I2RlZmluZSBfUE9TSVhfQ19TT1VSQ0UgMTk5MzA5CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzaWduYWwuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPHN5c2xvZy5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNsdWRlICJzb2Z0YXBfbG9nLmgiCiNpbmNsdWRlICJzb2Z0YXBfYXBpLmgiCgojZGVmaW5lIE9OIDEKI2RlZmluZSBPRkYgLTEKCmludCBzbG9nX3ByaW50bGV2ZWwgID0gU0xPR19FUlI7CmludCBzbG9nX3N5c2xvZ2xldmVsID0gU0xPR19PRkY7CmludCBzb2N0aW1lX3N3ICAgICAgID0gU0xPR19TT0NUSU1FX09GRjsKCmludCBsb2dfc3dpdGNoID0gTE9HX09OOwpsb25nIGxvbmcgdGltZV91czsKCnZvaWQgbG9nX3NpZ19oZGwoaW50IHNpZywgc2lnaW5mb190ICpzaWdpbmZvLCB2b2lkICpwdHIpCnsKCWludCBsZXZlbCA9IDA7CglpbnQgcHJpbnRsb2cgPSAwLCBzeXNsb2cgPSAwLCBzb2N0aW1lID0gMDsKCglpZiAoc2lnID09IFNJR1VTUjIpIHsKCQlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJwcmVsZXZlbHMocHJpbnRsb2c6JWQsc3lzbG9nOiVkLHNvY3RpbWU6JWQpLCBzZXRsZXZlbDolZCBcbiIsCgkJICAgICBzbG9nX3ByaW50bGV2ZWwsIHNsb2dfc3lzbG9nbGV2ZWwsIHNvY3RpbWVfc3csIHNpZ2luZm8tPnNpX3ZhbHVlLnNpdmFsX2ludCk7CgoJCWxldmVsID0gc2lnaW5mby0+c2lfdmFsdWUuc2l2YWxfaW50OwoKCQlzb2N0aW1lICA9IChsZXZlbCAlIDEwMDApIC8gMTAwOyAgICAgICAgIC8vyKGw2c67o6zHp8670tTJz7K71qez1goJCXN5c2xvZyAgID0gKGxldmVsIC0gc29jdGltZSAqIDEwMCkgLyAxMDsgLy/IocquzrsKCQlwcmludGxvZyA9IGxldmVsIC0gc29jdGltZSAqIDEwMCAtIHN5c2xvZyAqIDEwOyAvL8ihuPbOuwoKCQlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJwcmludGxvZzolZCwgc3lzbG9nOiVkLCBzb2N0aW1lOiVkIFxuIiwgcHJpbnRsb2csIHN5c2xvZywgc29jdGltZSk7CgoJCWlmIChwcmludGxvZyA+IDAgJiYgcHJpbnRsb2cgPD0gU0xPR19PRkYpCgkJCXNsb2dfcHJpbnRsZXZlbCA9IHByaW50bG9nOwoJCWVsc2UKCQkJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAic2xvZ19wcmludGxldmVsIG9ubHkgc3VwcG9ydCAlZH4lZCBcbiIsIFNMT0dfREVCVUcsIFNMT0dfT0ZGKTsKCgkJaWYgKHN5c2xvZyA+IDAgJiYgc3lzbG9nIDw9IFNMT0dfT0ZGKQoJCQlzbG9nX3N5c2xvZ2xldmVsID0gc3lzbG9nOwoJCWVsc2UKCQkJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAic2xvZ19zeXNsb2dsZXZlbCBvbmx5IHN1cHBvcnQgJWR+JWQgXG4iLCBTTE9HX0RFQlVHLCBTTE9HX09GRik7CgoJCWlmIChzb2N0aW1lID09IDAgfHwgc29jdGltZSA9PSAxKQoJCQlzb2N0aW1lX3N3ID0gc29jdGltZTsKCQllbHNlCgkJCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgInNvY3RpbWVfc3cgb25seSBzdXBwb3J0IDB+MSBcbiIpOwoJfQp9CgovL9eisuG2r8ystffV+7Ty06G8trHw0MW6xcG/CnZvaWQgcmVnaXN0ZXJfc2lnX2xvZ3N3aXRjaCh2b2lkKQp7CglzdHJ1Y3Qgc2lnYWN0aW9uIHN0OwoKCW1lbXNldCgmc3QsIDAsIHNpemVvZihzdCkpOwoJc3Quc2FfZmxhZ3MgPSBTQV9TSUdJTkZPOwoJc3Quc2Ffc2lnYWN0aW9uID0gbG9nX3NpZ19oZGw7CglzaWdhY3Rpb24oU0lHVVNSMiwgJnN0LCBOVUxMKTsKfQoKLy+4+b7dTlaz9cq8u6+08tOhvLax8Ap2b2lkIGxvZ2xldmVsX2luaXQodm9pZCkKewoJY2hhciBudl9wcmludF9sZXZlbFszMl0gICAgPSB7MH07CgljaGFyIG52X3N5c2xvZ19sZXZlbFszMl0gICA9IHswfTsKCWNoYXIgbnZfc29jdGltZV9zd2l0Y2hbMzJdID0gezB9OwoKCXNjX2NmZ19nZXQoInByaW50X2xldmVsIiwgbnZfcHJpbnRfbGV2ZWwsIHNpemVvZihudl9wcmludF9sZXZlbCkpOwoJc2NfY2ZnX2dldCgic3lzbG9nX2xldmVsIiwgbnZfc3lzbG9nX2xldmVsLCBzaXplb2YobnZfc3lzbG9nX2xldmVsKSk7CglzY19jZmdfZ2V0KCJzb2N0aW1lX3N3aXRjaCIsIG52X3NvY3RpbWVfc3dpdGNoLCBzaXplb2YobnZfc29jdGltZV9zd2l0Y2gpKTsKCgkvL2xvZ2xldmVst8fT0NCn1rXKsaOsvavErMjPtPLToby2sfDJ6NbDzqpvZmajrLy0udix1bTy06EKCXNsb2dfcHJpbnRsZXZlbCA9IGF0b2kobnZfcHJpbnRfbGV2ZWwpOwoJaWYoKHNsb2dfcHJpbnRsZXZlbCA8IFNMT0dfREVCVUcpIHx8IChzbG9nX3ByaW50bGV2ZWwgPiBTTE9HX09GRikpIHsgCgkJc2xvZ19wcmludGxldmVsID0gU0xPR19PRkY7Cgl9CQoKCXNsb2dfc3lzbG9nbGV2ZWwgPSBhdG9pKG52X3N5c2xvZ19sZXZlbCk7CglpZigoc2xvZ19zeXNsb2dsZXZlbCA8IFNMT0dfREVCVUcpIHx8IChzbG9nX3N5c2xvZ2xldmVsID4gU0xPR19PRkYpKSB7IAoJCXNsb2dfc3lzbG9nbGV2ZWwgPSBTTE9HX09GRjsKCX0KCglzb2N0aW1lX3N3ID0gYXRvaShudl9zb2N0aW1lX3N3aXRjaCk7CglpZigoc29jdGltZV9zdyA+IFNMT0dfU09DVElNRV9PTikgfHwgKHNvY3RpbWVfc3cgPCBTTE9HX1NPQ1RJTUVfT0ZGKSkgeyAKCQlzb2N0aW1lX3N3ID0gU0xPR19TT0NUSU1FX09GRjsKCX0JCgoJcmVnaXN0ZXJfc2lnX2xvZ3N3aXRjaCgpOwoKCXNsb2coTkVUX1BSSU5ULCBTTE9HX0RFQlVHLCAibG9nbGV2ZWxfaW5pdCwgcHJpbnQ6JWQsIHN5c2xvZzolZCwgc29jdGltZTolZCBcbiIsCgkgICAgIHNsb2dfcHJpbnRsZXZlbCwgc2xvZ19zeXNsb2dsZXZlbCwgc29jdGltZV9zdyk7Cn0KCmludCBzeXNfbG9nKGNoYXIgKmlkZW50LCBpbnQgcHJpbywgY29uc3QgY2hhciAqIGZtdCwgdmFfbGlzdCBhcmcpCnsKCXZzeXNsb2cocHJpbywgZm10LCBhcmcpOwoJcmV0dXJuIDA7Cn0KCmlubGluZSB2b2lkIG91dHB1dF9zeXNsb2dfdGltZShjaGFyICptb2QsIGludCBwcmlvKQp7CglpZiAoU0xPR19TT0NUSU1FX09OID09IHNvY3RpbWVfc3cpCgkJc3lzbG9nKHByaW8sICJbJWxsZC4lbGxkc106ICIsIHRpbWVfdXMgLyAxMDAwMDAwLCB0aW1lX3VzICUgMTAwMDAwMCk7Cn0KCiNkZWZpbmUgcHV0X3RvX2NvbnNvbGUobW9kLCBmbXQsIGFyZykgZG8ge1wKCWNoYXIgYnVmWzEwMjRdOyBcCglpZihTTE9HX1NPQ1RJTUVfT04gPT0gc29jdGltZV9zdykgXAoJCXNucHJpbnRmKGJ1ZiwgMTAyMywgIiVzWyVkXVslbGxkLiVsbGRzXTogIiwgbW9kLCBzeXNjYWxsKFNZU19nZXR0aWQpLCB0aW1lX3VzLzEwMDAwMDAsIHRpbWVfdXMlMTAwMDAwMCk7IFwKCWVsc2UgXAoJCXNucHJpbnRmKGJ1ZiwgMTAyMywgIiVzWyVkXTogIiwgbW9kLCBzeXNjYWxsKFNZU19nZXR0aWQpKTsgXAoJaW50IG4gPSBzdHJsZW4oYnVmKTsgXAoJdmFfc3RhcnQoYXJnLCBmbXQpOyBcCgl2c25wcmludGYoYnVmK24sIDEwMjMtbiwgZm10LCBhcmcpOyBcCgl2YV9lbmQoYXJnKTsgXAoJcHJpbnRmKCIlcyIsYnVmKTsgXAp9d2hpbGUoMCkKCgovL291dHB1dF9zeXNsb2dfdGltZShtb2QsIExPR18jI0xFVkVMLCAmdCk7CiNkZWZpbmUgcHV0X3RvX3N5c2xvZyhMRVZFTCkgZG8geyBcCglvcGVubG9nKG1vZCwgTE9HX1BJRCwgTE9HX01BSUwpOyBcCglvdXRwdXRfc3lzbG9nX3RpbWUobW9kLCBMT0dfIyNMRVZFTCk7IFwKCXZhX3N0YXJ0KGFyZywgZm10KTsgXAoJcmV0ID0gc3lzX2xvZyhtb2QsIExPR18jI0xFVkVMLCBmbXQsIGFyZyk7IFwKCXZhX2VuZChhcmcpOyBcCgljbG9zZWxvZygpOyBcCn13aGlsZSgwKQoKI2RlZmluZSBTWVNMT0dfTFZMX1BBVEggIi9wcm9jL3N5cy9zbG9nL3N5c2xvZ19sZXZlbCIKI2RlZmluZSBQUklOVF9MVkxfUEFUSCAiL3Byb2Mvc3lzL3Nsb2cvcHJpbnRfbGV2ZWwiCiNkZWZpbmUgTE9HX1NPQ19USU1FX1NXSVRDSCAiL3Byb2Mvc3lzL3Nsb2cvc29jdGltZV9zdyIKc3RhdGljIHZvaWQgc2V0X2xvZ19sZXZlbChpbnQqIGxvZ2xldmVsLCBjaGFyKiBmaWxlcGF0aCkKewoJaW50IGZkOwoJY2hhciBidWZbNF0gPSB7MH07CiAgICBpbnQgbGVuICA9IDA7CglmZCA9IG9wZW4oZmlsZXBhdGgsIE9fUkRXUik7CglpZiAoZmQgPCAwKSB7CgkJcHJpbnRmKCJmYWlsIHRvIG9wZW5cbiIpOwoJCXJldHVybjsKCX0KCiAgICBsZW4gPSByZWFkKGZkLCBidWYsIDMpOwoKCWlmIChsZW4gPiAwICkKCQkqbG9nbGV2ZWwgPSBhdG9pKGJ1Zik7CgllbHNlIHsKCQljbG9zZShmZCk7CgkJcmV0dXJuOwoJfQoJY2xvc2UoZmQpOwp9CgppbnQgc2xvZyhjaGFyICptb2QsIGludCBwcmlvLCBjb25zdCBjaGFyICpmbXQsIC4uLikKewoJdmFfbGlzdCBhcmcgPSB7MH07CglpbnQgcmV0ID0gMDsKCglpZiAoU0xPR19TT0NUSU1FX09OID09IHNvY3RpbWVfc3cpCgkJdGltZV91cyA9IGdldF90aW1lX3VzKCk7CgoJaWYgKHNsb2dfc3lzbG9nbGV2ZWwgPiAwICYmIHNsb2dfc3lzbG9nbGV2ZWwgPD0gcHJpbykgewoJCXN3aXRjaCAocHJpbykgewoJCWNhc2UgU0xPR19OT1JNQUw6IHsKCQkJcHV0X3RvX3N5c2xvZyhOT1RJQ0UpOwoJCX0KCQlicmVhazsKCgkJY2FzZSBTTE9HX0RFQlVHOiB7CgkJCXB1dF90b19zeXNsb2coREVCVUcpOwoJCX0KCQlicmVhazsKCgkJY2FzZSBTTE9HX0VSUjogewoJCQlwdXRfdG9fc3lzbG9nKEVSUik7CgkJfQoJCWJyZWFrOwoKCQlkZWZhdWx0OgoJCQlicmVhazsKCQl9Cgl9CgoJaWYgKHNsb2dfcHJpbnRsZXZlbCA+IDAgJiYgc2xvZ19wcmludGxldmVsIDw9IHByaW8pIHsKCQlwdXRfdG9fY29uc29sZShtb2QsIGZtdCwgYXJnKTsKCX0KCglyZXR1cm4gcmV0Owp9Cgp2b2lkIHNlY3VyaXR5X2xvZyhpbnQgbW9kLGNvbnN0IGNoYXIgKmZtdCwgLi4uKQp7CgljaGFyIGJ1Zls1MTJdID0gezB9OwoJdmFfbGlzdCBhcmcgPSB7MH07CglpbnQgbiA9IDA7CgoJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIlslWF1bJWRdIiwgbW9kLCBzeXNjYWxsKFNZU19nZXR0aWQpKTsKCW4gPSBzdHJsZW4oYnVmKTsKCXZhX3N0YXJ0KGFyZywgZm10KTsKCXZzbnByaW50ZihidWYrbiwgc2l6ZW9mKGJ1ZiktbiwgZm10LCBhcmcpOyAKCXZhX2VuZChhcmcpOwoJaXBjX3NlbmRfbWVzc2FnZShtb2QsIE1PRFVMRV9JRF9TRUNVUklUWV9MT0csIE1TR19DTURfU0VDVVJJVFlfTE9HX1NBVkUsIHNpemVvZihidWYpLCAodW5zaWduZWQgY2hhciAqKWJ1ZiwgSVBDX05PV0FJVCk7Cn0KCg==