ZGlmZiAtLWdpdCBhL2NyeXB0by9hcGkuYyBiL2NyeXB0by9hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTQxNjlhCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2FwaS5jCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogU2NhdHRlcmxpc3QgQ3J5cHRvZ3JhcGhpYyBBUEkuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgorICogQ29weXJpZ2h0IChjKSAyMDAyIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqCisgKiBQb3J0aW9ucyBkZXJpdmVkIGZyb20gQ3J5cHRvYXBpLCBieSBBbGV4YW5kZXIgS2plbGRhYXMgPGFzdG9yQGZhc3Qubm8+CisgKiBhbmQgTmV0dGxlLCBieSBOaWVscyBN9mxsZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworTElTVF9IRUFEKGNyeXB0b19hbGdfbGlzdCk7CitERUNMQVJFX1JXU0VNKGNyeXB0b19hbGdfc2VtKTsKKworc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2FsZ19nZXQoc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlyZXR1cm4gdHJ5X21vZHVsZV9nZXQoYWxnLT5jcmFfbW9kdWxlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19hbGdfcHV0KHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJbW9kdWxlX3B1dChhbGctPmNyYV9tb2R1bGUpOworfQorCitzdHJ1Y3QgY3J5cHRvX2FsZyAqY3J5cHRvX2FsZ19sb29rdXAoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqcSwgKmFsZyA9IE5VTEw7CisKKwlpZiAoIW5hbWUpCisJCXJldHVybiBOVUxMOworCQorCWRvd25fcmVhZCgmY3J5cHRvX2FsZ19zZW0pOworCQorCWxpc3RfZm9yX2VhY2hfZW50cnkocSwgJmNyeXB0b19hbGdfbGlzdCwgY3JhX2xpc3QpIHsKKwkJaWYgKCEoc3RyY21wKHEtPmNyYV9uYW1lLCBuYW1lKSkpIHsKKwkJCWlmIChjcnlwdG9fYWxnX2dldChxKSkKKwkJCQlhbGcgPSBxOworCQkJYnJlYWs7CisJCX0KKwl9CisJCisJdXBfcmVhZCgmY3J5cHRvX2FsZ19zZW0pOworCXJldHVybiBhbGc7Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRvX2luaXRfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKQoreworCXRmbS0+Y3J0X2ZsYWdzID0gMDsKKwkKKwlzd2l0Y2ggKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSkgeworCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0NJUEhFUjoKKwkJcmV0dXJuIGNyeXB0b19pbml0X2NpcGhlcl9mbGFncyh0Zm0sIGZsYWdzKTsKKwkJCisJY2FzZSBDUllQVE9fQUxHX1RZUEVfRElHRVNUOgorCQlyZXR1cm4gY3J5cHRvX2luaXRfZGlnZXN0X2ZsYWdzKHRmbSwgZmxhZ3MpOworCQkKKwljYXNlIENSWVBUT19BTEdfVFlQRV9DT01QUkVTUzoKKwkJcmV0dXJuIGNyeXB0b19pbml0X2NvbXByZXNzX2ZsYWdzKHRmbSwgZmxhZ3MpOworCQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwkKKwlCVUcoKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBjcnlwdG9faW5pdF9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlzd2l0Y2ggKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSkgeworCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0NJUEhFUjoKKwkJcmV0dXJuIGNyeXB0b19pbml0X2NpcGhlcl9vcHModGZtKTsKKwkJCisJY2FzZSBDUllQVE9fQUxHX1RZUEVfRElHRVNUOgorCQlyZXR1cm4gY3J5cHRvX2luaXRfZGlnZXN0X29wcyh0Zm0pOworCQkKKwljYXNlIENSWVBUT19BTEdfVFlQRV9DT01QUkVTUzoKKwkJcmV0dXJuIGNyeXB0b19pbml0X2NvbXByZXNzX29wcyh0Zm0pOworCQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwkKKwlCVUcoKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgY3J5cHRvX2V4aXRfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJc3dpdGNoIChjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkpIHsKKwljYXNlIENSWVBUT19BTEdfVFlQRV9DSVBIRVI6CisJCWNyeXB0b19leGl0X2NpcGhlcl9vcHModGZtKTsKKwkJYnJlYWs7CisJCQorCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0RJR0VTVDoKKwkJY3J5cHRvX2V4aXRfZGlnZXN0X29wcyh0Zm0pOworCQlicmVhazsKKwkJCisJY2FzZSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1M6CisJCWNyeXB0b19leGl0X2NvbXByZXNzX29wcyh0Zm0pOworCQlicmVhazsKKwkKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJCisJfQorfQorCitzdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX2FsbG9jX3RmbShjb25zdCBjaGFyICpuYW1lLCB1MzIgZmxhZ3MpCit7CisJc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IE5VTEw7CisJc3RydWN0IGNyeXB0b19hbGcgKmFsZzsKKworCWFsZyA9IGNyeXB0b19hbGdfbW9kX2xvb2t1cChuYW1lKTsKKwlpZiAoYWxnID09IE5VTEwpCisJCWdvdG8gb3V0OworCQorCXRmbSA9IGttYWxsb2Moc2l6ZW9mKCp0Zm0pICsgYWxnLT5jcmFfY3R4c2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHRmbSA9PSBOVUxMKQorCQlnb3RvIG91dF9wdXQ7CisKKwltZW1zZXQodGZtLCAwLCBzaXplb2YoKnRmbSkgKyBhbGctPmNyYV9jdHhzaXplKTsKKwkKKwl0Zm0tPl9fY3J0X2FsZyA9IGFsZzsKKwkKKwlpZiAoY3J5cHRvX2luaXRfZmxhZ3ModGZtLCBmbGFncykpCisJCWdvdG8gb3V0X2ZyZWVfdGZtOworCQkKKwlpZiAoY3J5cHRvX2luaXRfb3BzKHRmbSkpIHsKKwkJY3J5cHRvX2V4aXRfb3BzKHRmbSk7CisJCWdvdG8gb3V0X2ZyZWVfdGZtOworCX0KKworCWdvdG8gb3V0OworCitvdXRfZnJlZV90Zm06CisJa2ZyZWUodGZtKTsKKwl0Zm0gPSBOVUxMOworb3V0X3B1dDoKKwljcnlwdG9fYWxnX3B1dChhbGcpOworb3V0OgorCXJldHVybiB0Zm07Cit9CisKK3ZvaWQgY3J5cHRvX2ZyZWVfdGZtKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJc3RydWN0IGNyeXB0b19hbGcgKmFsZyA9IHRmbS0+X19jcnRfYWxnOworCWludCBzaXplID0gc2l6ZW9mKCp0Zm0pICsgYWxnLT5jcmFfY3R4c2l6ZTsKKworCWNyeXB0b19leGl0X29wcyh0Zm0pOworCWNyeXB0b19hbGdfcHV0KGFsZyk7CisJbWVtc2V0KHRmbSwgMCwgc2l6ZSk7CisJa2ZyZWUodGZtKTsKK30KKworaW50IGNyeXB0b19yZWdpc3Rlcl9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqcTsKKwkKKwlkb3duX3dyaXRlKCZjcnlwdG9fYWxnX3NlbSk7CisJCisJbGlzdF9mb3JfZWFjaF9lbnRyeShxLCAmY3J5cHRvX2FsZ19saXN0LCBjcmFfbGlzdCkgeworCQlpZiAoIShzdHJjbXAocS0+Y3JhX25hbWUsIGFsZy0+Y3JhX25hbWUpKSkgeworCQkJcmV0ID0gLUVFWElTVDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCQorCWxpc3RfYWRkX3RhaWwoJmFsZy0+Y3JhX2xpc3QsICZjcnlwdG9fYWxnX2xpc3QpOworb3V0OgkKKwl1cF93cml0ZSgmY3J5cHRvX2FsZ19zZW0pOworCXJldHVybiByZXQ7Cit9CisKK2ludCBjcnlwdG9fdW5yZWdpc3Rlcl9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlpbnQgcmV0ID0gLUVOT0VOVDsKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqcTsKKwkKKwlCVUdfT04oIWFsZy0+Y3JhX21vZHVsZSk7CisJCisJZG93bl93cml0ZSgmY3J5cHRvX2FsZ19zZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnkocSwgJmNyeXB0b19hbGdfbGlzdCwgY3JhX2xpc3QpIHsKKwkJaWYgKGFsZyA9PSBxKSB7CisJCQlsaXN0X2RlbCgmYWxnLT5jcmFfbGlzdCk7CisJCQlyZXQgPSAwOworCQkJZ290byBvdXQ7CisJCX0KKwl9CitvdXQ6CQorCXVwX3dyaXRlKCZjcnlwdG9fYWxnX3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGNyeXB0b19hbGdfYXZhaWxhYmxlKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBmbGFncykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnID0gY3J5cHRvX2FsZ19tb2RfbG9va3VwKG5hbWUpOworCQorCWlmIChhbGcpIHsKKwkJY3J5cHRvX2FsZ19wdXQoYWxnKTsKKwkJcmV0ID0gMTsKKwl9CisJCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9jcnlwdG8odm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJJbml0aWFsaXppbmcgQ3J5cHRvZ3JhcGhpYyBBUElcbiIpOworCWNyeXB0b19pbml0X3Byb2MoKTsKKwlyZXR1cm4gMDsKK30KKworX19pbml0Y2FsbChpbml0X2NyeXB0byk7CisKK0VYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19yZWdpc3Rlcl9hbGcpOworRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX3VucmVnaXN0ZXJfYWxnKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19hbGxvY190Zm0pOworRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX2ZyZWVfdGZtKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19hbGdfYXZhaWxhYmxlKTsK