ZGlmZiAtLWdpdCBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAva2VybmVsL3JhbWR1bXAvcmFtZHVtcF9jbGllbnRfY2FwLmMgYi91cHN0cmVhbS9saW51eC01LjEwL2tlcm5lbC9yYW1kdW1wL3JhbWR1bXBfY2xpZW50X2NhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJjYjZhNTMKLS0tIC9kZXYvbnVsbAorKysgYi91cHN0cmVhbS9saW51eC01LjEwL2tlcm5lbC9yYW1kdW1wL3JhbWR1bXBfY2xpZW50X2NhcC5jCkBAIC0wLDAgKzEsNDU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiCw5sioy/nT0CAoQykyMDE2LCDW0NDLzajRtrnJt93T0M/euavLvqGjCisqIAorKiDOxLz+w/uzxjogICAgIHJhbWR1bXBfY2xpZW50X2NhcC5jCisqIM7EvP6x6sq2OiAgICAgcmFtZHVtcF9jbGllbnRfY2FwLmMKKyogxNrI3dWq0qo6ICAgICByYW1kdW1wIGNhcL/Nu6e2y9Lss6PLwLv6z9azocr9vt21vLP2yrXP1gorKiAKKyog0N64xMjVxtogICAgICAgILDmsb66xSAgICAgINDeuMSx6rzHICAgICAgICDQ3rjEyMsgICAgICAgICAg0N64xMTayN0KKyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIDIwMTkvMTAvMTAgICAgICBWMS4wICAgICAgICBDcmVhdGUgICAgICAgICAgMDAxMzA1NzQgICAgICAgICC0tL2oCisqIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIM23zsS8/iAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInJhbWR1bXAuaCIKKyNpbmNsdWRlICJyYW1kdW1wX2FyY2guaCIKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2MvenRlL3JwbXNnLmg+CisjaW5jbHVkZSAicmFtX2NvbmZpZy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILOjwb+2qNLlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILrqtqjS5SAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyv2+3cDg0M22qNLlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICC6r8r9yfnD9yAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIHZvaWQgcmFtZHVtcF9yZWdpc3Rlcl9jYWxsYmFja3Modm9pZCk7CitleHRlcm4gdW5zaWduZWQgY2hhciAqcmFtZHVtcF9waHlfdG9fdmlyKHVuc2lnbmVkIGxvbmcgcGh5LCB1bnNpZ25lZCBsb25nIHNpemUpOworZXh0ZXJuIHZvaWQgcmFtZHVtcF9zaGFyZWRfbWVtX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCByYW1kdW1wX2RhdGFfdHJhbnNmZXJfdG9fZGV2aWNlKHZvaWQpOworZXh0ZXJuIHZvaWQgcmFtZHVtcF9vc3NfZGF0YV90cmFuc19pbml0KHZvaWQpOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgKnJhbWR1bXBfZXhwb3J0X2ZsYWdfYmFzZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICC+1rK/vrLMrLHkwb+2qNLlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBSQU1EVU1QX09OX0RFRkFVTFRfVkFMICAoMSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMirvtax5MG/tqjS5SAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHJ1biB0aW1lIGNvbnRyb2wgZHVtcCBvciBub3QsIHVzZSAoIGVjaG8gIjAiID4gcmFtZHVtcF9vbiApIHRvIGNsb3NlIHJhbWR1bXAKKyAqLworaW50IHN5c2N0bF9yYW1kdW1wX29uX3BhbmljID0gUkFNRFVNUF9PTl9ERUZBVUxUX1ZBTDsKK2ludCByYW1kdW1wX2NhcF9pbml0X2ZsYWcgPSAtMTsKK2ludCByYW1kdW1wX2NvdW50ID0gMDsKK2ludCByYW1kdW1wX3NlcnZlcl9leHBfY29yZSA9IFJBTURVTVBfRkFMU0U7CisjaWZkZWYgQ09ORklHX1JBTURVTVBfVVNFUgordW5zaWduZWQgaW50IHN5c2N0bF9yYW1kdW1wX29uX3VzZXIgPSAxOworI2VuZGlmCit1bnNpZ25lZCBpbnQgcmFtZHVtcF9leHBvcnRfbW9kZSA9IDB4RkY7CisvKiBDbW0gZmlsZSBjb250ZW50ICovCit1bnNpZ25lZCBjaGFyICpyYW1kdW1wX2NhcF9jbW1fYnVmID0gTlVMTDsKKy8qIGVyciBsb2cgZmlsZSAqLwordW5zaWduZWQgY2hhciAqcmFtZHVtcF9jYXBfZXJyb3JfbG9nICA9IE5VTEw7Cit1bnNpZ25lZCBpbnQgKmNhcF9kZHJfbGVuX2Jhc2UgICAgICAgID0gTlVMTDsKK3Vuc2lnbmVkIGludCAgIHN5c2N0bF9yYW1kdW1wX2VtbWNfc2l6ZSA9IDB4MDsKK3Vuc2lnbmVkIGludCAgIHN5c2N0bF9yYW1kdW1wX2VtbWNfc3RhcnRfYWRkciA9IDB4RkZGRjsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgY2ZnX3JhbWR1bXBfYXJyYXlbXSA9IHsKKyNpZmRlZiBDT05GSUdfUkFNRFVNUF9VU0VSCisJeworCQkucHJvY25hbWUJPSAic3lzY3RsX3JhbWR1bXBfb25fdXNlciIsCisJCS5kYXRhCQk9ICZzeXNjdGxfcmFtZHVtcF9vbl91c2VyLAorCQkubWF4bGVuCQk9IHNpemVvZihzeXNjdGxfcmFtZHVtcF9vbl91c2VyKSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuZXh0cmExCQk9IFNZU0NUTF9aRVJPLAorCQkuZXh0cmEyCQk9IFNZU0NUTF9PTkUsCisJfSwKKyNlbmRpZgorCXsKKwkJICAucHJvY25hbWUgICA9ICJyYW1kdW1wX3N0YXJ0X2FkZHIiLAorCQkgIC5kYXRhIAkgID0gJnN5c2N0bF9yYW1kdW1wX2VtbWNfc3RhcnRfYWRkciwKKwkJICAubWF4bGVuCSAgPSBzaXplb2YodTY0KSwKKwkJICAubW9kZSAJICA9IDA2NDQsCisJCSAgLnByb2NfaGFuZGxlciAgPSBwcm9jX2RvaW50dmVjX21pbm1heCwKKwkgIH0sCisJICB7CisJCSAgLnByb2NuYW1lICAgPSAicmFtZHVtcF9lbW1jX3NpemUiLAorCQkgIC5kYXRhIAkgID0gJnN5c2N0bF9yYW1kdW1wX2VtbWNfc2l6ZSwKKwkJICAubWF4bGVuCSAgPSBzaXplb2YodTY0KSwKKwkJICAubW9kZSAJICA9IDA2NDQsCisJCSAgLnByb2NfaGFuZGxlciAgPSBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4LAorCSAgfSwKKworICAgIHsgfQorfTsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgc3lzY3RsX3JhbWR1bXBfdGFibGVbXSA9IHsKKyAgICB7CisgICAgICAgIC5wcm9jbmFtZSAgID0gInJhbWR1bXBfYXAiLAorICAgICAgICAubW9kZSAgICAgICA9IDA1NTUsCisgICAgICAgIC5jaGlsZCAgICAgID0gY2ZnX3JhbWR1bXBfYXJyYXksCisgICAgfSwKKyAgICB7IH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICC+1rK/uq/K/cq1z9YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqILmmxNzD6Mr2OiAgICAgcmFtZHVtcF9jYXBfaWNwX2hhbmRsZQorKiCyzsr9y7XD9zogICAgIAorKiAgICi0q8jrss7K/SkgIGJ1ZjogaWNwIG1zZyBhZGRyCisqICAgICAgICAgICAgICAgbGVuOiBpY3AgbXNnIGxlbgorKiAgICi0q7P2ss7K/SkgIHZvaWQKKyogt7Ugu9gg1rU6ICAgICB2b2lkCisqIMbky/zLtcP3OiAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciByYW1kdW1wIGNsaWVudCBpY3AgbXNnIGhhbmRsZSwgY29tbW9uIGVudHJ5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcmFtZHVtcF9jYXBfaWNwX2hhbmRsZSh2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCit7CisJcmFtZHVtcF9tc2dfdCAqaWNwX21zZyA9IChyYW1kdW1wX21zZ190ICopYnVmOworCisJcmFtZHVtcF9zZXJ2ZXJfZXhwX2NvcmUgPSBSQU1EVU1QX1NVQ0NFU1M7CisKKwlzd2l0Y2goaWNwX21zZy0+bXNnX2lkKQorCXsKKwkJY2FzZSBSQU1EVU1QX01TR19FWENFUFQ6CisJCXsKKwkJCXJhbWR1bXBfcGFuaWMoInRyYW5zIHNlcnZlciByZWNlaXZlZCBmb3JjZWQgZHVtcCByZXF1ZXN0IGZyb20gQXAgc2VydmVyIVxuIik7CisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJhbWR1bXBfcGFuaWMoInRyYW5zIHNlcnZlciByZWNlaXZlZCBmb3JjZWQgZHVtcCByZXF1ZXN0IGZyb20gQXAgc2VydmVyIVxuIik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoguabE3MPoyvY6ICAgIHJhbWR1bXBfb3NzX2ljcF9jcmVhdGVfY2hhbm5lbAorKiCyzsr9y7XD9zogICAgIAorKiAgICi0q8jrss7K/SkgYWN0b3JJRDogaWNwIHNlbmQgY29yZSBpZAorICAgICAgICAgICAgICAgY2hJRDogICAgaWNwIGNoYW5uZWwgaWQKKyAgICAgICAgICAgICAgIHNpemU6ICAgIGljcCBjaGFubmVsIHNpemUKKyogICAotKuz9rLOyv0pIHZvaWQgCisqILe1ILvYINa1OiAgICBpbnQ6IGlmIG1zZyBzZW5kIHN1Y2Nlc3MgCisqIMbky/zLtcP3OiAgICAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHJhbWR1bXBfY2FwX2ljcF9jcmVhdGVfY2hhbm5lbChUX1JwTXNnX0NvcmVJRCBkc3RDb3JlSUQsIFRfUnBNc2dfQ2hJRCBjaElELCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlyZXR1cm4gcnBtc2dDcmVhdGVDaGFubmVsKGRzdENvcmVJRCwgY2hJRCwgc2l6ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqILmmxNzD6Mr2OiAgICByYW1kdW1wX29zc19pY3BfcmVnY2FsbGJhY2sKKyogss7K/cu1w/c6ICAgICAKKyogICAotKvI67LOyv0pIGFjdG9ySUQ6IGljcCBzZW5kIGNvcmUgaWQKKyAgICAgICAgICAgICAgIGNoSUQ6ICAgIGljcCBjaGFubmVsIGlkCisgICAgICAgICAgICAgICBjYWxsYmFjazppY3AgY2FsbGJhY2sgZnVuCisqICAgKLSrs/ayzsr9KSB2b2lkIAorKiC3tSC72CDWtTogICAgaW50OiBpZiBtc2cgc2VuZCBzdWNjZXNzIAorKiDG5Mv8y7XD9zogICAgCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCByYW1kdW1wX2NhcF9pY3BfcmVnY2FsbGJhY2sgKFRfUnBNc2dfQ29yZUlEIGNvcmVJRCwgdW5zaWduZWQgaW50IGNoSUQsIFRfUnBNc2dfQ2FsbGJhY2sgY2FsbGJhY2spCit7CisJcmV0dXJuIHJwbXNnUmVnQ2FsbEJhY2soY29yZUlELCBjaElELCBjYWxsYmFjayk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqILmmxNzD6Mr2OiAgICByYW1kdW1wX2luaXRfc3lzY3RsX3RhYmxlCisqILLOyv3LtcP3OiAgICAgCisqICAgKLSryOuyzsr9KSB2b2lkCisqICAgKLSrs/ayzsr9KSB2b2lkIAorKiC3tSC72CDWtTogICAgdm9pZCAKKyogxuTL/Mu1w/c6ICAgINeisuFzeXNjdGzD/MHuo6zTw7unzKzKudPDc3lzY3Rsv9jWxnJhbWR1bXC05rSitdjWtworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcmFtZHVtcF9pbml0X3N5c2N0bF90YWJsZSh2b2lkKQoreworCXJlZ2lzdGVyX3N5c2N0bF90YWJsZShzeXNjdGxfcmFtZHVtcF90YWJsZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqILmmxNzD6Mr2OiAgICAgcmFtZHVtcF9jYXBfaWNwX2luaXQKKyogss7K/cu1w/c6ICAgICAKKyogICAotKvI67LOyv0pICB2b2lkCisqICAgKLSrs/ayzsr9KSAgdm9pZAorKiC3tSC72CDWtTogICAgIHZvaWQKKyogxuTL/Mu1w/c6ICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHJhbWR1bXAgY2xpZW50IGljcCBpbml0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCByYW1kdW1wX2NhcF9pY3BfaW5pdCh2b2lkKQoreworCWludCByZXQgPSAwOworCisJcmV0ID0gcmFtZHVtcF9jYXBfaWNwX2NyZWF0ZV9jaGFubmVsKAorCQkJUkFNRFVNUF9TRVJWRVJfQVAsIAorCQkJUkFNRFVNUF9DSEFOTkVMLCAKKwkJCVJBTURVTVBfQ0hBTk5FTF9TSVpFKTsKKworCWlmIChyZXQgIT0gUkFNRFVNUF9TVUNDRVNTKQorCXsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gcmFtZHVtcF9jYXBfaWNwX3JlZ2NhbGxiYWNrKAorCQkJUkFNRFVNUF9TRVJWRVJfQVAsCisJCQlSQU1EVU1QX0NIQU5ORUwsIAorCQkJcmFtZHVtcF9jYXBfaWNwX2hhbmRsZSk7CisKKwlpZiAocmV0ICE9IFJBTURVTVBfU1VDQ0VTUykKKwl7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiBSQU1EVU1QX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqILmmxNzD6Mr2OiAgICAgcmFtZHVtcF9ub3RpZnlfc2VydmVyX3BhbmljCisqILLOyv3LtcP3OiAgICAgCisqICAgKLSryOuyzsr9KSAgdm9pZAorKiAgICi0q7P2ss7K/SkgIHZvaWQKKyogt7Ugu9gg1rU6ICAgICB2b2lkCisqIMbky/zLtcP3OiAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBjYXAgbm90aWZ5IHJhbWR1bXAgc2VydmVyIHRvIHBhbmljCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCByYW1kdW1wX25vdGlmeV9zZXJ2ZXJfcGFuaWModm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlUX1JwTXNnX01zZyBycE1zZyA9IHswfTsKKwlyYW1kdW1wX21zZ190IHJhbWR1bXBNc2cgPSB7MH07CisJCisJcmFtZHVtcE1zZy5tc2dfaWQgPSBSQU1EVU1QX01TR19FWENFUFQ7CisJcmFtZHVtcE1zZy5jcHVfaWQgPSBDT1JFX0FQOworCisJcnBNc2cuY29yZUlEID0gUkFNRFVNUF9TRVJWRVJfQVA7CisJcnBNc2cuY2hJRCA9IFJBTURVTVBfQ0hBTk5FTDsKKwlycE1zZy5mbGFnID0gUlBNU0dfV1JJVEVfSU5UIHwgUlBNU0dfV1JJVEVfSVJRTE9DSzsKKwlycE1zZy5sZW4gPSBzaXplb2YocmFtZHVtcF9tc2dfdCk7CisJcnBNc2cuYnVmID0gJnJhbWR1bXBNc2c7CisKKwlyZXQgPSBycG1zZ1dyaXRlKCZycE1zZyk7CisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoguabE3MPoyvY6ICAgIHJhbWR1bXBfY2FwX3N0b3JlX3JhbV9jb25mCisqILLOyv3LtcP3OiAgICAgCisqICAgKLSryOuyzsr9KSBtZW06IGFkZHIKKyogICAotKuz9rLOyv0pIHZvaWQgCisqILe1ILvYINa1OiAgICB1bnNpZ2VuZCBjaGFyKjogY2hhbmdlZCBhZGRyCisqIMbky/zLtcP3OiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3RvcmUgcmFtIGNvbmYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcmFtZHVtcF9jYXBfc3RvcmVfcmFtX2NvbmYodW5zaWduZWQgY2hhciAqbWVtKQoreworCW1lbSArPSBzcHJpbnRmKAorCQkJbWVtLCAKKwkJCSJkYXRhLmxvYWQuYmluYXJ5ICZyYW1kdW1wX2RpclxcJXMgQToweCV4LS1BOjB4JXggL25vY2xlYXJcbiIsCisJCQkiY2FwX2Rkci5iaW4iLAorCQkJKHVuc2lnbmVkIGludClERFJfQkFTRV9DQVBfQUREUl9QQSwgCisJCQkodW5zaWduZWQgaW50KShERFJfQkFTRV9DQVBfQUREUl9QQSArICpjYXBfZGRyX2xlbl9iYXNlICAtIDEpKTsKKwltZW0gKz0gc3ByaW50ZigKKwkJCW1lbSwgCisJCQkiZGF0YS5sb2FkLmJpbmFyeSAmcmFtZHVtcF9kaXJcXCVzIEE6MHgleC0tQToweCV4IC9ub2NsZWFyXG4iLAorCQkJImNhcC5jbW0iLAorCQkJKHVuc2lnbmVkIGludClSQU1EVU1QX0NBUF9DTU1fQlVGX0FERFIsIAorCQkJKHVuc2lnbmVkIGludCkoUkFNRFVNUF9DQVBfQ01NX0JVRl9BRERSICsgUkFNRFVNUF9DQVBfQ01NX0JVRl9MRU5fUkVBTCAtIDEpKTsKKwltZW0gKz0gc3ByaW50ZigKKwkJCW1lbSwgCisJCQkiZGF0YS5sb2FkLmJpbmFyeSAmcmFtZHVtcF9kaXJcXCVzIEE6MHgleC0tQToweCV4IC9ub2NsZWFyXG4iLAorCQkJImNhcF9lcnJfbG9nLnR4dCIsCisJCQkodW5zaWduZWQgaW50KVJBTURVTVBfQ0FQX0xPR19CVUZfQUREUiwgCisJCQkodW5zaWduZWQgaW50KShSQU1EVU1QX0NBUF9MT0dfQlVGX0FERFIgKyBSQU1EVU1QX0NBUF9MT0dfQlVGX0xFTiAtIDEpKTsKKwlyZXR1cm4gbWVtOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoguabE3MPoyvY6ICAgIHJhbWR1bXBfY2FwX2NtbV9jcmVhdGUKKyogss7K/cu1w/c6ICAgICAKKyogICAotKvI67LOyv0pIHZvaWQKKyogICAotKuz9rLOyv0pIHZvaWQKKyogt7Ugu9gg1rU6ICAgIHZvaWQKKyogxuTL/Mu1w/c6ICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3Igc2VydmVyIHRvIGdlbmVyYXRlIGNtbSBzY3JpcHRzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcmFtZHVtcF9jYXBfY21tX2NyZWF0ZSh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgKnBjbW1fYnVmID0gcmFtZHVtcF9jYXBfY21tX2J1ZjsKKworCW1lbXNldChyYW1kdW1wX2NhcF9jbW1fYnVmLCAwLCBSQU1EVU1QX0NBUF9DTU1fQlVGX0xFTl9SRUFMKTsKKworCS8vIHN0b3JlIHRoZSBjbW0gQkVHSU4KKwlwY21tX2J1ZiArPSBzcHJpbnRmKHBjbW1fYnVmLCAiRU5UUlkgJnJhbWR1bXBfZGlyXG4iKTsKKworCS8vIHN0b3JlIHByb2Ntb2RlcyByZWdzCisJcGNtbV9idWYgPSByYW1kdW1wX2FyY2hfc3RvcmVfbW9kZXNfcmVncyhwY21tX2J1Zik7CisKKwkvLyBzdG9yZSByYW0gY29uZmlnIAorCXBjbW1fYnVmID0gcmFtZHVtcF9jYXBfc3RvcmVfcmFtX2NvbmYocGNtbV9idWYpOworCisJLy8gc3RvcmUgbWVtb3J5IG1hcCBjb250cm9sIHJlZ3MKKwlwY21tX2J1ZiA9IHJhbWR1bXBfYXJjaF9zdG9yZV9tbV9yZWdzKHBjbW1fYnVmKTsKKworCS8vIHN0b3JlIGVuZCBzeW1ib2wKKwlwY21tX2J1ZiArPSBzcHJpbnRmKHBjbW1fYnVmLCAiRU5ERE9cbiIpOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqILmmxNzD6Mr2OiAgICByYW1kdW1wX3RyYW5zX2NhcF9lcnJvcl9sb2dfY3JlYXRlCisqILLOyv3LtcP3OiAgICAgCisqICAgKLSryOuyzsr9KSB2b2lkCisqICAgKLSrs/ayzsr9KSB2b2lkCisqILe1ILvYINa1OiAgICB2b2lkCisqIMbky/zLtcP3OiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGVyciBsb2cgZmlsZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHJhbWR1bXBfY2FwX2Vycm9yX2xvZ19jcmVhdGUodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyICpidWYgPSByYW1kdW1wX2NhcF9lcnJvcl9sb2c7CisKKwltZW1zZXQocmFtZHVtcF9jYXBfZXJyb3JfbG9nLCAwLCBSQU1EVU1QX0NBUF9MT0dfQlVGX0xFTik7CisJYnVmICs9CXNwcmludGYoYnVmLCAiZHVtcCBhdCBjb3JlJWQsIiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlpZiAoY3VycmVudC0+bW0gIT0gTlVMTCkKKwkJYnVmICs9IHNwcmludGYoYnVmLCAiaW4gdXNlcix0YXNrIGlzOiAlc1xuIiwgY3VycmVudC0+Y29tbSk7CisJZWxzZQorCQlidWYgKz0gc3ByaW50ZihidWYsICJpbiBrZXJuZWwsdGFzayBpczogJXNcbiIsIGN1cnJlbnQtPmNvbW0pOworCisJaWYgKHJhbWR1bXBfc2VydmVyX2V4cF9jb3JlKQorCQlidWYgKz0gc3ByaW50ZihidWYsICJyZWN2IGR1bXBpbmZvIGZyb20gYXBcbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyKu+1rqvyv3Ktc/WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiC5psTcw+jK9jogICAgIHJhbWR1bXBfcmFtX2NvbmZfdGFibGVfYWRkCisqILLOyv3LtcP3OiAgICAgCisqICAgKLSryOuyzsr9KSAgcmFtX25hbWU6ICAgIGR1bXAgcmFtIG5hbWUKKyAgICAgICAgICAgICAgICByYW1fc3RhcnQ6ICAgZHVtcCByYW0gc3RhcnQodmlydHVhbCBhZGRyKQorICAgICAgICAgICAgICAgIHJhbV9zaXplOiAgICBkdW1wIHJhbSBzaXplCisgICAgICAgICAgICAgICAgcmFtX3ZpcnQ6ICAgIGR1bXAgcmFtIHZpcnQgYWRkcgorICAgICAgICAgICAgICAgIHJhbV9mbGFnOiAgICBkdW1wIHJhbSBmbGFnKGNvcHkvZXh0ZXIvY2FsbGJhY2spCisgICAgICAgICAgICAgICAgcmFtX2V4dHJhOiAgIGR1bXAgcmFtIGV4dHJhIGFjY2VzcyBhZGRyCisqICAgKLSrs/ayzsr9KSAgdm9pZAorKiC3tSC72CDWtTogICAgIHZvaWQKKyogxuTL/Mu1w/c6ICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWRkIGR1bXAgcmFtIGNvbmYgaW50byBwdWJsaWMgdGFibGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHJhbWR1bXBfcmFtX2NvbmZfdGFibGVfYWRkKAorCQljaGFyICpyYW1fbmFtZSwgCisJCXVuc2lnbmVkIGxvbmcgcmFtX3BoeSwgCisJCXVuc2lnbmVkIGxvbmcgcmFtX3NpemUsIAorCQl1bnNpZ25lZCBsb25nIHJhbV92aXJ0LAorCQl1bnNpZ25lZCBsb25nIHJhbV9mbGFnLAorCQl1bnNpZ25lZCBsb25nIHJhbV9leHRyYSkKK3sKK30KK3ZvaWQgcmFtZHVtcF9pbml0X2NtbV9idWYodm9pZCkKK3sKKwkvKiBDbW0gZmlsZSBjb250ZW50ICovCisJcmFtZHVtcF9jYXBfY21tX2J1ZiA9IHJhbWR1bXBfcGh5X3RvX3ZpcigodW5zaWduZWQgbG9uZylSQU1EVU1QX0NBUF9DTU1fQlVGX0FERFIsIFJBTURVTVBfQ0FQX0NNTV9CVUZfTEVOX1JFQUwpOworCS8qIGVyciBsb2cgZmlsZSAqLworCXJhbWR1bXBfY2FwX2Vycm9yX2xvZyA9IHJhbWR1bXBfcGh5X3RvX3ZpcigodW5zaWduZWQgbG9uZylSQU1EVU1QX0NBUF9MT0dfQlVGX0FERFIsIFJBTURVTVBfQ0FQX0xPR19CVUZfTEVOKTsKKwljYXBfZGRyX2xlbl9iYXNlID0gKHVuc2lnbmVkIGludCAqKXJhbWR1bXBfcGh5X3RvX3ZpcigodW5zaWduZWQgbG9uZylJUkFNX0JBU0VfQUREUl9CT09UX0REUiwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoguabE3MPoyvY6ICAgICByYW1kdW1wX2luaXQKKyogss7K/cu1w/c6ICAgICAKKyogICAotKvI67LOyv0pICB2b2lkCisqICAgKLSrs/ayzsr9KSAgdm9pZAorKiC3tSC72CDWtTogICAgIFJBTURVTVBfU1VDQ0VTUyBvciBSQU1EVU1QX0ZBSUxFRAorKiDG5Mv8y7XD9zogICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgcmFtZHVtcCBpbml0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IF9faW5pdCByYW1kdW1wX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlyYW1kdW1wX3ByaW50ZigiUmFtZHVtcCBjYXAgaW5pdCBzdGFydCEhISEhXG4iKTsKKworCWlmIChyYW1kdW1wX2NhcF9pbml0X2ZsYWcgPT0gUkFNRFVNUF9UUlVFKQorCQlyZXR1cm4gUkFNRFVNUF9TVUNDRVNTOworCXJhbWR1bXBfcHJpbnRmKCJSYW1kdW1wIGNhcCBpbml0IHJwbXNnIHN0YXJ0ISEhISFcbiIpOworCXJldCA9IHJhbWR1bXBfY2FwX2ljcF9pbml0KCk7CisJaWYgKHJldCAhPSBSQU1EVU1QX0lDUF9TVUNDRVNTKSAKKwkJcmV0dXJuIHJldDsKKworCXJhbWR1bXBfcmVnaXN0ZXJfY2FsbGJhY2tzKCk7CisKKwlyYW1kdW1wX2luaXRfY21tX2J1ZigpOworCisJcmFtZHVtcF9pbml0X3N5c2N0bF90YWJsZSgpOworCisJcmFtZHVtcF9zaGFyZWRfbWVtX2luaXQoKTsKKwlyYW1kdW1wX29zc19kYXRhX3RyYW5zX2luaXQoKTsKKworCXJhbWR1bXBfcHJpbnRmKCJSYW1kdW1wIGNhcCBpbml0IHN1Y2Nlc3MhXG4iKTsKKwlyYW1kdW1wX2NhcF9pbml0X2ZsYWcgPSBSQU1EVU1QX1RSVUU7CisKKwlyZXR1cm4gUkFNRFVNUF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiC5psTcw+jK9jogICAgIHJhbWR1bXBfZW50cnkKKyogss7K/cu1w/c6ICAgICAKKyogICAotKvI67LOyv0pICB2b2lkCisqICAgKLSrs/ayzsr9KSAgdm9pZAorKiC3tSC72CDWtTogICAgIHZvaWQKKyogxuTL/Mu1w/c6ICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHJhbWR1bXAgZW50cnkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHJhbWR1bXBfZW50cnkgKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpZiAoc3lzY3RsX3JhbWR1bXBfb25fcGFuaWMgPT0gZmFsc2UpCisJCXJldHVybjsKKworCS8qCisJKiB3ZSBuZWVkIGxvY2sgdGhlIGlycSwgdGhpcyBjYW5gdCBiZSBpbnRlcnJ1cHQuCisJKi8KKwlyYW1kdW1wX2lycV9sb2NrKGZsYWdzKTsKKworCWlmICghcmFtZHVtcF9jYXBfaW5pdF9mbGFnKQorCQl3aGlsZSh0cnVlKTsgLyogZW5kbGVzcyBjaXJjbGUgKi8KKworCWlmICgrK3JhbWR1bXBfY291bnQgPiAxKQorCQl3aGlsZSh0cnVlKTsgLyogZW5kbGVzcyBjaXJjbGUgKi8KKworCS8qCisJKiBzYXZlIGFsbCByZWdzIGZpcnN0LgorCSovCisJcmFtZHVtcF9hcmNoX3NhdmVfYWxsX3JlZ3MoKTsKKwkvLyBnZW5lcmF0ZSBlcnJvciBsb2cgCisJcmFtZHVtcF9jYXBfZXJyb3JfbG9nX2NyZWF0ZSgpOworCisJLy/J+rPJY21tvcWxvrXEtbyz9sXk1sMKKwlyYW1kdW1wX2NhcF9jbW1fY3JlYXRlKCk7CisKKwkvKiBub3RpZnkgY2xpZW50IHJhbWR1bXAgKi8KKwlyYW1kdW1wX25vdGlmeV9zZXJ2ZXJfcGFuaWMoKTsKKworCXJhbWR1bXBfYXJjaF9jbGVhbl9jYWNoZXMoKTsKKwlyYW1kdW1wX2V4cG9ydF9tb2RlICA9ICoodW5zaWduZWQgaW50ICopcmFtZHVtcF9leHBvcnRfZmxhZ19iYXNlOworCisJaWYoKHJhbWR1bXBfZXhwb3J0X21vZGUgPT0gUkFNRFVNUF9NT0RFX0VNTUMpCisJCXx8IChyYW1kdW1wX2V4cG9ydF9tb2RlID09IFJBTURVTVBfTU9ERV9TUElOQU5EKSkKKwkJcmFtZHVtcF9kYXRhX3RyYW5zZmVyX3RvX2RldmljZSgpOworCisJd2hpbGUodHJ1ZSkKKwkJOworfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS91cHN0cmVhbS9saW51eC01LjEwL2tlcm5lbC9yYW1kdW1wL3JhbWR1bXBfZW1tYy5jIGIvdXBzdHJlYW0vbGludXgtNS4xMC9rZXJuZWwvcmFtZHVtcC9yYW1kdW1wX2VtbWMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYzI4ZjI3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBzdHJlYW0vbGludXgtNS4xMC9rZXJuZWwvcmFtZHVtcC9yYW1kdW1wX2VtbWMuYwpAQCAtMCwwICsxLDE3MCBAQAorLyoqCisgKiBAZmlsZSBvc3NfcmFtZHVtcF9vc2EuYworICogQGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIFJhbWR1bXAgb3MgYWRhcHQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgU2FuZWNoaXBzIFRlY2hub2xvZ3kgQ28uLCBMdGQuCisgKiBAYXV0aG9yIFFpbmcgV2FuZyA8d2FuZy5xaW5nQHNhbmVjaGlwcy5jb20uY24+CisgKiBAaW5ncm91cCBzaV9hcF9vc3NfcmFtZHVtcF9pZAorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyAqIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEluY2x1ZGUgaGVhZGVyIGZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJyYW1kdW1wLmgiCisjaW5jbHVkZSAicmFtZHVtcF9lbW1jLmgiCisjaW5jbHVkZSAicmFtX2NvbmZpZy5oIgorI2luY2x1ZGUgInJhbWR1bXBfY29tcHJlc3MuaCIKKyNpbmNsdWRlIDxsaW51eC9sem8uaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm4gdmFyaWFibGUgZGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiB1bnNpZ25lZCBjaGFyICpyYW1kdW1wX3NoYXJlZF9tZW1fYmFzZTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyICpyYW1kdW1wX2VtbWNfZmxhZ19iYXNlOworZXh0ZXJuIHVuc2lnbmVkIGludCByYW1kdW1wX2NvbXByZXNzX2ZsYWc7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm8gZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUkFNRFVNUF9ERUxBWV9NU19DT1VOVCAoMjUwMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICBMb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbCB2YXJpYWJsZSBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsIHZhcmlhYmxlIGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5zaWduZWQgaW50IHJhbWR1bXBfZW1tY19zaXplID0gMDsKK3ZvbGF0aWxlIHVuc2lnbmVkIGludCByYW1kdW1wX2VtbWNfb2Zmc2V0ID0gMDsKK2V4dGVybiB1bnNpZ25lZCBpbnQgcmFtZHVtcF9kZXZpY2VfZmlsZV9jbnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICBJbmxpbmUgZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByYW1kdW1wX3dhaXRfZGVsYXkoIHVuc2lnbmVkIGxvbmcgbXMpCit7CisJdm9sYXRpbGUgaW50IGogPSAwOworCWZvciAoaiA9IDA7IGogPCAxMDAwMDsgaisrKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgIExvY2FsIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHJhbWR1bXBfZW1tY19pbml0KHJhbWR1bXBfZmlsZV90ICpmcCkKK3sKKwlmcC0+bWFnaWMgPSAweDJBMkEyQTJBOworCXJhbWR1bXBfZW1tY19vZmZzZXQgPSByb3VuZHVwKHNpemVvZihyYW1kdW1wX2ZpbGVfdCksIFJBTURVTVBfRU1NQ19BTElHTl9TSVpFKTsKKwkKKwlpZihSQU1EVU1QX1RSQU5TX0VNTUNfTEVOID4gcmFtZHVtcF9lbW1jX29mZnNldCkKKwl7CisJCXJhbWR1bXBfZW1tY19zaXplID0gUkFNRFVNUF9UUkFOU19FTU1DX0xFTiAtIHJhbWR1bXBfZW1tY19vZmZzZXQ7CisJfQorCWVsc2UKKwl7CisJCXByaW50aygiW3JhbWR1bXBdIGVtbWMgc3RhcnQgYWRkciBpcyAlbGQsIGVtbWMgc2l6ZT0gJWxkLCBlcnJvcjogc2l6ZSBzbWFsbGVyIHRoYW4gcmFtZHVtcCBmaWxlIGhlYWRlciwgcmV0dXJuIVxuIiwgc3lzY3RsX3JhbWR1bXBfZW1tY19zdGFydF9hZGRyLCBzeXNjdGxfcmFtZHVtcF9lbW1jX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYobW1jX3JhbWR1bXBfaW5pdCgpKXsKKwkJcmFtZHVtcF9wcmludGYoIkVNTUMgaW5pdCBmYWlsZWQhIE5vIHJhbWR1bXAgZGF0YSB0cmFucyB0byBlbW1jIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCByYW1kdW1wX2VtbWNfd3JpdGVfZmlsZShjaGFyICpmaWxlX25hbWUsIHVuc2lnbmVkIGludCBmaWxlX3NpemUsIHJhbWR1bXBfZmlsZV90ICpmcCkKK3sKKwlpZiAocmFtZHVtcF9kZXZpY2VfZmlsZV9jbnQgPj0gUkFNRFVNUF9GSUxFX05VTV9NQVgpCisJCXJldHVybiAtMTsKKwlpZiAocmFtZHVtcF9lbW1jX29mZnNldCA+PSBSQU1EVU1QX1RSQU5TX0VNTUNfTEVOKQorCQlyZXR1cm4gLTE7CisKKwlmcC0+ZmlsZV9mcFtyYW1kdW1wX2RldmljZV9maWxlX2NudF0ubWFnaWMgPSAweDNBM0EzQTNBOworCXN0cm5jcHkoZnAtPmZpbGVfZnBbcmFtZHVtcF9kZXZpY2VfZmlsZV9jbnRdLmZpbGVfbmFtZSwgZmlsZV9uYW1lLCBSQU1EVU1QX1JBTUNPTkZfRklMRU5BTUVfTUFYTEVOIC0gMSk7CisJZnAtPmZpbGVfZnBbcmFtZHVtcF9kZXZpY2VfZmlsZV9jbnRdLm9mZnNldCA9IHJhbWR1bXBfZW1tY19vZmZzZXQ7CisJZnAtPmZpbGVfZnBbcmFtZHVtcF9kZXZpY2VfZmlsZV9jbnRdLnNpemUgPSBmaWxlX3NpemU7CisJcmV0dXJuIDA7Cit9CisKK2ludCByYW1kdW1wX2VtbWNfd3JpdGVfZmlsZV9oZWFkKHJhbWR1bXBfZmlsZV90ICpmcCkKK3sKKwlpbnQgcmV0ID0gLTE7CisJbW1jX2J3cml0ZShSQU1EVU1QX0VNTUNfQUREUiwgcm91bmR1cChzaXplb2YocmFtZHVtcF9maWxlX3QpLCBSQU1EVU1QX0VNTUNfQUxJR05fU0laRSksIGZwKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgcmFtZHVtcF9lbW1jX3dyaXRlX2RhdGEocmFtZHVtcF9zaG1lbV90ICptc2csIHJhbWR1bXBfZmlsZV90ICpmcCwgdW5zaWduZWQgaW50IHNpemUpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50IGJ1ZmZlciA9IFJBTURVTVBfRU1NQ19BRERSICsgcmFtZHVtcF9lbW1jX29mZnNldDsKKworCWlmIChyYW1kdW1wX2RldmljZV9maWxlX2NudCA+PSBSQU1EVU1QX0ZJTEVfTlVNX01BWCkKKwkJcmV0dXJuIC0xOworCisJd2hpbGUoMSl7CisJCWlmICgobXNnLT5jb3JlX2ZsYWcgPT0gMSkgJiYgKG1zZy0+cndfZmxhZyA9PSAyKSl7CisJCQlpZihtc2ctPnNpemUgPj0gKHJhbWR1bXBfZW1tY19zaXplIC0gZnAtPmZpbGVfZnBbcmFtZHVtcF9kZXZpY2VfZmlsZV9jbnRdLm9mZnNldCkpCisJCQkJcmV0dXJuIC0xOworCQkJcmV0ID0gbW1jX2J3cml0ZShidWZmZXIsIG1zZy0+c2l6ZSwgbXNnLT5idWYpOworCQkJcmFtZHVtcF9lbW1jX29mZnNldCA9IHJhbWR1bXBfZW1tY19vZmZzZXQgKyByb3VuZHVwKG1zZy0+c2l6ZSwgUkFNRFVNUF9FTU1DX0FMSUdOX1NJWkUpOworCQkJbXNnLT5jb3JlX2ZsYWcgPSAxOworCQkJbXNnLT5yd19mbGFnID0gMTsKKwkJCXJldCA9IG1zZy0+c2l6ZTsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UKKwkJCXJhbWR1bXBfd2FpdF9kZWxheSgwKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworaW50IHJhbWR1bXBfZW1tY19yZWFkKGNoYXIgKmJ1ZmZlciwgcmFtZHVtcF9zaG1lbV90ICptc2csIHVuc2lnbmVkIGludCBzaXplKQoreworCWludCByZXQgPSAwOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCByYW1kdW1wX2VtbWNfY2xvc2UocmFtZHVtcF9maWxlX3QgKmZwKQoreworCWZwLT5maWxlX3NpemUgPSByYW1kdW1wX2VtbWNfb2Zmc2V0OworCXJhbWR1bXBfZW1tY193cml0ZV9maWxlX2hlYWQoZnApOworCXJhbWR1bXBfcHJpbnRmKCJyYW1kdW1wIHRyYW5zIGVtbWMgZmluaXNoZWQhXG4iKTsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvdXBzdHJlYW0vbGludXgtNS4xMC9rZXJuZWwvcmFtZHVtcC9yYW1kdW1wX2VtbWMuaCBiL3Vwc3RyZWFtL2xpbnV4LTUuMTAva2VybmVsL3JhbWR1bXAvcmFtZHVtcF9lbW1jLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTAyOGFiMgotLS0gL2Rldi9udWxsCisrKyBiL3Vwc3RyZWFtL2xpbnV4LTUuMTAva2VybmVsL3JhbWR1bXAvcmFtZHVtcF9lbW1jLmgKQEAgLTAsMCArMSw3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogsObIqMv509AgKEMpMjAxNiwg1tDQy82o0ba5ybfd09DP3rmry76howorKiAKKyogzsS8/sP7s8Y6IHJhbWR1bXBfZW1tYy5oCisqIM7EvP6x6sq2OiByYW1kdW1wX2VtbWMuaAorKiDE2sjd1arSqjogcmFtZHVtcCBlbW1jzbfOxLz+CisqIMq508O3vbeoOiAjaW5jbHVkZSAicmFtZHVtcF9lbW1jLmgiCisqIAorKiDQ3rjEyNXG2iAgICAgICAgsOaxvrrFICAgICAg0N64xLHqvMcgICAgICAgINDeuMTIyyAgICAgICAgICDQ3rjExNrI3QorKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogMjAxNi8zLzEwICAgICAgVjEuMCAgICAgICAgQ3JlYXRlICAgICAgICAgICDV1L78v/wgICAgICAgICAgtLS9qAorKiAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1JBTURVTVBfRU1NQ19ICisjZGVmaW5lIF9SQU1EVU1QX0VNTUNfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgzbfOxLz+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAicmFtZHVtcC5oIgorI2luY2x1ZGUgPGxpbnV4L21tYy9tbWNfZnVuYy5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgzeKyv7Hkwb/J+cP3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gdW5zaWduZWQgaW50IHN5c2N0bF9yYW1kdW1wX2VtbWNfc3RhcnRfYWRkcjsKK2V4dGVybiB1bnNpZ25lZCBpbnQgc3lzY3RsX3JhbWR1bXBfZW1tY19zaXplOworZXh0ZXJuIHZvbGF0aWxlIHVuc2lnbmVkIGludCByYW1kdW1wX2VtbWNfb2Zmc2V0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAguuq2qNLlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFJBTURVTVBfRU1NQ19BRERSICAgICAgICAgKHN5c2N0bF9yYW1kdW1wX2VtbWNfc3RhcnRfYWRkciAqIDUxMikgCisjZGVmaW5lIFJBTURVTVBfVFJBTlNfRU1NQ19MRU4gICAgKHN5c2N0bF9yYW1kdW1wX2VtbWNfc2l6ZSAqIDUxMikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMr9vt3A4NDNtqjS5SAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyKu+1rHkwb/J+cP3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDIq77Wuq/K/cn5w/cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIHJhbWR1bXBfZW1tY19pbml0IC4KKyAqCisgKiBAcGFyYW0gdm9pZC4KKyAqCisgKiBAcmV0dXJuIGludC4KKyAqIEByZXR2YWwgc3RhbmRhcmQgZXJyb3IKKyAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciByYW1kdW1wIGluaXQKKyAqLworaW50IHJhbWR1bXBfZW1tY19pbml0KHJhbWR1bXBfZmlsZV90ICpmcCk7CitpbnQgcmFtZHVtcF9lbW1jX3dyaXRlX2ZpbGUoY2hhciAqZmlsZV9uYW1lLCB1bnNpZ25lZCBpbnQgZmlsZV9zaXplLCByYW1kdW1wX2ZpbGVfdCAqZnApOworaW50IHJhbWR1bXBfZW1tY193cml0ZV9maWxlX2hlYWQocmFtZHVtcF9maWxlX3QgKmZwKTsKK2ludCByYW1kdW1wX2VtbWNfbW9kaWZ5X2ZpbGVfc2l6ZShyYW1kdW1wX2ZpbGVfdCAqZnAsIHVuc2lnbmVkIGludCBmaWxlX3NpemUpOworaW50IHJhbWR1bXBfZW1tY193cml0ZV9kYXRhKHJhbWR1bXBfc2htZW1fdCAqbXNnLCByYW1kdW1wX2ZpbGVfdCAqZnAsIHVuc2lnbmVkIGludCBzaXplKTsKK2ludCByYW1kdW1wX2VtbWNfd3JpdGVfbG9nYnVmKHJhbWR1bXBfZmlsZV90ICpmcCk7Cit2b2lkIHJhbWR1bXBfZW1tY19jbG9zZShyYW1kdW1wX2ZpbGVfdCAqZnApOworaW50IHJhbWR1bXBfZW1tY193cml0ZV9sb2dfdHh0KHJhbWR1bXBfZmlsZV90ICpmcCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDE2sGquq/K/cq1z9YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2VuZGlmICAvLyNpZm5kZWYgX1JBTURVTVBfRU1NQ19ICisKZGlmZiAtLWdpdCBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAva2VybmVsL3RyYWNrZXIuYyBiL3Vwc3RyZWFtL2xpbnV4LTUuMTAva2VybmVsL3RyYWNrZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZjdlMWFiCi0tLSAvZGV2L251bGwKKysrIGIvdXBzdHJlYW0vbGludXgtNS4xMC9rZXJuZWwvdHJhY2tlci5jCkBAIC0wLDAgKzEsNDU5IEBACisvKgorICogdHJhY2tlci5jIC0gU3lzdGVtIGFjY291bnRpbmcgb3ZlciB0YXNrc3RhdHMgaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IChDKSBKYXkgTGFuLAk8amxhbkBzZ2kuY29tPgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC9jbG9jay5oPgorI2luY2x1ZGUgInJhbV9jb25maWcuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILrqtqjS5SAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBfT1NfTElOVVggICAgICAgICAgICAgICAgICAgIDEKKworI2lmIGRlZmluZWQoX09TX1RPUykKKyMgZGVmaW5lIE9TX1NUQVRJU1RJQ19JUkFNX0JBU0UgICAgKElSQU1fQkFTRV9BRERSX09TX1NUQVRJU1RJQ19QU0NQVSkKKyMgZGVmaW5lIE9TX1NUQVRJU1RJQ19USU1FICAgICAgICAgekRydlRpbWVyX1N0YW1wKCkKKyNlbGlmIGRlZmluZWQoX09TX0xJTlVYKQorIyBkZWZpbmUgT1NfU1RBVElTVElDX0lSQU1fQkFTRSAgICBnX3p4aWNfdHJhY2VfYXBjcHVfYWRkciAvLyhJUkFNX0JBU0VfQUREUl9PU19TVEFUSVNUSUNfQVBDUFUpCisjIGRlZmluZSBPU19TVEFUSVNUSUNfVElNRSAgICAgICAgIChjcHVfY2xvY2soMCk+PjEwKQorI2Vsc2UKKyMgZXJyb3IgInVua25vd24gb3MiCisjZW5kaWYKKworCisKKyNkZWZpbmUgT1NfSVJBTV9TVEFUSVNUSUNfQ05UICAgICAgICAgKDUpCisjZGVmaW5lIE9TX0lSQU1fU1RBVElTVElDX05BTUVfTEVOICAgICgxNikKKyNkZWZpbmUgT1NfRERSX1NUQVRJU1RJQ19DTlQgICAgICAgICAgKDEwMDApCisKKyNkZWZpbmUgT1NfSVJBTV9USFJFQURfU1dBUElOICAgICAgKE9TX1NUQVRJU1RJQ19JUkFNX0JBU0UpCisjZGVmaW5lIE9TX0lSQU1fSVJRX1NUQVJUICAgICAgICAgIChPU19JUkFNX1RIUkVBRF9TV0FQSU4gKyBzaXplb2YodF9vc19pcmFtX3RocmVhZF9zdGF0aXN0aWMpKQorI2RlZmluZSBPU19JUkFNX0lSUV9FTkQgICAgICAgICAgICAoT1NfSVJBTV9JUlFfU1RBUlQgKyBzaXplb2YodF9vc19pcmFtX3N0YXRpc3RpYykpCisKKyNpZiBkZWZpbmVkKF9PU19UT1MpCisjZGVmaW5lIE9TX0lSQU1fRFNSX1NUQVJUICAgICAgICAgIChPU19JUkFNX0lSUV9FTkQgKyBzaXplb2YodF9vc19pcmFtX3N0YXRpc3RpYykpCisjZGVmaW5lIE9TX0lSQU1fRFNSX0VORCAgICAgICAgICAgIChPU19JUkFNX0RTUl9TVEFSVCArIHNpemVvZih0X29zX2lyYW1fc3RhdGlzdGljKSkKKyNlbGlmIGRlZmluZWQoX09TX0xJTlVYKQorI2RlZmluZSBPU19JUkFNX1NPRlRJUlFfU1RBUlQgICAgICAoT1NfSVJBTV9JUlFfRU5EICsgc2l6ZW9mKHRfb3NfaXJhbV9zdGF0aXN0aWMpKQorI2RlZmluZSBPU19JUkFNX1NPRlRJUlFfRU5EICAgICAgICAoT1NfSVJBTV9TT0ZUSVJRX1NUQVJUICsgc2l6ZW9mKHRfb3NfaXJhbV9zdGF0aXN0aWMpKQorI2RlZmluZSBPU19JUkFNX1RJTUVSX1NUQVJUICAgICAgICAoT1NfSVJBTV9TT0ZUSVJRX0VORCArIHNpemVvZih0X29zX2lyYW1fc3RhdGlzdGljKSkKKyNkZWZpbmUgT1NfSVJBTV9USU1FUl9FTkQgICAgICAgICAgKE9TX0lSQU1fVElNRVJfU1RBUlQgKyBzaXplb2YodF9vc19pcmFtX3N0YXRpc3RpYykpCisjZW5kaWYKKworI2RlZmluZSBvc19zdGF0aXN0aWNfY2hlY2soKSAgICAgICAqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopT1NfU1RBVElTVElDX0lSQU1fQkFTRSkKKyNkZWZpbmUgb3Nfc3RhdGlzdGljX2VuYWJsZWQoKSAgICAgZ19vc19zdGF0aXN0aWNfZW5hYmxlIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyv2+3b3hubm2qNLlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCB7CisgICAgdW5zaWduZWQgaW50IGNudDsKKyAgICB1bnNpZ25lZCBpbnQgaW5kZXg7CisgICAgc3RydWN0IHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBuYW1lW09TX0lSQU1fU1RBVElTVElDX05BTUVfTEVOXTsKKyAgICAgICAgdW5zaWduZWQgaW50IGRhdGEyOworICAgIH0gc3RhdGlzdGljc1tPU19JUkFNX1NUQVRJU1RJQ19DTlRdOworfXRfb3NfaXJhbV90aHJlYWRfc3RhdGlzdGljOworCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCB7CisgICAgdW5zaWduZWQgaW50IGNudDsKKyAgICB1bnNpZ25lZCBpbnQgaW5kZXg7CisgICAgc3RydWN0IHsKKyAgICAgICAgdW5zaWduZWQgaW50IGRhdGExOworICAgICAgICB1bnNpZ25lZCBpbnQgZGF0YTI7CisgICAgfSBzdGF0aXN0aWNzW09TX0lSQU1fU1RBVElTVElDX0NOVF07Cit9dF9vc19pcmFtX3N0YXRpc3RpYzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCBjbnQ7CisgICAgdW5zaWduZWQgaW50IGluZGV4OworICAgIHN0cnVjdCB7CisgICAgICAgIHVuc2lnbmVkIGludCBkYXRhMTsKKyAgICAgICAgdW5zaWduZWQgaW50IGRhdGEyOworICAgIH0gc3RhdGlzdGljc1tPU19ERFJfU1RBVElTVElDX0NOVF07Cit9dF9vc19kZHJfc3RhdGlzdGljOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyKu+1rHkwb8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZChfT1NfTElOVVgpCit2b2xhdGlsZSAgc3RhdGljIGNoYXIgKmdfenhpY190cmFjZV9hcGNwdV9hZGRyOworI2VuZGlmCisKK3ZvbGF0aWxlICBzdGF0aWMgaW50IGdfb3Nfc3RhdGlzdGljX2VuYWJsZTsKK3ZvbGF0aWxlICBzdGF0aWMgdW5zaWduZWQgaW50IGdfb3Nfc3RhdGlzdGljX2NudDsKKwordm9sYXRpbGUgIHN0YXRpYyB0X29zX2lyYW1fdGhyZWFkX3N0YXRpc3RpYyAqZ19vc19pcmFtX3N3YXBpbl9zdGF0aXN0aWM7Cit2b2xhdGlsZSAgc3RhdGljIHRfb3NfaXJhbV9zdGF0aXN0aWMgICAgICAgICpnX29zX2lyYW1faXJxX3N0YXJ0X3N0YXRpc3RpYzsKK3ZvbGF0aWxlICBzdGF0aWMgdF9vc19pcmFtX3N0YXRpc3RpYyAgICAgICAgKmdfb3NfaXJhbV9pcnFfZW5kX3N0YXRpc3RpYzsKKworI2lmIGRlZmluZWQoX09TX1RPUykKK3N0YXRpYyB0X29zX2lyYW1fc3RhdGlzdGljICpnX29zX2lyYW1fZHNyX3N0YXJ0X3N0YXRpc3RpYzsKK3N0YXRpYyB0X29zX2lyYW1fc3RhdGlzdGljICpnX29zX2lyYW1fZHNyX2VuZF9zdGF0aXN0aWM7CisjZWxpZiBkZWZpbmVkKF9PU19MSU5VWCkKK3ZvbGF0aWxlICBzdGF0aWMgdF9vc19pcmFtX3N0YXRpc3RpYyAqZ19vc19pcmFtX3NvZnRpcnFfc3RhcnRfc3RhdGlzdGljOwordm9sYXRpbGUgIHN0YXRpYyB0X29zX2lyYW1fc3RhdGlzdGljICpnX29zX2lyYW1fc29mdGlycV9lbmRfc3RhdGlzdGljOwordm9sYXRpbGUgIHN0YXRpYyB0X29zX2lyYW1fc3RhdGlzdGljICpnX29zX2lyYW1fdGltZXJfc3RhcnRfc3RhdGlzdGljOwordm9sYXRpbGUgIHN0YXRpYyB0X29zX2lyYW1fc3RhdGlzdGljICpnX29zX2lyYW1fdGltZXJfZW5kX3N0YXRpc3RpYzsKKyNlbmRpZgorCit2b2xhdGlsZSAgc3RhdGljIHRfb3NfZGRyX3N0YXRpc3RpYyAqZ19vc19kZHJfc3dhcGluX3N0YXRpc3RpYzsKK3ZvbGF0aWxlICBzdGF0aWMgdF9vc19kZHJfc3RhdGlzdGljICpnX29zX2Rkcl9pcnFfc3RhcnRfc3RhdGlzdGljOwordm9sYXRpbGUgIHN0YXRpYyB0X29zX2Rkcl9zdGF0aXN0aWMgKmdfb3NfZGRyX2lycV9lbmRfc3RhdGlzdGljOworCisjaWYgZGVmaW5lZChfT1NfVE9TKQorc3RhdGljIHRfb3NfZGRyX3N0YXRpc3RpYyAqZ19vc19kZHJfZHNyX3N0YXJ0X3N0YXRpc3RpYzsKK3N0YXRpYyB0X29zX2Rkcl9zdGF0aXN0aWMgKmdfb3NfZGRyX2Rzcl9lbmRfc3RhdGlzdGljOworI2VsaWYgZGVmaW5lZChfT1NfTElOVVgpCit2b2xhdGlsZSAgc3RhdGljIHRfb3NfZGRyX3N0YXRpc3RpYyAqZ19vc19kZHJfc29mdGlycV9zdGFydF9zdGF0aXN0aWM7Cit2b2xhdGlsZSAgc3RhdGljIHRfb3NfZGRyX3N0YXRpc3RpYyAqZ19vc19kZHJfc29mdGlycV9lbmRfc3RhdGlzdGljOwordm9sYXRpbGUgIHN0YXRpYyB0X29zX2Rkcl9zdGF0aXN0aWMgKmdfb3NfZGRyX3RpbWVyX3N0YXJ0X3N0YXRpc3RpYzsKK3ZvbGF0aWxlICBzdGF0aWMgdF9vc19kZHJfc3RhdGlzdGljICpnX29zX2Rkcl90aW1lcl9lbmRfc3RhdGlzdGljOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDIq77Wuq/K/cn5w/cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgb3Nfc3RhdGlzdGljX2VuYWJsZSh2b2lkKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICC+1rK/uq/K/SAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqILmmxNzD6Mr2OiAgICAguey8o82zvMa1vUlSQU0KKyogss7K/cu1w/c6ICAgICAKKyogICAotKvI67LOyv0pICBpcmFtX2FkZHI6ILXY1rcgCisgICAgICAgICAgICAgICAgZGF0YTogICAgICDKwrz+z+4KKyAgICAgICAgICAgICAgICB0aW1lOiAgICAgIMqxvOQKKyogICAotKuz9rLOyv0pICB2b2lkCisqILe1ILvYINa1OiAgICAgdm9pZAorKiDG5Mv8y7XD9zogICAgIM7eCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkIG9zX3N0YXRpc3RpY19pbl9pcmFtKHZvbGF0aWxlIHZvaWQgKmlyYW1fYWRkciwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyB0aW1lKQoreworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgaW5kZXg7CisgICAgdF9vc19pcmFtX3N0YXRpc3RpYyAqaXJhbTsKKworICAgIGlyYW0gPSAodF9vc19pcmFtX3N0YXRpc3RpYyAqKWlyYW1fYWRkcjsKKyAgICAKKyAgICBpbmRleCA9IGlyYW0tPmluZGV4OworICAgIGlmKGluZGV4ID49IE9TX0lSQU1fU1RBVElTVElDX0NOVCkKKyAgICB7CisgICAgICAgIGluZGV4ID0gMDsKKyAgICB9CisKKyAgICBpcmFtLT5zdGF0aXN0aWNzW2luZGV4XS5kYXRhMSA9ICh1bnNpZ25lZCBpbnQpZGF0YTsKKyAgICBpcmFtLT5zdGF0aXN0aWNzW2luZGV4XS5kYXRhMiA9IHRpbWU7CisgICAgaW5kZXgrKzsKKworICAgIGlyYW0tPmluZGV4ID0gaW5kZXg7CisgICAgaXJhbS0+Y250ID0gZ19vc19zdGF0aXN0aWNfY250OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiC5psTcw+jK9jogICAgIM/fs8y57LyjzbO8xrW9SVJBTQorKiCyzsr9y7XD9zogICAgIAorKiAgICi0q8jrss7K/SkgIGlyYW1fYWRkcjogtdjWtyAKKyAgICAgICAgICAgICAgICBkYXRhOiAgICAgIMrCvP7P7gorICAgICAgICAgICAgICAgIHRpbWU6ICAgICAgyrG85AorKiAgICi0q7P2ss7K/SkgIHZvaWQKKyogt7Ugu9gg1rU6ICAgICB2b2lkCisqIMbky/zLtcP3OiAgICAgzt4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgb3Nfc3RhdGlzdGljX3RocmVhZF9pbl9pcmFtKHZvbGF0aWxlIHZvaWQgKmlyYW1fYWRkciwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyB0aW1lKQoreworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgIGluZGV4OworICAgIHRfb3NfaXJhbV90aHJlYWRfc3RhdGlzdGljICppcmFtOworCisgICAgaXJhbSA9ICh0X29zX2lyYW1fdGhyZWFkX3N0YXRpc3RpYyAqKWlyYW1fYWRkcjsKKyAgICAKKyAgICBpbmRleCA9IGlyYW0tPmluZGV4OworICAgIGlmKGluZGV4ID49IE9TX0lSQU1fU1RBVElTVElDX0NOVCkKKyAgICB7CisgICAgICAgIGluZGV4ID0gMDsKKyAgICB9CisKKyNpZiBkZWZpbmVkKF9PU19UT1MpCisgICAgc3RybmNweSgoY2hhciAqKShpcmFtLT5zdGF0aXN0aWNzW2luZGV4XS5uYW1lKSwgY3lnX3RocmVhZF9nZXRfbmFtZSgoY3lnX2hhbmRsZV90KWRhdGEpLCBPU19JUkFNX1NUQVRJU1RJQ19OQU1FX0xFTiAtIDEpOworI2VsaWYgZGVmaW5lZChfT1NfTElOVVgpCisgICAgc3RybmNweSgoY2hhciAqKShpcmFtLT5zdGF0aXN0aWNzW2luZGV4XS5uYW1lKSwgKChzdHJ1Y3QgdGFza19zdHJ1Y3QgKilkYXRhKS0+Y29tbSwgT1NfSVJBTV9TVEFUSVNUSUNfTkFNRV9MRU4gLSAxKTsKKyNlbHNlCisjIGVycm9yICJ1bmtvd24gb3MiCisjZW5kaWYKKyAgICBpcmFtLT5zdGF0aXN0aWNzW2luZGV4XS5uYW1lW09TX0lSQU1fU1RBVElTVElDX05BTUVfTEVOIC0gMV0gPSAwOworICAgIGlyYW0tPnN0YXRpc3RpY3NbaW5kZXhdLmRhdGEyID0gdGltZTsKKyAgICBpbmRleCsrOworCisgICAgaXJhbS0+aW5kZXggPSBpbmRleDsKKyAgICBpcmFtLT5jbnQgPSBnX29zX3N0YXRpc3RpY19jbnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqILmmxNzD6Mr2OiAgICAguey8o82zvMa1vUREUgorKiCyzsr9y7XD9zogICAgIAorKiAgICi0q8jrss7K/SkgIGlyYW1fYWRkcjogtdjWtyAKKyAgICAgICAgICAgICAgICBkYXRhOiAgICAgIMrCvP7P7gorICAgICAgICAgICAgICAgIHRpbWU6ICAgICAgyrG85AorKiAgICi0q7P2ss7K/SkgIHZvaWQKKyogt7Ugu9gg1rU6ICAgICB2b2lkCisqIMbky/zLtcP3OiAgICAgzt4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgb3Nfc3RhdGlzdGljX2luX2Rkcih2b2lkICpkZHJfYWRkciwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyB0aW1lKQoreworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgIGluZGV4OworICAgIHRfb3NfZGRyX3N0YXRpc3RpYyAgICAgICAgICpkZHI7CisKKyAgICBkZHIgID0gKHRfb3NfZGRyX3N0YXRpc3RpYyAqKWRkcl9hZGRyOworICAgIAorICAgIGluZGV4ID0gZGRyLT5pbmRleDsKKyAgICBpZiAoaW5kZXggPj0gT1NfRERSX1NUQVRJU1RJQ19DTlQpCisgICAgeworICAgICAgICBpbmRleCA9IDA7CisgICAgfQorICAgIGRkci0+c3RhdGlzdGljc1tpbmRleF0uZGF0YTEgPSAodW5zaWduZWQgaW50KWRhdGE7CisgICAgZGRyLT5zdGF0aXN0aWNzW2luZGV4XS5kYXRhMiA9IHRpbWU7CisgICAgaW5kZXgrKzsKKworICAgIGRkci0+aW5kZXggPSBpbmRleDsKKyAgICBkZHItPmNudCAgID0gZ19vc19zdGF0aXN0aWNfY250OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiC5psTcw+jK9jogICAgILnsvKPNs7zGtb1ERFIKKyogss7K/cu1w/c6ICAgICAKKyogICAotKvI67LOyv0pICBpcmFtX2FkZHI6ILXY1rcgCisgICAgICAgICAgICAgICAgZGF0YTogICAgICDKwrz+z+4KKyAgICAgICAgICAgICAgICB0aW1lOiAgICAgIMqxvOQKKyogICAotKuz9rLOyv0pICB2b2lkCisqILe1ILvYINa1OiAgICAgdm9pZAorKiDG5Mv8y7XD9zogICAgIM7eCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkIG9zX3N0YXRpc3RpY19pbmZvX3VwZGF0ZSh2b2lkKQoreworICAgIGdfb3Nfc3RhdGlzdGljX2NudCsrOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiC5psTcw+jK9jogICAgILaoyrHG97vYtfe5s9fTCisqILLOyv3LtcP3OiAgICAgCisqICAgKLSryOuyzsr9KSAgCisqICAgKLSrs/ayzsr9KSAgdm9pZAorKiC3tSC72CDWtTogICAgIHZvaWQKKyogxuTL/Mu1w/c6ICAgICDO3gorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgb3Nfc3RhdGlzdGljX2RlbGF5ZWRfd29ya190aW1lcl9mbih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisgICAgaW50IHNlYyA9IDA7CisgICAgbXNsZWVwKDIwMDAwKTsKKyAgICB3aGlsZSghb3Nfc3RhdGlzdGljX2NoZWNrKCkpCisgICAgeworICAgICAgICAvL7Osuf00MHOjrNaxvdPNy7P2CisgICAgICAgIGlmKHNlYyA+PSA0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG1zbGVlcCgxMDAwMCk7CisgICAgICAgIHNlYysrOworICAgIH0KKyAgICBvc19zdGF0aXN0aWNfZW5hYmxlKCk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyKu+1rqvyv3Ktc/WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqILmmxNzD6Mr2OiAgICAgyrnE3LnsvKPNs7zGuabE3AorKiCyzsr9y7XD9zogICAgIAorKiAgICi0q8jrss7K/SkgIGFkZHJlc3M6ILzHwry1vUlSQU3W0LXEtdjWtyAKKyAgICAgICAgICAgICAgICBzaXplOiAgICBJUkFNv9W85LTz0KEKKyogICAotKuz9rLOyv0pICB2b2lkCisqILe1ILvYINa1OiAgICAgdm9pZAorKiDG5Mv8y7XD9zogICAgIM7eCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBvc19zdGF0aXN0aWNfZW5hYmxlKHZvaWQpCit7CisjaWYgZGVmaW5lZChfT1NfVE9TKQorICAgIGdfb3NfaXJhbV9zd2FwaW5fc3RhdGlzdGljICAgICAgICA9ICh0X29zX2lyYW1fdGhyZWFkX3N0YXRpc3RpYyAqKU9TX0lSQU1fVEhSRUFEX1NXQVBJTjsKKyAgICBnX29zX2lyYW1faXJxX3N0YXJ0X3N0YXRpc3RpYyAgICAgPSAodF9vc19pcmFtX3N0YXRpc3RpYyAqKU9TX0lSQU1fSVJRX1NUQVJUOworICAgIGdfb3NfaXJhbV9pcnFfZW5kX3N0YXRpc3RpYyAgICAgICA9ICh0X29zX2lyYW1fc3RhdGlzdGljICopT1NfSVJBTV9JUlFfRU5EOworICAgIGdfb3NfaXJhbV9kc3Jfc3RhcnRfc3RhdGlzdGljICAgICA9ICh0X29zX2lyYW1fc3RhdGlzdGljICopT1NfSVJBTV9EU1JfU1RBUlQ7CisgICAgZ19vc19pcmFtX2Rzcl9lbmRfc3RhdGlzdGljICAgICAgID0gKHRfb3NfaXJhbV9zdGF0aXN0aWMgKilPU19JUkFNX0RTUl9FTkQ7CisKKyAgICBnX29zX2Rkcl9zd2FwaW5fc3RhdGlzdGljICAgICAgICAgPSAodF9vc19kZHJfc3RhdGlzdGljICopek9zc19NYWxsb2Moc2l6ZW9mKHRfb3NfZGRyX3N0YXRpc3RpYykpOworICAgIGdfb3NfZGRyX2lycV9zdGFydF9zdGF0aXN0aWMgICAgICA9ICh0X29zX2Rkcl9zdGF0aXN0aWMgKil6T3NzX01hbGxvYyhzaXplb2YodF9vc19kZHJfc3RhdGlzdGljKSk7CisgICAgZ19vc19kZHJfaXJxX2VuZF9zdGF0aXN0aWMgICAgICAgID0gKHRfb3NfZGRyX3N0YXRpc3RpYyAqKXpPc3NfTWFsbG9jKHNpemVvZih0X29zX2Rkcl9zdGF0aXN0aWMpKTsKKyAgICBnX29zX2Rkcl9kc3Jfc3RhcnRfc3RhdGlzdGljICAgICAgPSAodF9vc19kZHJfc3RhdGlzdGljICopek9zc19NYWxsb2Moc2l6ZW9mKHRfb3NfZGRyX3N0YXRpc3RpYykpOworICAgIGdfb3NfZGRyX2Rzcl9lbmRfc3RhdGlzdGljICAgICAgICA9ICh0X29zX2Rkcl9zdGF0aXN0aWMgKil6T3NzX01hbGxvYyhzaXplb2YodF9vc19kZHJfc3RhdGlzdGljKSk7CisjZWxpZiBkZWZpbmVkKF9PU19MSU5VWCkKKyAgICBnX29zX2lyYW1fc3dhcGluX3N0YXRpc3RpYyAgICAgICAgPSAodF9vc19pcmFtX3RocmVhZF9zdGF0aXN0aWMgKilPU19JUkFNX1RIUkVBRF9TV0FQSU47ICAgIAorICAgIGdfb3NfaXJhbV9pcnFfc3RhcnRfc3RhdGlzdGljICAgICA9ICh0X29zX2lyYW1fc3RhdGlzdGljICopT1NfSVJBTV9JUlFfU1RBUlQ7ICAgIAorICAgIGdfb3NfaXJhbV9pcnFfZW5kX3N0YXRpc3RpYyAgICAgICA9ICh0X29zX2lyYW1fc3RhdGlzdGljICopT1NfSVJBTV9JUlFfRU5EOyAgICAKKyAgICBnX29zX2lyYW1fc29mdGlycV9zdGFydF9zdGF0aXN0aWMgPSAodF9vc19pcmFtX3N0YXRpc3RpYyAqKU9TX0lSQU1fU09GVElSUV9TVEFSVDsgICAgCisgICAgZ19vc19pcmFtX3NvZnRpcnFfZW5kX3N0YXRpc3RpYyAgID0gKHRfb3NfaXJhbV9zdGF0aXN0aWMgKilPU19JUkFNX1NPRlRJUlFfRU5EOyAgICAKKyAgICBnX29zX2lyYW1fdGltZXJfc3RhcnRfc3RhdGlzdGljICAgPSAodF9vc19pcmFtX3N0YXRpc3RpYyAqKU9TX0lSQU1fVElNRVJfU1RBUlQ7ICAgIAorICAgIGdfb3NfaXJhbV90aW1lcl9lbmRfc3RhdGlzdGljICAgICA9ICh0X29zX2lyYW1fc3RhdGlzdGljICopT1NfSVJBTV9USU1FUl9FTkQ7CisKKyAgICBnX29zX2Rkcl9zd2FwaW5fc3RhdGlzdGljICAgICAgICAgPSAodF9vc19kZHJfc3RhdGlzdGljICopa21hbGxvYyhzaXplb2YodF9vc19kZHJfc3RhdGlzdGljKSwgR0ZQX0tFUk5FTCk7CisgICAgZ19vc19kZHJfaXJxX3N0YXJ0X3N0YXRpc3RpYyAgICAgID0gKHRfb3NfZGRyX3N0YXRpc3RpYyAqKWttYWxsb2Moc2l6ZW9mKHRfb3NfZGRyX3N0YXRpc3RpYyksIEdGUF9LRVJORUwpOworICAgIGdfb3NfZGRyX2lycV9lbmRfc3RhdGlzdGljICAgICAgICA9ICh0X29zX2Rkcl9zdGF0aXN0aWMgKilrbWFsbG9jKHNpemVvZih0X29zX2Rkcl9zdGF0aXN0aWMpLCBHRlBfS0VSTkVMKTsKKyAgICBnX29zX2Rkcl9zb2Z0aXJxX3N0YXJ0X3N0YXRpc3RpYyAgPSAodF9vc19kZHJfc3RhdGlzdGljICopa21hbGxvYyhzaXplb2YodF9vc19kZHJfc3RhdGlzdGljKSwgR0ZQX0tFUk5FTCk7CisgICAgZ19vc19kZHJfc29mdGlycV9lbmRfc3RhdGlzdGljICAgID0gKHRfb3NfZGRyX3N0YXRpc3RpYyAqKWttYWxsb2Moc2l6ZW9mKHRfb3NfZGRyX3N0YXRpc3RpYyksIEdGUF9LRVJORUwpOworICAgIGdfb3NfZGRyX3RpbWVyX3N0YXJ0X3N0YXRpc3RpYyAgICA9ICh0X29zX2Rkcl9zdGF0aXN0aWMgKilrbWFsbG9jKHNpemVvZih0X29zX2Rkcl9zdGF0aXN0aWMpLCBHRlBfS0VSTkVMKTsKKyAgICBnX29zX2Rkcl90aW1lcl9lbmRfc3RhdGlzdGljICAgICAgPSAodF9vc19kZHJfc3RhdGlzdGljICopa21hbGxvYyhzaXplb2YodF9vc19kZHJfc3RhdGlzdGljKSwgR0ZQX0tFUk5FTCk7CisKKyNlbHNlCisjIGVycm9yICJ1bmtvd24gb3MiCisjZW5kaWYKKyAgICBpZiAoKHVuc2lnbmVkIGludCApZ19vc19pcmFtX3RpbWVyX2VuZF9zdGF0aXN0aWMgLSAodW5zaWduZWQgaW50IClnX29zX2lyYW1fc3dhcGluX3N0YXRpc3RpYyA+ICh1bnNpZ25lZCBpbnQgKUlSQU1fQkFTRV9MRU5fT1NfU1RBVElTVElDX1BTQ1BVICkKKyAgICB7CisgICAgICAgIEJVRygpOworICAgIH0KKyAgICBnX29zX3N0YXRpc3RpY19lbmFibGUgPSAxOworfQorRVhQT1JUX1NZTUJPTChvc19zdGF0aXN0aWNfZW5hYmxlKTsKKwordm9pZCB6eGljX3RyYWNlX3Rhc2tfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWU7CisgICAgaWYgKCFnX29zX3N0YXRpc3RpY19lbmFibGUpCisgICAgICAgIHJldHVybiA7CisKKyAgICB0aW1lID0gT1NfU1RBVElTVElDX1RJTUU7CisgICAgb3Nfc3RhdGlzdGljX3RocmVhZF9pbl9pcmFtKGdfb3NfaXJhbV9zd2FwaW5fc3RhdGlzdGljLCBuZXh0LCB0aW1lKTsKKyAgICBvc19zdGF0aXN0aWNfaW5fZGRyKGdfb3NfZGRyX3N3YXBpbl9zdGF0aXN0aWMsIG5leHQsIHRpbWUpOworICAgIG9zX3N0YXRpc3RpY19pbmZvX3VwZGF0ZSgpOworfQorCit2b2lkIHp4aWNfdHJhY2VfaXJxX2VudGVyKHUzMiBpcnEpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lOworICAgIGlmICghZ19vc19zdGF0aXN0aWNfZW5hYmxlKQorICAgICAgICByZXR1cm4gOworCisgICAgdGltZSA9IE9TX1NUQVRJU1RJQ19USU1FOworICAgIG9zX3N0YXRpc3RpY19pbl9pcmFtKGdfb3NfaXJhbV9pcnFfc3RhcnRfc3RhdGlzdGljLCBpcnEsIHRpbWUpOworICAgIG9zX3N0YXRpc3RpY19pbl9kZHIoZ19vc19kZHJfaXJxX3N0YXJ0X3N0YXRpc3RpYywgaXJxLCB0aW1lKTsKKyAgICBvc19zdGF0aXN0aWNfaW5mb191cGRhdGUoKTsKK30KKwordm9pZCB6eGljX3RyYWNlX2lycV9leGl0KHUzMiBpcnEpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lOworICAgIGlmICghZ19vc19zdGF0aXN0aWNfZW5hYmxlKQorICAgICAgICByZXR1cm4gOworCisgICAgdGltZSA9IE9TX1NUQVRJU1RJQ19USU1FOworICAgIG9zX3N0YXRpc3RpY19pbl9pcmFtKGdfb3NfaXJhbV9pcnFfZW5kX3N0YXRpc3RpYywgaXJxLCB0aW1lKTsKKyAgICBvc19zdGF0aXN0aWNfaW5fZGRyKGdfb3NfZGRyX2lycV9lbmRfc3RhdGlzdGljLCBpcnEsIHRpbWUpOworICAgIG9zX3N0YXRpc3RpY19pbmZvX3VwZGF0ZSgpOworfQorCit2b2lkIHp4aWNfdHJhY2Vfc29mdGlycV9lbnRlcih1MzIgdmVjX25yKQoreworCXVuc2lnbmVkIGxvbmcgdGltZTsKKyAgICBpZiAoIWdfb3Nfc3RhdGlzdGljX2VuYWJsZSkKKyAgICAgICAgcmV0dXJuIDsKKworICAgIHRpbWUgPSBPU19TVEFUSVNUSUNfVElNRTsKKyAgICBvc19zdGF0aXN0aWNfaW5faXJhbShnX29zX2lyYW1fc29mdGlycV9zdGFydF9zdGF0aXN0aWMsIHZlY19uciwgdGltZSk7CisgICAgb3Nfc3RhdGlzdGljX2luX2RkcihnX29zX2Rkcl9zb2Z0aXJxX3N0YXJ0X3N0YXRpc3RpYywgdmVjX25yLCB0aW1lKTsKKyAgICBvc19zdGF0aXN0aWNfaW5mb191cGRhdGUoKTsKK30KKwordm9pZCB6eGljX3RyYWNlX3NvZnRpcnFfZXhpdCh1MzIgdmVjX25yKQoreworCXVuc2lnbmVkIGxvbmcgdGltZTsKKyAgICBpZiAoIWdfb3Nfc3RhdGlzdGljX2VuYWJsZSkKKyAgICAgICAgcmV0dXJuIDsKKworICAgIHRpbWUgPSBPU19TVEFUSVNUSUNfVElNRTsKKyAgICBvc19zdGF0aXN0aWNfaW5faXJhbShnX29zX2lyYW1fc29mdGlycV9lbmRfc3RhdGlzdGljLCB2ZWNfbnIsIHRpbWUpOworICAgIG9zX3N0YXRpc3RpY19pbl9kZHIoZ19vc19kZHJfc29mdGlycV9lbmRfc3RhdGlzdGljLCB2ZWNfbnIsIHRpbWUpOworICAgIG9zX3N0YXRpc3RpY19pbmZvX3VwZGF0ZSgpOworfQorCit2b2lkIHp4aWNfdHJhY2VfdGltZXJfZW50ZXIodm9pZCAqZnVuYykKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWU7CisgICAgaWYgKCFnX29zX3N0YXRpc3RpY19lbmFibGUpCisgICAgICAgIHJldHVybiA7CisKKyAgICB0aW1lID0gT1NfU1RBVElTVElDX1RJTUU7CisgICAgb3Nfc3RhdGlzdGljX2luX2lyYW0oZ19vc19pcmFtX3RpbWVyX3N0YXJ0X3N0YXRpc3RpYywgZnVuYywgdGltZSk7CisgICAgb3Nfc3RhdGlzdGljX2luX2RkcihnX29zX2Rkcl90aW1lcl9zdGFydF9zdGF0aXN0aWMsIGZ1bmMsIHRpbWUpOworICAgIG9zX3N0YXRpc3RpY19pbmZvX3VwZGF0ZSgpOworfQorCit2b2lkIHp4aWNfdHJhY2VfdGltZXJfZXhpdCh2b2lkICpmdW5jKQoreworCXVuc2lnbmVkIGxvbmcgdGltZTsKKyAgICBpZiAoIWdfb3Nfc3RhdGlzdGljX2VuYWJsZSkKKyAgICAgICAgcmV0dXJuIDsKKworICAgIHRpbWUgPSBPU19TVEFUSVNUSUNfVElNRTsKKyAgICBvc19zdGF0aXN0aWNfaW5faXJhbShnX29zX2lyYW1fdGltZXJfZW5kX3N0YXRpc3RpYywgZnVuYywgdGltZSk7CisgICAgb3Nfc3RhdGlzdGljX2luX2RkcihnX29zX2Rkcl90aW1lcl9lbmRfc3RhdGlzdGljLCBmdW5jLCB0aW1lKTsKKyAgICBvc19zdGF0aXN0aWNfaW5mb191cGRhdGUoKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiC5psTcw+jK9jogICAgILnsvKPNs7zGtb1ERFIKKyogss7K/cu1w/c6ICAgICAKKyogICAotKvI67LOyv0pICBpcmFtX2FkZHI6ILXY1rcgCisgICAgICAgICAgICAgICAgZGF0YTogICAgICDKwrz+z+4KKyAgICAgICAgICAgICAgICB0aW1lOiAgICAgIMqxvOQKKyogICAotKuz9rLOyv0pICB2b2lkCisqILe1ILvYINa1OiAgICAgdm9pZAorKiDG5Mv8y7XD9zogICAgIM7eCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IF9faW5pdCB6eGljX2VuYWJsZV90cmFjZXIodm9pZCkKK3sKKyAgICBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKyAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisKKyNpZmRlZiBJUkFNX0JBU0VfQUREUl9WQQorICAgIGdfenhpY190cmFjZV9hcGNwdV9hZGRyID0gSVJBTV9CQVNFX0FERFJfT1NfU1RBVElTVElDX1BTQ1BVOworI2Vsc2UKKyAgICBnX3p4aWNfdHJhY2VfYXBjcHVfYWRkciA9IGlvcmVtYXAoSVJBTV9CQVNFX0FERFJfT1NfU1RBVElTVElDX1BTQ1BVLCBJUkFNX0JBU0VfTEVOX09TX1NUQVRJU1RJQ19QU0NQVSk7CisjZW5kaWYKKworICAgIC8qCisgICAgaW5pdF90aW1lcigmdGltZXIpOworICAgIHRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgNDAqSFo7Ly9tc2Vjc190b19qaWZmaWVzKDQwKjEwMDApOy8v0dOz2TQww+sKKyAgICB0aW1lci5kYXRhID0gMDsKKyAgICB0aW1lci5mdW5jdGlvbiA9IG9zX3N0YXRpc3RpY19kZWxheWVkX3dvcmtfdGltZXJfZm47CisgICAgc2V0dXBfdGltZXIoJnRpbWVyLCBvc19zdGF0aXN0aWNfZGVsYXllZF93b3JrX3RpbWVyX2ZuLCAwKTsKKyAgICBhZGRfdGltZXIoJnRpbWVyKTsKKyAgICAqLworICAgIC8vdGFzayA9IGt0aHJlYWRfY3JlYXRlKG9zX3N0YXRpc3RpY19kZWxheWVkX3dvcmtfdGltZXJfZm4sIDAsICJnX3p4aWNfdHJhY2Vfc3luY190aHJlYWQiLCAwKTsKKyAgICAvL3dha2VfdXBfcHJvY2Vzcyh0YXNrKTsKKyAgICBvc19zdGF0aXN0aWNfZW5hYmxlKCk7CisgICAgcmV0dXJuIDB4MDsKK30KK21vZHVsZV9pbml0KHp4aWNfZW5hYmxlX3RyYWNlcik7CisKKwo=