ZGlmZiAtLWdpdCBhL2FwL2xpYi9saWJzb2Z0YXAvc29mdGFwX2xvZy5jIGIvYXAvbGliL2xpYnNvZnRhcC9zb2Z0YXBfbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDkyYjU0MwotLS0gL2Rldi9udWxsCisrKyBiL2FwL2xpYi9saWJzb2Z0YXAvc29mdGFwX2xvZy5jCkBAIC0wLDAgKzEsMjE2IEBACisjZGVmaW5lIF9QT1NJWF9DX1NPVVJDRSAxOTkzMDkKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlICJzb2Z0YXBfbG9nLmgiCisjaW5jbHVkZSAic29mdGFwX2FwaS5oIgorCisjZGVmaW5lIE9OIDEKKyNkZWZpbmUgT0ZGIC0xCisKK2ludCBzbG9nX3ByaW50bGV2ZWwgID0gU0xPR19FUlI7CitpbnQgc2xvZ19zeXNsb2dsZXZlbCA9IFNMT0dfT0ZGOworaW50IHNvY3RpbWVfc3cgICAgICAgPSBTTE9HX1NPQ1RJTUVfT0ZGOworCitpbnQgbG9nX3N3aXRjaCA9IExPR19PTjsKK2xvbmcgbG9uZyB0aW1lX3VzOworCit2b2lkIGxvZ19zaWdfaGRsKGludCBzaWcsIHNpZ2luZm9fdCAqc2lnaW5mbywgdm9pZCAqcHRyKQoreworCWludCBsZXZlbCA9IDA7CisJaW50IHByaW50bG9nID0gMCwgc3lzbG9nID0gMCwgc29jdGltZSA9IDA7CisKKwlpZiAoc2lnID09IFNJR1VTUjIpIHsKKwkJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAicHJlbGV2ZWxzKHByaW50bG9nOiVkLHN5c2xvZzolZCxzb2N0aW1lOiVkKSwgc2V0bGV2ZWw6JWQgXG4iLAorCQkgICAgIHNsb2dfcHJpbnRsZXZlbCwgc2xvZ19zeXNsb2dsZXZlbCwgc29jdGltZV9zdywgc2lnaW5mby0+c2lfdmFsdWUuc2l2YWxfaW50KTsKKworCQlsZXZlbCA9IHNpZ2luZm8tPnNpX3ZhbHVlLnNpdmFsX2ludDsKKworCQlzb2N0aW1lICA9IChsZXZlbCAlIDEwMDApIC8gMTAwOyAgICAgICAgIC8vyKGw2c67o6zHp8670tTJz7K71qez1gorCQlzeXNsb2cgICA9IChsZXZlbCAtIHNvY3RpbWUgKiAxMDApIC8gMTA7IC8vyKHKrs67CisJCXByaW50bG9nID0gbGV2ZWwgLSBzb2N0aW1lICogMTAwIC0gc3lzbG9nICogMTA7IC8vyKG49s67CisKKwkJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAicHJpbnRsb2c6JWQsIHN5c2xvZzolZCwgc29jdGltZTolZCBcbiIsIHByaW50bG9nLCBzeXNsb2csIHNvY3RpbWUpOworCisJCWlmIChwcmludGxvZyA+IDAgJiYgcHJpbnRsb2cgPD0gU0xPR19PRkYpCisJCQlzbG9nX3ByaW50bGV2ZWwgPSBwcmludGxvZzsKKwkJZWxzZQorCQkJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAic2xvZ19wcmludGxldmVsIG9ubHkgc3VwcG9ydCAlZH4lZCBcbiIsIFNMT0dfREVCVUcsIFNMT0dfT0ZGKTsKKworCQlpZiAoc3lzbG9nID4gMCAmJiBzeXNsb2cgPD0gU0xPR19PRkYpCisJCQlzbG9nX3N5c2xvZ2xldmVsID0gc3lzbG9nOworCQllbHNlCisJCQlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJzbG9nX3N5c2xvZ2xldmVsIG9ubHkgc3VwcG9ydCAlZH4lZCBcbiIsIFNMT0dfREVCVUcsIFNMT0dfT0ZGKTsKKworCQlpZiAoc29jdGltZSA9PSAwIHx8IHNvY3RpbWUgPT0gMSkKKwkJCXNvY3RpbWVfc3cgPSBzb2N0aW1lOworCQllbHNlCisJCQlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJzb2N0aW1lX3N3IG9ubHkgc3VwcG9ydCAwfjEgXG4iKTsKKwl9Cit9CisKKy8v16Ky4bavzKy199X7tPLToby2sfDQxbrFwb8KK3ZvaWQgcmVnaXN0ZXJfc2lnX2xvZ3N3aXRjaCh2b2lkKQoreworCXN0cnVjdCBzaWdhY3Rpb24gc3Q7CisKKwltZW1zZXQoJnN0LCAwLCBzaXplb2Yoc3QpKTsKKwlzdC5zYV9mbGFncyA9IFNBX1NJR0lORk87CisJc3Quc2Ffc2lnYWN0aW9uID0gbG9nX3NpZ19oZGw7CisJc2lnYWN0aW9uKFNJR1VTUjIsICZzdCwgTlVMTCk7Cit9CisKKy8vuPm+3U5Ws/XKvLuvtPLToby2sfAKK3ZvaWQgbG9nbGV2ZWxfaW5pdCh2b2lkKQoreworCWNoYXIgbnZfcHJpbnRfbGV2ZWxbMzJdICAgID0gezB9OworCWNoYXIgbnZfc3lzbG9nX2xldmVsWzMyXSAgID0gezB9OworCWNoYXIgbnZfc29jdGltZV9zd2l0Y2hbMzJdID0gezB9OworCisJY2ZnX2dldF9pdGVtKCJwcmludF9sZXZlbCIsIG52X3ByaW50X2xldmVsLCBzaXplb2YobnZfcHJpbnRfbGV2ZWwpKTsKKwljZmdfZ2V0X2l0ZW0oInN5c2xvZ19sZXZlbCIsIG52X3N5c2xvZ19sZXZlbCwgc2l6ZW9mKG52X3N5c2xvZ19sZXZlbCkpOworCWNmZ19nZXRfaXRlbSgic29jdGltZV9zd2l0Y2giLCBudl9zb2N0aW1lX3N3aXRjaCwgc2l6ZW9mKG52X3NvY3RpbWVfc3dpdGNoKSk7CisKKwkvL2xvZ2xldmVst8fT0NCn1rXKsaOsvavErMjPtPLToby2sfDJ6NbDzqpvZmajrLy0udix1bTy06EKKwlzbG9nX3ByaW50bGV2ZWwgPSBhdG9pKG52X3ByaW50X2xldmVsKTsKKwlpZigoc2xvZ19wcmludGxldmVsIDwgU0xPR19ERUJVRykgfHwgKHNsb2dfcHJpbnRsZXZlbCA+IFNMT0dfT0ZGKSkgeyAKKwkJc2xvZ19wcmludGxldmVsID0gU0xPR19PRkY7CisJfQkKKworCXNsb2dfc3lzbG9nbGV2ZWwgPSBhdG9pKG52X3N5c2xvZ19sZXZlbCk7CisJaWYoKHNsb2dfc3lzbG9nbGV2ZWwgPCBTTE9HX0RFQlVHKSB8fCAoc2xvZ19zeXNsb2dsZXZlbCA+IFNMT0dfT0ZGKSkgeyAKKwkJc2xvZ19zeXNsb2dsZXZlbCA9IFNMT0dfT0ZGOworCX0KKworCXNvY3RpbWVfc3cgPSBhdG9pKG52X3NvY3RpbWVfc3dpdGNoKTsKKwlpZigoc29jdGltZV9zdyA+IFNMT0dfU09DVElNRV9PTikgfHwgKHNvY3RpbWVfc3cgPCBTTE9HX1NPQ1RJTUVfT0ZGKSkgeyAKKwkJc29jdGltZV9zdyA9IFNMT0dfU09DVElNRV9PRkY7CisJfQkKKworCXJlZ2lzdGVyX3NpZ19sb2dzd2l0Y2goKTsKKworCXNsb2coTkVUX1BSSU5ULCBTTE9HX0RFQlVHLCAibG9nbGV2ZWxfaW5pdCwgcHJpbnQ6JWQsIHN5c2xvZzolZCwgc29jdGltZTolZCBcbiIsCisJICAgICBzbG9nX3ByaW50bGV2ZWwsIHNsb2dfc3lzbG9nbGV2ZWwsIHNvY3RpbWVfc3cpOworfQorCitpbnQgc3lzX2xvZyhjaGFyICppZGVudCwgaW50IHByaW8sIGNvbnN0IGNoYXIgKiBmbXQsIHZhX2xpc3QgYXJnKQoreworCXZzeXNsb2cocHJpbywgZm10LCBhcmcpOworCXJldHVybiAwOworfQorCitpbmxpbmUgdm9pZCBvdXRwdXRfc3lzbG9nX3RpbWUoY2hhciAqbW9kLCBpbnQgcHJpbykKK3sKKwlpZiAoU0xPR19TT0NUSU1FX09OID09IHNvY3RpbWVfc3cpCisJCXN5c2xvZyhwcmlvLCAiWyVsbGQuJWxsZHNdOiAiLCB0aW1lX3VzIC8gMTAwMDAwMCwgdGltZV91cyAlIDEwMDAwMDApOworfQorCisjZGVmaW5lIHB1dF90b19jb25zb2xlKG1vZCwgZm10LCBhcmcpIGRvIHtcCisJY2hhciBidWZbMTAyNF0gPSB7MH07IFwKKwlpZihTTE9HX1NPQ1RJTUVfT04gPT0gc29jdGltZV9zdykgXAorCQlzbnByaW50ZihidWYsIDEwMjMsICIlc1slZF1bJWxsZC4lbGxkc106ICIsIG1vZCwgc3lzY2FsbChTWVNfZ2V0dGlkKSwgdGltZV91cy8xMDAwMDAwLCB0aW1lX3VzJTEwMDAwMDApOyBcCisJZWxzZSBcCisJCXNucHJpbnRmKGJ1ZiwgMTAyMywgIiVzWyVkXTogIiwgbW9kLCBzeXNjYWxsKFNZU19nZXR0aWQpKTsgXAorCWludCBuID0gc3RybGVuKGJ1Zik7IFwKKwl2YV9zdGFydChhcmcsIGZtdCk7IFwKKwl2c25wcmludGYoYnVmK24sIDEwMjMtbiwgZm10LCBhcmcpOyBcCisJdmFfZW5kKGFyZyk7IFwKKwlwcmludGYoIiVzIixidWYpOyBcCit9d2hpbGUoMCkKKworCisvL291dHB1dF9zeXNsb2dfdGltZShtb2QsIExPR18jI0xFVkVMLCAmdCk7CisjZGVmaW5lIHB1dF90b19zeXNsb2coTEVWRUwpIGRvIHsgXAorCW9wZW5sb2cobW9kLCBMT0dfUElELCBMT0dfTUFJTCk7IFwKKwlvdXRwdXRfc3lzbG9nX3RpbWUobW9kLCBMT0dfIyNMRVZFTCk7IFwKKwl2YV9zdGFydChhcmcsIGZtdCk7IFwKKwlyZXQgPSBzeXNfbG9nKG1vZCwgTE9HXyMjTEVWRUwsIGZtdCwgYXJnKTsgXAorCXZhX2VuZChhcmcpOyBcCisJY2xvc2Vsb2coKTsgXAorfXdoaWxlKDApCisKKyNkZWZpbmUgU1lTTE9HX0xWTF9QQVRIICIvcHJvYy9zeXMvc2xvZy9zeXNsb2dfbGV2ZWwiCisjZGVmaW5lIFBSSU5UX0xWTF9QQVRIICIvcHJvYy9zeXMvc2xvZy9wcmludF9sZXZlbCIKKyNkZWZpbmUgTE9HX1NPQ19USU1FX1NXSVRDSCAiL3Byb2Mvc3lzL3Nsb2cvc29jdGltZV9zdyIKK3N0YXRpYyB2b2lkIHNldF9sb2dfbGV2ZWwoaW50KiBsb2dsZXZlbCwgY2hhciogZmlsZXBhdGgpCit7CisJaW50IGZkOworCWNoYXIgYnVmWzRdID0gezB9OworICAgIGludCBsZW4gID0gMDsKKwlmZCA9IG9wZW4oZmlsZXBhdGgsIE9fUkRXUik7CisJaWYgKGZkIDwgMCkgeworCQlwcmludGYoImZhaWwgdG8gb3BlblxuIik7CisJCXJldHVybjsKKwl9CisKKyAgICBsZW4gPSByZWFkKGZkLCBidWYsIDMpOworCisJaWYgKGxlbiA+IDAgKQorCQkqbG9nbGV2ZWwgPSBhdG9pKGJ1Zik7CisJZWxzZSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuOworCX0KKwljbG9zZShmZCk7Cit9CisKK2ludCBzbG9nKGNoYXIgKm1vZCwgaW50IHByaW8sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnID0gezB9OworCWludCByZXQgPSAwOworCisJaWYgKFNMT0dfU09DVElNRV9PTiA9PSBzb2N0aW1lX3N3KQorCQl0aW1lX3VzID0gZ2V0X3RpbWVfdXMoKTsKKworCWlmIChzbG9nX3N5c2xvZ2xldmVsID4gMCAmJiBzbG9nX3N5c2xvZ2xldmVsIDw9IHByaW8pIHsKKwkJc3dpdGNoIChwcmlvKSB7CisJCWNhc2UgU0xPR19OT1JNQUw6IHsKKwkJCXB1dF90b19zeXNsb2coTk9USUNFKTsKKwkJfQorCQlicmVhazsKKworCQljYXNlIFNMT0dfREVCVUc6IHsKKwkJCXB1dF90b19zeXNsb2coREVCVUcpOworCQl9CisJCWJyZWFrOworCisJCWNhc2UgU0xPR19FUlI6IHsKKwkJCXB1dF90b19zeXNsb2coRVJSKTsKKwkJfQorCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoc2xvZ19wcmludGxldmVsID4gMCAmJiBzbG9nX3ByaW50bGV2ZWwgPD0gcHJpbykgeworCQlwdXRfdG9fY29uc29sZShtb2QsIGZtdCwgYXJnKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHNlY3VyaXR5X2xvZyhpbnQgbW9kLGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCWNoYXIgYnVmWzUxMl0gPSB7MH07CisJdmFfbGlzdCBhcmcgPSB7MH07CisJaW50IG4gPSAwOworCisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIlslWF1bJWRdIiwgbW9kLCBzeXNjYWxsKFNZU19nZXR0aWQpKTsKKwluID0gc3RybGVuKGJ1Zik7CisJdmFfc3RhcnQoYXJnLCBmbXQpOworCXZzbnByaW50ZihidWYrbiwgc2l6ZW9mKGJ1ZiktbiwgZm10LCBhcmcpOyAKKwl2YV9lbmQoYXJnKTsKKwlpcGNfc2VuZF9tZXNzYWdlKG1vZCwgTU9EVUxFX0lEX1NFQ1VSSVRZX0xPRywgTVNHX0NNRF9TRUNVUklUWV9MT0dfU0FWRSwgc2l6ZW9mKGJ1ZiksICh1bnNpZ25lZCBjaGFyICopYnVmLCBJUENfTk9XQUlUKTsKK30KKwo=