ZGlmZiAtLWdpdCBhL2J0YS9hZy9idGFfYWdfYWN0LmMgYi9idGEvYWcvYnRhX2FnX2FjdC5jCmluZGV4IGY1M2ZmNzIuLmMwZWFlYmIgMTAwNjQ0Ci0tLSBhL2J0YS9hZy9idGFfYWdfYWN0LmMKKysrIGIvYnRhL2FnL2J0YV9hZ19hY3QuYwpAQCAtNDQsMTMgKzQ0LDEzIEBACiAvKiBtYXhpbXVtIEFUIGNvbW1hbmQgbGVuZ3RoICovCiAjZGVmaW5lIEJUQV9BR19DTURfTUFYICAgICAgICAgIDUxMgogCi1jb25zdCBVSU5UMTYgYnRhX2FnX3V1aWRbQlRBX0FHX05VTV9JRFhdID0KK2NvbnN0IHVpbnQxNl90IGJ0YV9hZ191dWlkW0JUQV9BR19OVU1fSURYXSA9CiB7CiAgICAgVVVJRF9TRVJWQ0xBU1NfSEVBRFNFVF9BVURJT19HQVRFV0FZLAogICAgIFVVSURfU0VSVkNMQVNTX0FHX0hBTkRTRlJFRQogfTsKIAotY29uc3QgVUlOVDggYnRhX2FnX3NlY19pZFtCVEFfQUdfTlVNX0lEWF0gPQorY29uc3QgdWludDhfdCBidGFfYWdfc2VjX2lkW0JUQV9BR19OVU1fSURYXSA9CiB7CiAgICAgQlRNX1NFQ19TRVJWSUNFX0hFQURTRVRfQUcsCiAgICAgQlRNX1NFQ19TRVJWSUNFX0FHX0hBTkRTRlJFRQpAQCAtNjgsOCArNjgsOCBAQAogICAgIEJUQV9IRlBfU0VSVklDRV9NQVNLCiB9OwogCi10eXBlZGVmIHZvaWQgKCp0QlRBX0FHX0FUQ01EX0NCQUNLKSh0QlRBX0FHX1NDQiAqcF9zY2IsIFVJTlQxNiBjbWQsIFVJTlQ4IGFyZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcF9hcmcsIElOVDE2IGludF9hcmcpOwordHlwZWRlZiB2b2lkICgqdEJUQV9BR19BVENNRF9DQkFDSykodEJUQV9BR19TQ0IgKnBfc2NiLCB1aW50MTZfdCBjbWQsIHVpbnQ4X3QgYXJnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwX2FyZywgaW50MTZfdCBpbnRfYXJnKTsKIAogY29uc3QgdEJUQV9BR19BVENNRF9DQkFDSyBidGFfYWdfYXRfY2JhY2tfdGJsW0JUQV9BR19OVU1fSURYXSA9CiB7CkBAIC0xNTcsNyArMTU3LDcgQEAKIHZvaWQgYnRhX2FnX2RlcmVnaXN0ZXIodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSkKIHsKICAgICAvKiBzZXQgZGVhbGxvYyAqLwotICAgIHBfc2NiLT5kZWFsbG9jID0gVFJVRTsKKyAgICBwX3NjYi0+ZGVhbGxvYyA9IHRydWU7CiAKICAgICAvKiByZW1vdmUgc2RwIHJlY29yZHMgKi8KICAgICBidGFfYWdfZGVsX3JlY29yZHMocF9zY2IsIHBfZGF0YSk7CkBAIC0xODIsNyArMTgyLDcgQEAKIHZvaWQgYnRhX2FnX3N0YXJ0X2RlcmVnKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpCiB7CiAgICAgLyogc2V0IGRlYWxsb2MgKi8KLSAgICBwX3NjYi0+ZGVhbGxvYyA9IFRSVUU7CisgICAgcF9zY2ItPmRlYWxsb2MgPSB0cnVlOwogCiAgICAgLyogcmVtb3ZlIHNkcCByZWNvcmRzICovCiAgICAgYnRhX2FnX2RlbF9yZWNvcmRzKHBfc2NiLCBwX2RhdGEpOwpAQCAtMjQyLDcgKzI0Miw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfYWdfZGlzY19pbnRfcmVzKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpCiB7Ci0gICAgVUlOVDE2IGV2ZW50ID0gQlRBX0FHX0RJU0NfRkFJTF9FVlQ7CisgICAgdWludDE2X3QgZXZlbnQgPSBCVEFfQUdfRElTQ19GQUlMX0VWVDsKIAogICAgIEFQUExfVFJBQ0VfREVCVUcgKCJidGFfYWdfZGlzY19pbnRfcmVzOiBTdGF0dXM6ICVkIiwgcF9kYXRhLT5kaXNjX3Jlc3VsdC5zdGF0dXMpOwogCkBAIC0zODIsMTIgKzM4MiwxMiBAQAogICAgIHBfc2NiLT5jb25uX2hhbmRsZSA9IDA7CiAgICAgcF9zY2ItPmNvbm5fc2VydmljZSA9IDA7CiAgICAgcF9zY2ItPnBlZXJfZmVhdHVyZXMgPSAwOwotI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUgKQorI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUpCiAgICAgcF9zY2ItPnBlZXJfY29kZWNzID0gQlRBX0FHX0NPREVDX0NWU0Q7CiAgICAgcF9zY2ItPnNjb19jb2RlYyA9IEJUQV9BR19DT0RFQ19DVlNEOwogI2VuZGlmCiAgICAgcF9zY2ItPnJvbGUgPSAwOwotICAgIHBfc2NiLT5zdmNfY29ubiA9IEZBTFNFOworICAgIHBfc2NiLT5zdmNfY29ubiA9IGZhbHNlOwogICAgIHBfc2NiLT5oc3BfdmVyc2lvbiA9IEhTUF9WRVJTSU9OXzFfMjsKICAgICAvKkNsZWFyIHRoZSBCRCBhZGRyZXNzKi8KICAgICBiZGNweShwX3NjYi0+cGVlcl9hZGRyLCBiZF9hZGRyX251bGwpOwpAQCAtNDE5LDE3ICs0MTksMTcgQEAKICAgICAvKiByZWluaXRpYWxpemUgc3R1ZmYgKi8KICAgICBwX3NjYi0+Y29ubl9zZXJ2aWNlID0gMDsKICAgICBwX3NjYi0+cGVlcl9mZWF0dXJlcyA9IDA7Ci0jaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSkKICAgICBwX3NjYi0+cGVlcl9jb2RlY3MgPSBCVEFfQUdfQ09ERUNfQ1ZTRDsKICAgICBwX3NjYi0+c2NvX2NvZGVjID0gQlRBX0FHX0NPREVDX0NWU0Q7CiAgICAgLyogQ2xlYXIgdGhlc2UgZmxhZ3MgdXBvbiBTTEMgdGVhcmRvd24gKi8KLSAgICBwX3NjYi0+Y29kZWNfdXBkYXRlZCA9IEZBTFNFOwotICAgIHBfc2NiLT5jb2RlY19mYWxsYmFjayA9IEZBTFNFOworICAgIHBfc2NiLT5jb2RlY191cGRhdGVkID0gZmFsc2U7CisgICAgcF9zY2ItPmNvZGVjX2ZhbGxiYWNrID0gZmFsc2U7CiAgICAgcF9zY2ItPmNvZGVjX21zYmNfc2V0dGluZ3MgPSBCVEFfQUdfU0NPX01TQkNfU0VUVElOR1NfVDI7CiAjZW5kaWYKICAgICBwX3NjYi0+cm9sZSA9IDA7CiAgICAgcF9zY2ItPnBvc3Rfc2NvID0gQlRBX0FHX1BPU1RfU0NPX05PTkU7Ci0gICAgcF9zY2ItPnN2Y19jb25uID0gRkFMU0U7CisgICAgcF9zY2ItPnN2Y19jb25uID0gZmFsc2U7CiAgICAgcF9zY2ItPmhzcF92ZXJzaW9uID0gSFNQX1ZFUlNJT05fMV8yOwogICAgIGJ0YV9hZ19hdF9yZWluaXQoJnBfc2NiLT5hdF9jYik7CiAKQEAgLTQ1Miw3ICs0NTIsNyBAQAogICAgICgqYnRhX2FnX2NiLnBfY2JhY2spKEJUQV9BR19DTE9TRV9FVlQsICh0QlRBX0FHICopICZjbG9zZSk7CiAKICAgICAvKiBpZiBub3QgZGVyZWdpc3RlcmluZyAoZGVhbGxvY2F0aW5nKSByZW9wZW4gcmVnaXN0ZXJlZCBzZXJ2ZXJzICovCi0gICAgaWYgKHBfc2NiLT5kZWFsbG9jID09IEZBTFNFKQorICAgIGlmIChwX3NjYi0+ZGVhbGxvYyA9PSBmYWxzZSkKICAgICB7CiAgICAgICAgIC8qIENsZWFyIHBlZXIgYmRfYWRkciBzbyBpbnN0YW5jZSBjYW4gYmUgcmV1c2VkICovCiAgICAgICAgIGJkY3B5KHBfc2NiLT5wZWVyX2FkZHIsIGJkX2FkZHJfbnVsbCk7CkBAIC01MDUsMTAgKzUwNSwxMCBAQAogdm9pZCBidGFfYWdfcmZjX29wZW4odEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSkKIHsKICAgICAvKiBpbml0aWFsaXplIEFUIGZlYXR1cmUgdmFyaWFibGVzICovCi0gICAgcF9zY2ItPmNsaXBfZW5hYmxlZCA9IEZBTFNFOwotICAgIHBfc2NiLT5jY3dhX2VuYWJsZWQgPSBGQUxTRTsKLSAgICBwX3NjYi0+Y21lcl9lbmFibGVkID0gRkFMU0U7Ci0gICAgcF9zY2ItPmNtZWVfZW5hYmxlZCA9IEZBTFNFOworICAgIHBfc2NiLT5jbGlwX2VuYWJsZWQgPSBmYWxzZTsKKyAgICBwX3NjYi0+Y2N3YV9lbmFibGVkID0gZmFsc2U7CisgICAgcF9zY2ItPmNtZXJfZW5hYmxlZCA9IGZhbHNlOworICAgIHBfc2NiLT5jbWVlX2VuYWJsZWQgPSBmYWxzZTsKICAgICBwX3NjYi0+aW5iYW5kX2VuYWJsZWQgPSAoKHBfc2NiLT5mZWF0dXJlcyAmIEJUQV9BR19GRUFUX0lOQkFORCkgPT0gQlRBX0FHX0ZFQVRfSU5CQU5EKTsKIAogICAgIC8qIHNldCB1cCBBVCBjb21tYW5kIGludGVycHJldGVyICovCkBAIC01NDgsNyArNTQ4LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9hZ19yZmNfYWNwX29wZW4odEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSkKIHsKLSAgICBVSU5UMTYgICAgICAgICAgbGNpZDsKKyAgICB1aW50MTZfdCAgICAgICAgbGNpZDsKICAgICBpbnQgICAgICAgICAgICAgaTsKICAgICB0QlRBX0FHX1NDQiAgICAgKmFnX3NjYiwgKm90aGVyX3NjYjsKICAgICBCRF9BRERSICAgICAgICAgZGV2X2FkZHI7CkBAIC02NDAsNyArNjQwLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9hZ19yZmNfZGF0YSh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKQogewotICAgIFVJTlQxNiAgbGVuOworICAgIHVpbnQxNl90ICBsZW47CiAgICAgY2hhciAgICBidWZbQlRBX0FHX1JGQ19SRUFEX01BWF07CiAgICAgVU5VU0VEKHBfZGF0YSk7CiAKQEAgLTgxNyw3ICs4MTcsNyBAQAogICAgIGlmICghcF9zY2ItPnN2Y19jb25uKQogICAgIHsKICAgICAgICAgLyogc2V0IHN0YXRlIHZhcmlhYmxlICovCi0gICAgICAgIHBfc2NiLT5zdmNfY29ubiA9IFRSVUU7CisgICAgICAgIHBfc2NiLT5zdmNfY29ubiA9IHRydWU7CiAKICAgICAgICAgLyogQ2xlYXIgQVQrQklBIG1hc2sgZnJvbSBwcmV2aW91cyBTTEMgaWYgYW55LiAqLwogICAgICAgICBwX3NjYi0+YmlhX21hc2tlZF9vdXQgPSAwOwpAQCAtODI5LDcgKzgyOSw3IEBACiAgICAgICAgIGV2dC5oZHIuYXBwX2lkID0gcF9zY2ItPmFwcF9pZDsKICAgICAgICAgZXZ0LnBlZXJfZmVhdCA9IHBfc2NiLT5wZWVyX2ZlYXR1cmVzOwogICAgICAgICBiZGNweShldnQuYmRfYWRkciwgcF9zY2ItPnBlZXJfYWRkcik7Ci0jaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSkKICAgICAgICAgZXZ0LnBlZXJfY29kZWMgID0gcF9zY2ItPnBlZXJfY29kZWNzOwogI2VuZGlmCiAKQEAgLTg1NCw3ICs4NTQsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2FnX2NpX3J4X2RhdGEodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSkKIHsKLSAgICBVSU5UMTYgbGVuOworICAgIHVpbnQxNl90IGxlbjsKICAgICB0QlRBX0FHX0NJX1JYX1dSSVRFICpwX3J4X3dyaXRlX21zZyA9ICh0QlRBX0FHX0NJX1JYX1dSSVRFICopcF9kYXRhOwogICAgIGNoYXIgKnBfZGF0YV9hcmVhID0gKGNoYXIgKikocF9yeF93cml0ZV9tc2crMSk7ICAgICAvKiBQb2ludCB0byBkYXRhIGFyZWEgYWZ0ZXIgaGVhZGVyICovCiAKQEAgLTkwNyw3ICs5MDcsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2FnX3NldGNvZGVjKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpCiB7Ci0jaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSkKICAgICB0QlRBX0FHX1BFRVJfQ09ERUMgY29kZWNfdHlwZSA9IHBfZGF0YS0+YXBpX3NldGNvZGVjLmNvZGVjOwogICAgIHRCVEFfQUdfVkFMICAgICAgICB2YWw7CiAKQEAgLTkyNyw3ICs5MjcsNyBAQAogICAgICAgICAoY29kZWNfdHlwZSA9PSBCVEFfQUdfQ09ERUNfQ1ZTRCkpCiAgICAgewogICAgICAgICBwX3NjYi0+c2NvX2NvZGVjID0gY29kZWNfdHlwZTsKLSAgICAgICAgcF9zY2ItPmNvZGVjX3VwZGF0ZWQgPSBUUlVFOworICAgICAgICBwX3NjYi0+Y29kZWNfdXBkYXRlZCA9IHRydWU7CiAgICAgICAgIHZhbC5udW0gPSBjb2RlY190eXBlOwogICAgICAgICB2YWwuaGRyLnN0YXR1cyA9IEJUQV9BR19TVUNDRVNTOwogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfYWdfc2V0Y29kZWM6IFVwZGF0ZWQgY29kZWMgdHlwZSAlZCIsIGNvZGVjX3R5cGUpOwpkaWZmIC0tZ2l0IGEvYnRhL2FnL2J0YV9hZ19hcGkuYyBiL2J0YS9hZy9idGFfYWdfYXBpLmMKaW5kZXggMTE3OTI0Yy4uODNhOTJjMyAxMDA2NDQKLS0tIGEvYnRhL2FnL2J0YV9hZ19hcGkuYworKysgYi9idGEvYWcvYnRhX2FnX2FwaS5jCkBAIC0xMDgsNyArMTA4LDcgQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBCVEFfQWdSZWdpc3Rlcih0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlcywgdEJUQV9TRUMgc2VjX21hc2ssdEJUQV9BR19GRUFUIGZlYXR1cmVzLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIHBfc2VydmljZV9uYW1lc1tdLCBVSU5UOCBhcHBfaWQpCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogcF9zZXJ2aWNlX25hbWVzW10sIHVpbnQ4X3QgYXBwX2lkKQogewogICAgIHRCVEFfQUdfQVBJX1JFR0lTVEVSICpwX2J1ZiA9CiAgICAgICAgICh0QlRBX0FHX0FQSV9SRUdJU1RFUiAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfQUdfQVBJX1JFR0lTVEVSKSk7CkBAIC0xMzgsNyArMTM4LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BZ0RlcmVnaXN0ZXIoVUlOVDE2IGhhbmRsZSkKK3ZvaWQgQlRBX0FnRGVyZWdpc3Rlcih1aW50MTZfdCBoYW5kbGUpCiB7CiAgICAgQlRfSERSICpwX2J1ZiA9IChCVF9IRFIgKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFIpKTsKIApAQCAtMTYxLDcgKzE2MSw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQWdPcGVuKFVJTlQxNiBoYW5kbGUsIEJEX0FERFIgYmRfYWRkciwgdEJUQV9TRUMgc2VjX21hc2ssIHRCVEFfU0VSVklDRV9NQVNLIHNlcnZpY2VzKQordm9pZCBCVEFfQWdPcGVuKHVpbnQxNl90IGhhbmRsZSwgQkRfQUREUiBiZF9hZGRyLCB0QlRBX1NFQyBzZWNfbWFzaywgdEJUQV9TRVJWSUNFX01BU0sgc2VydmljZXMpCiB7CiAgICAgdEJUQV9BR19BUElfT1BFTiAqcF9idWYgPQogICAgICAgICAodEJUQV9BR19BUElfT1BFTiAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfQUdfQVBJX09QRU4pKTsKQEAgLTE4Niw3ICsxODYsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0FnQ2xvc2UoVUlOVDE2IGhhbmRsZSkKK3ZvaWQgQlRBX0FnQ2xvc2UodWludDE2X3QgaGFuZGxlKQogewogICAgIEJUX0hEUiAqcF9idWYgPSAoQlRfSERSICopb3NpX21hbGxvYyhzaXplb2YoQlRfSERSKSk7CiAKQEAgLTIwNyw3ICsyMDcsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0FnQXVkaW9PcGVuKFVJTlQxNiBoYW5kbGUpCit2b2lkIEJUQV9BZ0F1ZGlvT3Blbih1aW50MTZfdCBoYW5kbGUpCiB7CiAgICAgQlRfSERSICpwX2J1ZiA9IChCVF9IRFIgKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFIpKTsKIApAQCAtMjI4LDcgKzIyOCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQWdBdWRpb0Nsb3NlKFVJTlQxNiBoYW5kbGUpCit2b2lkIEJUQV9BZ0F1ZGlvQ2xvc2UodWludDE2X3QgaGFuZGxlKQogewogICAgIEJUX0hEUiAgKnBfYnVmID0gKEJUX0hEUiAqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUikpOwogCkBAIC0yNTAsNyArMjUwLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BZ1Jlc3VsdChVSU5UMTYgaGFuZGxlLCB0QlRBX0FHX1JFUyByZXN1bHQsIHRCVEFfQUdfUkVTX0RBVEEgKnBfZGF0YSkKK3ZvaWQgQlRBX0FnUmVzdWx0KHVpbnQxNl90IGhhbmRsZSwgdEJUQV9BR19SRVMgcmVzdWx0LCB0QlRBX0FHX1JFU19EQVRBICpwX2RhdGEpCiB7CiAgICAgdEJUQV9BR19BUElfUkVTVUxUICpwX2J1ZiA9CiAgICAgICAgICh0QlRBX0FHX0FQSV9SRVNVTFQgKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0FHX0FQSV9SRVNVTFQpKTsKQEAgLTI3Niw3ICsyNzYsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0FnU2V0Q29kZWMoVUlOVDE2IGhhbmRsZSwgdEJUQV9BR19QRUVSX0NPREVDIGNvZGVjKQordm9pZCBCVEFfQWdTZXRDb2RlYyh1aW50MTZfdCBoYW5kbGUsIHRCVEFfQUdfUEVFUl9DT0RFQyBjb2RlYykKIHsKICAgICB0QlRBX0FHX0FQSV9TRVRDT0RFQyAqcF9idWYgPQogICAgICAgICAodEJUQV9BR19BUElfU0VUQ09ERUMgKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0FHX0FQSV9TRVRDT0RFQykpOwpkaWZmIC0tZ2l0IGEvYnRhL2FnL2J0YV9hZ19hdC5jIGIvYnRhL2FnL2J0YV9hZ19hdC5jCmluZGV4IDgyMDFlODYuLmJjYzBhNTggMTAwNjQ0Ci0tLSBhL2J0YS9hZy9idGFfYWdfYXQuYworKysgYi9idGEvYWcvYnRhX2FnX2F0LmMKQEAgLTc5LDEwICs3OSwxMCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfYWdfcHJvY2Vzc19hdCh0QlRBX0FHX0FUX0NCICpwX2NiKQogewotICAgIFVJTlQxNiAgICAgIGlkeDsKLSAgICBVSU5UOCAgICAgICBhcmdfdHlwZTsKKyAgICB1aW50MTZfdCAgICBpZHg7CisgICAgdWludDhfdCAgICAgYXJnX3R5cGU7CiAgICAgY2hhciAgICAgICAgKnBfYXJnOwotICAgIElOVDE2ICAgICAgIGludF9hcmcgPSAwOworICAgIGludDE2X3QgICAgIGludF9hcmcgPSAwOwogICAgIC8qIGxvb3AgdGhyb3VnaCBhdCBjb21tYW5kIHRhYmxlIGxvb2tpbmcgZm9yIG1hdGNoICovCiAgICAgZm9yIChpZHggPSAwOyBwX2NiLT5wX2F0X3RibFtpZHhdLnBfY21kWzBdICE9IDA7IGlkeCsrKQogICAgIHsKQEAgLTE0MCwxMSArMTQwLDExIEBACiAgICAgICAgICAgICAgICAgcF9jYi0+cF9hdF90YmxbaWR4XS5mbXQgPT0gQlRBX0FHX0FUX0lOVCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpbnRfYXJnID0gdXRsX3N0cjJpbnQocF9hcmcpOwotICAgICAgICAgICAgICAgIGlmIChpbnRfYXJnIDwgKElOVDE2KSBwX2NiLT5wX2F0X3RibFtpZHhdLm1pbiB8fAotICAgICAgICAgICAgICAgICAgICBpbnRfYXJnID4gKElOVDE2KSBwX2NiLT5wX2F0X3RibFtpZHhdLm1heCkKKyAgICAgICAgICAgICAgICBpZiAoaW50X2FyZyA8IChpbnQxNl90KSBwX2NiLT5wX2F0X3RibFtpZHhdLm1pbiB8fAorICAgICAgICAgICAgICAgICAgICBpbnRfYXJnID4gKGludDE2X3QpIHBfY2ItPnBfYXRfdGJsW2lkeF0ubWF4KQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgLyogYXJnIG91dCBvZiByYW5nZTsgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICAgICAgKCpwX2NiLT5wX2Vycl9jYmFjaykocF9jYi0+cF91c2VyLCBGQUxTRSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICgqcF9jYi0+cF9lcnJfY2JhY2spKHBfY2ItPnBfdXNlciwgZmFsc2UsIE5VTEwpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewpAQCAtMTYwLDEzICsxNjAsMTMgQEAKICAgICAgICAgLyogZWxzZSBlcnJvciAqLwogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgICgqcF9jYi0+cF9lcnJfY2JhY2spKHBfY2ItPnBfdXNlciwgRkFMU0UsIE5VTEwpOworICAgICAgICAgICAgKCpwX2NiLT5wX2Vycl9jYmFjaykocF9jYi0+cF91c2VyLCBmYWxzZSwgTlVMTCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgLyogZWxzZSBubyBtYXRjaCBjYWxsIGVycm9yIGNhbGxiYWNrICovCiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgKCpwX2NiLT5wX2Vycl9jYmFjaykocF9jYi0+cF91c2VyLCBUUlVFLCBwX2NiLT5wX2NtZF9idWYpOworICAgICAgICAoKnBfY2ItPnBfZXJyX2NiYWNrKShwX2NiLT5wX3VzZXIsIHRydWUsIHBfY2ItPnBfY21kX2J1Zik7CiAgICAgfQogfQogCkBAIC0xODIsNyArMTgyLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX2F0X3BhcnNlKHRCVEFfQUdfQVRfQ0IgKnBfY2IsIGNoYXIgKnBfYnVmLCBVSU5UMTYgbGVuKQordm9pZCBidGFfYWdfYXRfcGFyc2UodEJUQV9BR19BVF9DQiAqcF9jYiwgY2hhciAqcF9idWYsIHVpbnQxNl90IGxlbikKIHsKICAgICBpbnQgaSA9IDA7CiAgICAgY2hhciogcF9zYXZlOwpAQCAtMjIzLDcgKzIyMyw3IEBACiAgICAgICAgICAgICBlbHNlIGlmKCBwX2NiLT5wX2NtZF9idWZbcF9jYi0+Y21kX3Bvc10gPT0gMHgxQSB8fCBwX2NiLT5wX2NtZF9idWZbcF9jYi0+Y21kX3Bvc10gPT0gMHgxQiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcF9jYi0+cF9jbWRfYnVmWysrcF9jYi0+Y21kX3Bvc10gPSAwOwotICAgICAgICAgICAgICAgICgqcF9jYi0+cF9lcnJfY2JhY2spKHBfY2ItPnBfdXNlciwgVFJVRSwgcF9jYi0+cF9jbWRfYnVmKTsKKyAgICAgICAgICAgICAgICAoKnBfY2ItPnBfZXJyX2NiYWNrKShwX2NiLT5wX3VzZXIsIHRydWUsIHBfY2ItPnBfY21kX2J1Zik7CiAgICAgICAgICAgICAgICAgcF9jYi0+Y21kX3BvcyA9IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCmRpZmYgLS1naXQgYS9idGEvYWcvYnRhX2FnX2F0LmggYi9idGEvYWcvYnRhX2FnX2F0LmgKaW5kZXggOTBkN2IwZi4uYmM0MDQzZiAxMDA2NDQKLS0tIGEvYnRhL2FnL2J0YV9hZ19hdC5oCisrKyBiL2J0YS9hZy9idGFfYWdfYXQuaApAQCAtNDcsMTggKzQ3LDE4IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIGNvbnN0IGNoYXIgICpwX2NtZDsgICAgICAgICAvKiBBVCBjb21tYW5kIHN0cmluZyAqLwotICAgIFVJTlQ4ICAgICAgIGFyZ190eXBlOyAgICAgICAvKiBhbGxvd2FibGUgYXJndW1lbnQgdHlwZSBzeW50YXggKi8KLSAgICBVSU5UOCAgICAgICBmbXQ7ICAgICAgICAgICAgLyogd2hldGhlciBhcmcgaXMgaW50IG9yIHN0cmluZyAqLwotICAgIFVJTlQ4ICAgICAgIG1pbjsgICAgICAgICAgICAvKiBtaW5pbXVtIHZhbHVlIGZvciBpbnQgYXJnICovCi0gICAgSU5UMTYgICAgICAgbWF4OyAgICAgICAgICAgIC8qIG1heGltdW0gdmFsdWUgZm9yIGludCBhcmcgKi8KKyAgICB1aW50OF90ICAgICBhcmdfdHlwZTsgICAgICAgLyogYWxsb3dhYmxlIGFyZ3VtZW50IHR5cGUgc3ludGF4ICovCisgICAgdWludDhfdCAgICAgZm10OyAgICAgICAgICAgIC8qIHdoZXRoZXIgYXJnIGlzIGludCBvciBzdHJpbmcgKi8KKyAgICB1aW50OF90ICAgICBtaW47ICAgICAgICAgICAgLyogbWluaW11bSB2YWx1ZSBmb3IgaW50IGFyZyAqLworICAgIGludDE2X3QgICAgIG1heDsgICAgICAgICAgICAvKiBtYXhpbXVtIHZhbHVlIGZvciBpbnQgYXJnICovCiB9IHRCVEFfQUdfQVRfQ01EOwogCiAvKiBjYWxsYmFjayBmdW5jdGlvbiBleGVjdXRlZCB3aGVuIGNvbW1hbmQgaXMgcGFyc2VkICovCi10eXBlZGVmIHZvaWQgKHRCVEFfQUdfQVRfQ01EX0NCQUNLKSh2b2lkICpwX3VzZXIsIFVJTlQxNiBjbWQsIFVJTlQ4IGFyZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcF9hcmcsIElOVDE2IGludF9hcmcpOwordHlwZWRlZiB2b2lkICh0QlRBX0FHX0FUX0NNRF9DQkFDSykodm9pZCAqcF91c2VyLCB1aW50MTZfdCBjbWQsIHVpbnQ4X3QgYXJnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwX2FyZywgaW50MTZfdCBpbnRfYXJnKTsKIAogLyogY2FsbGJhY2sgZnVuY3Rpb24gZXhlY3V0ZWQgdG8gc2VuZCAiRVJST1IiIHJlc3VsdCBjb2RlICovCi10eXBlZGVmIHZvaWQgKHRCVEFfQUdfQVRfRVJSX0NCQUNLKSh2b2lkICpwX3VzZXIsIEJPT0xFQU4gdW5rbm93biwgY2hhciAqcF9hcmcpOwordHlwZWRlZiB2b2lkICh0QlRBX0FHX0FUX0VSUl9DQkFDSykodm9pZCAqcF91c2VyLCBib29sIHVua25vd24sIGNoYXIgKnBfYXJnKTsKIAogLyogQVQgY29tbWFuZCBwYXJzaW5nIGNvbnRyb2wgYmxvY2sgKi8KIHR5cGVkZWYgc3RydWN0CkBAIC02OCw5ICs2OCw5IEBACiAgICAgdEJUQV9BR19BVF9FUlJfQ0JBQ0sgICAgKnBfZXJyX2NiYWNrOyAgIC8qIGVycm9yIGNhbGxiYWNrICovCiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnBfdXNlcjsgICAgICAgIC8qIHVzZXItZGVmaW5lZCBkYXRhICovCiAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgKnBfY21kX2J1ZjsgICAgIC8qIHRlbXAgcGFyc2luZyBidWZmZXIgKi8KLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBjbWRfcG9zOyAgICAgICAgLyogcG9zaXRpb24gaW4gdGVtcCBidWZmZXIgKi8KLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBjbWRfbWF4X2xlbjsgICAgLyogbGVuZ3RoIG9mIHRlbXAgYnVmZmVyIHRvIGFsbG9jYXRlICovCi0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgc3RhdGU7ICAgICAgICAgIC8qIHBhcnNpbmcgc3RhdGUgKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICBjbWRfcG9zOyAgICAgICAgLyogcG9zaXRpb24gaW4gdGVtcCBidWZmZXIgKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICBjbWRfbWF4X2xlbjsgICAgLyogbGVuZ3RoIG9mIHRlbXAgYnVmZmVyIHRvIGFsbG9jYXRlICovCisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgc3RhdGU7ICAgICAgICAgIC8qIHBhcnNpbmcgc3RhdGUgKi8KIH0gdEJUQV9BR19BVF9DQjsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMTUsNyArMTE1LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2FnX2F0X3BhcnNlKHRCVEFfQUdfQVRfQ0IgKnBfY2IsIGNoYXIgKnBfYnVmLCBVSU5UMTYgbGVuKTsKK2V4dGVybiB2b2lkIGJ0YV9hZ19hdF9wYXJzZSh0QlRBX0FHX0FUX0NCICpwX2NiLCBjaGFyICpwX2J1ZiwgdWludDE2X3QgbGVuKTsKIAogI2VuZGlmIC8qIEJUQV9BR19BVF9IICovCiAKZGlmZiAtLWdpdCBhL2J0YS9hZy9idGFfYWdfY2kuYyBiL2J0YS9hZy9idGFfYWdfY2kuYwppbmRleCA5NjhjYjFiLi4zNzk4NjE1IDEwMDY0NAotLS0gYS9idGEvYWcvYnRhX2FnX2NpLmMKKysrIGIvYnRhL2FnL2J0YV9hZ19jaS5jCkBAIC00MCw5ICs0MCw5IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZ19jaV9yeF93cml0ZShVSU5UMTYgaGFuZGxlLCBjaGFyICpwX2RhdGEsIFVJTlQxNiBsZW4pCit2b2lkIGJ0YV9hZ19jaV9yeF93cml0ZSh1aW50MTZfdCBoYW5kbGUsIGNoYXIgKnBfZGF0YSwgdWludDE2X3QgbGVuKQogewotICAgIFVJTlQxNiBsZW5fcmVtYWluaW5nID0gbGVuOworICAgIHVpbnQxNl90IGxlbl9yZW1haW5pbmcgPSBsZW47CiAgICAgY2hhciAqcF9kYXRhX2FyZWE7CiAKICAgICBpZiAobGVuID4gKFJGQ09NTV9EQVRBX0JVRl9TSVpFIC0gc2l6ZW9mKHRCVEFfQUdfQ0lfUlhfV1JJVEUpIC0gMSkpCkBAIC03OSw3ICs3OSw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZ19jaV9zbGNfcmVhZHkoVUlOVDE2IGhhbmRsZSkKK3ZvaWQgYnRhX2FnX2NpX3NsY19yZWFkeSh1aW50MTZfdCBoYW5kbGUpCiB7CiAgICAgdEJUQV9BR19EQVRBICpwX2J1ZiA9ICh0QlRBX0FHX0RBVEEgKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0FHX0RBVEEpKTsKIApkaWZmIC0tZ2l0IGEvYnRhL2FnL2J0YV9hZ19jbWQuYyBiL2J0YS9hZy9idGFfYWdfY21kLmMKaW5kZXggMmFiOWY1MS4uMDRkOGE0OCAxMDA2NDQKLS0tIGEvYnRhL2FnL2J0YV9hZ19jbWQuYworKysgYi9idGEvYWcvYnRhX2FnX2NtZC5jCkBAIC01NSwyMiArNTUsMjIgQEAKICNkZWZpbmUgQlRBX0FHX0NMSVBfVFlQRV9ERUZBVUxUICAgIDEyOQogI2RlZmluZSBCVEFfQUdfQ0xJUF9UWVBFX1ZPSVAgICAgICAgMjU1CiAKLSNpZiBkZWZpbmVkKEJUQV9BR19NVUxUSV9SRVNVTFRfSU5DTFVERUQpICYmIChCVEFfQUdfTVVMVElfUkVTVUxUX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9BR19NVUxUSV9SRVNVTFRfSU5DTFVERUQgPT0gVFJVRSkKICNkZWZpbmUgQlRBX0FHX0FUX01VTFRJX0xFTiAgICAgICAgICAgIDIKICNkZWZpbmUgQVRfU0VUX1JFU19DQihyZXNfY2IsIGMsIHAsIGkpIHtyZXNfY2IuY29kZSA9IGM7IHJlc19jYi5wX2FyZyA9IHA7IHJlc19jYi5pbnRfYXJnID0gaTt9CiAKIC8qIHR5cGUgZm9yIEFUIHJlc3VsdCBjb2RlIGJsb2NrICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQ4IGNvZGU7CisgICAgdWludDhfdCBjb2RlOwogICAgIGNoYXIgKnBfYXJnOwotICAgIElOVDE2IGludF9hcmc7CisgICAgaW50MTZfdCBpbnRfYXJnOwogfSB0QlRBX0FHX1JFU1VMVF9DQjsKIAogLyogdHlwZSBmb3IgbXVsdGlwbGUgQVQgcmVzdWx0IGNvZGVzIGJsb2NrICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQ4IG51bV9yZXN1bHQ7CisgICAgdWludDhfdCBudW1fcmVzdWx0OwogICAgIHRCVEFfQUdfUkVTVUxUX0NCIHJlc19jYltCVEFfQUdfQVRfTVVMVElfTEVOXTsKIH0gdEJUQV9BR19NVUxUSV9SRVNVTFRfQ0I7CiAjZW5kaWYKQEAgLTE2MCw3ICsxNjAsNyBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBjb25zdCBjaGFyICAqcF9yZXM7ICAgICAgICAgLyogQVQgcmVzdWx0IHN0cmluZyAqLwotICAgIFVJTlQ4ICAgICAgIGZtdDsgICAgICAgICAgICAvKiB3aGV0aGVyIGFyZ3VtZW50IGlzIGludCBvciBzdHJpbmcgKi8KKyAgICB1aW50OF90ICAgICBmbXQ7ICAgICAgICAgICAgLyogd2hldGhlciBhcmd1bWVudCBpcyBpbnQgb3Igc3RyaW5nICovCiB9IHRCVEFfQUdfUkVTVUxUOwogCiAvKiBBVCByZXN1bHQgY29kZSBhcmd1bWVudCB0eXBlcyAqLwpAQCAtMTk3LDcgKzE5Nyw3IEBACiAgICAgQlRBX0FHX1JFU19VTkFUCiB9OwogCi0jaWYgZGVmaW5lZChCVEFfSFNQX1JFU1VMVF9SRVBMQUNFX0NPTE9OKSAmJiAoQlRBX0hTUF9SRVNVTFRfUkVQTEFDRV9DT0xPTiA9PSBUUlVFKQorI2lmIChCVEFfSFNQX1JFU1VMVF9SRVBMQUNFX0NPTE9OID09IFRSVUUpCiAjZGVmaW5lIENPTE9OX0lEWF80X1ZHU1ZHTSAgICA0CiAjZW5kaWYKIC8qIEFUIHJlc3VsdCBjb2RlIGNvbnN0YW50IHRhYmxlICAoSW5kZXhlZCBieSByZXN1bHQgY29kZSkgKi8KQEAgLTI3Miw3ICsyNzIsNyBAQAogfTsKIAogLyogdHJhbnNsYXRpb24gb2YgQVBJIHJlc3VsdCBjb2RlIHZhbHVlcyB0byBpbnRlcm5hbCB2YWx1ZXMgKi8KLWNvbnN0IFVJTlQ4IGJ0YV9hZ190cmFuc19yZXN1bHRbXSA9Citjb25zdCB1aW50OF90IGJ0YV9hZ190cmFuc19yZXN1bHRbXSA9CiB7CiAgICAgQlRBX0FHX1JFU19WR1MsICAgICAvKiBCVEFfQUdfU1BLX1JFUyAqLwogICAgIEJUQV9BR19SRVNfVkdNLCAgICAgLyogQlRBX0FHX01JQ19SRVMgKi8KQEAgLTI5OCw3ICsyOTgsNyBAQAogfTsKIAogLyogY2FsbHNldHVwIGluZGljYXRvciB2YWx1ZSBsb29rdXAgdGFibGUgKi8KLWNvbnN0IFVJTlQ4IGJ0YV9hZ19jYWxsc2V0dXBfaW5kX3RibFtdID0KK2NvbnN0IHVpbnQ4X3QgYnRhX2FnX2NhbGxzZXR1cF9pbmRfdGJsW10gPQogewogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCVEFfQUdfU1BLX1JFUyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCVEFfQUdfTUlDX1JFUyAqLwpAQCAtMzMyLDE0ICszMzIsMTQgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfYWdfc2VuZF9yZXN1bHQodEJUQV9BR19TQ0IgKnBfc2NiLCBVSU5UOCBjb2RlLCBjaGFyICpwX2FyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQxNiBpbnRfYXJnKQorc3RhdGljIHZvaWQgYnRhX2FnX3NlbmRfcmVzdWx0KHRCVEFfQUdfU0NCICpwX3NjYiwgdWludDhfdCBjb2RlLCBjaGFyICpwX2FyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGludF9hcmcpCiB7Ci0gICAgY2hhciAgICBidWZbQlRBX0FHX0FUX01BWF9MRU4gKyAxNl07Ci0gICAgY2hhciAgICAqcCA9IGJ1ZjsKLSAgICBVSU5UMTYgIGxlbjsKKyAgICBjaGFyICAgICBidWZbQlRBX0FHX0FUX01BWF9MRU4gKyAxNl07CisgICAgY2hhciAgICAgKnAgPSBidWY7CisgICAgdWludDE2X3QgbGVuOwogCi0jaWYgZGVmaW5lZChCVEFfQUdfUkVTVUxUX0RFQlVHKSAmJiAoQlRBX0FHX1JFU1VMVF9ERUJVRyA9PSBUUlVFKQorI2lmIChCVEFfQUdfUkVTVUxUX0RFQlVHID09IFRSVUUpCiAgICAgbWVtc2V0KGJ1ZiwgTlVMTCwgc2l6ZW9mKGJ1ZikpOwogI2VuZGlmCiAgICAgLyogaW5pdCB3aXRoIFxyXG4gKi8KQEAgLTM0OCw3ICszNDgsNyBAQAogCiAgICAgLyogY29weSByZXN1bHQgY29kZSBzdHJpbmcgKi8KICAgICBzdHJsY3B5KHAsIGJ0YV9hZ19yZXN1bHRfdGJsW2NvZGVdLnBfcmVzLCBzaXplb2YoYnVmKSAtIDIpOwotI2lmIGRlZmluZWQoQlRBX0hTUF9SRVNVTFRfUkVQTEFDRV9DT0xPTikgJiYgKEJUQV9IU1BfUkVTVUxUX1JFUExBQ0VfQ09MT04gPT0gVFJVRSkKKyNpZiAoQlRBX0hTUF9SRVNVTFRfUkVQTEFDRV9DT0xPTiA9PSBUUlVFKQogICAgIGlmKHBfc2NiLT5jb25uX3NlcnZpY2UgPT0gQlRBX0FHX0hTUCkKICAgICB7CiAgICAgICAgIC8qIElmIEhTUCB0aGVuICI6InN5bWJvbCBzaG91bGQgYmUgY2hhbmdlZCBhcyAiPSIgZm9yIEhTUCBjb21wYXRpYmlsaXR5ICovCkBAIC0zNTgsNyArMzU4LDcgQEAKICAgICAgICAgY2FzZSBCVEFfQUdfUkVTX1ZHTToKICAgICAgICAgICAgIGlmKCoocCtDT0xPTl9JRFhfNF9WR1NWR00pID09ICc6JykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAjaWYgZGVmaW5lZChCVEFfQUdfUkVTVUxUX0RFQlVHKSAmJiAoQlRBX0FHX1JFU1VMVF9ERUJVRyA9PSBUUlVFKQorICAgICAgICAgICAgICAgICNpZiAoQlRBX0FHX1JFU1VMVF9ERUJVRyA9PSBUUlVFKQogICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIltIU1BdICc6J3N5bWJvbCBpcyBjaGFuZ2VkIGFzICc9JyBmb3IgSFNQIGNvbXBhdGliaWxpdHkiKTsKICAgICAgICAgICAgICAgICAjZW5kaWYKICAgICAgICAgICAgICAgICAqKHArQ09MT05fSURYXzRfVkdTVkdNKSA9ICc9JzsKQEAgLTM3Miw3ICszNzIsNyBAQAogICAgIC8qIGNvcHkgYXJndW1lbnQgaWYgYW55ICovCiAgICAgaWYgKGJ0YV9hZ19yZXN1bHRfdGJsW2NvZGVdLmZtdCA9PSBCVEFfQUdfUkVTX0ZNVF9JTlQpCiAgICAgewotICAgICAgICBwICs9IHV0bF9pdG9hKChVSU5UMTYpIGludF9hcmcsIHApOworICAgICAgICBwICs9IHV0bF9pdG9hKCh1aW50MTZfdCkgaW50X2FyZywgcCk7CiAgICAgfQogICAgIGVsc2UgaWYgKGJ0YV9hZ19yZXN1bHRfdGJsW2NvZGVdLmZtdCA9PSBCVEFfQUdfUkVTX0ZNVF9TVFIpCiAgICAgewpAQCAtMzg0LDE1ICszODQsMTUgQEAKICAgICAqcCsrID0gJ1xyJzsKICAgICAqcCsrID0gJ1xuJzsKIAotI2lmIGRlZmluZWQoQlRBX0FHX1JFU1VMVF9ERUJVRykgJiYgKEJUQV9BR19SRVNVTFRfREVCVUcgPT0gVFJVRSkKKyNpZiAoQlRBX0FHX1JFU1VMVF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9hZ19zZW5kX3Jlc3VsdDogJXMiLCBidWYpOwogI2VuZGlmCiAKICAgICAvKiBzZW5kIHRvIFJGQ09NTSAqLwotICAgIFBPUlRfV3JpdGVEYXRhKHBfc2NiLT5jb25uX2hhbmRsZSwgYnVmLCAoVUlOVDE2KSAocCAtIGJ1ZiksICZsZW4pOworICAgIFBPUlRfV3JpdGVEYXRhKHBfc2NiLT5jb25uX2hhbmRsZSwgYnVmLCAodWludDE2X3QpIChwIC0gYnVmKSwgJmxlbik7CiB9CiAKLSNpZiBkZWZpbmVkKEJUQV9BR19NVUxUSV9SRVNVTFRfSU5DTFVERUQpICYmIChCVEFfQUdfTVVMVElfUkVTVUxUX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9BR19NVUxUSV9SRVNVTFRfSU5DTFVERUQgPT0gVFJVRSkKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgogKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc2VuZF9tdWx0aV9yZXN1bHQKQEAgLTQwNSwxMCArNDA1LDEwIEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgYnRhX2FnX3NlbmRfbXVsdGlfcmVzdWx0KHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19NVUxUSV9SRVNVTFRfQ0IgKm1fcmVzX2NiKQogewotICAgIGNoYXIgICAgYnVmW0JUQV9BR19BVF9NQVhfTEVOICogQlRBX0FHX0FUX01VTFRJX0xFTiArIDE2XTsKLSAgICBjaGFyICAgICpwID0gYnVmOwotICAgIFVJTlQxNiAgbGVuOwotICAgIFVJTlQ4ICAgcmVzX2lkeCA9IDA7CisgICAgY2hhciAgICAgYnVmW0JUQV9BR19BVF9NQVhfTEVOICogQlRBX0FHX0FUX01VTFRJX0xFTiArIDE2XTsKKyAgICBjaGFyICAgICAqcCA9IGJ1ZjsKKyAgICB1aW50MTZfdCBsZW47CisgICAgdWludDhfdCAgcmVzX2lkeCA9IDA7CiAKICAgICBpZigoIW1fcmVzX2NiKSB8fCAobV9yZXNfY2ItPm51bV9yZXN1bHQgPT0gMCkgfHwgKG1fcmVzX2NiLT5udW1fcmVzdWx0ID4gQlRBX0FHX0FUX01VTFRJX0xFTikpCiAgICAgewpAQCAtNDE2LDcgKzQxNiw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSNpZiBkZWZpbmVkKEJUQV9BR19SRVNVTFRfREVCVUcpICYmIChCVEFfQUdfUkVTVUxUX0RFQlVHID09IFRSVUUpCisjaWYgKEJUQV9BR19SRVNVTFRfREVCVUcgPT0gVFJVRSkKICAgICBtZW1zZXQoYnVmLCBOVUxMLCBzaXplb2YoYnVmKSk7CiAjZW5kaWYKIApAQCAtNDMzLDcgKzQzMyw3IEBACiAgICAgICAgIC8qIGNvcHkgYXJndW1lbnQgaWYgYW55ICovCiAgICAgICAgIGlmIChidGFfYWdfcmVzdWx0X3RibFttX3Jlc19jYi0+cmVzX2NiW3Jlc19pZHhdLmNvZGVdLmZtdCA9PSBCVEFfQUdfUkVTX0ZNVF9JTlQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHAgKz0gdXRsX2l0b2EoKFVJTlQxNikgbV9yZXNfY2ItPnJlc19jYltyZXNfaWR4XS5pbnRfYXJnLCBwKTsKKyAgICAgICAgICAgIHAgKz0gdXRsX2l0b2EoKHVpbnQxNl90KSBtX3Jlc19jYi0+cmVzX2NiW3Jlc19pZHhdLmludF9hcmcsIHApOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKGJ0YV9hZ19yZXN1bHRfdGJsW21fcmVzX2NiLT5yZXNfY2JbcmVzX2lkeF0uY29kZV0uZm10ID09IEJUQV9BR19SRVNfRk1UX1NUUikKICAgICAgICAgewpAQCAtNDQ4LDEyICs0NDgsMTIgQEAKICAgICAgICAgcmVzX2lkeCsrOwogICAgIH0KIAotI2lmIGRlZmluZWQoQlRBX0FHX1JFU1VMVF9ERUJVRykgJiYgKEJUQV9BR19SRVNVTFRfREVCVUcgPT0gVFJVRSkKKyNpZiAoQlRBX0FHX1JFU1VMVF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoInNlbmRfcmVzdWx0OiAlcyIsIGJ1Zik7CiAjZW5kaWYKIAogICAgIC8qIHNlbmQgdG8gUkZDT01NICovCi0gICAgUE9SVF9Xcml0ZURhdGEocF9zY2ItPmNvbm5faGFuZGxlLCBidWYsIChVSU5UMTYpIChwIC0gYnVmKSwgJmxlbik7CisgICAgUE9SVF9Xcml0ZURhdGEocF9zY2ItPmNvbm5faGFuZGxlLCBidWYsICh1aW50MTZfdCkgKHAgLSBidWYpLCAmbGVuKTsKIH0KICNlbmRpZgogCkBAIC00ODMsNyArNDgzLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfYWdfc2VuZF9lcnJvcih0QlRBX0FHX1NDQiAqcF9zY2IsIElOVDE2IGVycmNvZGUpCitzdGF0aWMgdm9pZCBidGFfYWdfc2VuZF9lcnJvcih0QlRBX0FHX1NDQiAqcF9zY2IsIGludDE2X3QgZXJyY29kZSkKIHsKICAgICAvKiBJZiBIRlAgYW5kIGV4dGVuZGVkIGF1ZGlvIGdhdGV3YXkgZXJyb3IgY29kZXMgYXJlIGVuYWJsZWQgKi8KICAgICBpZiAocF9zY2ItPmNvbm5fc2VydmljZSA9PSBCVEFfQUdfSEZQICYmIHBfc2NiLT5jbWVlX2VuYWJsZWQpCkBAIC01MDIsMTQgKzUwMiwxNCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hZ19zZW5kX2luZCh0QlRBX0FHX1NDQiAqcF9zY2IsIFVJTlQxNiBpZCwgVUlOVDE2IHZhbHVlLCBCT09MRUFOIG9uX2RlbWFuZCkKK3N0YXRpYyB2b2lkIGJ0YV9hZ19zZW5kX2luZCh0QlRBX0FHX1NDQiAqcF9zY2IsIHVpbnQxNl90IGlkLCB1aW50MTZfdCB2YWx1ZSwgYm9vbCBvbl9kZW1hbmQpCiB7CiAgICAgY2hhciAgICBzdHJbMTJdOwogICAgIGNoYXIgICAgKnAgPSBzdHI7CiAKICAgICAvKiBJZiB0aGUgaW5kaWNhdG9yIGlzIG1hc2tlZCBvdXQsIGp1c3QgcmV0dXJuICovCiAgICAgLyogTWFuZGF0b3J5IGluZGljYXRvcnMgY2FuIG5vdCBiZSBtYXNrZWQgb3V0LiAqLwotICAgIGlmICgocF9zY2ItPmJpYV9tYXNrZWRfb3V0ICYgKChVSU5UMzIpMSA8PCBpZCkpICYmCisgICAgaWYgKChwX3NjYi0+YmlhX21hc2tlZF9vdXQgJiAoKHVpbnQzMl90KTEgPDwgaWQpKSAmJgogICAgICAgICAoKGlkICE9IEJUQV9BR19JTkRfQ0FMTCkgJiYgKGlkICE9IEJUQV9BR19JTkRfQ0FMTFNFVFVQKSAmJiAoaWQgIT0gQlRBX0FHX0lORF9DQUxMSEVMRCkpKQogICAgICAgICByZXR1cm47CiAKQEAgLTUxNyw1NiArNTE3LDU2IEBACiAgICAgLyogSWYgaXQgd2FzIHJlcXVlc3RlZCBieSBhcHAsIHRyYW5zbWl0IENJRVYgZXZlbiBpZiBpdCBpcyBkdXBsaWNhdGUuICovCiAgICAgaWYgKGlkID09IEJUQV9BR19JTkRfQ0FMTCkKICAgICB7Ci0gICAgICAgIGlmICgodmFsdWUgPT0gcF9zY2ItPmNhbGxfaW5kKSAmJiAob25fZGVtYW5kID09IEZBTFNFKSkKKyAgICAgICAgaWYgKCh2YWx1ZSA9PSBwX3NjYi0+Y2FsbF9pbmQpICYmIChvbl9kZW1hbmQgPT0gZmFsc2UpKQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIHBfc2NiLT5jYWxsX2luZCA9IChVSU5UOCl2YWx1ZTsKKyAgICAgICAgcF9zY2ItPmNhbGxfaW5kID0gKHVpbnQ4X3QpdmFsdWU7CiAgICAgfQogCi0gICAgaWYgKChpZCA9PSBCVEFfQUdfSU5EX0NBTExTRVRVUCkgJiYgKG9uX2RlbWFuZCA9PSBGQUxTRSkpCisgICAgaWYgKChpZCA9PSBCVEFfQUdfSU5EX0NBTExTRVRVUCkgJiYgKG9uX2RlbWFuZCA9PSBmYWxzZSkpCiAgICAgewogICAgICAgICBpZiAodmFsdWUgPT0gcF9zY2ItPmNhbGxzZXR1cF9pbmQpCiAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgcF9zY2ItPmNhbGxzZXR1cF9pbmQgPSAoVUlOVDgpdmFsdWU7CisgICAgICAgIHBfc2NiLT5jYWxsc2V0dXBfaW5kID0gKHVpbnQ4X3QpdmFsdWU7CiAgICAgfQogCi0gICAgaWYgKChpZCA9PSBCVEFfQUdfSU5EX1NFUlZJQ0UpICYmIChvbl9kZW1hbmQgPT0gRkFMU0UpKQorICAgIGlmICgoaWQgPT0gQlRBX0FHX0lORF9TRVJWSUNFKSAmJiAob25fZGVtYW5kID09IGZhbHNlKSkKICAgICB7CiAgICAgICAgIGlmICh2YWx1ZSA9PSBwX3NjYi0+c2VydmljZV9pbmQpCiAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgcF9zY2ItPnNlcnZpY2VfaW5kID0gKFVJTlQ4KXZhbHVlOworICAgICAgICBwX3NjYi0+c2VydmljZV9pbmQgPSAodWludDhfdCl2YWx1ZTsKICAgICB9Ci0gICAgaWYgKChpZCA9PSBCVEFfQUdfSU5EX1NJR05BTCkgJiYgKG9uX2RlbWFuZCA9PSBGQUxTRSkpCisgICAgaWYgKChpZCA9PSBCVEFfQUdfSU5EX1NJR05BTCkgJiYgKG9uX2RlbWFuZCA9PSBmYWxzZSkpCiAgICAgewogICAgICAgICBpZiAodmFsdWUgPT0gcF9zY2ItPnNpZ25hbF9pbmQpCiAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgcF9zY2ItPnNpZ25hbF9pbmQgPSAoVUlOVDgpdmFsdWU7CisgICAgICAgIHBfc2NiLT5zaWduYWxfaW5kID0gKHVpbnQ4X3QpdmFsdWU7CiAgICAgfQotICAgIGlmICgoaWQgPT0gQlRBX0FHX0lORF9ST0FNKSAmJiAob25fZGVtYW5kID09IEZBTFNFKSkKKyAgICBpZiAoKGlkID09IEJUQV9BR19JTkRfUk9BTSkgJiYgKG9uX2RlbWFuZCA9PSBmYWxzZSkpCiAgICAgewogICAgICAgICBpZiAodmFsdWUgPT0gcF9zY2ItPnJvYW1faW5kKQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIHBfc2NiLT5yb2FtX2luZCA9IChVSU5UOCl2YWx1ZTsKKyAgICAgICAgcF9zY2ItPnJvYW1faW5kID0gKHVpbnQ4X3QpdmFsdWU7CiAgICAgfQotICAgIGlmICgoaWQgPT0gQlRBX0FHX0lORF9CQVRUQ0hHKSAmJiAob25fZGVtYW5kID09IEZBTFNFKSkKKyAgICBpZiAoKGlkID09IEJUQV9BR19JTkRfQkFUVENIRykgJiYgKG9uX2RlbWFuZCA9PSBmYWxzZSkpCiAgICAgewogICAgICAgICBpZiAodmFsdWUgPT0gcF9zY2ItPmJhdHRjaGdfaW5kKQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIHBfc2NiLT5iYXR0Y2hnX2luZCA9IChVSU5UOCl2YWx1ZTsKKyAgICAgICAgcF9zY2ItPmJhdHRjaGdfaW5kID0gKHVpbnQ4X3QpdmFsdWU7CiAgICAgfQogCi0gICAgaWYgKChpZCA9PSBCVEFfQUdfSU5EX0NBTExIRUxEKSAmJiAob25fZGVtYW5kID09IEZBTFNFKSkKKyAgICBpZiAoKGlkID09IEJUQV9BR19JTkRfQ0FMTEhFTEQpICYmIChvbl9kZW1hbmQgPT0gZmFsc2UpKQogICAgIHsKICAgICAgICAgLyogY2FsbCBzd2FwIGNvdWxkIHJlc3VsdCBpbiBzZW5kaW5nIGNhbGxoZWxkPTEgbXVsdGlwbGUgdGltZXMgKi8KICAgICAgICAgaWYgKCh2YWx1ZSAhPSAxKSAmJiAodmFsdWUgPT0gcF9zY2ItPmNhbGxoZWxkX2luZCkpCiAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgcF9zY2ItPmNhbGxoZWxkX2luZCA9IChVSU5UOCl2YWx1ZTsKKyAgICAgICAgcF9zY2ItPmNhbGxoZWxkX2luZCA9ICh1aW50OF90KXZhbHVlOwogICAgIH0KIAogICAgIGlmIChwX3NjYi0+Y21lcl9lbmFibGVkKQpAQCAtNTg1LDEyICs1ODUsMTIgQEAKICoqIERlc2NyaXB0aW9uICAgICAgUGFyc2UgQVQrQ01FUiBwYXJhbWV0ZXIgc3RyaW5nLgogKioKICoqCi0qKiBSZXR1cm5zICAgICAgICAgIFRSVUUgaWYgcGFyc2VkIG9rLCBGQUxTRSBvdGhlcndpc2UuCisqKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgcGFyc2VkIG9rLCBmYWxzZSBvdGhlcndpc2UuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBCT09MRUFOIGJ0YV9hZ19wYXJzZV9jbWVyKGNoYXIgKnBfcywgQk9PTEVBTiAqcF9lbmFibGVkKQorc3RhdGljIGJvb2wgYnRhX2FnX3BhcnNlX2NtZXIoY2hhciAqcF9zLCBib29sICpwX2VuYWJsZWQpCiB7Ci0gICAgSU5UMTYgICBuWzRdID0gey0xLCAtMSwgLTEsIC0xfTsKKyAgICBpbnQxNl90IG5bNF0gPSB7LTEsIC0xLCAtMSwgLTF9OwogICAgIGludCAgICAgaTsKICAgICBjaGFyICAgICpwOwogCkBAIC02MTIsMTUgKzYxMiwxNSBAQAogICAgIC8qIHByb2Nlc3MgdmFsdWVzICovCiAgICAgaWYgKG5bMF0gPCAwIHx8IG5bM10gPCAwKQogICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgaWYgKChuWzBdID09IDMpICYmICgoblszXSA9PSAxKSB8fCAoblszXSA9PSAwKSkpCiAgICAgewotICAgICAgICAqcF9lbmFibGVkID0gKEJPT0xFQU4pIG5bM107CisgICAgICAgICpwX2VuYWJsZWQgPSAoYm9vbCkgblszXTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTYzNCwxMCArNjM0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGlmIGlkeCBkb2Vzbid0IGV4aXN0LzFzdCBjaGFyYWN0ZXIgb2YgYXJndW1lbnQgaXMgbm90IGEgZGlnaXQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFVJTlQ4IGJ0YV9hZ19wYXJzZV9jaGxkKHRCVEFfQUdfU0NCICpwX3NjYiwgY2hhciAqcF9zKQorc3RhdGljIHVpbnQ4X3QgYnRhX2FnX3BhcnNlX2NobGQodEJUQV9BR19TQ0IgKnBfc2NiLCBjaGFyICpwX3MpCiB7Ci0gICAgVUlOVDggICByZXR2YWwgPSAwOwotICAgIElOVDE2ICAgaWR4ID0gLTE7CisgICAgdWludDhfdCByZXR2YWwgPSAwOworICAgIGludDE2X3QgaWR4ID0gLTE7CiAgICAgVU5VU0VEKHBfc2NiKTsKIAogICAgIGlmICghaXNkaWdpdChwX3NbMF0pKQpAQCAtNjUxLDcgKzY1MSw3IEBACiAgICAgICAgIGlkeCA9IHV0bF9zdHIyaW50KCZwX3NbMV0pOwogICAgICAgICBpZiAoaWR4ICE9IC0xICYmIGlkeCA8IDI1NSkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dmFsID0gKFVJTlQ4KWlkeDsKKyAgICAgICAgICAgIHJldHZhbCA9ICh1aW50OF90KWlkeDsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKQEAgLTY2Miw3ICs2NjIsNyBAQAogICAgIHJldHVybiAocmV0dmFsKTsKIH0KIAotI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUgKQorI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUpCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKICoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3BhcnNlX2JhYwpAQCAtNjc1LDggKzY3NSw4IEBACiBzdGF0aWMgdEJUQV9BR19QRUVSX0NPREVDIGJ0YV9hZ19wYXJzZV9iYWModEJUQV9BR19TQ0IgKnBfc2NiLCBjaGFyICpwX3MpCiB7CiAgICAgdEJUQV9BR19QRUVSX0NPREVDICByZXR2YWwgPSBCVEFfQUdfQ09ERUNfTk9ORTsKLSAgICBVSU5UMTYgIHV1aWRfY29kZWM7Ci0gICAgQk9PTEVBTiBjb250ID0gRkFMU0U7ICAgICAgIC8qIENvbnRpbnVlIHByb2Nlc3NpbmcgKi8KKyAgICB1aW50MTZfdCAgdXVpZF9jb2RlYzsKKyAgICBib29sIGNvbnQgPSBmYWxzZTsgICAgICAgLyogQ29udGludWUgcHJvY2Vzc2luZyAqLwogICAgIGNoYXIgKnA7CiAKICAgICB3aGlsZShwX3MpCkBAIC02ODgsMTAgKzY4OCwxMCBAQAogICAgICAgICBpZiAoKnAgIT0gMCkKICAgICAgICAgewogICAgICAgICAgICAgKnAgPSAwOwotICAgICAgICAgICAgY29udCA9IFRSVUU7CisgICAgICAgICAgICBjb250ID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250ID0gRkFMU0U7CisgICAgICAgICAgICBjb250ID0gZmFsc2U7CiAKICAgICAgICAgdXVpZF9jb2RlYyA9IHV0bF9zdHIyaW50KHBfcyk7CiAgICAgICAgIHN3aXRjaCh1dWlkX2NvZGVjKQpAQCAtNzI3LDEwICs3MjcsMTAgQEAKIAogc3RhdGljIHZvaWQgYnRhX2FnX3Byb2Nlc3NfdW5hdF9yZXMoY2hhciAqdW5hdF9yZXN1bHQpCiB7Ci0gICAgVUlOVDggICBzdHJfbGVuZzsKLSAgICBVSU5UOCAgIGkgPSAwOwotICAgIFVJTlQ4ICAgaiA9IDA7Ci0gICAgVUlOVDggICBwYWlyc19vZl9ubF9jcjsKKyAgICB1aW50OF90IHN0cl9sZW5nOworICAgIHVpbnQ4X3QgaSA9IDA7CisgICAgdWludDhfdCBqID0gMDsKKyAgICB1aW50OF90IHBhaXJzX29mX25sX2NyOwogICAgIGNoYXIgICAgdHJpbV9kYXRhW0JUQV9BR19BVF9NQVhfTEVOXTsKIAogCkBAIC03NzYsMTYgKzc3NiwxNiBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX2FnX2luYmFuZF9lbmFibGVkKHRCVEFfQUdfU0NCICpwX3NjYikKK2Jvb2wgYnRhX2FnX2luYmFuZF9lbmFibGVkKHRCVEFfQUdfU0NCICpwX3NjYikKIHsKICAgICAvKiBpZiBmZWF0dXJlIGlzIGVuYWJsZWQgYW5kIG5vIG90aGVyIHNjYnMgY29ubmVjdGVkICovCiAgICAgaWYgKHBfc2NiLT5pbmJhbmRfZW5hYmxlZCAmJiAhYnRhX2FnX290aGVyX3NjYl9vcGVuKHBfc2NiKSkKICAgICB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogfQogCkBAIC04MDEsOCArODAxLDggQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9hZ19zZW5kX2NhbGxfaW5kcyh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfUkVTIHJlc3VsdCkKIHsKLSAgICBVSU5UOCBjYWxsID0gcF9zY2ItPmNhbGxfaW5kOwotICAgIFVJTlQ4IGNhbGxzZXR1cDsKKyAgICB1aW50OF90IGNhbGwgPSBwX3NjYi0+Y2FsbF9pbmQ7CisgICAgdWludDhfdCBjYWxsc2V0dXA7CiAKICAgICAvKiBzZXQgbmV3IGNhbGwgYW5kIGNhbGxzZXR1cCB2YWx1ZXMgYmFzZWQgb24gQlRBX0FnUmVzdWx0ICovCiAgICAgY2FsbHNldHVwID0gYnRhX2FnX2NhbGxzZXR1cF9pbmRfdGJsW3Jlc3VsdF07CkBAIC04MjIsOCArODIyLDggQEAKICAgICB9CiAKICAgICAvKiBTZW5kIGluZGljYXRvciBmdW5jdGlvbiB0cmFja3MgaWYgdGhlIHZhbHVlcyBoYXZlIGFjdHVhbGx5IGNoYW5nZWQgKi8KLSAgICBidGFfYWdfc2VuZF9pbmQocF9zY2IsIEJUQV9BR19JTkRfQ0FMTCwgY2FsbCwgRkFMU0UpOwotICAgIGJ0YV9hZ19zZW5kX2luZChwX3NjYiwgQlRBX0FHX0lORF9DQUxMU0VUVVAsIGNhbGxzZXR1cCwgRkFMU0UpOworICAgIGJ0YV9hZ19zZW5kX2luZChwX3NjYiwgQlRBX0FHX0lORF9DQUxMLCBjYWxsLCBmYWxzZSk7CisgICAgYnRhX2FnX3NlbmRfaW5kKHBfc2NiLCBCVEFfQUdfSU5EX0NBTExTRVRVUCwgY2FsbHNldHVwLCBmYWxzZSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC04MzYsOCArODM2LDggQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZ19hdF9oc3BfY2JhY2sodEJUQV9BR19TQ0IgKnBfc2NiLCBVSU5UMTYgY21kLCBVSU5UOCBhcmdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcF9hcmcsIElOVDE2IGludF9hcmcpCit2b2lkIGJ0YV9hZ19hdF9oc3BfY2JhY2sodEJUQV9BR19TQ0IgKnBfc2NiLCB1aW50MTZfdCBjbWQsIHVpbnQ4X3QgYXJnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBfYXJnLCBpbnQxNl90IGludF9hcmcpCiB7CiAgICAgdEJUQV9BR19WQUwgdmFsOwogCkBAIC04NDksNyArODQ5LDcgQEAKIAogICAgIHZhbC5oZHIuaGFuZGxlID0gYnRhX2FnX3NjYl90b19pZHgocF9zY2IpOwogICAgIHZhbC5oZHIuYXBwX2lkID0gcF9zY2ItPmFwcF9pZDsKLSAgICB2YWwubnVtID0gKFVJTlQxNikgaW50X2FyZzsKKyAgICB2YWwubnVtID0gKHVpbnQxNl90KSBpbnRfYXJnOwogICAgIHN0cmxjcHkodmFsLnN0ciwgcF9hcmcsIEJUQV9BR19BVF9NQVhfTEVOKTsKIAogICAgIC8qIGNhbGwgY2FsbGJhY2sgd2l0aCBldmVudCAqLwpAQCAtODY2LDE1ICs4NjYsMTUgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZ19hdF9oZnBfY2JhY2sodEJUQV9BR19TQ0IgKnBfc2NiLCBVSU5UMTYgY21kLCBVSU5UOCBhcmdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcF9hcmcsIElOVDE2IGludF9hcmcpCit2b2lkIGJ0YV9hZ19hdF9oZnBfY2JhY2sodEJUQV9BR19TQ0IgKnBfc2NiLCB1aW50MTZfdCBjbWQsIHVpbnQ4X3QgYXJnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBfYXJnLCBpbnQxNl90IGludF9hcmcpCiB7Ci0gICAgdEJUQV9BR19WQUwgICAgIHZhbDsKKyAgICB0QlRBX0FHX1ZBTCAgIHZhbDsKICAgICB0QlRBX0FHX0VWVCAgIGV2ZW50OwotICAgIHRCVEFfQUdfU0NCICAgICAqYWdfc2NiOwotICAgIFVJTlQzMiAgICAgICAgICBpLCBpbmRfaWQ7Ci0gICAgVUlOVDMyICAgICAgICAgIGJpYV9tYXNrZWRfb3V0OwotI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUgKQorICAgIHRCVEFfQUdfU0NCICAgKmFnX3NjYjsKKyAgICB1aW50MzJfdCAgICAgIGksIGluZF9pZDsKKyAgICB1aW50MzJfdCAgICAgIGJpYV9tYXNrZWRfb3V0OworI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUpCiAgICAgdEJUQV9BR19QRUVSX0NPREVDICBjb2RlY190eXBlLCBjb2RlY19zZW50OwogI2VuZGlmCiAgICAgaWYgKHBfYXJnID09IE5VTEwpCkBAIC05NDcsNyArOTQ3LDcgQEAKIAogICAgICAgICBjYXNlIEJUQV9BR19IRl9DTURfQ0NXQToKICAgICAgICAgICAgIC8qIHN0b3JlIHNldHRpbmcgKi8KLSAgICAgICAgICAgIHBfc2NiLT5jY3dhX2VuYWJsZWQgPSAoQk9PTEVBTikgaW50X2FyZzsKKyAgICAgICAgICAgIHBfc2NiLT5jY3dhX2VuYWJsZWQgPSAoYm9vbCkgaW50X2FyZzsKIAogICAgICAgICAgICAgLyogc2VuZCBPSyAqLwogICAgICAgICAgICAgYnRhX2FnX3NlbmRfb2socF9zY2IpOwpAQCAtMTAzMSw3ICsxMDMxLDcgQEAKIAogICAgICAgICBjYXNlIEJUQV9BR19IRl9DTURfQ0xJUDoKICAgICAgICAgICAgIC8qIHN0b3JlIHNldHRpbmcsIHNlbmQgT0sgKi8KLSAgICAgICAgICAgIHBfc2NiLT5jbGlwX2VuYWJsZWQgPSAoQk9PTEVBTikgaW50X2FyZzsKKyAgICAgICAgICAgIHBfc2NiLT5jbGlwX2VuYWJsZWQgPSAoYm9vbCkgaW50X2FyZzsKICAgICAgICAgICAgIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsKICAgICAgICAgICAgIGJyZWFrOwogCkBAIC0xMDg5LDExICsxMDg5LDExIEBACiAKICAgICAgICAgY2FzZSBCVEFfQUdfSEZfQ01EX0JSU0Y6CiAgICAgICAgICAgICAvKiBzdG9yZSBwZWVyIGZlYXR1cmVzICovCi0gICAgICAgICAgICBwX3NjYi0+cGVlcl9mZWF0dXJlcyA9IChVSU5UMTYpIGludF9hcmc7CisgICAgICAgICAgICBwX3NjYi0+cGVlcl9mZWF0dXJlcyA9ICh1aW50MTZfdCkgaW50X2FyZzsKIAogICAgICAgICAgICAgLyogc2VuZCBCUlNGLCBzZW5kIE9LICovCiAgICAgICAgICAgICBidGFfYWdfc2VuZF9yZXN1bHQocF9zY2IsIEJUQV9BR19SRVNfQlJTRiwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSU5UMTYpIChwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfQlNSRl9GRUFUX1NQRUMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCkgKHBfc2NiLT5mZWF0dXJlcyAmIEJUQV9BR19CU1JGX0ZFQVRfU1BFQykpOwogICAgICAgICAgICAgYnRhX2FnX3NlbmRfb2socF9zY2IpOwogICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTExNTMsNyArMTE1Myw3IEBACiAgICAgICAgICAgICBpZiAocF9zY2ItPmZlYXR1cmVzICYgQlRBX0FHX0ZFQVRfRVhURVJSKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8qIHN0b3JlIHNldHRpbmcgKi8KLSAgICAgICAgICAgICAgICBwX3NjYi0+Y21lZV9lbmFibGVkID0gKEJPT0xFQU4pIGludF9hcmc7CisgICAgICAgICAgICAgICAgcF9zY2ItPmNtZWVfZW5hYmxlZCA9IChib29sKSBpbnRfYXJnOwogCiAgICAgICAgICAgICAgICAgLyogc2VuZCBPSyAqLwogICAgICAgICAgICAgICAgIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsKQEAgLTExNzksOSArMTE3OSw5IEBACiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgICAgICAgICAgaWYgKHZhbC5zdHJbaV0gPT0gJzAnKQotICAgICAgICAgICAgICAgICAgICBiaWFfbWFza2VkX291dCB8PSAoKFVJTlQzMikxIDw8IGluZF9pZCk7CisgICAgICAgICAgICAgICAgICAgIGJpYV9tYXNrZWRfb3V0IHw9ICgodWludDMyX3QpMSA8PCBpbmRfaWQpOwogICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbC5zdHJbaV0gPT0gJzEnKQotICAgICAgICAgICAgICAgICAgICBiaWFfbWFza2VkX291dCAmPSB+KChVSU5UMzIpMSA8PCBpbmRfaWQpOworICAgICAgICAgICAgICAgICAgICBiaWFfbWFza2VkX291dCAmPSB+KCh1aW50MzJfdCkxIDw8IGluZF9pZCk7CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtMTIwOCw3ICsxMjA4LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogCi0jaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSkKICAgICAgICAgY2FzZSBCVEFfQUdfSEZfQ01EX0JBQzoKICAgICAgICAgICAgIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsKIApAQCAtMTIxNiw3ICsxMjE2LDcgQEAKICAgICAgICAgICAgIGlmKChwX3NjYi0+cGVlcl9mZWF0dXJlcyAmIEJUQV9BR19QRUVSX0ZFQVRfQ09ERUMpICYmIChwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9DT0RFQykpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcF9zY2ItPnBlZXJfY29kZWNzID0gYnRhX2FnX3BhcnNlX2JhYyhwX3NjYiwgcF9hcmcpOwotICAgICAgICAgICAgICAgIHBfc2NiLT5jb2RlY191cGRhdGVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICBwX3NjYi0+Y29kZWNfdXBkYXRlZCA9IHRydWU7CiAKICAgICAgICAgICAgICAgICBpZiAocF9zY2ItPnBlZXJfY29kZWNzICYgQlRBX0FHX0NPREVDX01TQkMpCiAgICAgICAgICAgICAgICAgewpAQCAtMTI2NSw5ICsxMjY1LDkgQEAKICAgICAgICAgICAgICAgICBjb2RlY19zZW50ID0gcF9zY2ItPnNjb19jb2RlYzsKIAogICAgICAgICAgICAgaWYoY29kZWNfdHlwZSA9PSBjb2RlY19zZW50KQotICAgICAgICAgICAgICAgIGJ0YV9hZ19zY29fY29kZWNfbmVnbyhwX3NjYiwgVFJVRSk7CisgICAgICAgICAgICAgICAgYnRhX2FnX3Njb19jb2RlY19uZWdvKHBfc2NiLCB0cnVlKTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBidGFfYWdfc2NvX2NvZGVjX25lZ28ocF9zY2IsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICBidGFfYWdfc2NvX2NvZGVjX25lZ28ocF9zY2IsIGZhbHNlKTsKIAogICAgICAgICAgICAgLyogc2VuZCBmaW5hbCBjb2RlYyBpbmZvIHRvIGNhbGxiYWNrICovCiAgICAgICAgICAgICB2YWwubnVtID0gY29kZWNfc2VudDsKQEAgLTEzMDEsNyArMTMwMSw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYWdfYXRfZXJyX2NiYWNrKHRCVEFfQUdfU0NCICpwX3NjYiwgQk9PTEVBTiB1bmtub3duLCBjaGFyICpwX2FyZykKK3ZvaWQgYnRhX2FnX2F0X2Vycl9jYmFjayh0QlRBX0FHX1NDQiAqcF9zY2IsIGJvb2wgdW5rbm93biwgY2hhciAqcF9hcmcpCiB7CiAgICAgdEJUQV9BR19WQUwgICAgIHZhbDsKIApAQCAtMTMzOSw3ICsxMzM5LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9hZ19oc3BfcmVzdWx0KHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19BUElfUkVTVUxUICpwX3Jlc3VsdCkKIHsKLSAgICBVSU5UOCBjb2RlID0gYnRhX2FnX3RyYW5zX3Jlc3VsdFtwX3Jlc3VsdC0+cmVzdWx0XTsKKyAgICB1aW50OF90IGNvZGUgPSBidGFfYWdfdHJhbnNfcmVzdWx0W3BfcmVzdWx0LT5yZXN1bHRdOwogCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2FnX2hzcF9yZXN1bHQgOiByZXMgPSAlZCIsIHBfcmVzdWx0LT5yZXN1bHQpOwogCkBAIC0xNDUxLDcgKzE0NTEsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2FnX2hmcF9yZXN1bHQodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0FQSV9SRVNVTFQgKnBfcmVzdWx0KQogewotICAgIFVJTlQ4IGNvZGUgPSBidGFfYWdfdHJhbnNfcmVzdWx0W3BfcmVzdWx0LT5yZXN1bHRdOworICAgIHVpbnQ4X3QgY29kZSA9IGJ0YV9hZ190cmFuc19yZXN1bHRbcF9yZXN1bHQtPnJlc3VsdF07CiAKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfYWdfaGZwX3Jlc3VsdCA6IHJlcyA9ICVkIiwgcF9yZXN1bHQtPnJlc3VsdCk7CiAKQEAgLTE2ODMsNyArMTY4Myw3IEBACiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEJUQV9BR19JTkRfUkVTOgotICAgICAgICAgICAgYnRhX2FnX3NlbmRfaW5kKHBfc2NiLCBwX3Jlc3VsdC0+ZGF0YS5pbmQuaWQsIHBfcmVzdWx0LT5kYXRhLmluZC52YWx1ZSwgRkFMU0UpOworICAgICAgICAgICAgYnRhX2FnX3NlbmRfaW5kKHBfc2NiLCBwX3Jlc3VsdC0+ZGF0YS5pbmQuaWQsIHBfcmVzdWx0LT5kYXRhLmluZC52YWx1ZSwgZmFsc2UpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBCVEFfQUdfQlZSQV9SRVM6CkBAIC0xNzM3LDcgKzE3MzcsNyBAQAogICAgIH0KIH0KIAotI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUgKQorI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUpCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKICoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3NlbmRfYmNzCkBAIC0xNzQ5LDcgKzE3NDksNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2FnX3NlbmRfYmNzKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpCiB7Ci0gICAgVUlOVDE2IGNvZGVjX3V1aWQ7CisgICAgdWludDE2X3QgY29kZWNfdXVpZDsKIAogICAgIGlmIChwX3NjYi0+Y29kZWNfZmFsbGJhY2spCiAgICAgewpAQCAtMTc5MCw3ICsxNzkwLDcgQEAKIHsKICAgICBVTlVTRUQocF9kYXRhKTsKIAotI2lmIGRlZmluZWQoQlRBX0FHX01VTFRJX1JFU1VMVF9JTkNMVURFRCkgJiYgKEJUQV9BR19NVUxUSV9SRVNVTFRfSU5DTFVERUQgPT0gVFJVRSkKKyNpZiAoQlRBX0FHX01VTFRJX1JFU1VMVF9JTkNMVURFRCA9PSBUUlVFKQogICAgIHRCVEFfQUdfTVVMVElfUkVTVUxUX0NCIG1fcmVzX2NiOwogCiAgICAgaWYgKHBfc2NiLT5jb25uX3NlcnZpY2UgPT0gQlRBX0FHX0hGUCAmJiBwX3NjYi0+Y2xpcF9lbmFibGVkICYmIHBfc2NiLT5jbGlwWzBdICE9IDApCmRpZmYgLS1naXQgYS9idGEvYWcvYnRhX2FnX2ludC5oIGIvYnRhL2FnL2J0YV9hZ19pbnQuaAppbmRleCBhOTVmMGE4Li5hY2RlNzhmIDEwMDY0NAotLS0gYS9idGEvYWcvYnRhX2FnX2ludC5oCisrKyBiL2J0YS9hZy9idGFfYWdfaW50LmgKQEAgLTMxLDEyICszMSwxMiBAQAogCiAvKiBTZW5kIFJJTkcgJiBDTElQIGluIG9uZSBBVCBjbWQgKi8KICNpZm5kZWYgQlRBX0FHX01VTFRJX1JFU1VMVF9JTkNMVURFRAotI2RlZmluZSBCVEFfQUdfTVVMVElfUkVTVUxUX0lOQ0xVREVEICAgICAgRkFMU0UKKyNkZWZpbmUgQlRBX0FHX01VTFRJX1JFU1VMVF9JTkNMVURFRCBGQUxTRQogI2VuZGlmCiAKIC8qIFJlcGxhY2UgOiBpbiBWR1MgYW5kIFZHTSBmb3IgSFNQICovCiAjaWZuZGVmIEJUQV9IU1BfUkVTVUxUX1JFUExBQ0VfQ09MT04KLSNkZWZpbmUgQlRBX0hTUF9SRVNVTFRfUkVQTEFDRV9DT0xPTiAgICAgIFRSVUUKKyNkZWZpbmUgQlRBX0hTUF9SRVNVTFRfUkVQTEFDRV9DT0xPTiBUUlVFCiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMzMsNyArMTMzLDcgQEAKIHsKICAgICBCVEFfQUdfU0NPX1NIVVRET1dOX1NULCAgICAgLyogbm8gc2NvIGxpc3RlbmluZywgYWxsIHNjbyBjb25uZWN0aW9ucyBjbG9zZWQgKi8KICAgICBCVEFfQUdfU0NPX0xJU1RFTl9TVCwgICAgICAgLyogc2NvIGxpc3RlbmluZyAqLwotI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUgKQorI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUpCiAgICAgQlRBX0FHX1NDT19DT0RFQ19TVCwgICAgICAgIC8qIHNjbyBjb2RlYyBuZWdvdGlhdGlvbiAqLwogI2VuZGlmCiAgICAgQlRBX0FHX1NDT19PUEVOSU5HX1NULCAgICAgIC8qIHNjbyBjb25uZWN0aW9uIG9wZW5pbmcgKi8KQEAgLTE2Niw3ICsxNjYsNyBAQAogICAgIHRCVEFfU0VSVklDRV9NQVNLICAgc2VydmljZXM7CiAgICAgdEJUQV9TRUMgICAgICAgICAgICBzZWNfbWFzazsKICAgICB0QlRBX0FHX0ZFQVQgICAgICAgIGZlYXR1cmVzOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgYXBwX2lkOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgYXBwX2lkOwogfSB0QlRBX0FHX0FQSV9SRUdJU1RFUjsKIAogLyogZGF0YSB0eXBlIGZvciBCVEFfQUdfQVBJX09QRU5fRVZUICovCkBAIC0xOTcsMTQgKzE5NywxNCBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICAgICAgaGRyOwotICAgIFVJTlQxNiAgICAgICAgICBzdGF0dXM7CisgICAgdWludDE2X3QgICAgICAgIHN0YXR1czsKIH0gdEJUQV9BR19ESVNDX1JFU1VMVDsKIAogLyogZGF0YSB0eXBlIGZvciBSRkNPTU0gZXZlbnRzICovCiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJUX0hEUiAgICAgICAgICBoZHI7Ci0gICAgVUlOVDE2ICAgICAgICAgIHBvcnRfaGFuZGxlOworICAgIHVpbnQxNl90ICAgICAgICBwb3J0X2hhbmRsZTsKIH0gdEJUQV9BR19SRkM7CiAKIC8qIGRhdGEgdHlwZSBmb3IgQlRBX0FHX0NJX1JYX1dSSVRFX0VWVCAqLwpAQCAtMjIyLDcgKzIyMiw3IEBACiAgICAgdEJUQV9BR19BUElfUkVHSVNURVIgICAgYXBpX3JlZ2lzdGVyOwogICAgIHRCVEFfQUdfQVBJX09QRU4gICAgICAgIGFwaV9vcGVuOwogICAgIHRCVEFfQUdfQVBJX1JFU1VMVCAgICAgIGFwaV9yZXN1bHQ7Ci0jaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSkKICAgICB0QlRBX0FHX0FQSV9TRVRDT0RFQyAgICBhcGlfc2V0Y29kZWM7CiAjZW5kaWYKICAgICB0QlRBX0FHX0RJU0NfUkVTVUxUICAgICBkaXNjX3Jlc3VsdDsKQEAgLTIzMyw4ICsyMzMsOCBAQAogLyogdHlwZSBmb3IgZWFjaCBwcm9maWxlICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQzMiAgICAgICAgICBzZHBfaGFuZGxlOwotICAgIFVJTlQ4ICAgICAgICAgICBzY247CisgICAgdWludDMyX3QgICAgICAgICAgc2RwX2hhbmRsZTsKKyAgICB1aW50OF90ICAgICAgICAgICBzY247CiB9IHRCVEFfQUdfUFJPRklMRTsKIAogI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUpCkBAIC0yNDksNDMgKzI0OSw0MyBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBjaGFyICAgICAgICAgICAgICAgIGNsaXBbQlRBX0FHX0FUX01BWF9MRU4rMV07IC8qIG51bWJlciBzdHJpbmcgdXNlZCBmb3IgQ0xJUCAqLwotICAgIFVJTlQxNiAgICAgICAgICAgICAgc2Vydl9oYW5kbGVbQlRBX0FHX05VTV9JRFhdOyAvKiBSRkNPTU0gc2VydmVyIGhhbmRsZXMgKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgIHNlcnZfaGFuZGxlW0JUQV9BR19OVU1fSURYXTsgLyogUkZDT01NIHNlcnZlciBoYW5kbGVzICovCiAgICAgdEJUQV9BR19BVF9DQiAgICAgICBhdF9jYjsgICAgICAgICAgLyogQVQgY29tbWFuZCBpbnRlcnByZXRlciAqLwogICAgIEJEX0FERFIgICAgICAgICAgICAgcGVlcl9hZGRyOyAgICAgIC8qIHBlZXIgYmQgYWRkcmVzcyAqLwogICAgIHRTRFBfRElTQ09WRVJZX0RCICAgKnBfZGlzY19kYjsgICAgIC8qIHBvaW50ZXIgdG8gZGlzY292ZXJ5IGRhdGFiYXNlICovCiAgICAgdEJUQV9TRVJWSUNFX01BU0sgICByZWdfc2VydmljZXM7ICAgLyogc2VydmljZXMgc3BlY2lmaWVkIGluIHJlZ2lzdGVyIEFQSSAqLwogICAgIHRCVEFfU0VSVklDRV9NQVNLICAgb3Blbl9zZXJ2aWNlczsgIC8qIHNlcnZpY2VzIHNwZWNpZmllZCBpbiBvcGVuIEFQSSAqLwotICAgIFVJTlQxNiAgICAgICAgICAgICAgY29ubl9oYW5kbGU7ICAgIC8qIFJGQ09NTSBoYW5kbGUgb2YgY29ubmVjdGVkIHNlcnZpY2UgKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgIGNvbm5faGFuZGxlOyAgICAvKiBSRkNPTU0gaGFuZGxlIG9mIGNvbm5lY3RlZCBzZXJ2aWNlICovCiAgICAgdEJUQV9TRUMgICAgICAgICAgICBzZXJ2X3NlY19tYXNrOyAgLyogc2VydmVyIHNlY3VyaXR5IG1hc2sgKi8KICAgICB0QlRBX1NFQyAgICAgICAgICAgIGNsaV9zZWNfbWFzazsgICAvKiBjbGllbnQgc2VjdXJpdHkgbWFzayAqLwogICAgIHRCVEFfQUdfRkVBVCAgICAgICAgZmVhdHVyZXM7ICAgICAgIC8qIGZlYXR1cmVzIHJlZ2lzdGVyZWQgYnkgYXBwbGljYXRpb24gKi8KICAgICB0QlRBX0FHX1BFRVJfRkVBVCAgIHBlZXJfZmVhdHVyZXM7ICAvKiBwZWVyIGRldmljZSBmZWF0dXJlcyAqLwotICAgIFVJTlQxNiAgICAgICAgICAgICAgcGVlcl92ZXJzaW9uOyAgIC8qIHByb2ZpbGUgdmVyc2lvbiBvZiBwZWVyIGRldmljZSAqLwotICAgIFVJTlQxNiAgICAgICAgICAgICAgaHNwX3ZlcnNpb247ICAgIC8qIEhTUCBwcm9maWxlIHZlcnNpb24gKi8KLSAgICBVSU5UMTYgICAgICAgICAgICAgIHNjb19pZHg7ICAgICAgICAvKiBTQ08gaGFuZGxlICovCi0gICAgQk9PTEVBTiAgICAgICAgICAgICBpbl91c2U7ICAgICAgICAgLyogc2NiIGluIHVzZSAqLwotICAgIEJPT0xFQU4gICAgICAgICAgICAgZGVhbGxvYzsgICAgICAgIC8qIFRSVUUgaWYgc2VydmljZSBzaHV0dGluZyBkb3duICovCi0gICAgQk9PTEVBTiAgICAgICAgICAgICBjbGlwX2VuYWJsZWQ7ICAgLyogc2V0IHRvIFRSVUUgaWYgSEYgZW5hYmxlcyBDTElQIHJlcG9ydGluZyAqLwotICAgIEJPT0xFQU4gICAgICAgICAgICAgY2N3YV9lbmFibGVkOyAgIC8qIHNldCB0byBUUlVFIGlmIEhGIGVuYWJsZXMgQ0NXQSByZXBvcnRpbmcgKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgIGNtZXJfZW5hYmxlZDsgICAvKiBzZXQgdG8gVFJVRSBpZiBIRiBlbmFibGVzIENNRVIgcmVwb3J0aW5nICovCi0gICAgQk9PTEVBTiAgICAgICAgICAgICBjbWVlX2VuYWJsZWQ7ICAgLyogc2V0IHRvIFRSVUUgaWYgSEYgZW5hYmxlcyBDTUUgRVJST1IgcmVwb3J0aW5nICovCi0gICAgQk9PTEVBTiAgICAgICAgICAgICBpbmJhbmRfZW5hYmxlZDsgLyogc2V0IHRvIFRSVUUgaWYgaW5iYW5kIHJpbmcgZW5hYmxlZCAqLwotICAgIEJPT0xFQU4gICAgICAgICAgICAgc3ZjX2Nvbm47ICAgICAgIC8qIHNldCB0byBUUlVFIHdoZW4gc2VydmljZSBsZXZlbCBjb25uZWN0aW9uIHVwICovCi0gICAgVUlOVDggICAgICAgICAgICAgICBzdGF0ZTsgICAgICAgICAgLyogc3RhdGUgbWFjaGluZSBzdGF0ZSAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgY29ubl9zZXJ2aWNlOyAgIC8qIGNvbm5lY3RlZCBzZXJ2aWNlICovCi0gICAgVUlOVDggICAgICAgICAgICAgICBwZWVyX3NjbjsgICAgICAgLyogcGVlciBzY24gKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIGFwcF9pZDsgICAgICAgICAvKiBhcHBsaWNhdGlvbiBpZCAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgcm9sZTsgICAgICAgICAgIC8qIGluaXRpYXRvci9hY2NlcHRvciByb2xlICovCi0gICAgVUlOVDggICAgICAgICAgICAgICBwb3N0X3NjbzsgICAgICAgLyogYWN0aW9uIHRvIHBlcmZvcm0gYWZ0ZXIgc2NvIGV2ZW50ICovCi0gICAgVUlOVDggICAgICAgICAgICAgICBjYWxsX2luZDsgICAgICAgLyogQ0lFViBjYWxsIGluZGljYXRvciB2YWx1ZSAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgY2FsbHNldHVwX2luZDsgIC8qIENJRVYgY2FsbHNldHVwIGluZGljYXRvciB2YWx1ZSAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgc2VydmljZV9pbmQ7ICAgIC8qIENJRVYgc2VydmljZSBpbmRpY2F0b3IgdmFsdWUgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIHNpZ25hbF9pbmQ7ICAgICAvKiBDSUVWIHNpZ25hbCBpbmRpY2F0b3IgdmFsdWUgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIHJvYW1faW5kOyAgICAgICAvKiBDSUVWIHJvYW0gaW5kaWNhdG9yIHZhbHVlICovCi0gICAgVUlOVDggICAgICAgICAgICAgICBiYXR0Y2hnX2luZDsgICAgLyogQ0lFViBiYXR0ZXJ5IGNoYXJnZSBpbmRpY2F0b3IgdmFsdWUgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIGNhbGxoZWxkX2luZDsgICAvKiBDSUVWIGNhbGwgaGVsZCBpbmRpY2F0b3IgdmFsdWUgKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgIHJldHJ5X3dpdGhfc2NvX29ubHk7IC8qIGluZGljYXRvciB0byB0cnkgd2l0aCBTQ08gb25seSB3aGVuIGVTQ08gZmFpbHMgKi8KLSAgICBVSU5UMzIgICAgICAgICAgICAgIGJpYV9tYXNrZWRfb3V0OyAvKiBpbmRpY2F0b3JzIEhGIGRvZXMgbm90IHdhbnQgdXMgdG8gc2VuZCAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgcGVlcl92ZXJzaW9uOyAgIC8qIHByb2ZpbGUgdmVyc2lvbiBvZiBwZWVyIGRldmljZSAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgaHNwX3ZlcnNpb247ICAgIC8qIEhTUCBwcm9maWxlIHZlcnNpb24gKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgIHNjb19pZHg7ICAgICAgICAvKiBTQ08gaGFuZGxlICovCisgICAgYm9vbCAgICAgICAgICAgICAgICBpbl91c2U7ICAgICAgICAgLyogc2NiIGluIHVzZSAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgZGVhbGxvYzsgICAgICAgIC8qIHRydWUgaWYgc2VydmljZSBzaHV0dGluZyBkb3duICovCisgICAgYm9vbCAgICAgICAgICAgICAgICBjbGlwX2VuYWJsZWQ7ICAgLyogc2V0IHRvIHRydWUgaWYgSEYgZW5hYmxlcyBDTElQIHJlcG9ydGluZyAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgY2N3YV9lbmFibGVkOyAgIC8qIHNldCB0byB0cnVlIGlmIEhGIGVuYWJsZXMgQ0NXQSByZXBvcnRpbmcgKi8KKyAgICBib29sICAgICAgICAgICAgICAgIGNtZXJfZW5hYmxlZDsgICAvKiBzZXQgdG8gdHJ1ZSBpZiBIRiBlbmFibGVzIENNRVIgcmVwb3J0aW5nICovCisgICAgYm9vbCAgICAgICAgICAgICAgICBjbWVlX2VuYWJsZWQ7ICAgLyogc2V0IHRvIHRydWUgaWYgSEYgZW5hYmxlcyBDTUUgRVJST1IgcmVwb3J0aW5nICovCisgICAgYm9vbCAgICAgICAgICAgICAgICBpbmJhbmRfZW5hYmxlZDsgLyogc2V0IHRvIHRydWUgaWYgaW5iYW5kIHJpbmcgZW5hYmxlZCAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgc3ZjX2Nvbm47ICAgICAgIC8qIHNldCB0byB0cnVlIHdoZW4gc2VydmljZSBsZXZlbCBjb25uZWN0aW9uIHVwICovCisgICAgdWludDhfdCAgICAgICAgICAgICBzdGF0ZTsgICAgICAgICAgLyogc3RhdGUgbWFjaGluZSBzdGF0ZSAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgY29ubl9zZXJ2aWNlOyAgIC8qIGNvbm5lY3RlZCBzZXJ2aWNlICovCisgICAgdWludDhfdCAgICAgICAgICAgICBwZWVyX3NjbjsgICAgICAgLyogcGVlciBzY24gKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgIGFwcF9pZDsgICAgICAgICAvKiBhcHBsaWNhdGlvbiBpZCAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcm9sZTsgICAgICAgICAgIC8qIGluaXRpYXRvci9hY2NlcHRvciByb2xlICovCisgICAgdWludDhfdCAgICAgICAgICAgICBwb3N0X3NjbzsgICAgICAgLyogYWN0aW9uIHRvIHBlcmZvcm0gYWZ0ZXIgc2NvIGV2ZW50ICovCisgICAgdWludDhfdCAgICAgICAgICAgICBjYWxsX2luZDsgICAgICAgLyogQ0lFViBjYWxsIGluZGljYXRvciB2YWx1ZSAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgY2FsbHNldHVwX2luZDsgIC8qIENJRVYgY2FsbHNldHVwIGluZGljYXRvciB2YWx1ZSAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgc2VydmljZV9pbmQ7ICAgIC8qIENJRVYgc2VydmljZSBpbmRpY2F0b3IgdmFsdWUgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgIHNpZ25hbF9pbmQ7ICAgICAvKiBDSUVWIHNpZ25hbCBpbmRpY2F0b3IgdmFsdWUgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgIHJvYW1faW5kOyAgICAgICAvKiBDSUVWIHJvYW0gaW5kaWNhdG9yIHZhbHVlICovCisgICAgdWludDhfdCAgICAgICAgICAgICBiYXR0Y2hnX2luZDsgICAgLyogQ0lFViBiYXR0ZXJ5IGNoYXJnZSBpbmRpY2F0b3IgdmFsdWUgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgIGNhbGxoZWxkX2luZDsgICAvKiBDSUVWIGNhbGwgaGVsZCBpbmRpY2F0b3IgdmFsdWUgKi8KKyAgICBib29sICAgICAgICAgICAgICAgIHJldHJ5X3dpdGhfc2NvX29ubHk7IC8qIGluZGljYXRvciB0byB0cnkgd2l0aCBTQ08gb25seSB3aGVuIGVTQ08gZmFpbHMgKi8KKyAgICB1aW50MzJfdCAgICAgICAgICAgIGJpYV9tYXNrZWRfb3V0OyAvKiBpbmRpY2F0b3JzIEhGIGRvZXMgbm90IHdhbnQgdXMgdG8gc2VuZCAqLwogICAgIGFsYXJtX3QgICAgICAgICAgICAgKmNvbGxpc2lvbl90aW1lcjsKICAgICBhbGFybV90ICAgICAgICAgICAgICpyaW5nX3RpbWVyOwogI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUpCkBAIC0yOTMsOCArMjkzLDggQEAKICAgICB0QlRBX0FHX1BFRVJfQ09ERUMgIHBlZXJfY29kZWNzOyAgICAvKiBjb2RlY3MgZm9yIGVTQ08gc3VwcG9ydGVkIGJ5IHRoZSBwZWVyICovCiAgICAgdEJUQV9BR19QRUVSX0NPREVDICBzY29fY29kZWM7ICAgICAgLyogY29kZWMgdG8gYmUgdXNlZCBmb3IgZVNDTyBjb25uZWN0aW9uICovCiAgICAgdEJUQV9BR19QRUVSX0NPREVDICBpbnVzZV9jb2RlYzsgICAgLyogY29kZWMgYmVpbmcgdXNlZCBmb3IgdGhlIGN1cnJlbnQgU0NPIGNvbm5lY3Rpb24gKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgIGNvZGVjX3VwZGF0ZWQ7ICAvKiBzZXQgdG8gVFJVRSB3aGVuZXZlciB0aGUgYXBwIHVwZGF0ZXMgY29kZWMgdHlwZSAqLwotICAgIEJPT0xFQU4gICAgICAgICAgICAgY29kZWNfZmFsbGJhY2s7IC8qIElmIHNjbyBuZWdvIGZhaWxzIGZvciBtU0JDLCBmYWxsYmFjayB0byBDVlNEICovCisgICAgYm9vbCAgICAgICAgICAgICAgICBjb2RlY191cGRhdGVkOyAgLyogc2V0IHRvIHRydWUgd2hlbmV2ZXIgdGhlIGFwcCB1cGRhdGVzIGNvZGVjIHR5cGUgKi8KKyAgICBib29sICAgICAgICAgICAgICAgIGNvZGVjX2ZhbGxiYWNrOyAvKiBJZiBzY28gbmVnbyBmYWlscyBmb3IgbVNCQywgZmFsbGJhY2sgdG8gQ1ZTRCAqLwogICAgIHRCVEFfQUdfU0NPX01TQkNfU0VUVElOR1MgY29kZWNfbXNiY19zZXR0aW5nczsgLyogc2V0dGluZ3MgdG8gYmUgdXNlZCBmb3IgdGhlIGltcGVuZGluZyBlU0NPICovCiAjZW5kaWYKIApAQCAtMzA2LDkgKzMwNiw5IEBACiAgICAgdEJUTV9FU0NPX0NPTk5fUkVRX0VWVF9EQVRBICBjb25uX2RhdGE7ICAgICAvKiBTQ08gZGF0YSBmb3IgcGVuZGluZyBjb25uIHJlcXVlc3QgKi8KICAgICB0QlRBX0FHX1NDQiAgICAgICAgICAgICAgICAgKnBfY3Vycl9zY2I7ICAgIC8qIFNDQiBhc3NvY2lhdGVkIHdpdGggU0NPIGNvbm5lY3Rpb24gKi8KICAgICB0QlRBX0FHX1NDQiAgICAgICAgICAgICAgICAgKnBfeGZlcl9zY2I7ICAgIC8qIFNDQiBhc3NvY2lhdGVkIHdpdGggU0NPIHRyYW5zZmVyICovCi0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgIGN1cl9pZHg7ICAgICAgICAvKiBTQ08gaGFuZGxlICovCi0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOyAgICAgICAgICAvKiBTQ08gc3RhdGUgdmFyaWFibGUgKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgcGFyYW1fdXBkYXRlZDsgIC8qIGlmIHBhcmFtcyB3ZXJlIHVwZGF0ZWQgdG8gbm9uLWRlZmF1bHQgKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgY3VyX2lkeDsgICAgICAgIC8qIFNDTyBoYW5kbGUgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgc3RhdGU7ICAgICAgICAgIC8qIFNDTyBzdGF0ZSB2YXJpYWJsZSAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV91cGRhdGVkOyAgLyogaWYgcGFyYW1zIHdlcmUgdXBkYXRlZCB0byBub24tZGVmYXVsdCAqLwogICAgIHRCVE1fRVNDT19QQVJBTVMgICAgICAgICAgICBwYXJhbXM7ICAgICAgICAgLyogRVNDTyBwYXJhbWV0ZXJzICovCiB9IHRCVEFfQUdfU0NPX0NCOwogCkBAIC0zMjgsMTIgKzMyOCwxMiBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIGNvbnN0YW50IGxvb2t1cCB0YWJsZXMgKi8KLWV4dGVybiBjb25zdCBVSU5UMTYgYnRhX2FnX3V1aWRbQlRBX0FHX05VTV9JRFhdOwotZXh0ZXJuIGNvbnN0IFVJTlQ4IGJ0YV9hZ19zZWNfaWRbQlRBX0FHX05VTV9JRFhdOworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGJ0YV9hZ191dWlkW0JUQV9BR19OVU1fSURYXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGJ0YV9hZ19zZWNfaWRbQlRBX0FHX05VTV9JRFhdOwogZXh0ZXJuIGNvbnN0IHRCVEFfQUdfQVRfQ01EICpidGFfYWdfYXRfdGJsW0JUQV9BR19OVU1fSURYXTsKIAogLyogY29udHJvbCBibG9jayBkZWNsYXJhdGlvbiAqLwotI2lmIEJUQV9EWU5BTUlDX01FTU9SWSA9PSBGQUxTRQorI2lmIChCVEFfRFlOQU1JQ19NRU1PUlkgPT0gRkFMU0UpCiBleHRlcm4gdEJUQV9BR19DQiBidGFfYWdfY2I7CiAjZWxzZQogZXh0ZXJuIHRCVEFfQUdfQ0IgKmJ0YV9hZ19jYl9wdHI7CkBAIC0zNDksNDcgKzM0OSw0NyBAQAogCiAvKiBtYWluIGZ1bmN0aW9ucyAqLwogZXh0ZXJuIHZvaWQgYnRhX2FnX3NjYl9kZWFsbG9jKHRCVEFfQUdfU0NCICpwX3NjYik7Ci1leHRlcm4gVUlOVDE2IGJ0YV9hZ19zY2JfdG9faWR4KHRCVEFfQUdfU0NCICpwX3NjYik7Ci1leHRlcm4gdEJUQV9BR19TQ0IgKmJ0YV9hZ19zY2JfYnlfaWR4KFVJTlQxNiBpZHgpOwotZXh0ZXJuIFVJTlQ4IGJ0YV9hZ19zZXJ2aWNlX3RvX2lkeCh0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlcyk7Ci1leHRlcm4gVUlOVDE2IGJ0YV9hZ19pZHhfYnlfYmRhZGRyKEJEX0FERFIgcGVlcl9hZGRyKTsKLWV4dGVybiBCT09MRUFOIGJ0YV9hZ19vdGhlcl9zY2Jfb3Blbih0QlRBX0FHX1NDQiAqcF9jdXJyX3NjYik7Ci1leHRlcm4gQk9PTEVBTiBidGFfYWdfc2NiX29wZW4odEJUQV9BR19TQ0IgKnBfY3Vycl9zY2IpOworZXh0ZXJuIHVpbnQxNl90IGJ0YV9hZ19zY2JfdG9faWR4KHRCVEFfQUdfU0NCICpwX3NjYik7CitleHRlcm4gdEJUQV9BR19TQ0IgKmJ0YV9hZ19zY2JfYnlfaWR4KHVpbnQxNl90IGlkeCk7CitleHRlcm4gdWludDhfdCBidGFfYWdfc2VydmljZV90b19pZHgodEJUQV9TRVJWSUNFX01BU0sgc2VydmljZXMpOworZXh0ZXJuIHVpbnQxNl90IGJ0YV9hZ19pZHhfYnlfYmRhZGRyKEJEX0FERFIgcGVlcl9hZGRyKTsKK2V4dGVybiBib29sIGJ0YV9hZ19vdGhlcl9zY2Jfb3Blbih0QlRBX0FHX1NDQiAqcF9jdXJyX3NjYik7CitleHRlcm4gYm9vbCBidGFfYWdfc2NiX29wZW4odEJUQV9BR19TQ0IgKnBfY3Vycl9zY2IpOwogZXh0ZXJuIHRCVEFfQUdfU0NCICpidGFfYWdfZ2V0X290aGVyX2lkbGVfc2NiICh0QlRBX0FHX1NDQiAqcF9jdXJyX3NjYik7Ci1leHRlcm4gdm9pZCBidGFfYWdfc21fZXhlY3V0ZSh0QlRBX0FHX1NDQiAqcF9zY2IsIFVJTlQxNiBldmVudCwgdEJUQV9BR19EQVRBICpwX2RhdGEpOwotZXh0ZXJuIEJPT0xFQU4gYnRhX2FnX2hkbF9ldmVudChCVF9IRFIgKnBfbXNnKTsKLWV4dGVybiB2b2lkIGJ0YV9hZ19jb2xsaXNpb25fY2JhY2sgKHRCVEFfU1lTX0NPTk5fU1RBVFVTIHN0YXR1cywgVUlOVDggaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKTsKK2V4dGVybiB2b2lkIGJ0YV9hZ19zbV9leGVjdXRlKHRCVEFfQUdfU0NCICpwX3NjYiwgdWludDE2X3QgZXZlbnQsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKK2V4dGVybiBib29sIGJ0YV9hZ19oZGxfZXZlbnQoQlRfSERSICpwX21zZyk7CitleHRlcm4gdm9pZCBidGFfYWdfY29sbGlzaW9uX2NiYWNrICh0QlRBX1NZU19DT05OX1NUQVRVUyBzdGF0dXMsIHVpbnQ4X3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpOwogZXh0ZXJuIHZvaWQgYnRhX2FnX3Jlc3VtZV9vcGVuICh0QlRBX0FHX1NDQiAqcF9zY2IpOwogCiAvKiBTRFAgZnVuY3Rpb25zICovCi1leHRlcm4gQk9PTEVBTiBidGFfYWdfYWRkX3JlY29yZChVSU5UMTYgc2VydmljZV91dWlkLCBjaGFyICpwX3NlcnZpY2VfbmFtZSwgVUlOVDggc2NuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9BR19GRUFUIGZlYXR1cmVzLCBVSU5UMzIgc2RwX2hhbmRsZSk7CitleHRlcm4gYm9vbCBidGFfYWdfYWRkX3JlY29yZCh1aW50MTZfdCBzZXJ2aWNlX3V1aWQsIGNoYXIgKnBfc2VydmljZV9uYW1lLCB1aW50OF90IHNjbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQUdfRkVBVCBmZWF0dXJlcywgdWludDMyX3Qgc2RwX2hhbmRsZSk7CiBleHRlcm4gdm9pZCBidGFfYWdfY3JlYXRlX3JlY29yZHModEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSk7CiBleHRlcm4gdm9pZCBidGFfYWdfZGVsX3JlY29yZHModEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSk7Ci1leHRlcm4gQk9PTEVBTiBidGFfYWdfc2RwX2ZpbmRfYXR0cih0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfU0VSVklDRV9NQVNLIHNlcnZpY2UpOworZXh0ZXJuIGJvb2wgYnRhX2FnX3NkcF9maW5kX2F0dHIodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlKTsKIGV4dGVybiB2b2lkIGJ0YV9hZ19kb19kaXNjKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9TRVJWSUNFX01BU0sgc2VydmljZSk7CiBleHRlcm4gdm9pZCBidGFfYWdfZnJlZV9kYih0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKIAogLyogUkZDT01NIGZ1bmN0aW9ucyAqLwogZXh0ZXJuIHZvaWQgYnRhX2FnX3N0YXJ0X3NlcnZlcnModEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlcyk7CiBleHRlcm4gdm9pZCBidGFfYWdfY2xvc2Vfc2VydmVycyh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfU0VSVklDRV9NQVNLIHNlcnZpY2VzKTsKLWV4dGVybiBCT09MRUFOIGJ0YV9hZ19pc19zZXJ2ZXJfY2xvc2VkICh0QlRBX0FHX1NDQiAqcF9zY2IpOworZXh0ZXJuIGJvb2wgYnRhX2FnX2lzX3NlcnZlcl9jbG9zZWQgKHRCVEFfQUdfU0NCICpwX3NjYik7CiBleHRlcm4gdm9pZCBidGFfYWdfcmZjX2RvX2Nsb3NlKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpOwogZXh0ZXJuIHZvaWQgYnRhX2FnX3JmY19kb19vcGVuKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpOwogCiAvKiBTQ08gZnVuY3Rpb25zICovCi1leHRlcm4gQk9PTEVBTiBidGFfYWdfc2NvX2lzX29wZW4odEJUQV9BR19TQ0IgKnBfc2NiKTsKLWV4dGVybiBCT09MRUFOIGJ0YV9hZ19zY29faXNfb3BlbmluZyh0QlRBX0FHX1NDQiAqcF9zY2IpOworZXh0ZXJuIGJvb2wgYnRhX2FnX3Njb19pc19vcGVuKHRCVEFfQUdfU0NCICpwX3NjYik7CitleHRlcm4gYm9vbCBidGFfYWdfc2NvX2lzX29wZW5pbmcodEJUQV9BR19TQ0IgKnBfc2NiKTsKIGV4dGVybiB2b2lkIGJ0YV9hZ19zY29fY29ubl9yc3AodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRNX0VTQ09fQ09OTl9SRVFfRVZUX0RBVEEgKnBfZGF0YSk7CiAKIC8qIEFUIGNvbW1hbmQgZnVuY3Rpb25zICovCi1leHRlcm4gdm9pZCBidGFfYWdfYXRfaHNwX2NiYWNrKHRCVEFfQUdfU0NCICpwX3NjYiwgVUlOVDE2IGNtZCwgVUlOVDggYXJnX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBfYXJnLCBJTlQxNiBpbnRfYXJnKTsKLWV4dGVybiB2b2lkIGJ0YV9hZ19hdF9oZnBfY2JhY2sodEJUQV9BR19TQ0IgKnBfc2NiLCBVSU5UMTYgY21kLCBVSU5UOCBhcmdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcF9hcmcsIElOVDE2IGludF9hcmcpOwotZXh0ZXJuIHZvaWQgYnRhX2FnX2F0X2Vycl9jYmFjayh0QlRBX0FHX1NDQiAqcF9zY2IsIEJPT0xFQU4gdW5rbm93biwgY2hhciAqcF9hcmcpOwotZXh0ZXJuIEJPT0xFQU4gYnRhX2FnX2luYmFuZF9lbmFibGVkKHRCVEFfQUdfU0NCICpwX3NjYik7CitleHRlcm4gdm9pZCBidGFfYWdfYXRfaHNwX2NiYWNrKHRCVEFfQUdfU0NCICpwX3NjYiwgdWludDE2X3QgY21kLCB1aW50OF90IGFyZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwX2FyZywgaW50MTZfdCBpbnRfYXJnKTsKK2V4dGVybiB2b2lkIGJ0YV9hZ19hdF9oZnBfY2JhY2sodEJUQV9BR19TQ0IgKnBfc2NiLCB1aW50MTZfdCBjbWQsIHVpbnQ4X3QgYXJnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBfYXJnLCBpbnQxNl90IGludF9hcmcpOworZXh0ZXJuIHZvaWQgYnRhX2FnX2F0X2Vycl9jYmFjayh0QlRBX0FHX1NDQiAqcF9zY2IsIGJvb2wgdW5rbm93biwgY2hhciAqcF9hcmcpOworZXh0ZXJuIGJvb2wgYnRhX2FnX2luYmFuZF9lbmFibGVkKHRCVEFfQUdfU0NCICpwX3NjYik7CiBleHRlcm4gdm9pZCBidGFfYWdfc2VuZF9jYWxsX2luZHModEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX1JFUyByZXN1bHQpOwogCiAvKiBBY3Rpb24gZnVuY3Rpb25zICovCkBAIC00MTAsOCArNDEwLDggQEAKIGV4dGVybiB2b2lkIGJ0YV9hZ19zY29fbGlzdGVuKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpOwogZXh0ZXJuIHZvaWQgYnRhX2FnX3Njb19vcGVuKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpOwogZXh0ZXJuIHZvaWQgYnRhX2FnX3Njb19jbG9zZSh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKLSNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFICkKLWV4dGVybiB2b2lkIGJ0YV9hZ19zY29fY29kZWNfbmVnbyh0QlRBX0FHX1NDQiAqcF9zY2IsIEJPT0xFQU4gcmVzdWx0KTsKKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFKQorZXh0ZXJuIHZvaWQgYnRhX2FnX3Njb19jb2RlY19uZWdvKHRCVEFfQUdfU0NCICpwX3NjYiwgYm9vbCByZXN1bHQpOwogZXh0ZXJuIHZvaWQgYnRhX2FnX2NvZGVjX25lZ290aWF0ZSAodEJUQV9BR19TQ0IgKnBfc2NiKTsKICNlbmRpZgogZXh0ZXJuIHZvaWQgYnRhX2FnX3Njb19zaHV0ZG93bih0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKQEAgLTQyMiwxMiArNDIyLDEyIEBACiBleHRlcm4gdm9pZCBidGFfYWdfc3ZjX2Nvbm5fb3Blbih0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKIGV4dGVybiB2b2lkIGJ0YV9hZ19yZXN1bHQodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSk7CiBleHRlcm4gdm9pZCBidGFfYWdfc2V0Y29kZWModEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSk7Ci0jaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSkKIGV4dGVybiB2b2lkIGJ0YV9hZ19zZW5kX2Jjcyh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKICNlbmRpZgogZXh0ZXJuIHZvaWQgYnRhX2FnX3NlbmRfcmluZyh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKIGV4dGVybiB2b2lkIGJ0YV9hZ19jaV9zY29fZGF0YSh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hZ19zZXRfZXNjb19wYXJhbShCT09MRUFOIHNldF9yZXNldCwgdEJUTV9FU0NPX1BBUkFNUyAqcGFyYW0pOworZXh0ZXJuIHZvaWQgYnRhX2FnX3NldF9lc2NvX3BhcmFtKGJvb2wgc2V0X3Jlc2V0LCB0QlRNX0VTQ09fUEFSQU1TICpwYXJhbSk7CiBleHRlcm4gdm9pZCBidGFfYWdfY2lfcnhfZGF0YSh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKIGV4dGVybiB2b2lkIGJ0YV9hZ19yY3ZkX3NsY19yZWFkeSh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKICNlbmRpZiAvKiBCVEFfQUdfSU5UX0ggKi8KZGlmZiAtLWdpdCBhL2J0YS9hZy9idGFfYWdfbWFpbi5jIGIvYnRhL2FnL2J0YV9hZ19tYWluLmMKaW5kZXggM2FiZDFlZi4uMjkzMTYzYiAxMDA2NDQKLS0tIGEvYnRhL2FnL2J0YV9hZ19tYWluLmMKKysrIGIvYnRhL2FnL2J0YV9hZ19tYWluLmMKQEAgLTM4LDkgKzM4LDkgQEAKIAogZXh0ZXJuIGZpeGVkX3F1ZXVlX3QgKmJ0dV9idGFfYWxhcm1fcXVldWU7CiAKLSNpZiBCVEFfQUdfREVCVUcgPT0gVFJVRQotc3RhdGljIGNoYXIgKmJ0YV9hZ19ldnRfc3RyKFVJTlQxNiBldmVudCwgdEJUQV9BR19SRVMgcmVzdWx0KTsKLXN0YXRpYyBjaGFyICpidGFfYWdfc3RhdGVfc3RyKFVJTlQ4IHN0YXRlKTsKKyNpZiAoQlRBX0FHX0RFQlVHID09IFRSVUUpCitzdGF0aWMgY2hhciAqYnRhX2FnX2V2dF9zdHIodWludDE2X3QgZXZlbnQsIHRCVEFfQUdfUkVTIHJlc3VsdCk7CitzdGF0aWMgY2hhciAqYnRhX2FnX3N0YXRlX3N0cih1aW50OF90IHN0YXRlKTsKICNlbmRpZgogCiAvKiBzdGF0ZSBtYWNoaW5lIHN0YXRlcyAqLwpAQCAtMTM4LDcgKzEzOCw3IEBACiAjZGVmaW5lIEJUQV9BR19OVU1fQ09MUyAgICAgICAgICAgICAzICAgICAgIC8qIG51bWJlciBvZiBjb2x1bW5zIGluIHN0YXRlIHRhYmxlcyAqLwogCiAvKiBzdGF0ZSB0YWJsZSBmb3IgaW5pdCBzdGF0ZSAqLwotY29uc3QgVUlOVDggYnRhX2FnX3N0X2luaXRbXVtCVEFfQUdfTlVNX0NPTFNdID0KK2NvbnN0IHVpbnQ4X3QgYnRhX2FnX3N0X2luaXRbXVtCVEFfQUdfTlVNX0NPTFNdID0KIHsKIC8qIEV2ZW50ICAgICAgICAgICAgICAgICAgICBBY3Rpb24gMSAgICAgICAgICAgICAgICBBY3Rpb24gMiAgICAgICAgICAgICAgICBOZXh0IHN0YXRlICovCiAvKiBBUElfUkVHSVNURVJfRVZUICovICAgICAge0JUQV9BR19SRUdJU1RFUiwgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX0lOSVRfU1R9LApAQCAtMTY3LDcgKzE2Nyw3IEBACiB9OwogCiAvKiBzdGF0ZSB0YWJsZSBmb3Igb3BlbmluZyBzdGF0ZSAqLwotY29uc3QgVUlOVDggYnRhX2FnX3N0X29wZW5pbmdbXVtCVEFfQUdfTlVNX0NPTFNdID0KK2NvbnN0IHVpbnQ4X3QgYnRhX2FnX3N0X29wZW5pbmdbXVtCVEFfQUdfTlVNX0NPTFNdID0KIHsKIC8qIEV2ZW50ICAgICAgICAgICAgICAgICAgICBBY3Rpb24gMSAgICAgICAgICAgICAgICBBY3Rpb24gMiAgICAgICAgICAgICAgICBOZXh0IHN0YXRlICovCiAvKiBBUElfUkVHSVNURVJfRVZUICovICAgICAge0JUQV9BR19JR05PUkUsICAgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX09QRU5JTkdfU1R9LApAQCAtMTk2LDcgKzE5Niw3IEBACiB9OwogCiAvKiBzdGF0ZSB0YWJsZSBmb3Igb3BlbiBzdGF0ZSAqLwotY29uc3QgVUlOVDggYnRhX2FnX3N0X29wZW5bXVtCVEFfQUdfTlVNX0NPTFNdID0KK2NvbnN0IHVpbnQ4X3QgYnRhX2FnX3N0X29wZW5bXVtCVEFfQUdfTlVNX0NPTFNdID0KIHsKIC8qIEV2ZW50ICAgICAgICAgICAgICAgICAgICBBY3Rpb24gMSAgICAgICAgICAgICAgICBBY3Rpb24gMiAgICAgICAgICAgICAgICBOZXh0IHN0YXRlICovCiAvKiBBUElfUkVHSVNURVJfRVZUICovICAgICAge0JUQV9BR19JR05PUkUsICAgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX09QRU5fU1R9LApAQCAtMjI1LDcgKzIyNSw3IEBACiB9OwogCiAvKiBzdGF0ZSB0YWJsZSBmb3IgY2xvc2luZyBzdGF0ZSAqLwotY29uc3QgVUlOVDggYnRhX2FnX3N0X2Nsb3NpbmdbXVtCVEFfQUdfTlVNX0NPTFNdID0KK2NvbnN0IHVpbnQ4X3QgYnRhX2FnX3N0X2Nsb3NpbmdbXVtCVEFfQUdfTlVNX0NPTFNdID0KIHsKIC8qIEV2ZW50ICAgICAgICAgICAgICAgICAgICBBY3Rpb24gMSAgICAgICAgICAgICAgICBBY3Rpb24gMiAgICAgICAgICAgICAgICBOZXh0IHN0YXRlICovCiAvKiBBUElfUkVHSVNURVJfRVZUICovICAgICAge0JUQV9BR19JR05PUkUsICAgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX0NMT1NJTkdfU1R9LApAQCAtMjU0LDcgKzI1NCw3IEBACiB9OwogCiAvKiB0eXBlIGZvciBzdGF0ZSB0YWJsZSAqLwotdHlwZWRlZiBjb25zdCBVSU5UOCAoKnRCVEFfQUdfU1RfVEJMKVtCVEFfQUdfTlVNX0NPTFNdOwordHlwZWRlZiBjb25zdCB1aW50OF90ICgqdEJUQV9BR19TVF9UQkwpW0JUQV9BR19OVU1fQ09MU107CiAKIC8qIHN0YXRlIHRhYmxlICovCiBjb25zdCB0QlRBX0FHX1NUX1RCTCBidGFfYWdfc3RfdGJsW10gPQpAQCAtMjk0LDEwICsyOTQsMTAgQEAKICAgICAgICAgaWYgKCFwX3NjYi0+aW5fdXNlKQogICAgICAgICB7CiAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHZhcmlhYmxlcyAqLwotICAgICAgICAgICAgcF9zY2ItPmluX3VzZSA9IFRSVUU7CisgICAgICAgICAgICBwX3NjYi0+aW5fdXNlID0gdHJ1ZTsKICAgICAgICAgICAgIHBfc2NiLT5zY29faWR4ID0gQlRNX0lOVkFMSURfU0NPX0lOREVYOwotI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUgKQotICAgICAgICAgICAgcF9zY2ItPmNvZGVjX3VwZGF0ZWQgPSBGQUxTRTsKKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFKQorICAgICAgICAgICAgcF9zY2ItPmNvZGVjX3VwZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgIHBfc2NiLT5wZWVyX2NvZGVjcyA9IEJUQV9BR19DT0RFQ19DVlNEOwogICAgICAgICAgICAgcF9zY2ItPnNjb19jb2RlYyA9IEJUQV9BR19DT0RFQ19DVlNEOwogI2VuZGlmCkBAIC0zMzYsOCArMzM2LDggQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9hZ19zY2JfZGVhbGxvYyh0QlRBX0FHX1NDQiAqcF9zY2IpCiB7Ci0gICAgVUlOVDggICBpZHg7Ci0gICAgQk9PTEVBTiBhbGxvY2F0ZWQgPSBGQUxTRTsKKyAgICB1aW50OF90ICAgaWR4OworICAgIGJvb2wgYWxsb2NhdGVkID0gZmFsc2U7CiAKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfYWdfc2NiX2RlYWxsb2MgJWQiLCBidGFfYWdfc2NiX3RvX2lkeChwX3NjYikpOwogCkBAIC0zNTksNyArMzU5LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGJ0YV9hZ19jYi5zY2JbaWR4XS5pbl91c2UpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWxsb2NhdGVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zODIsMTAgKzM4MiwxMCBAQAogKiogUmV0dXJucyAgICAgICAgICBJbmRleCBvZiBzY2IuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVVJTlQxNiBidGFfYWdfc2NiX3RvX2lkeCh0QlRBX0FHX1NDQiAqcF9zY2IpCit1aW50MTZfdCBidGFfYWdfc2NiX3RvX2lkeCh0QlRBX0FHX1NDQiAqcF9zY2IpCiB7CiAgICAgLyogdXNlIGFycmF5IGFyaXRobWV0aWMgdG8gZGV0ZXJtaW5lIGluZGV4ICovCi0gICAgcmV0dXJuICgoVUlOVDE2KSAocF9zY2IgLSBidGFfYWdfY2Iuc2NiKSkgKyAxOworICAgIHJldHVybiAoKHVpbnQxNl90KSAocF9zY2IgLSBidGFfYWdfY2Iuc2NiKSkgKyAxOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzk4LDcgKzM5OCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gc2NiIG9yIE5VTEwgaWYgbm90IGFsbG9jYXRlZC4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9BR19TQ0IgKmJ0YV9hZ19zY2JfYnlfaWR4KFVJTlQxNiBpZHgpCit0QlRBX0FHX1NDQiAqYnRhX2FnX3NjYl9ieV9pZHgodWludDE2X3QgaWR4KQogewogICAgIHRCVEFfQUdfU0NCICAgICAqcF9zY2I7CiAKQEAgLTQzMCw3ICs0MzAsNyBAQAogKiogUmV0dXJucyAgICAgICAgICBQcm9maWxlIG5kZXggb2Ygc2NiLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1VSU5UOCBidGFfYWdfc2VydmljZV90b19pZHgodEJUQV9TRVJWSUNFX01BU0sgc2VydmljZXMpCit1aW50OF90IGJ0YV9hZ19zZXJ2aWNlX3RvX2lkeCh0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlcykKIHsKICAgICBpZiAoc2VydmljZXMgJiBCVEFfSEZQX1NFUlZJQ0VfTUFTSykKICAgICB7CkBAIC00NTIsMTAgKzQ1MiwxMCBAQAogKiogUmV0dXJucyAgICAgICAgICBJbmRleCBvZiBTQ0Igb3IgemVybyBpZiBub25lIGZvdW5kLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1VSU5UMTYgYnRhX2FnX2lkeF9ieV9iZGFkZHIoQkRfQUREUiBwZWVyX2FkZHIpCit1aW50MTZfdCBidGFfYWdfaWR4X2J5X2JkYWRkcihCRF9BRERSIHBlZXJfYWRkcikKIHsKICAgICB0QlRBX0FHX1NDQiAgICAgKnBfc2NiID0gJmJ0YV9hZ19jYi5zY2JbMF07Ci0gICAgVUlOVDE2ICAgICAgICAgIGk7CisgICAgdWludDE2X3QgICAgICAgIGk7CiAKICAgICBpZiAocGVlcl9hZGRyICE9IE5VTEwpCiAgICAgewpAQCAtNDgwLDEwICs0ODAsMTAgQEAKICoqIERlc2NyaXB0aW9uICAgICAgQ2hlY2sgd2hldGhlciBhbnkgb3RoZXIgc2NiIGlzIGluIG9wZW4gc3RhdGUuCiAqKgogKioKLSoqIFJldHVybnMgICAgICAgICAgVFJVRSBpZiBhbm90aGVyIHNjYiBpcyBpbiBvcGVuIHN0YXRlLCBGQUxTRSBvdGhlcndpc2UuCisqKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgYW5vdGhlciBzY2IgaXMgaW4gb3BlbiBzdGF0ZSwgZmFsc2Ugb3RoZXJ3aXNlLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9hZ19vdGhlcl9zY2Jfb3Blbih0QlRBX0FHX1NDQiAqcF9jdXJyX3NjYikKK2Jvb2wgYnRhX2FnX290aGVyX3NjYl9vcGVuKHRCVEFfQUdfU0NCICpwX2N1cnJfc2NiKQogewogICAgIHRCVEFfQUdfU0NCICAgICAqcF9zY2IgPSAmYnRhX2FnX2NiLnNjYlswXTsKICAgICBpbnQgICAgICAgICAgICAgaTsKQEAgLTQ5MiwxMyArNDkyLDEzIEBACiAgICAgewogICAgICAgICBpZiAocF9zY2ItPmluX3VzZSAmJiBwX3NjYiAhPSBwX2N1cnJfc2NiICYmIHBfc2NiLT5zdGF0ZSA9PSBCVEFfQUdfT1BFTl9TVCkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qIG5vIG90aGVyIHNjYiBmb3VuZCAqLwogICAgIEFQUExfVFJBQ0VfREVCVUcoIk5vIG90aGVyIGFnIHNjYiBvcGVuIik7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTUwOCwxNyArNTA4LDE3IEBACiAqKiBEZXNjcmlwdGlvbiAgICAgIENoZWNrIHdoZXRoZXIgZ2l2ZW4gc2NiIGlzIGluIG9wZW4gc3RhdGUuCiAqKgogKioKLSoqIFJldHVybnMgICAgICAgICAgVFJVRSBpZiBzY2IgaXMgaW4gb3BlbiBzdGF0ZSwgRkFMU0Ugb3RoZXJ3aXNlLgorKiogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHNjYiBpcyBpbiBvcGVuIHN0YXRlLCBmYWxzZSBvdGhlcndpc2UuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX2FnX3NjYl9vcGVuKHRCVEFfQUdfU0NCICpwX2N1cnJfc2NiKQorYm9vbCBidGFfYWdfc2NiX29wZW4odEJUQV9BR19TQ0IgKnBfY3Vycl9zY2IpCiB7CiAgICAgaWYgKHBfY3Vycl9zY2IgJiYgcF9jdXJyX3NjYi0+aW5fdXNlICYmIHBfY3Vycl9zY2ItPnN0YXRlID09IEJUQV9BR19PUEVOX1NUKQogICAgIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC01MzQsNyArNTM0LDcgQEAKIHRCVEFfQUdfU0NCICpidGFfYWdfZ2V0X290aGVyX2lkbGVfc2NiICh0QlRBX0FHX1NDQiAqcF9jdXJyX3NjYikKIHsKICAgICB0QlRBX0FHX1NDQiAgICAgKnBfc2NiID0gJmJ0YV9hZ19jYi5zY2JbMF07Ci0gICAgVUlOVDggICB4eDsKKyAgICB1aW50OF90ICAgeHg7CiAKICAgICBmb3IgKHh4ID0gMDsgeHggPCBCVEFfQUdfTlVNX1NDQjsgeHgrKywgcF9zY2IrKykKICAgICB7CkBAIC01ODAsMTAgKzU4MCwxMCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX2NvbGxpc2lvbl9jYmFjayAodEJUQV9TWVNfQ09OTl9TVEFUVVMgc3RhdHVzLCBVSU5UOCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpCit2b2lkIGJ0YV9hZ19jb2xsaXNpb25fY2JhY2sgKHRCVEFfU1lTX0NPTk5fU1RBVFVTIHN0YXR1cywgdWludDhfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXBwX2lkLCBCRF9BRERSIHBlZXJfYWRkcikKIHsKLSAgICBVSU5UMTYgIGhhbmRsZTsKKyAgICB1aW50MTZfdCAgaGFuZGxlOwogICAgIHRCVEFfQUdfU0NCICpwX3NjYjsKICAgICBVTlVTRUQoc3RhdHVzKTsKICAgICBVTlVTRUQoYXBwX2lkKTsKQEAgLTcwNSw5ICs3MDUsOSBAQAogc3RhdGljIHZvaWQgYnRhX2FnX2FwaV9kaXNhYmxlKHRCVEFfQUdfREFUQSAqcF9kYXRhKQogewogICAgIC8qIGRlcmVnaXN0ZXIgYWxsIHNjYnMgaW4gdXNlICovCi0gICAgdEJUQV9BR19TQ0IgICAgICpwX3NjYiA9ICZidGFfYWdfY2Iuc2NiWzBdOwotICAgIEJPT0xFQU4gICAgICAgICBkb19kZXJlZyA9IEZBTFNFOwotICAgIGludCAgICAgICAgICAgICBpOworICAgIHRCVEFfQUdfU0NCICAqcF9zY2IgPSAmYnRhX2FnX2NiLnNjYlswXTsKKyAgICBib29sICAgICAgICAgZG9fZGVyZWcgPSBmYWxzZTsKKyAgICBpbnQgICAgICAgICAgaTsKIAogICAgIGlmICghYnRhX3N5c19pc19yZWdpc3RlciAoQlRBX0lEX0FHKSkKICAgICB7CkBAIC03MjMsNyArNzIzLDcgQEAKICAgICAgICAgaWYgKHBfc2NiLT5pbl91c2UpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ0YV9hZ19zbV9leGVjdXRlKHBfc2NiLCBCVEFfQUdfQVBJX0RFUkVHSVNURVJfRVZULCBwX2RhdGEpOwotICAgICAgICAgICAgZG9fZGVyZWcgPSBUUlVFOworICAgICAgICAgICAgZG9fZGVyZWcgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogCkBAIC04MTAsMTUgKzgxMCwxNSBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX3NtX2V4ZWN1dGUodEJUQV9BR19TQ0IgKnBfc2NiLCBVSU5UMTYgZXZlbnQsIHRCVEFfQUdfREFUQSAqcF9kYXRhKQordm9pZCBidGFfYWdfc21fZXhlY3V0ZSh0QlRBX0FHX1NDQiAqcF9zY2IsIHVpbnQxNl90IGV2ZW50LCB0QlRBX0FHX0RBVEEgKnBfZGF0YSkKIHsKICAgICB0QlRBX0FHX1NUX1RCTCAgICAgIHN0YXRlX3RhYmxlOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgYWN0aW9uOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgYWN0aW9uOwogICAgIGludCAgICAgICAgICAgICAgICAgaTsKIAotI2lmIEJUQV9BR19ERUJVRyA9PSBUUlVFCi0gICAgVUlOVDE2ICBpbl9ldmVudCA9IGV2ZW50OwotICAgIFVJTlQ4ICAgaW5fc3RhdGUgPSBwX3NjYi0+c3RhdGU7CisjaWYgKEJUQV9BR19ERUJVRyA9PSBUUlVFKQorICAgIHVpbnQxNl90ICBpbl9ldmVudCA9IGV2ZW50OworICAgIHVpbnQ4X3QgICBpbl9zdGF0ZSA9IHBfc2NiLT5zdGF0ZTsKIAogICAgIC8qIElnbm9yZSBkaXNwbGF5aW5nIG9mIEFUIHJlc3VsdHMgd2hlbiBub3QgY29ubmVjdGVkIChJZ25vcmVkIGluIHN0YXRlIG1hY2hpbmUpICovCiAgICAgaWYgKGluX2V2ZW50ICE9IEJUQV9BR19BUElfUkVTVUxUX0VWVCB8fCBwX3NjYi0+c3RhdGUgPT0gQlRBX0FHX09QRU5fU1QpCkBAIC04NTgsNyArODU4LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQotI2lmIEJUQV9BR19ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9BR19ERUJVRyA9PSBUUlVFKQogICAgIGlmIChwX3NjYi0+c3RhdGUgIT0gaW5fc3RhdGUpCiAgICAgewogICAgICAgICBBUFBMX1RSQUNFX0VWRU5UKCJCVEEgQUcgU3RhdGUgQ2hhbmdlOiBbJXNdIC0+IFslc10gYWZ0ZXIgRXZlbnQgWyVzXSIsCkBAIC04NzYsMTAgKzg3NiwxMCBAQAogKiogRGVzY3JpcHRpb24gICAgICBEYXRhIGdhdGV3YXkgbWFpbiBldmVudCBoYW5kbGluZyBmdW5jdGlvbi4KICoqCiAqKgotKiogUmV0dXJucyAgICAgICAgICBCT09MRUFOCisqKiBSZXR1cm5zICAgICAgICAgIGJvb2wKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfYWdfaGRsX2V2ZW50KEJUX0hEUiAqcF9tc2cpCitib29sIGJ0YV9hZ19oZGxfZXZlbnQoQlRfSERSICpwX21zZykKIHsKICAgICB0QlRBX0FHX1NDQiAqcF9zY2I7CiAKQEAgLTkxNSwxMSArOTE1LDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLSNpZiBCVEFfQUdfREVCVUcgPT0gVFJVRQotc3RhdGljIGNoYXIgKmJ0YV9hZ19ldnRfc3RyKFVJTlQxNiBldmVudCwgdEJUQV9BR19SRVMgcmVzdWx0KQorI2lmIChCVEFfQUdfREVCVUcgPT0gVFJVRSkKK3N0YXRpYyBjaGFyICpidGFfYWdfZXZ0X3N0cih1aW50MTZfdCBldmVudCwgdEJUQV9BR19SRVMgcmVzdWx0KQogewogICAgIHN3aXRjaCAoZXZlbnQpCiAgICAgewpAQCAtMTAwMSw3ICsxMDAxLDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBjaGFyICpidGFfYWdfc3RhdGVfc3RyKFVJTlQ4IHN0YXRlKQorc3RhdGljIGNoYXIgKmJ0YV9hZ19zdGF0ZV9zdHIodWludDhfdCBzdGF0ZSkKIHsKICAgICBzd2l0Y2ggKHN0YXRlKQogICAgIHsKZGlmZiAtLWdpdCBhL2J0YS9hZy9idGFfYWdfcmZjLmMgYi9idGEvYWcvYnRhX2FnX3JmYy5jCmluZGV4IGQzZjI3MDUuLmEzOTllOWIgMTAwNjQ0Ci0tLSBhL2J0YS9hZy9idGFfYWdfcmZjLmMKKysrIGIvYnRhL2FnL2J0YV9hZ19yZmMuYwpAQCAtMzksMTcgKzM5LDE3IEBACiAjZGVmaW5lIEJUQV9BR19QT1JUX0VWX01BU0sgICAgICAgICBQT1JUX0VWX1JYQ0hBUgogCiAvKiBlYWNoIHNjYiBoYXMgaXRzIG93biByZmNvbW0gY2FsbGJhY2tzICovCi12b2lkIGJ0YV9hZ19wb3J0X2NiYWNrXzEoVUlOVDMyIGNvZGUsIFVJTlQxNiBwb3J0X2hhbmRsZSk7Ci12b2lkIGJ0YV9hZ19wb3J0X2NiYWNrXzIoVUlOVDMyIGNvZGUsIFVJTlQxNiBwb3J0X2hhbmRsZSk7Ci12b2lkIGJ0YV9hZ19wb3J0X2NiYWNrXzMoVUlOVDMyIGNvZGUsIFVJTlQxNiBwb3J0X2hhbmRsZSk7Cit2b2lkIGJ0YV9hZ19wb3J0X2NiYWNrXzEodWludDMyX3QgY29kZSwgdWludDE2X3QgcG9ydF9oYW5kbGUpOwordm9pZCBidGFfYWdfcG9ydF9jYmFja18yKHVpbnQzMl90IGNvZGUsIHVpbnQxNl90IHBvcnRfaGFuZGxlKTsKK3ZvaWQgYnRhX2FnX3BvcnRfY2JhY2tfMyh1aW50MzJfdCBjb2RlLCB1aW50MTZfdCBwb3J0X2hhbmRsZSk7CiAKLXZvaWQgYnRhX2FnX21nbXRfY2JhY2tfMShVSU5UMzIgY29kZSwgVUlOVDE2IHBvcnRfaGFuZGxlKTsKLXZvaWQgYnRhX2FnX21nbXRfY2JhY2tfMihVSU5UMzIgY29kZSwgVUlOVDE2IHBvcnRfaGFuZGxlKTsKLXZvaWQgYnRhX2FnX21nbXRfY2JhY2tfMyhVSU5UMzIgY29kZSwgVUlOVDE2IHBvcnRfaGFuZGxlKTsKK3ZvaWQgYnRhX2FnX21nbXRfY2JhY2tfMSh1aW50MzJfdCBjb2RlLCB1aW50MTZfdCBwb3J0X2hhbmRsZSk7Cit2b2lkIGJ0YV9hZ19tZ210X2NiYWNrXzIodWludDMyX3QgY29kZSwgdWludDE2X3QgcG9ydF9oYW5kbGUpOwordm9pZCBidGFfYWdfbWdtdF9jYmFja18zKHVpbnQzMl90IGNvZGUsIHVpbnQxNl90IHBvcnRfaGFuZGxlKTsKIAotaW50IGJ0YV9hZ19kYXRhX2NiYWNrXzEoVUlOVDE2IHBvcnRfaGFuZGxlLCB2b2lkICpwX2RhdGEsIFVJTlQxNiBsZW4pOwotaW50IGJ0YV9hZ19kYXRhX2NiYWNrXzIoVUlOVDE2IHBvcnRfaGFuZGxlLCB2b2lkICpwX2RhdGEsIFVJTlQxNiBsZW4pOwotaW50IGJ0YV9hZ19kYXRhX2NiYWNrXzMoVUlOVDE2IHBvcnRfaGFuZGxlLCB2b2lkICpwX2RhdGEsIFVJTlQxNiBsZW4pOworaW50IGJ0YV9hZ19kYXRhX2NiYWNrXzEodWludDE2X3QgcG9ydF9oYW5kbGUsIHZvaWQgKnBfZGF0YSwgdWludDE2X3QgbGVuKTsKK2ludCBidGFfYWdfZGF0YV9jYmFja18yKHVpbnQxNl90IHBvcnRfaGFuZGxlLCB2b2lkICpwX2RhdGEsIHVpbnQxNl90IGxlbik7CitpbnQgYnRhX2FnX2RhdGFfY2JhY2tfMyh1aW50MTZfdCBwb3J0X2hhbmRsZSwgdm9pZCAqcF9kYXRhLCB1aW50MTZfdCBsZW4pOwogCiAvKiByZmNvbW0gY2FsbGJhY2sgZnVuY3Rpb24gdGFibGVzICovCiB0eXBlZGVmIHRQT1JUX0NBTExCQUNLICp0QlRBX0FHX1BPUlRfQ0JBQ0s7CkBAIC04NSw3ICs4NSw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2FnX3BvcnRfY2JhY2soVUlOVDMyIGNvZGUsIFVJTlQxNiBwb3J0X2hhbmRsZSwgVUlOVDE2IGhhbmRsZSkKK3N0YXRpYyB2b2lkIGJ0YV9hZ19wb3J0X2NiYWNrKHVpbnQzMl90IGNvZGUsIHVpbnQxNl90IHBvcnRfaGFuZGxlLCB1aW50MTZfdCBoYW5kbGUpCiB7CiAgICAgdEJUQV9BR19TQ0IgKnBfc2NiOwogICAgIFVOVVNFRChjb2RlKTsKQEAgLTExNywxMiArMTE3LDEyIEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2FnX21nbXRfY2JhY2soVUlOVDMyIGNvZGUsIFVJTlQxNiBwb3J0X2hhbmRsZSwgVUlOVDE2IGhhbmRsZSkKK3N0YXRpYyB2b2lkIGJ0YV9hZ19tZ210X2NiYWNrKHVpbnQzMl90IGNvZGUsIHVpbnQxNl90IHBvcnRfaGFuZGxlLCB1aW50MTZfdCBoYW5kbGUpCiB7Ci0gICAgdEJUQV9BR19TQ0IgICAgICpwX3NjYjsKLSAgICBVSU5UMTYgICAgICAgICAgZXZlbnQ7Ci0gICAgVUlOVDggICAgICAgICAgIGk7Ci0gICAgQk9PTEVBTiAgICAgICAgIGZvdW5kX2hhbmRsZSA9IEZBTFNFOworICAgIHRCVEFfQUdfU0NCICAqcF9zY2I7CisgICAgdWludDE2X3QgICAgIGV2ZW50OworICAgIHVpbnQ4X3QgICAgICBpOworICAgIGJvb2wgICAgICAgICBmb3VuZF9oYW5kbGUgPSBmYWxzZTsKIAogICAgIEFQUExfVFJBQ0VfREVCVUcoImFnX21nbXRfY2JhY2sgOiBjb2RlID0gJWQsIHBvcnRfaGFuZGxlID0gJWQsIGhhbmRsZSA9ICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsIHBvcnRfaGFuZGxlLCBoYW5kbGUpOwpAQCAtMTQxLDE0ICsxNDEsMTQgQEAKICAgICAgICAgICAgIGlmIChwX3NjYi0+Y29ubl9oYW5kbGUpICAgICAvKiBPdXRnb2luZyBjb25uZWN0aW9uICovCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKHBvcnRfaGFuZGxlID09IHBfc2NiLT5jb25uX2hhbmRsZSkKLSAgICAgICAgICAgICAgICAgICAgZm91bmRfaGFuZGxlID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgZm91bmRfaGFuZGxlID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNvbWluZyBjb25uZWN0aW9uICovCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEJUQV9BR19OVU1fSURYOyBpKyspCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAocG9ydF9oYW5kbGUgPT0gcF9zY2ItPnNlcnZfaGFuZGxlW2ldKQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfaGFuZGxlID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2hhbmRsZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC0xODgsMTIgKzE4OCwxMiBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgYnRhX2FnX2RhdGFfY2JhY2soVUlOVDE2IHBvcnRfaGFuZGxlLCB2b2lkICpwX2RhdGEsIFVJTlQxNiBsZW4sIFVJTlQxNiBoYW5kbGUpCitzdGF0aWMgaW50IGJ0YV9hZ19kYXRhX2NiYWNrKHVpbnQxNl90IHBvcnRfaGFuZGxlLCB2b2lkICpwX2RhdGEsIHVpbnQxNl90IGxlbiwgdWludDE2X3QgaGFuZGxlKQogewogICAgIFVOVVNFRChwb3J0X2hhbmRsZSk7CiAKICAgICAvKiBjYWxsIGRhdGEgY2FsbC1vdXQgZGlyZWN0bHkgKi8KLSAgICBidGFfYWdfY29fdHhfd3JpdGUoaGFuZGxlLCAoVUlOVDggKikgcF9kYXRhLCBsZW4pOworICAgIGJ0YV9hZ19jb190eF93cml0ZShoYW5kbGUsICh1aW50OF90ICopIHBfZGF0YSwgbGVuKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMjA5LDEyICsyMDksMTIgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZ19tZ210X2NiYWNrXzEoVUlOVDMyIGNvZGUsIFVJTlQxNiBoYW5kbGUpIHtidGFfYWdfbWdtdF9jYmFjayhjb2RlLCBoYW5kbGUsIDEpO30KLXZvaWQgYnRhX2FnX21nbXRfY2JhY2tfMihVSU5UMzIgY29kZSwgVUlOVDE2IGhhbmRsZSkge2J0YV9hZ19tZ210X2NiYWNrKGNvZGUsIGhhbmRsZSwgMik7fQotdm9pZCBidGFfYWdfbWdtdF9jYmFja18zKFVJTlQzMiBjb2RlLCBVSU5UMTYgaGFuZGxlKSB7YnRhX2FnX21nbXRfY2JhY2soY29kZSwgaGFuZGxlLCAzKTt9Ci12b2lkIGJ0YV9hZ19wb3J0X2NiYWNrXzEoVUlOVDMyIGNvZGUsIFVJTlQxNiBoYW5kbGUpIHtidGFfYWdfcG9ydF9jYmFjayhjb2RlLCBoYW5kbGUsIDEpO30KLXZvaWQgYnRhX2FnX3BvcnRfY2JhY2tfMihVSU5UMzIgY29kZSwgVUlOVDE2IGhhbmRsZSkge2J0YV9hZ19wb3J0X2NiYWNrKGNvZGUsIGhhbmRsZSwgMik7fQotdm9pZCBidGFfYWdfcG9ydF9jYmFja18zKFVJTlQzMiBjb2RlLCBVSU5UMTYgaGFuZGxlKSB7YnRhX2FnX3BvcnRfY2JhY2soY29kZSwgaGFuZGxlLCAzKTt9Cit2b2lkIGJ0YV9hZ19tZ210X2NiYWNrXzEodWludDMyX3QgY29kZSwgdWludDE2X3QgaGFuZGxlKSB7YnRhX2FnX21nbXRfY2JhY2soY29kZSwgaGFuZGxlLCAxKTt9Cit2b2lkIGJ0YV9hZ19tZ210X2NiYWNrXzIodWludDMyX3QgY29kZSwgdWludDE2X3QgaGFuZGxlKSB7YnRhX2FnX21nbXRfY2JhY2soY29kZSwgaGFuZGxlLCAyKTt9Cit2b2lkIGJ0YV9hZ19tZ210X2NiYWNrXzModWludDMyX3QgY29kZSwgdWludDE2X3QgaGFuZGxlKSB7YnRhX2FnX21nbXRfY2JhY2soY29kZSwgaGFuZGxlLCAzKTt9Cit2b2lkIGJ0YV9hZ19wb3J0X2NiYWNrXzEodWludDMyX3QgY29kZSwgdWludDE2X3QgaGFuZGxlKSB7YnRhX2FnX3BvcnRfY2JhY2soY29kZSwgaGFuZGxlLCAxKTt9Cit2b2lkIGJ0YV9hZ19wb3J0X2NiYWNrXzIodWludDMyX3QgY29kZSwgdWludDE2X3QgaGFuZGxlKSB7YnRhX2FnX3BvcnRfY2JhY2soY29kZSwgaGFuZGxlLCAyKTt9Cit2b2lkIGJ0YV9hZ19wb3J0X2NiYWNrXzModWludDMyX3QgY29kZSwgdWludDE2X3QgaGFuZGxlKSB7YnRhX2FnX3BvcnRfY2JhY2soY29kZSwgaGFuZGxlLCAzKTt9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMjI3LDE1ICsyMjcsMTUgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgYnRhX2FnX2RhdGFfY2JhY2tfMShVSU5UMTYgcG9ydF9oYW5kbGUsIHZvaWQgKnBfZGF0YSwgVUlOVDE2IGxlbikKK2ludCBidGFfYWdfZGF0YV9jYmFja18xKHVpbnQxNl90IHBvcnRfaGFuZGxlLCB2b2lkICpwX2RhdGEsIHVpbnQxNl90IGxlbikKIHsKICAgICByZXR1cm4gYnRhX2FnX2RhdGFfY2JhY2socG9ydF9oYW5kbGUsIHBfZGF0YSwgbGVuLCAxKTsKIH0KLWludCBidGFfYWdfZGF0YV9jYmFja18yKFVJTlQxNiBwb3J0X2hhbmRsZSwgdm9pZCAqcF9kYXRhLCBVSU5UMTYgbGVuKQoraW50IGJ0YV9hZ19kYXRhX2NiYWNrXzIodWludDE2X3QgcG9ydF9oYW5kbGUsIHZvaWQgKnBfZGF0YSwgdWludDE2X3QgbGVuKQogewogICAgIHJldHVybiBidGFfYWdfZGF0YV9jYmFjayhwb3J0X2hhbmRsZSwgcF9kYXRhLCBsZW4sIDIpOwogfQotaW50IGJ0YV9hZ19kYXRhX2NiYWNrXzMoVUlOVDE2IHBvcnRfaGFuZGxlLCB2b2lkICpwX2RhdGEsIFVJTlQxNiBsZW4pCitpbnQgYnRhX2FnX2RhdGFfY2JhY2tfMyh1aW50MTZfdCBwb3J0X2hhbmRsZSwgdm9pZCAqcF9kYXRhLCB1aW50MTZfdCBsZW4pCiB7CiAgICAgcmV0dXJuIGJ0YV9hZ19kYXRhX2NiYWNrKHBvcnRfaGFuZGxlLCBwX2RhdGEsIGxlbiwgMyk7CiB9CkBAIC0yNTAsOSArMjUwLDkgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZ19zZXR1cF9wb3J0KHRCVEFfQUdfU0NCICpwX3NjYiwgVUlOVDE2IGhhbmRsZSkKK3ZvaWQgYnRhX2FnX3NldHVwX3BvcnQodEJUQV9BR19TQ0IgKnBfc2NiLCB1aW50MTZfdCBoYW5kbGUpCiB7Ci0gICAgVUlOVDE2IGkgPSBidGFfYWdfc2NiX3RvX2lkeChwX3NjYikgLSAxOworICAgIHVpbnQxNl90IGkgPSBidGFfYWdfc2NiX3RvX2lkeChwX3NjYikgLSAxOwogCiAgICAgLyogc2V0IHVwIGRhdGEgY2FsbGJhY2sgaWYgdXNpbmcgcGFzcyB0aHJvdWdoIG1vZGUgKi8KICAgICBpZiAoYnRhX2FnX2NiLnBhcnNlX21vZGUgPT0gQlRBX0FHX1BBU1NfVEhST1VHSCkKQEAgLTI4NSwxMSArMjg1LDExIEBACiAgICAgICAgIC8qIGlmIHNlcnZpY2UgaXMgc2V0IGluIG1hc2sgKi8KICAgICAgICAgaWYgKHNlcnZpY2VzICYgMSkKICAgICAgICAgewotICAgICAgICAgICAgQlRNX1NldFNlY3VyaXR5TGV2ZWwoRkFMU0UsICIiLCBidGFfYWdfc2VjX2lkW2ldLCBwX3NjYi0+c2Vydl9zZWNfbWFzaywKKyAgICAgICAgICAgIEJUTV9TZXRTZWN1cml0eUxldmVsKGZhbHNlLCAiIiwgYnRhX2FnX3NlY19pZFtpXSwgcF9zY2ItPnNlcnZfc2VjX21hc2ssCiAgICAgICAgICAgICAgICAgQlRfUFNNX1JGQ09NTSwgQlRNX1NFQ19QUk9UT19SRkNPTU0sIGJ0YV9hZ19jYi5wcm9maWxlW2ldLnNjbik7CiAKICAgICAgICAgICAgIGJ0YV9hZ19wb3J0X3N0YXR1cyA9ICBSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbihidGFfYWdfdXVpZFtpXSwgYnRhX2FnX2NiLnByb2ZpbGVbaV0uc2NuLAotICAgICAgICAgICAgICAgIFRSVUUsIEJUQV9BR19NVFUsIChVSU5UOCAqKSBiZF9hZGRyX2FueSwgJihwX3NjYi0+c2Vydl9oYW5kbGVbaV0pLAorICAgICAgICAgICAgICAgIHRydWUsIEJUQV9BR19NVFUsICh1aW50OF90ICopIGJkX2FkZHJfYW55LCAmKHBfc2NiLT5zZXJ2X2hhbmRsZVtpXSksCiAgICAgICAgICAgICAgICAgYnRhX2FnX21nbXRfY2JhY2tfdGJsW2J0YV9hZ19zY2JfdG9faWR4KHBfc2NiKSAtIDFdKTsKIAogICAgICAgICAgICAgaWYoIGJ0YV9hZ19wb3J0X3N0YXR1cyAgPT0gUE9SVF9TVUNDRVNTICkKQEAgLTMzNSwyMSArMzM1LDIxIEBACiAqKgogKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfaXNfc2VydmVyX2Nsb3NlZAogKioKLSoqIERlc2NyaXB0aW9uICAgICAgUmV0dXJucyBUUlVFIGlmIGFsbCBzZXJ2ZXJzIGFyZSBjbG9zZWQuCisqKiBEZXNjcmlwdGlvbiAgICAgIFJldHVybnMgdHJ1ZSBpZiBhbGwgc2VydmVycyBhcmUgY2xvc2VkLgogKioKICoqCi0qKiBSZXR1cm5zICAgICAgICAgIFRSVUUgaWYgYWxsIHNlcnZlcnMgYXJlIGNsb3NlZCwgRkFMU0Ugb3RoZXJ3aXNlCisqKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgYWxsIHNlcnZlcnMgYXJlIGNsb3NlZCwgZmFsc2Ugb3RoZXJ3aXNlCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX2FnX2lzX3NlcnZlcl9jbG9zZWQgKHRCVEFfQUdfU0NCICpwX3NjYikKK2Jvb2wgYnRhX2FnX2lzX3NlcnZlcl9jbG9zZWQgKHRCVEFfQUdfU0NCICpwX3NjYikKIHsKLSAgICBVSU5UOCB4eDsKLSAgICBCT09MRUFOIGlzX2Nsb3NlZCA9IFRSVUU7CisgICAgdWludDhfdCB4eDsKKyAgICBib29sIGlzX2Nsb3NlZCA9IHRydWU7CiAKICAgICBmb3IgKHh4ID0gMDsgeHggPCBCVEFfQUdfTlVNX0lEWDsgeHgrKykKICAgICB7CiAgICAgICAgIGlmIChwX3NjYi0+c2Vydl9oYW5kbGVbeHhdICE9IDApCi0gICAgICAgICAgICBpc19jbG9zZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlzX2Nsb3NlZCA9IGZhbHNlOwogICAgIH0KIAogICAgIHJldHVybiBpc19jbG9zZWQ7CkBAIC0zNjcsMTEgKzM2NywxMSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2FnX3JmY19kb19vcGVuKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpCiB7Ci0gICAgQlRNX1NldFNlY3VyaXR5TGV2ZWwoVFJVRSwgIiIsIGJ0YV9hZ19zZWNfaWRbcF9zY2ItPmNvbm5fc2VydmljZV0sCisgICAgQlRNX1NldFNlY3VyaXR5TGV2ZWwodHJ1ZSwgIiIsIGJ0YV9hZ19zZWNfaWRbcF9zY2ItPmNvbm5fc2VydmljZV0sCiAgICAgICAgIHBfc2NiLT5jbGlfc2VjX21hc2ssIEJUX1BTTV9SRkNPTU0sIEJUTV9TRUNfUFJPVE9fUkZDT01NLCBwX3NjYi0+cGVlcl9zY24pOwogCiAgICAgaWYgKFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uKGJ0YV9hZ191dWlkW3Bfc2NiLT5jb25uX3NlcnZpY2VdLCBwX3NjYi0+cGVlcl9zY24sCi0gICAgICAgICAgICBGQUxTRSwgQlRBX0FHX01UVSwgcF9zY2ItPnBlZXJfYWRkciwgJihwX3NjYi0+Y29ubl9oYW5kbGUpLAorICAgICAgICAgICAgZmFsc2UsIEJUQV9BR19NVFUsIHBfc2NiLT5wZWVyX2FkZHIsICYocF9zY2ItPmNvbm5faGFuZGxlKSwKICAgICAgICAgICAgIGJ0YV9hZ19tZ210X2NiYWNrX3RibFtidGFfYWdfc2NiX3RvX2lkeChwX3NjYikgLSAxXSkgPT0gUE9SVF9TVUNDRVNTKQogICAgIHsKICAgICAgICAgYnRhX2FnX3NldHVwX3BvcnQocF9zY2IsIHBfc2NiLT5jb25uX2hhbmRsZSk7CmRpZmYgLS1naXQgYS9idGEvYWcvYnRhX2FnX3Njby5jIGIvYnRhL2FnL2J0YV9hZ19zY28uYwppbmRleCAyYTUzNDFiLi5mYmJiMWQ3IDEwMDY0NAotLS0gYS9idGEvYWcvYnRhX2FnX3Njby5jCisrKyBiL2J0YS9hZy9idGFfYWdfc2NvLmMKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlICJidGFfYXBpLmgiCiAjaW5jbHVkZSAiYnRhX2FnX2FwaS5oIgogI2luY2x1ZGUgImJ0YV9hZ19jby5oIgotI2lmIChCVE1fU0NPX0hDSV9JTkNMVURFRCA9PSBUUlVFICkKKyNpZiAoQlRNX1NDT19IQ0lfSU5DTFVERUQgPT0gVFJVRSkKICNpbmNsdWRlICJidGFfZG1fY28uaCIKICNlbmRpZgogI2luY2x1ZGUgImJ0YV9hZ19pbnQuaCIKQEAgLTQ1LDkgKzQ1LDkgQEAKIAogZXh0ZXJuIGZpeGVkX3F1ZXVlX3QgKmJ0dV9idGFfYWxhcm1fcXVldWU7CiAKLSNpZiBCVEFfQUdfU0NPX0RFQlVHID09IFRSVUUKLXN0YXRpYyBjaGFyICpidGFfYWdfc2NvX2V2dF9zdHIoVUlOVDggZXZlbnQpOwotc3RhdGljIGNoYXIgKmJ0YV9hZ19zY29fc3RhdGVfc3RyKFVJTlQ4IHN0YXRlKTsKKyNpZiAoQlRBX0FHX1NDT19ERUJVRyA9PSBUUlVFKQorc3RhdGljIGNoYXIgKmJ0YV9hZ19zY29fZXZ0X3N0cih1aW50OF90IGV2ZW50KTsKK3N0YXRpYyBjaGFyICpidGFfYWdfc2NvX3N0YXRlX3N0cih1aW50OF90IHN0YXRlKTsKICNlbmRpZgogCiAjZGVmaW5lIEJUQV9BR19OT19FRFJfRVNDTyAgKEJUTV9TQ09fUEtUX1RZUEVTX01BU0tfTk9fMl9FVjMgfCBcCkBAIC02MSw3ICs2MSw3IEBACiAgICAgQlRBX0FHX1NDT19MSVNURU5fRSwgICAgICAgIC8qIGxpc3RlbiByZXF1ZXN0ICovCiAgICAgQlRBX0FHX1NDT19PUEVOX0UsICAgICAgICAgIC8qIG9wZW4gcmVxdWVzdCAqLwogICAgIEJUQV9BR19TQ09fWEZFUl9FLCAgICAgICAgICAvKiB0cmFuc2ZlciByZXF1ZXN0ICovCi0jaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSkKICAgICBCVEFfQUdfU0NPX0NOX0RPTkVfRSwgICAgICAgLyogY29kZWMgbmVnb3RpYXRpb24gZG9uZSAqLwogICAgIEJUQV9BR19TQ09fUkVPUEVOX0UsICAgICAgICAvKiBSZXRyeSB3aXRoIG90aGVyIGNvZGVjIHdoZW4gZmFpbGVkICovCiAjZW5kaWYKQEAgLTcyLDcgKzcyLDcgQEAKICAgICBCVEFfQUdfU0NPX0NJX0RBVEFfRSAgICAgICAgLyogU0NPIGRhdGEgcmVhZHkgKi8KIH07CiAKLSNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFICkKKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFKQogI2RlZmluZSBCVEFfQUdfTlVNX0NPREVDUyAgIDMKICNkZWZpbmUgQlRBX0FHX0VTQ09fU0VUVElOR19JRFhfQ1ZTRCAgICAwICAgLyogZVNDTyBzZXR0aW5nIGZvciBDVlNEICovCiAjZGVmaW5lIEJUQV9BR19FU0NPX1NFVFRJTkdfSURYX1QxICAgICAgMSAgIC8qIGVTQ08gc2V0dGluZyBmb3IgbVNCQyBUMSAqLwpAQCAtMTUyLDkgKzE1Miw5IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2FnX3Njb19jb25uX2NiYWNrKFVJTlQxNiBzY29faWR4KQorc3RhdGljIHZvaWQgYnRhX2FnX3Njb19jb25uX2NiYWNrKHVpbnQxNl90IHNjb19pZHgpCiB7Ci0gICAgVUlOVDE2ICBoYW5kbGU7CisgICAgdWludDE2X3QgIGhhbmRsZTsKICAgICB0QlRBX0FHX1NDQiAqcF9zY2I7CiAKICAgICAvKiBtYXRjaCBjYWxsYmFjayB0byBzY2I7IGZpcnN0IGNoZWNrIGN1cnJlbnQgc2NvIHNjYiAqLwpAQCAtMTk1LDkgKzE5NSw5IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2FnX3Njb19kaXNjX2NiYWNrKFVJTlQxNiBzY29faWR4KQorc3RhdGljIHZvaWQgYnRhX2FnX3Njb19kaXNjX2NiYWNrKHVpbnQxNl90IHNjb19pZHgpCiB7Ci0gICAgVUlOVDE2ICBoYW5kbGUgPSAwOworICAgIHVpbnQxNl90ICBoYW5kbGUgPSAwOwogCiAgICAgQVBQTF9UUkFDRV9ERUJVRyAoImJ0YV9hZ19zY29fZGlzY19jYmFjaygpOiBzY29faWR4OiAweCV4ICBwX2N1cl9zY2I6IDB4JTA4eCAgc2NvLnN0YXRlOiAlZCIsIHNjb19pZHgsIGJ0YV9hZ19jYi5zY28ucF9jdXJyX3NjYiwgYnRhX2FnX2NiLnNjby5zdGF0ZSk7CiAKQEAgLTIyMCwxNCArMjIwLDE0IEBACiAKICAgICBpZiAoaGFuZGxlICE9IDApCiAgICAgewotI2lmIChCVE1fU0NPX0hDSV9JTkNMVURFRCA9PSBUUlVFICkKLSAgICAgICAgdEJUTV9TVEFUVVMgc3RhdHVzID0gQlRNX0NvbmZpZ1Njb1BhdGgoQlRNX1NDT19ST1VURV9QQ00sIE5VTEwsIE5VTEwsIFRSVUUpOworI2lmIChCVE1fU0NPX0hDSV9JTkNMVURFRCA9PSBUUlVFKQorICAgICAgICB0QlRNX1NUQVRVUyBzdGF0dXMgPSBCVE1fQ29uZmlnU2NvUGF0aChCVE1fU0NPX1JPVVRFX1BDTSwgTlVMTCwgTlVMTCwgdHJ1ZSk7CiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9hZ19zY29fZGlzY19jYmFjayBzY28gY2xvc2UgY29uZmlnIHN0YXR1cyA9ICVkIiwgc3RhdHVzKTsKICAgICAgICAgLyogU0NPIGNsZWFuIHVwIGhlcmUgKi8KICAgICAgICAgYnRhX2RtX3Njb19jb19jbG9zZSgpOwogI2VuZGlmCiAKLSNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFICkKKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFKQogICAgICAgICAvKiBSZXN0b3JlIHNldHRpbmdzICovCiAgICAgICAgIGlmKGJ0YV9hZ19jYi5zY28ucF9jdXJyX3NjYi0+aW51c2VfY29kZWMgPT0gQlRBX0FHX0NPREVDX01TQkMpCiAgICAgICAgIHsKQEAgLTI0Niw3ICsyNDYsNyBAQAogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIkZhbGxiYWNrIHRvIENWU0Qgc2V0dGluZ3MiKTsKLSAgICAgICAgICAgICAgICAgICAgYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiLT5jb2RlY19mYWxsYmFjayA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19jYi5zY28ucF9jdXJyX3NjYi0+Y29kZWNfZmFsbGJhY2sgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjcxLDcgKzI3MSw3IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0jaWYgKEJUTV9TQ09fSENJX0lOQ0xVREVEID09IFRSVUUgKQorI2lmIChCVE1fU0NPX0hDSV9JTkNMVURFRCA9PSBUUlVFKQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCiAqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zY29fcmVhZF9jYmFjawpAQCAtMjgyLDcgKzI4Miw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2FnX3Njb19yZWFkX2NiYWNrIChVSU5UMTYgc2NvX2lueCwgQlRfSERSICpwX2RhdGEsIHRCVE1fU0NPX0RBVEFfRkxBRyBzdGF0dXMpCitzdGF0aWMgdm9pZCBidGFfYWdfc2NvX3JlYWRfY2JhY2sgKHVpbnQxNl90IHNjb19pbngsIEJUX0hEUiAqcF9kYXRhLCB0QlRNX1NDT19EQVRBX0ZMQUcgc3RhdHVzKQogewogICAgIGlmIChzdGF0dXMgIT0gQlRNX1NDT19EQVRBX0NPUlJFQ1QpCiAgICAgewpAQCAtMjk4LDE1ICsyOTgsMTUgQEAKICoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3JlbW92ZV9zY28KICoqCiAqKiBEZXNjcmlwdGlvbiAgICAgIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBTQ08gZnJvbSB0aGUgc3lzdGVtLgotKiogICAgICAgICAgICAgICAgICBJZiBvbmx5X2FjdGl2ZSBpcyBUUlVFLCB0aGVuIFNDTyBpcyBvbmx5IHJlbW92ZWQgaWYgY29ubmVjdGVkCisqKiAgICAgICAgICAgICAgICAgIElmIG9ubHlfYWN0aXZlIGlzIHRydWUsIHRoZW4gU0NPIGlzIG9ubHkgcmVtb3ZlZCBpZiBjb25uZWN0ZWQKICoqCi0qKiBSZXR1cm5zICAgICAgICAgIEJPT0xFQU4gICAtIFRSVUUgaWYgU2NvIHJlbW92YWwgd2FzIHN0YXJ0ZWQKKyoqIFJldHVybnMgICAgICAgICAgYm9vbCAgIC0gdHJ1ZSBpZiBTY28gcmVtb3ZhbCB3YXMgc3RhcnRlZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgQk9PTEVBTiBidGFfYWdfcmVtb3ZlX3Njbyh0QlRBX0FHX1NDQiAqcF9zY2IsIEJPT0xFQU4gb25seV9hY3RpdmUpCitzdGF0aWMgYm9vbCBidGFfYWdfcmVtb3ZlX3Njbyh0QlRBX0FHX1NDQiAqcF9zY2IsIGJvb2wgb25seV9hY3RpdmUpCiB7Ci0gICAgQk9PTEVBTiAgICAgcmVtb3ZlZF9zdGFydGVkID0gRkFMU0U7Ci0gICAgdEJUTV9TVEFUVVMJc3RhdHVzOworICAgIGJvb2wgICAgICAgIHJlbW92ZWRfc3RhcnRlZCA9IGZhbHNlOworICAgIHRCVE1fU1RBVFVTIHN0YXR1czsKIAogICAgIGlmIChwX3NjYi0+c2NvX2lkeCAhPSBCVE1fSU5WQUxJRF9TQ09fSU5ERVgpCiAgICAgewpAQCAtMzIxLDcgKzMyMSw3IEBACiAgICAgICAgICAgICAgICAgLyogU2NvIGlzIGNvbm5lY3RlZDsgc2V0IGN1cnJlbnQgY29udHJvbCBibG9jayAqLwogICAgICAgICAgICAgICAgIGJ0YV9hZ19jYi5zY28ucF9jdXJyX3NjYiA9IHBfc2NiOwogCi0gICAgICAgICAgICAgICAgcmVtb3ZlZF9zdGFydGVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICByZW1vdmVkX3N0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLyogSWYgbm8gY29ubmVjdGlvbiByZXNldCB0aGUgc2NvIGhhbmRsZSAqLwogICAgICAgICAgICAgZWxzZSBpZiAoIChzdGF0dXMgPT0gQlRNX1NVQ0NFU1MpIHx8IChzdGF0dXMgPT0gQlRNX1VOS05PV05fQUREUikgKQpAQCAtMzQ3LDggKzM0Nyw4IEBACiBzdGF0aWMgdm9pZCBidGFfYWdfZXNjb19jb25ucmVxX2NiYWNrKHRCVE1fRVNDT19FVlQgZXZlbnQsIHRCVE1fRVNDT19FVlRfREFUQSAqcF9kYXRhKQogewogICAgIHRCVEFfQUdfU0NCICAgICAgICAgKnBfc2NiOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgIGhhbmRsZTsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICBzY29faW54ID0gcF9kYXRhLT5jb25uX2V2dC5zY29faW54OworICAgIHVpbnQxNl90ICAgICAgICAgICAgIGhhbmRsZTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICBzY29faW54ID0gcF9kYXRhLT5jb25uX2V2dC5zY29faW54OwogCiAgICAgLyogT25seSBwcm9jZXNzIGNvbm5lY3Rpb24gcmVxdWVzdHMgKi8KICAgICBpZiAoZXZlbnQgPT0gQlRNX0VTQ09fQ09OTl9SRVFfRVZUKQpAQCAtMzc1LDcgKzM3NSw3IEBACiAgICAgICAgICAgICAgICAgYnRhX2FnX2NiLnNjby5jb25uX2RhdGEgPSBwX2RhdGEtPmNvbm5fZXZ0OwogICAgICAgICAgICAgICAgIGJ0YV9hZ19jYi5zY28uc3RhdGUgPSBCVEFfQUdfU0NPX09QRU5fWEZFUl9TVDsKIAotICAgICAgICAgICAgICAgIGlmICghYnRhX2FnX3JlbW92ZV9zY28oYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiLCBUUlVFKSkKKyAgICAgICAgICAgICAgICBpZiAoIWJ0YV9hZ19yZW1vdmVfc2NvKGJ0YV9hZ19jYi5zY28ucF9jdXJyX3NjYiwgdHJ1ZSkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKCJidGFfYWdfZXNjb19jb25ucmVxX2NiYWNrOiBOb3RoaW5nIHRvIHJlbW92ZSBzbyBhY2NlcHQgQ29ubiBSZXF1ZXN0IChzY29faW54IDB4JTA0eCkiLCBzY29faW54KTsKICAgICAgICAgICAgICAgICAgICAgYnRhX2FnX2NiLnNjby5wX3hmZXJfc2NiID0gTlVMTDsKQEAgLTQxMiw3ICs0MTIsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hZ19jYmFja19zY28odEJUQV9BR19TQ0IgKnBfc2NiLCBVSU5UOCBldmVudCkKK3N0YXRpYyB2b2lkIGJ0YV9hZ19jYmFja19zY28odEJUQV9BR19TQ0IgKnBfc2NiLCB1aW50OF90IGV2ZW50KQogewogICAgIHRCVEFfQUdfSERSICAgIHNjbzsKIApAQCAtNDMzLDE5ICs0MzMsMTkgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfYWdfY3JlYXRlX3Njbyh0QlRBX0FHX1NDQiAqcF9zY2IsIEJPT0xFQU4gaXNfb3JpZykKK3N0YXRpYyB2b2lkIGJ0YV9hZ19jcmVhdGVfc2NvKHRCVEFfQUdfU0NCICpwX3NjYiwgYm9vbCBpc19vcmlnKQogewogICAgIHRCVE1fU1RBVFVTICAgICAgIHN0YXR1czsKLSAgICBVSU5UOCAgICAgICAgICAgICpwX2JkX2FkZHIgPSBOVUxMOworICAgIHVpbnQ4X3QgICAgICAgICAgKnBfYmRfYWRkciA9IE5VTEw7CiAgICAgdEJUTV9FU0NPX1BBUkFNUyBwYXJhbXM7Ci0jaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCi0gICAgdEJUQV9BR19QRUVSX0NPREVDICBlc2NvX2NvZGVjID0gQlRNX1NDT19DT0RFQ19DVlNEOworI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUpCisgICAgdEJUQV9BR19QRUVSX0NPREVDIGVzY29fY29kZWMgPSBCVE1fU0NPX0NPREVDX0NWU0Q7CiAgICAgaW50IGNvZGVjX2luZGV4ID0gMDsKICNlbmRpZgotI2lmIChCVE1fU0NPX0hDSV9JTkNMVURFRCA9PSBUUlVFICkKKyNpZiAoQlRNX1NDT19IQ0lfSU5DTFVERUQgPT0gVFJVRSkKICAgICB0QlRNX1NDT19ST1VURV9UWVBFIHNjb19yb3V0ZTsKICAgICB0QlRBX0NPREVDX0lORk8gICAgIGNvZGVjX2luZm8gPSB7QlRBX1NDT19DT0RFQ19QQ019OwotICAgIFVJTlQzMiAgICAgICAgICAgICAgcGNtX3NhbXBsZV9yYXRlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgcGNtX3NhbXBsZV9yYXRlOwogI2VuZGlmCiAKICAgICAvKiBNYWtlIHN1cmUgdGhpcyBzY28gaGFuZGxlIGlzIG5vdCBhbHJlYWR5IGluIHVzZSAqLwpAQCAtNDU2LDcgKzQ1Niw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFICkKKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFKQogICAgIGlmICgocF9zY2ItPnNjb19jb2RlYyA9PSBCVE1fU0NPX0NPREVDX01TQkMpICYmCiAgICAgICAgICFwX3NjYi0+Y29kZWNfZmFsbGJhY2sgJiYKICAgICAgICAgIXBfc2NiLT5yZXRyeV93aXRoX3Njb19vbmx5KQpAQCAtNDY0LDEwICs0NjQsMTAgQEAKIAogICAgIGlmIChwX3NjYi0+Y29kZWNfZmFsbGJhY2spCiAgICAgewotICAgICAgICBwX3NjYi0+Y29kZWNfZmFsbGJhY2sgPSBGQUxTRTsKKyAgICAgICAgcF9zY2ItPmNvZGVjX2ZhbGxiYWNrID0gZmFsc2U7CiAKICAgICAgICAgLyogRm9yY2UgQUcgdG8gc2VuZCArQkNTIGZvciB0aGUgbmV4dCBhdWRpbyBjb25uZWN0aW9uLiAqLwotICAgICAgICBwX3NjYi0+Y29kZWNfdXBkYXRlZCA9IFRSVUU7CisgICAgICAgIHBfc2NiLT5jb2RlY191cGRhdGVkID0gdHJ1ZTsKICAgICB9CiAKICAgICAvKiBJZiBXQlMgaW5jbHVkZWQsIHVzZSBDVlNEIGJ5IGRlZmF1bHQsIGluZGV4IGlzIDAgZm9yIENWU0QgYnkgaW5pdGlhbGl6YXRpb24gKi8KQEAgLTUxOSwyMCArNTE5LDIwIEBACiAgICAgICAgICAgICBpZigocGFyYW1zLnBhY2tldF90eXBlcyAmIEJUTV9FU0NPX0xJTktfT05MWV9NQVNLKQogICAgICAgICAgICAgICAgfHwhKChwYXJhbXMucGFja2V0X3R5cGVzICYgfihCVE1fRVNDT19MSU5LX09OTFlfTUFTSyB8IEJUTV9TQ09fTElOS19PTkxZX01BU0spKSBeIEJUQV9BR19OT19FRFJfRVNDTykpCiAgICAgICAgICAgICB7Ci0jaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSkKICAgICAgICAgICAgICAgICBpZiAoZXNjb19jb2RlYyAhPSBCVEFfQUdfQ09ERUNfTVNCQykKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBfc2NiLT5yZXRyeV93aXRoX3Njb19vbmx5ID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgQVBQTF9UUkFDRV9BUEkoIlNldHRpbmcgcmV0cnlfd2l0aF9zY29fb25seSB0byBUUlVFIik7CisgICAgICAgICAgICAgICAgICAgIHBfc2NiLT5yZXRyeV93aXRoX3Njb19vbmx5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgQVBQTF9UUkFDRV9BUEkoIlNldHRpbmcgcmV0cnlfd2l0aF9zY29fb25seSB0byB0cnVlIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgICAgLyogRG8gbm90IHVzZSBTQ08gd2hlbiB1c2luZyBtU0JDICovCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwX3NjYi0+cmV0cnlfd2l0aF9zY29fb25seSA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICBBUFBMX1RSQUNFX0FQSSgiU2V0dGluZyByZXRyeV93aXRoX3Njb19vbmx5IHRvIEZBTFNFIik7CisgICAgICAgICAgICAgICAgICAgIHBfc2NiLT5yZXRyeV93aXRoX3Njb19vbmx5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfQVBJKCJTZXR0aW5nIHJldHJ5X3dpdGhfc2NvX29ubHkgdG8gZmFsc2UiKTsKICAgICAgICAgICAgICAgICB9CiAjZWxzZQotICAgICAgICAgICAgICAgIHBfc2NiLT5yZXRyeV93aXRoX3Njb19vbmx5ID0gVFJVRTsKLSAgICAgICAgICAgICAgICBBUFBMX1RSQUNFX0FQSSgiU2V0dGluZyByZXRyeV93aXRoX3Njb19vbmx5IHRvIFRSVUUiKTsKKyAgICAgICAgICAgICAgICBwX3NjYi0+cmV0cnlfd2l0aF9zY29fb25seSA9IHRydWU7CisgICAgICAgICAgICAgICAgQVBQTF9UUkFDRV9BUEkoIlNldHRpbmcgcmV0cnlfd2l0aF9zY29fb25seSB0byB0cnVlIik7CiAjZW5kaWYKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTQwLDcgKzU0MCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmKHBfc2NiLT5yZXRyeV93aXRoX3Njb19vbmx5KQogICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfQVBJKCJyZXRyeWluZyB3aXRoIFNDTyBvbmx5Iik7Ci0gICAgICAgICAgICBwX3NjYi0+cmV0cnlfd2l0aF9zY29fb25seSA9IEZBTFNFOworICAgICAgICAgICAgcF9zY2ItPnJldHJ5X3dpdGhfc2NvX29ubHkgPSBmYWxzZTsKIAogICAgICAgICAgICAgQlRNX1NldEVTY29Nb2RlKEJUTV9MSU5LX1RZUEVfU0NPLCAmcGFyYW1zKTsKICAgICAgICAgfQpAQCAtNTUwLDcgKzU1MCw3IEBACiAgICAgICAgIC8qIHRlbGwgc3lzIHRvIHN0b3AgYXYgaWYgYW55ICovCiAgICAgICAgIGJ0YV9zeXNfc2NvX3VzZShCVEFfSURfQUcsIHBfc2NiLT5hcHBfaWQsIHBfc2NiLT5wZWVyX2FkZHIpOwogCi0jaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSkKICAgICAgICAgLyogQWxsb3cgYW55IHBsYXRmb3JtIHNwZWNpZmljIHByZS1TQ08gc2V0IHVwIHRvIHRha2UgcGxhY2UgKi8KICAgICAgICAgYnRhX2FnX2NvX2F1ZGlvX3N0YXRlKGJ0YV9hZ19zY2JfdG9faWR4KHBfc2NiKSwgcF9zY2ItPmFwcF9pZCwgU0NPX1NUQVRFX1NFVFVQLAogICAgICAgICAgICAgICAgIGVzY29fY29kZWMpOwpAQCAtNTY4LDcgKzU2OCw3IEBACiAgICAgICAgIGJ0YV9hZ19jb19hdWRpb19zdGF0ZShidGFfYWdfc2NiX3RvX2lkeChwX3NjYiksIHBfc2NiLT5hcHBfaWQsIFNDT19TVEFURV9TRVRVUCk7CiAjZW5kaWYKIAotI2lmIChCVE1fU0NPX0hDSV9JTkNMVURFRCA9PSBUUlVFICkKKyNpZiAoQlRNX1NDT19IQ0lfSU5DTFVERUQgPT0gVFJVRSkKICNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFKQogICAgICAgICBpZiAoZXNjb19jb2RlYyA9PSBCVEFfQUdfQ09ERUNfTVNCQykKICAgICAgICAgICAgIHBjbV9zYW1wbGVfcmF0ZSA9IEJUQV9ETV9TQ09fU0FNUF9SQVRFXzE2SzsKQEAgLTU4MCwxNCArNTgwLDE0IEBACiAjZW5kaWYKIAogCi0jaWYgKEJUTV9TQ09fSENJX0lOQ0xVREVEID09IFRSVUUgKQorI2lmIChCVE1fU0NPX0hDSV9JTkNMVURFRCA9PSBUUlVFKQogICAgICAgICAvKiBpbml0aWFsaXplIFNDTyBzZXR1cCwgbm8gdm9pY2Ugc2V0dGluZyBmb3IgQUcsIGRhdGEgcmF0ZSA8PT0+IHNhbXBsZSByYXRlICovCi0gICAgICAgIEJUTV9Db25maWdTY29QYXRoKHNjb19yb3V0ZSwgYnRhX2FnX3Njb19yZWFkX2NiYWNrLCBOVUxMLCBUUlVFKTsKKyAgICAgICAgQlRNX0NvbmZpZ1Njb1BhdGgoc2NvX3JvdXRlLCBidGFfYWdfc2NvX3JlYWRfY2JhY2ssIE5VTEwsIHRydWUpOwogI2VuZGlmCiAgICAgICAgIGJ0YV9hZ19jYi5zY28uY3VyX2lkeCA9IHBfc2NiLT5zY29faWR4OwogICAgIH0KICAgICBlbHNlCi0gICAgICAgIHBfc2NiLT5yZXRyeV93aXRoX3Njb19vbmx5ID0gRkFMU0U7CisgICAgICAgIHBfc2NiLT5yZXRyeV93aXRoX3Njb19vbmx5ID0gZmFsc2U7CiAKICAgICBwX2JkX2FkZHIgPSBwX3NjYi0+cGVlcl9hZGRyOwogCkBAIC02MTAsNyArNjEwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBpc19vcmlnLCBwX3NjYi0+c2NvX2lkeCwgc3RhdHVzLCBwYXJhbXMucGFja2V0X3R5cGVzKTsKIH0KIAotI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUgKQorI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUpCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKICoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2F0dGVtcHRfbXNiY19zYWZlX3NldHRpbmdzCkBAIC02MTgsMTYgKzYxOCwxNiBAQAogKiogRGVzY3JpcHRpb24gICAgQ2hlY2tzIGlmIEVTQ08gY29ubmVjdGlvbiBuZWVkcyB0byBiZSBhdHRlbXB0ZWQgdXNpbmcgbVNCQyBUMShzYWZlKSBzZXR0aW5ncwogKioKICoqCi0qKiBSZXR1cm5zICAgICAgICAgIFRSVUUgaWYgVDEgc2V0dGluZ3MgaGFzIHRvIGJlIHVzZWQsIEZBTFNFIG90aGVyd2lzZQorKiogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIFQxIHNldHRpbmdzIGhhcyB0byBiZSB1c2VkLCBmYWxzZSBvdGhlcndpc2UKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfYWdfYXR0ZW1wdF9tc2JjX3NhZmVfc2V0dGluZ3ModEJUQV9BR19TQ0IgKnBfc2NiKQorYm9vbCBidGFfYWdfYXR0ZW1wdF9tc2JjX3NhZmVfc2V0dGluZ3ModEJUQV9BR19TQ0IgKnBfc2NiKQogewogICAgIGlmIChwX3NjYi0+c3ZjX2Nvbm4gJiYgcF9zY2ItPnNjb19jb2RlYyA9PSBCVE1fU0NPX0NPREVDX01TQkMgJiYKICAgICAgICAgcF9zY2ItPmNvZGVjX21zYmNfc2V0dGluZ3MgPT0gQlRBX0FHX1NDT19NU0JDX1NFVFRJTkdTX1QxKQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgZWxzZQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTY0NSw3ICs2NDUsNyBAQAogICAgIHRCVEFfQUdfU0NCICpwX3NjYiA9ICh0QlRBX0FHX1NDQiAqKWRhdGE7CiAKICAgICAvKiBBbm5vdW5jZSB0aGF0IGNvZGVjIG5lZ290aWF0aW9uIGZhaWxlZC4gKi8KLSAgICBidGFfYWdfc2NvX2NvZGVjX25lZ28ocF9zY2IsIEZBTFNFKTsKKyAgICBidGFfYWdfc2NvX2NvZGVjX25lZ28ocF9zY2IsIGZhbHNlKTsKIAogICAgIC8qIGNhbGwgYXBwIGNhbGxiYWNrICovCiAgICAgYnRhX2FnX2NiYWNrX3NjbyhwX3NjYiwgQlRBX0FHX0FVRElPX0NMT1NFX0VWVCk7CkBAIC02ODYsMTAgKzY4NiwxMCBAQAogICAgIHsKICAgICAgICAgLyogdXNlIHNhbWUgY29kZWMgdHlwZSBhcyBwcmV2aW91cyBTQ08gY29ubmVjdGlvbiwgc2tpcCBjb2RlYyBuZWdvdGlhdGlvbiAqLwogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJ1c2Ugc2FtZSBjb2RlYyB0eXBlIGFzIHByZXZpb3VzIFNDTyBjb25uZWN0aW9uLHNraXAgY29kZWMgbmVnb3RpYXRpb24iKTsKLSAgICAgICAgYnRhX2FnX3Njb19jb2RlY19uZWdvKHBfc2NiLCBUUlVFKTsKKyAgICAgICAgYnRhX2FnX3Njb19jb2RlY19uZWdvKHBfc2NiLCB0cnVlKTsKICAgICB9CiB9Ci0jZW5kaWYgLyogKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApICovCisjZW5kaWYgLyogKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSkgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC03MDEsMTcgKzcwMSwxNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hZ19zY29fZXZlbnQodEJUQV9BR19TQ0IgKnBfc2NiLCBVSU5UOCBldmVudCkKK3N0YXRpYyB2b2lkIGJ0YV9hZ19zY29fZXZlbnQodEJUQV9BR19TQ0IgKnBfc2NiLCB1aW50OF90IGV2ZW50KQogewogICAgIHRCVEFfQUdfU0NPX0NCICpwX3NjbyA9ICZidGFfYWdfY2Iuc2NvOwotI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUgKQorI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUpCiAgICAgdEJUQV9BR19TQ0IgKnBfY25fc2NiID0gTlVMTDsgICAvKiBGb3IgY29kZWMgbmVnb3RpYXRpb24gKi8KICNlbmRpZgotI2lmIChCVE1fU0NPX0hDSV9JTkNMVURFRCA9PSBUUlVFICkKKyNpZiAoQlRNX1NDT19IQ0lfSU5DTFVERUQgPT0gVFJVRSkKICAgICBCVF9IRFIgICpwX2J1ZjsKICNlbmRpZgotI2lmIEJUQV9BR19TQ09fREVCVUcgPT0gVFJVRQotICAgIFVJTlQ4ICAgaW5fc3RhdGUgPSBwX3Njby0+c3RhdGU7CisjaWYgKEJUQV9BR19TQ09fREVCVUcgPT0gVFJVRSkKKyAgICB1aW50OF90ICAgaW5fc3RhdGUgPSBwX3Njby0+c3RhdGU7CiAKICAgICBBUFBMX1RSQUNFX0VWRU5UKCJCVEEgYWcgc2NvIGV2dCAoaGRsIDB4JTA0eCk6IFN0YXRlICVkICglcyksIEV2ZW50ICVkICglcykiLAogICAgICAgICAgICAgICAgICAgICAgICAgcF9zY2ItPnNjb19pZHgsCkBAIC03MjIsMTAgKzcyMiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgIHBfc2NiLT5zY29faWR4LCBwX3Njby0+c3RhdGUsIGV2ZW50KTsKICNlbmRpZgogCi0jaWYgKEJUTV9TQ09fSENJX0lOQ0xVREVEID09IFRSVUUgKQorI2lmIChCVE1fU0NPX0hDSV9JTkNMVURFRCA9PSBUUlVFKQogICAgIGlmIChldmVudCA9PSBCVEFfQUdfU0NPX0NJX0RBVEFfRSkKICAgICB7Ci0gICAgICAgIHdoaWxlIChUUlVFKQorICAgICAgICB3aGlsZSAodHJ1ZSkKICAgICAgICAgewogICAgICAgICAgICAgYnRhX2RtX3Njb19jb19vdXRfZGF0YSgmcF9idWYpOwogICAgICAgICAgICAgaWYgKHBfYnVmKQpAQCAtNzUwLDcgKzc1MCw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0xJU1RFTl9FOgogICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgc2NvIGxpc3RlbiBjb25uZWN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fTElTVEVOX1NUOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtNzY1LDI3ICs3NjUsMjcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBjYXNlIEJUQV9BR19TQ09fTElTVEVOX0U6CiAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBzY28gbGlzdGVuIGNvbm5lY3Rpb24gKEFkZGl0aW9uYWwgY2hhbm5lbCkgKi8KLSAgICAgICAgICAgICAgICAgICAgYnRhX2FnX2NyZWF0ZV9zY28ocF9zY2IsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgYnRhX2FnX2NyZWF0ZV9zY28ocF9zY2IsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICBjYXNlIEJUQV9BR19TQ09fT1BFTl9FOgogICAgICAgICAgICAgICAgICAgICAvKiByZW1vdmUgbGlzdGVuaW5nIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3JlbW92ZV9zY28ocF9zY2IsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3JlbW92ZV9zY28ocF9zY2IsIGZhbHNlKTsKIAotI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUgKQorI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUpCiAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGNvZGVjIG5lZ290aWF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fQ09ERUNfU1Q7CiAgICAgICAgICAgICAgICAgICAgIHBfY25fc2NiID0gcF9zY2I7CiAjZWxzZQogICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgc2NvIGNvbm5lY3Rpb24gdG8gcGVlciAqLwotICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19PUEVOSU5HX1NUOwogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX1NIVVRET1dOX0U6CiAgICAgICAgICAgICAgICAgICAgIC8qIHJlbW92ZSBsaXN0ZW5pbmcgY29ubmVjdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBidGFfYWdfcmVtb3ZlX3NjbyhwX3NjYiwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBidGFfYWdfcmVtb3ZlX3NjbyhwX3NjYiwgZmFsc2UpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChwX3NjYiA9PSBwX3Njby0+cF9jdXJyX3NjYikKICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5wX2N1cnJfc2NiID0gTlVMTDsKQEAgLTgwNSw3ICs4MDUsNyBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NPTk5fQ0xPU0VfRToKICAgICAgICAgICAgICAgICAgICAgLyogc2NvIGZhaWxlZDsgY3JlYXRlIHNjbyBsaXN0ZW4gY29ubmVjdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX0xJU1RFTl9TVDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTgxNSwxOCArODE1LDE4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKIAotI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUgKQorI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUpCiAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19DT0RFQ19TVDoKICAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0xJU1RFTl9FOgogICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgc2NvIGxpc3RlbiBjb25uZWN0aW9uIChBZGRpdGlvbmFsIGNoYW5uZWwpICovCi0gICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NOX0RPTkVfRToKICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHNjbyBjb25uZWN0aW9uIHRvIHBlZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgYnRhX2FnX2NyZWF0ZV9zY28ocF9zY2IsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fT1BFTklOR19TVDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTgzOCw3ICs4MzgsNyBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX1NIVVRET1dOX0U6CiAgICAgICAgICAgICAgICAgICAgIC8qIHJlbW92ZSBsaXN0ZW5pbmcgY29ubmVjdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBidGFfYWdfcmVtb3ZlX3NjbyhwX3NjYiwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBidGFfYWdfcmVtb3ZlX3NjbyhwX3NjYiwgZmFsc2UpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChwX3NjYiA9PSBwX3Njby0+cF9jdXJyX3NjYikKICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5wX2N1cnJfc2NiID0gTlVMTDsKQEAgLTg1Nyw3ICs4NTcsNyBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NPTk5fQ0xPU0VfRToKICAgICAgICAgICAgICAgICAgICAgLyogc2NvIGZhaWxlZDsgY3JlYXRlIHNjbyBsaXN0ZW4gY29ubmVjdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX0xJU1RFTl9TVDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTg3Niw3ICs4NzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgc2NvIGxpc3RlbiBjb25uZWN0aW9uIChBZGRpdGlvbmFsIGNoYW5uZWwpICovCiAgICAgICAgICAgICAgICAgICAgIGlmIChwX3NjYiAhPSBwX3Njby0+cF9jdXJyX3NjYikKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2FnX2NyZWF0ZV9zY28ocF9zY2IsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTkwMyw3ICs5MDMsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAocF9zY2IgIT0gcF9zY28tPnBfY3Vycl9zY2IpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbW92ZSBsaXN0ZW5pbmcgY29ubmVjdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3JlbW92ZV9zY28ocF9zY2IsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19yZW1vdmVfc2NvKHBfc2NiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19TSFVUVElOR19TVDsKQEAgLTkxNiw3ICs5MTYsNyBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NPTk5fQ0xPU0VfRToKICAgICAgICAgICAgICAgICAgICAgLyogc2NvIGZhaWxlZDsgY3JlYXRlIHNjbyBsaXN0ZW4gY29ubmVjdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX0xJU1RFTl9TVDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTk0NSw3ICs5NDUsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAocF9zY2IgIT0gcF9zY28tPnBfY3Vycl9zY2IpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbW92ZSBsaXN0ZW5pbmcgY29ubmVjdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3JlbW92ZV9zY28ocF9zY2IsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19yZW1vdmVfc2NvKHBfc2NiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19TSFVUVElOR19TVDsKQEAgLTk1NCw3ICs5NTQsNyBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NPTk5fT1BFTl9FOgogICAgICAgICAgICAgICAgICAgICAvKiBjbG9zZSBzY28gY29ubmVjdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBidGFfYWdfcmVtb3ZlX3NjbyhwX3NjYiwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19yZW1vdmVfc2NvKHBfc2NiLCB0cnVlKTsKIAogICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX0NMT1NJTkdfU1Q7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtOTc2LDE0ICs5NzYsMTQgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBjYXNlIEJUQV9BR19TQ09fQ0xPU0VfRToKICAgICAgICAgICAgICAgICAgICAgLyogY2xvc2Ugc2NvIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3JlbW92ZV9zY28ocF9zY2IsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICBidGFfYWdfcmVtb3ZlX3NjbyhwX3NjYiwgdHJ1ZSk7CiAKICAgICAgICAgICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19DTE9TSU5HX1NUOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19TSFVURE9XTl9FOgogICAgICAgICAgICAgICAgICAgICAvKiByZW1vdmUgYWxsIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3JlbW92ZV9zY28ocF9zY2IsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3JlbW92ZV9zY28ocF9zY2IsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19TSFVUVElOR19TVDsKIAogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTk5MSw3ICs5OTEsNyBAQAogICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19DT05OX0NMT1NFX0U6CiAgICAgICAgICAgICAgICAgICAgIC8qIGNsb3NlZCBzY287IHBsYWNlIGluIGxpc3RlbiBtb2RlIGFuZAogICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHQgdGhlIHRyYW5zZmVycmVkIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgYnRhX2FnX2NyZWF0ZV9zY28ocF9zY2IsIEZBTFNFKTsgICAgLyogQmFjayBpbnRvIGxpc3RlbiBtb2RlICovCisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBmYWxzZSk7ICAgIC8qIEJhY2sgaW50byBsaXN0ZW4gbW9kZSAqLwogCiAgICAgICAgICAgICAgICAgICAgIC8qIEFjY2VwdCBzY28gY29ubmVjdGlvbiB3aXRoIHhmZXIgc2NiICovCiAgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zY29fY29ubl9yc3AocF9zY28tPnBfeGZlcl9zY2IsICZwX3Njby0+Y29ubl9kYXRhKTsKQEAgLTEwMTUsMTMgKzEwMTUsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHNjbyBsaXN0ZW4gY29ubmVjdGlvbiAoQWRkaXRpb25hbCBjaGFubmVsKSAqLwogICAgICAgICAgICAgICAgICAgICBpZiAocF9zY2IgIT0gcF9zY28tPnBfY3Vycl9zY2IpCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX1hGRVJfRToKICAgICAgICAgICAgICAgICAgICAgLyogY2xvc2UgY3VycmVudCBzY28gY29ubmVjdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBidGFfYWdfcmVtb3ZlX3NjbyhwX3Njby0+cF9jdXJyX3NjYiwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19yZW1vdmVfc2NvKHBfc2NvLT5wX2N1cnJfc2NiLCB0cnVlKTsKIAogICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIHhmZXIgc2NiICovCiAgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5wX3hmZXJfc2NiID0gcF9zY2I7CkBAIC0xMDMxLDcgKzEwMzEsNyBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NMT1NFX0U6CiAgICAgICAgICAgICAgICAgICAgIC8qIGNsb3NlIHNjbyBjb25uZWN0aW9uIGlmIGFjdGl2ZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoYnRhX2FnX3JlbW92ZV9zY28ocF9zY2IsIFRSVUUpKQorICAgICAgICAgICAgICAgICAgICBpZiAoYnRhX2FnX3JlbW92ZV9zY28ocF9zY2IsIHRydWUpKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX0NMT1NJTkdfU1Q7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTEwMzksNyArMTAzOSw3IEBACiAKICAgICAgICAgICAgICAgICBjYXNlIEJUQV9BR19TQ09fU0hVVERPV05fRToKICAgICAgICAgICAgICAgICAgICAgLyogcmVtb3ZlIGFsbCBsaXN0ZW5pbmcgY29ubmVjdGlvbnMgKi8KLSAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3JlbW92ZV9zY28ocF9zY2IsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3JlbW92ZV9zY28ocF9zY2IsIGZhbHNlKTsKIAogICAgICAgICAgICAgICAgICAgICAvKiBJZiBTQ08gd2FzIGFjdGl2ZSBvbiB0aGlzIHNjYiwgY2xvc2UgaXQgKi8KICAgICAgICAgICAgICAgICAgICAgaWYgKHBfc2NiID09IHBfc2NvLT5wX2N1cnJfc2NiKQpAQCAtMTA1MCw3ICsxMDUwLDcgQEAKIAogICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19DT05OX0NMT1NFX0U6CiAgICAgICAgICAgICAgICAgICAgIC8qIHBlZXIgY2xvc2VkIHNjbzsgY3JlYXRlIHNjbyBsaXN0ZW4gY29ubmVjdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX0xJU1RFTl9TVDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTEwNjcsNyArMTA2Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBzY28gbGlzdGVuIGNvbm5lY3Rpb24gKEFkZGl0aW9uYWwgY2hhbm5lbCkgKi8KICAgICAgICAgICAgICAgICAgICAgaWYgKHBfc2NiICE9IHBfc2NvLT5wX2N1cnJfc2NiKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2FnX2NyZWF0ZV9zY28ocF9zY2IsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtMTA4Nyw3ICsxMDg3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHBfc2NiICE9IHBfc2NvLT5wX2N1cnJfc2NiKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW1vdmUgbGlzdGVuaW5nIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19yZW1vdmVfc2NvKHBfc2NiLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBidGFfYWdfcmVtb3ZlX3NjbyhwX3NjYiwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fU0hVVFRJTkdfU1Q7CkBAIC0xMDk2LDcgKzEwOTYsNyBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NPTk5fQ0xPU0VfRToKICAgICAgICAgICAgICAgICAgICAgLyogcGVlciBjbG9zZWQgc2NvOyBjcmVhdGUgc2NvIGxpc3RlbiBjb25uZWN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBmYWxzZSk7CiAKICAgICAgICAgICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19MSVNURU5fU1Q7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTExOSwxMyArMTExOSwxMyBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19DT05OX0NMT1NFX0U6Ci0jaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSkKICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgY29kZWMgbmVnb3RpYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19DT0RFQ19TVDsKICAgICAgICAgICAgICAgICAgICAgcF9jbl9zY2IgPSBwX3NjYjsKICNlbHNlCiAgICAgICAgICAgICAgICAgICAgIC8qIG9wZW4gc2NvIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgYnRhX2FnX2NyZWF0ZV9zY28ocF9zY2IsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fT1BFTklOR19TVDsKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTExMzQsNyArMTEzNCw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBzY28gbGlzdGVuIGNvbm5lY3Rpb24gKEFkZGl0aW9uYWwgY2hhbm5lbCkgKi8KICAgICAgICAgICAgICAgICAgICAgaWYgKHBfc2NiICE9IHBfc2NvLT5wX2N1cnJfc2NiKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2FnX2NyZWF0ZV9zY28ocF9zY2IsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtMTE1MCw3ICsxMTUwLDcgQEAKICAgICAgICAgICAgICAgICBjYXNlIEJUQV9BR19TQ09fQ09OTl9PUEVOX0U6CiAgICAgICAgICAgICAgICAgICAgIC8qIGNsb3NlIHNjbyBjb25uZWN0aW9uIHNvIGhlYWRzZXQgY2FuIGJlIHRyYW5zZmVycmVkCiAgICAgICAgICAgICAgICAgICAgICAgIFByb2JhYmx5IGVudGVyZWQgdGhpcyBzdGF0ZSBmcm9tICJvcGVuaW5nIHN0YXRlIiAqLwotICAgICAgICAgICAgICAgICAgICBidGFfYWdfcmVtb3ZlX3NjbyhwX3NjYiwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19yZW1vdmVfc2NvKHBfc2NiLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICBjYXNlIEJUQV9BR19TQ09fQ0xPU0VfRToKQEAgLTExNzEsMTcgKzExNzEsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgLyogY2xvc2VkIHNjbzsgcGxhY2Ugb2xkIHNjbyBpbiBsaXN0ZW4gbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGFrZSBjdXJyZW50IHNjbyBvdXQgb2YgbGlzdGVuLCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlIG9yaWdpbmF0aW5nIHNjbyBmb3IgY3VycmVudCAqLwotICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgRkFMU0UpOwotICAgICAgICAgICAgICAgICAgICBidGFfYWdfcmVtb3ZlX3NjbyhwX3Njby0+cF94ZmVyX3NjYiwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBidGFfYWdfcmVtb3ZlX3NjbyhwX3Njby0+cF94ZmVyX3NjYiwgZmFsc2UpOwogCi0jaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSkKICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgY29kZWMgbmVnb3RpYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19DT0RFQ19TVDsKICAgICAgICAgICAgICAgICAgICAgcF9jbl9zY2IgPSBwX3Njby0+cF94ZmVyX3NjYjsKICAgICAgICAgICAgICAgICAgICAgcF9zY28tPnBfeGZlcl9zY2IgPSBOVUxMOwogI2Vsc2UKICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHNjbyBjb25uZWN0aW9uIHRvIHBlZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgYnRhX2FnX2NyZWF0ZV9zY28ocF9zY28tPnBfeGZlcl9zY2IsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3Njby0+cF94ZmVyX3NjYiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5wX3hmZXJfc2NiID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19PUEVOSU5HX1NUOwogI2VuZGlmCkBAIC0xMTk4LDcgKzExOTgsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19DT05OX09QRU5fRToKICAgICAgICAgICAgICAgICAgICAgLyogY2xvc2Ugc2NvIGNvbm5lY3Rpb247IHdhaXQgZm9yIGNvbm4gY2xvc2UgZXZlbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3JlbW92ZV9zY28ocF9zY2IsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICBidGFfYWdfcmVtb3ZlX3NjbyhwX3NjYiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NPTk5fQ0xPU0VfRToKQEAgLTEyMTYsNyArMTIxNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gY3JlYXRlIGxpc3RlbiBzY28gY29ubmVjdGlvbiBmb3IgaXQgYXMgc2NiIHN0aWxsIG9wZW4gKi8KICAgICAgICAgICAgICAgICAgICAgaWYgKGJ0YV9hZ19zY2Jfb3BlbihwX3NjYikpCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19MSVNURU5fU1Q7CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMTIzMSw3ICsxMjMxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHNjbyBsaXN0ZW4gY29ubmVjdGlvbiAoQWRkaXRpb25hbCBjaGFubmVsKSAqLwogICAgICAgICAgICAgICAgICAgICBpZiAocF9zY2IgIT0gcF9zY28tPnBfY3Vycl9zY2IpCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC0xMjYxLDcgKzEyNjEsNyBAQAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotI2lmIEJUQV9BR19TQ09fREVCVUcgPT0gVFJVRQorI2lmIChCVEFfQUdfU0NPX0RFQlVHID09IFRSVUUpCiAgICAgaWYgKHBfc2NvLT5zdGF0ZSAhPSBpbl9zdGF0ZSkKICAgICB7CiAgICAgICAgIEFQUExfVFJBQ0VfRVZFTlQoIkJUQSBBRyBTQ08gU3RhdGUgQ2hhbmdlOiBbJXNdIC0+IFslc10gYWZ0ZXIgRXZlbnQgWyVzXSIsCkBAIC0xMjcxLDcgKzEyNzEsNyBAQAogICAgIH0KICNlbmRpZgogCi0jaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSkKICAgICBpZiAocF9jbl9zY2IpCiAgICAgewogICAgICAgICBidGFfYWdfY29kZWNfbmVnb3RpYXRlKHBfY25fc2NiKTsKQEAgLTEyODYsMTAgKzEyODYsMTAgQEAKICoqIERlc2NyaXB0aW9uICAgICAgQ2hlY2sgaWYgc2NvIGlzIG9wZW4gZm9yIHRoaXMgc2NiLgogKioKICoqCi0qKiBSZXR1cm5zICAgICAgICAgIFRSVUUgaWYgc2NvIG9wZW4gZm9yIHRoaXMgc2NiLCBGQUxTRSBvdGhlcndpc2UuCisqKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgc2NvIG9wZW4gZm9yIHRoaXMgc2NiLCBmYWxzZSBvdGhlcndpc2UuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX2FnX3Njb19pc19vcGVuKHRCVEFfQUdfU0NCICpwX3NjYikKK2Jvb2wgYnRhX2FnX3Njb19pc19vcGVuKHRCVEFfQUdfU0NCICpwX3NjYikKIHsKICAgICByZXR1cm4gKChidGFfYWdfY2Iuc2NvLnN0YXRlID09IEJUQV9BR19TQ09fT1BFTl9TVCkgJiYKICAgICAgICAgICAgIChidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2IgPT0gcF9zY2IpKTsKQEAgLTEzMDIsMTIgKzEzMDIsMTIgQEAKICoqIERlc2NyaXB0aW9uICAgICAgQ2hlY2sgaWYgc2NvIGlzIGluIE9wZW5pbmcgc3RhdGUuCiAqKgogKioKLSoqIFJldHVybnMgICAgICAgICAgVFJVRSBpZiBzY28gaXMgaW4gT3BlbmluZyBzdGF0ZSBmb3IgdGhpcyBzY2IsIEZBTFNFIG90aGVyd2lzZS4KKyoqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzY28gaXMgaW4gT3BlbmluZyBzdGF0ZSBmb3IgdGhpcyBzY2IsIGZhbHNlIG90aGVyd2lzZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfYWdfc2NvX2lzX29wZW5pbmcodEJUQV9BR19TQ0IgKnBfc2NiKQorYm9vbCBidGFfYWdfc2NvX2lzX29wZW5pbmcodEJUQV9BR19TQ0IgKnBfc2NiKQogewotI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUgKQorI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUpCiAgICAgcmV0dXJuICgoKGJ0YV9hZ19jYi5zY28uc3RhdGUgPT0gQlRBX0FHX1NDT19PUEVOSU5HX1NUKSB8fAogICAgICAgICAgICAgKGJ0YV9hZ19jYi5zY28uc3RhdGUgPT0gQlRBX0FHX1NDT19PUEVOSU5HX1NUKSkgJiYKICAgICAgICAgICAgIChidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2IgPT0gcF9zY2IpKTsKQEAgLTEzNDUsNyArMTM0NSw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfYWdfc2NvX29wZW4odEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSkKIHsKLSAgICBVSU5UOCBldmVudDsKKyAgICB1aW50OF90IGV2ZW50OwogICAgIFVOVVNFRChwX2RhdGEpOwogCiAgICAgLyogaWYgYW5vdGhlciBzY2IgdXNpbmcgc2NvLCB0aGlzIGlzIGEgdHJhbnNmZXIgKi8KQEAgLTEzNzcsNyArMTM3Nyw3IEBACiAgICAgVU5VU0VEKHBfZGF0YSk7CiAKICAgICAvKiBpZiBzY2IgaXMgaW4gdXNlICovCi0jaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSkKICAgICAvKiBzY29faWR4IGlzIG5vdCBhbGxvY2F0ZWQgaW4gU0NPX0NPREVDX1NULCB3ZSBzdGlsbCBuZWVkIHRvIG1vdmUgdG8gbGlzdGVuaW5nIHN0YXRlLiAqLwogICAgIGlmICgocF9zY2ItPnNjb19pZHggIT0gQlRNX0lOVkFMSURfU0NPX0lOREVYKSB8fCAoYnRhX2FnX2NiLnNjby5zdGF0ZSA9PSBCVEFfQUdfU0NPX0NPREVDX1NUKSkKICNlbHNlCkBAIC0xMzg5LDcgKzEzODksNyBAQAogICAgIH0KIH0KIAotI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUgKQorI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMTQwMSwxMiArMTQwMSwxMiBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX3Njb19jb2RlY19uZWdvKHRCVEFfQUdfU0NCICpwX3NjYiwgQk9PTEVBTiByZXN1bHQpCit2b2lkIGJ0YV9hZ19zY29fY29kZWNfbmVnbyh0QlRBX0FHX1NDQiAqcF9zY2IsIGJvb2wgcmVzdWx0KQogewotICAgIGlmKHJlc3VsdCA9PSBUUlVFKQorICAgIGlmKHJlc3VsdCA9PSB0cnVlKQogICAgIHsKICAgICAgICAgLyogU3Vic2VxdWVudCBzY28gY29ubmVjdGlvbiB3aWxsIHNraXAgY29kZWMgbmVnb3RpYXRpb24gKi8KLSAgICAgICAgcF9zY2ItPmNvZGVjX3VwZGF0ZWQgPSBGQUxTRTsKKyAgICAgICAgcF9zY2ItPmNvZGVjX3VwZGF0ZWQgPSBmYWxzZTsKIAogICAgICAgICBidGFfYWdfc2NvX2V2ZW50KHBfc2NiLCBCVEFfQUdfU0NPX0NOX0RPTkVfRSk7CiAgICAgfQpAQCAtMTQ1Nyw3ICsxNDU3LDcgQEAKICAgICBidGFfYWdfY29fYXVkaW9fc3RhdGUoYnRhX2FnX3NjYl90b19pZHgocF9zY2IpLCBwX3NjYi0+YXBwX2lkLCBTQ09fU1RBVEVfT04pOwogI2VuZGlmCiAKLSNpZiAoQlRNX1NDT19IQ0lfSU5DTFVERUQgPT0gVFJVRSApCisjaWYgKEJUTV9TQ09fSENJX0lOQ0xVREVEID09IFRSVUUpCiAgICAgLyogb3BlbiBTQ08gY29kZWMgaWYgU0NPIGlzIHJvdXRlZCB0aHJvdWdoIHRyYW5zcG9ydCAqLwogICAgIGJ0YV9kbV9zY29fY29fb3BlbihidGFfYWdfc2NiX3RvX2lkeChwX3NjYiksIEJUQV9TQ09fT1VUX1BLVF9TSVpFLCBCVEFfQUdfQ0lfU0NPX0RBVEFfRVZUKTsKICNlbmRpZgpAQCAtMTQ2NSw3ICsxNDY1LDcgQEAKICAgICAvKiBjYWxsIGFwcCBjYWxsYmFjayAqLwogICAgIGJ0YV9hZ19jYmFja19zY28ocF9zY2IsIEJUQV9BR19BVURJT19PUEVOX0VWVCk7CiAKLSAgICBwX3NjYi0+cmV0cnlfd2l0aF9zY29fb25seSA9IEZBTFNFOworICAgIHBfc2NiLT5yZXRyeV93aXRoX3Njb19vbmx5ID0gZmFsc2U7CiAjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSkKICAgICAvKiByZXNldCB0byBtU0JDIFQyIHNldHRpbmdzIGFzIHRoZSBwcmVmZXJyZWQgKi8KICAgICBwX3NjYi0+Y29kZWNfbXNiY19zZXR0aW5ncyA9IEJUQV9BR19TQ09fTVNCQ19TRVRUSU5HU19UMjsKQEAgLTE0ODQsNyArMTQ4NCw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfYWdfc2NvX2Nvbm5fY2xvc2UodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSkKIHsKLSAgICBVSU5UMTYgaGFuZGxlID0gYnRhX2FnX3NjYl90b19pZHgocF9zY2IpOworICAgIHVpbnQxNl90IGhhbmRsZSA9IGJ0YV9hZ19zY2JfdG9faWR4KHBfc2NiKTsKICAgICBVTlVTRUQocF9kYXRhKTsKIAogICAgIC8qIGNsZWFyIGN1cnJlbnQgc2NiICovCkBAIC0xNTAyLDE0ICsxNTAyLDE0IEBACiAgICAgZWxzZSBpZiAocF9zY2ItPnJldHJ5X3dpdGhfc2NvX29ubHkgJiYgcF9zY2ItPnN2Y19jb25uKQogICAgIHsKICAgICAgICAgLyogcmV0cnlfd2l0aF9zY29fb25seSBpcyBzZXQgd2hlbiBBRyBpcyBpbml0aWF0b3IgYW5kIGNvbm5lY3Rpb24gZmFpbGVkIGZvciBlU0NPICovCi0gICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBUUlVFKTsKKyAgICAgICAgYnRhX2FnX2NyZWF0ZV9zY28ocF9zY2IsIHRydWUpOwogICAgIH0KICNlbHNlCiAgICAgLyogcmV0cnlfd2l0aF9zY29fb25seSwgd2lsbCBiZSBzZXQgb25seSB3aGVuIEFHIGlzIGluaXRpYXRvcgogICAgICoqIGFuZCBBRyBpcyBmaXJzdCB0cnlpbmcgdG8gZXN0YWJsaXNoIGFuIGVTQ08gY29ubmVjdGlvbiAqLwogICAgIGlmIChwX3NjYi0+cmV0cnlfd2l0aF9zY29fb25seSAmJiBwX3NjYi0+c3ZjX2Nvbm4pCiAgICAgewotICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgVFJVRSk7CisgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCB0cnVlKTsKICAgICB9CiAjZW5kaWYKICAgICBlbHNlCkBAIC0xNTQwLDcgKzE1NDAsNyBAQAogICAgICAgICBwX3NjYi0+Y29kZWNfbXNiY19zZXR0aW5ncyA9IEJUQV9BR19TQ09fTVNCQ19TRVRUSU5HU19UMjsKICNlbmRpZgogICAgIH0KLSAgICBwX3NjYi0+cmV0cnlfd2l0aF9zY29fb25seSA9IEZBTFNFOworICAgIHBfc2NiLT5yZXRyeV93aXRoX3Njb19vbmx5ID0gZmFsc2U7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNTU2LDEwICsxNTU2LDEwIEBACiB2b2lkIGJ0YV9hZ19zY29fY29ubl9yc3AodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRNX0VTQ09fQ09OTl9SRVFfRVZUX0RBVEEgKnBfZGF0YSkKIHsKICAgICB0QlRNX0VTQ09fUEFSQU1TICAgIHJlc3A7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBoY2lfc3RhdHVzID0gSENJX1NVQ0NFU1M7Ci0jaWYgKEJUTV9TQ09fSENJX0lOQ0xVREVEID09IFRSVUUgKQorICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBoY2lfc3RhdHVzID0gSENJX1NVQ0NFU1M7CisjaWYgKEJUTV9TQ09fSENJX0lOQ0xVREVEID09IFRSVUUpCiAgICAgdEJUQV9DT0RFQ19JTkZPICAgICBjb2RlY19pbmZvID0ge0JUQV9TQ09fQ09ERUNfUENNfTsKLSAgICBVSU5UMzIgICAgICAgICAgICAgIHBjbV9zYW1wbGVfcmF0ZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgcGNtX3NhbXBsZV9yYXRlOwogI2VuZGlmCiAKICAgICBpZiAoYnRhX2FnX2NiLnNjby5zdGF0ZSA9PSBCVEFfQUdfU0NPX0xJU1RFTl9TVCAgICAgfHwKQEAgLTE1OTgsNyArMTU5OCw3IEBACiAgICAgICAgIC8qIHRlbGwgc3lzIHRvIHN0b3AgYXYgaWYgYW55ICovCiAgICAgICAgIGJ0YV9zeXNfc2NvX3VzZShCVEFfSURfQUcsIHBfc2NiLT5hcHBfaWQsIHBfc2NiLT5wZWVyX2FkZHIpOwogCi0jaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gRkFMU0UgKQorI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IEZBTFNFKQogICAgICAgICAvKiBBbGxvdyBhbnkgcGxhdGZvcm0gc3BlY2lmaWMgcHJlLVNDTyBzZXQgdXAgdG8gdGFrZSBwbGFjZSAqLwogICAgICAgICBidGFfYWdfY29fYXVkaW9fc3RhdGUoYnRhX2FnX3NjYl90b19pZHgocF9zY2IpLCBwX3NjYi0+YXBwX2lkLCBTQ09fU1RBVEVfU0VUVVApOwogI2Vsc2UKQEAgLTE2MDgsMTggKzE2MDgsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9BR19DT0RFQ19DVlNEKTsKICNlbmRpZgogCi0jaWYgKEJUTV9TQ09fSENJX0lOQ0xVREVEID09IFRSVUUgKQorI2lmIChCVE1fU0NPX0hDSV9JTkNMVURFRCA9PSBUUlVFKQogICAgICAgICBwY21fc2FtcGxlX3JhdGUgPSBCVEFfRE1fU0NPX1NBTVBfUkFURV84SzsKIAogICAgICAgICAvKiBpbml0aWFsaXplIFNDTyBzZXR1cCwgbm8gdm9pY2Ugc2V0dGluZyBmb3IgQUcsIGRhdGEgcmF0ZSA8PT0+IHNhbXBsZSByYXRlICovCiAgICAgICAgIEJUTV9Db25maWdTY29QYXRoKGJ0YV9kbV9zY29fY29faW5pdChwY21fc2FtcGxlX3JhdGUsIHBjbV9zYW1wbGVfcmF0ZSwgJmNvZGVjX2luZm8sIHBfc2NiLT5hcHBfaWQpLAotICAgICAgICAgICAgYnRhX2FnX3Njb19yZWFkX2NiYWNrLCBOVUxMLCBUUlVFKTsKKyAgICAgICAgICAgIGJ0YV9hZ19zY29fcmVhZF9jYmFjaywgTlVMTCwgdHJ1ZSk7CiAjZW5kaWYKICAgICB9CiAgICAgZWxzZQogICAgICAgICBoY2lfc3RhdHVzID0gSENJX0VSUl9IT1NUX1JFSkVDVF9ERVZJQ0U7CiAKLSNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFICkKKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFKQogICAgIC8qIElmIFNDTyBvcGVuIHdhcyBpbml0aWF0ZWQgZnJvbSBIUywgaXQgbXVzdCBiZSBDVlNEICovCiAgICAgcF9zY2ItPmludXNlX2NvZGVjID0gQlRBX0FHX0NPREVDX05PTkU7CiAjZW5kaWYKQEAgLTE2NDIsNyArMTY0Miw3IEBACiAgICAgVU5VU0VEKHBfc2NiKTsKICAgICBVTlVTRUQocF9kYXRhKTsKIAotI2lmIChCVE1fU0NPX0hDSV9JTkNMVURFRCA9PSBUUlVFICkKKyNpZiAoQlRNX1NDT19IQ0lfSU5DTFVERUQgPT0gVFJVRSkKICAgICBidGFfYWdfc2NvX2V2ZW50KHBfc2NiLCBCVEFfQUdfU0NPX0NJX0RBVEFfRSk7CiAjZW5kaWYKIH0KQEAgLTE2NTcsMTYgKzE2NTcsMTYgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZ19zZXRfZXNjb19wYXJhbShCT09MRUFOIHNldF9yZXNldCwgdEJUTV9FU0NPX1BBUkFNUyAqcGFyYW0pCit2b2lkIGJ0YV9hZ19zZXRfZXNjb19wYXJhbShib29sIHNldF9yZXNldCwgdEJUTV9FU0NPX1BBUkFNUyAqcGFyYW0pCiB7Ci0gICAgaWYoc2V0X3Jlc2V0ID09IEZBTFNFKSAgICAvKiByZXNldCB0aGUgcGFyYW1ldGVycyB0byBkZWZhdWx0ICovCisgICAgaWYoc2V0X3Jlc2V0ID09IGZhbHNlKSAgICAvKiByZXNldCB0aGUgcGFyYW1ldGVycyB0byBkZWZhdWx0ICovCiAgICAgewotICAgICAgICBidGFfYWdfY2Iuc2NvLnBhcmFtX3VwZGF0ZWQgPSBGQUxTRTsKKyAgICAgICAgYnRhX2FnX2NiLnNjby5wYXJhbV91cGRhdGVkID0gZmFsc2U7CiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9hZ19zZXRfZXNjb19wYXJhbSA6IFJlc2V0dGluZyBFU0NPIHBhcmFtZXRlcnMgdG8gZGVmYXVsdCIpOwogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgICBidGFfYWdfY2Iuc2NvLnBhcmFtX3VwZGF0ZWQgPSBUUlVFOworICAgICAgICBidGFfYWdfY2Iuc2NvLnBhcmFtX3VwZGF0ZWQgPSB0cnVlOwogICAgICAgICBidGFfYWdfY2Iuc2NvLnBhcmFtcyA9ICpwYXJhbTsKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2FnX3NldF9lc2NvX3BhcmFtIDogU2V0dGluZyBFU0NPIHBhcmFtZXRlcnMiKTsKICAgICB9CkBAIC0xNjc2LDggKzE2NzYsOCBAQAogKiogIERlYnVnZ2luZyBmdW5jdGlvbnMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZiBCVEFfQUdfU0NPX0RFQlVHID09IFRSVUUKLXN0YXRpYyBjaGFyICpidGFfYWdfc2NvX2V2dF9zdHIoVUlOVDggZXZlbnQpCisjaWYgKEJUQV9BR19TQ09fREVCVUcgPT0gVFJVRSkKK3N0YXRpYyBjaGFyICpidGFfYWdfc2NvX2V2dF9zdHIodWludDhfdCBldmVudCkKIHsKICAgICBzd2l0Y2ggKGV2ZW50KQogICAgIHsKQEAgLTE2ODcsNyArMTY4Nyw3IEBACiAgICAgICAgIHJldHVybiAiT3BlbiBSZXF1ZXN0IjsKICAgICBjYXNlIEJUQV9BR19TQ09fWEZFUl9FOgogICAgICAgICByZXR1cm4gIlRyYW5zZmVyIFJlcXVlc3QiOwotI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUgKQorI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUpCiAgICAgY2FzZSBCVEFfQUdfU0NPX0NOX0RPTkVfRToKICAgICAgICAgcmV0dXJuICJDb2RlYyBOZWdvdGlhdGlvbiBEb25lIjsKICAgICBjYXNlIEJUQV9BR19TQ09fUkVPUEVOX0U6CkBAIC0xNzA4LDcgKzE3MDgsNyBAQAogICAgIH0KIH0KIAotc3RhdGljIGNoYXIgKmJ0YV9hZ19zY29fc3RhdGVfc3RyKFVJTlQ4IHN0YXRlKQorc3RhdGljIGNoYXIgKmJ0YV9hZ19zY29fc3RhdGVfc3RyKHVpbnQ4X3Qgc3RhdGUpCiB7CiAgICAgc3dpdGNoIChzdGF0ZSkKICAgICB7CkBAIC0xNzE2LDcgKzE3MTYsNyBAQAogICAgICAgICByZXR1cm4gIlNodXRkb3duIjsKICAgICBjYXNlIEJUQV9BR19TQ09fTElTVEVOX1NUOgogICAgICAgICByZXR1cm4gIkxpc3RlbmluZyI7Ci0jaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSkKICAgICBjYXNlIEJUQV9BR19TQ09fQ09ERUNfU1Q6CiAgICAgICAgIHJldHVybiAiQ29kZWMgTmVnb3RpYXRpb24iOwogI2VuZGlmCmRpZmYgLS1naXQgYS9idGEvYWcvYnRhX2FnX3NkcC5jIGIvYnRhL2FnL2J0YV9hZ19zZHAuYwppbmRleCBjYjViZDgwLi5lNTAzZTc2IDEwMDY0NAotLS0gYS9idGEvYWcvYnRhX2FnX3NkcC5jCisrKyBiL2J0YS9hZy9idGFfYWdfc2RwLmMKQEAgLTQ1LDkgKzQ1LDkgQEAKICNlbmRpZgogCiAvKiBkZWNsYXJlIHNkcCBjYWxsYmFjayBmdW5jdGlvbnMgKi8KLXZvaWQgYnRhX2FnX3NkcF9jYmFja18xKFVJTlQxNiBzdGF0dXMpOwotdm9pZCBidGFfYWdfc2RwX2NiYWNrXzIoVUlOVDE2IHN0YXR1cyk7Ci12b2lkIGJ0YV9hZ19zZHBfY2JhY2tfMyhVSU5UMTYgc3RhdHVzKTsKK3ZvaWQgYnRhX2FnX3NkcF9jYmFja18xKHVpbnQxNl90IHN0YXR1cyk7Cit2b2lkIGJ0YV9hZ19zZHBfY2JhY2tfMih1aW50MTZfdCBzdGF0dXMpOwordm9pZCBidGFfYWdfc2RwX2NiYWNrXzModWludDE2X3Qgc3RhdHVzKTsKIAogLyogU0RQIGNhbGxiYWNrIGZ1bmN0aW9uIHRhYmxlICovCiB0eXBlZGVmIHRTRFBfRElTQ19DTVBMX0NCICp0QlRBX0FHX1NEUF9DQkFDSzsKQEAgLTY4LDEyICs2OCwxMiBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hZ19zZHBfY2JhY2soVUlOVDE2IHN0YXR1cywgVUlOVDggaWR4KQorc3RhdGljIHZvaWQgYnRhX2FnX3NkcF9jYmFjayh1aW50MTZfdCBzdGF0dXMsIHVpbnQ4X3QgaWR4KQogewotICAgIFVJTlQxNiAgICAgICAgICAgICAgZXZlbnQ7CisgICAgdWludDE2X3QgICAgICAgICAgICAgZXZlbnQ7CiAgICAgdEJUQV9BR19TQ0IgICAgICAgICAqcF9zY2I7CiAKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfYWdfc2RwX2NiYWNrIHN0YXR1czoweCV4Iiwgc3RhdHVzKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBzdGF0dXM6MHgleCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCiAgICAgaWYgKChwX3NjYiA9IGJ0YV9hZ19zY2JfYnlfaWR4KGlkeCkpICE9IE5VTEwpCiAgICAgewpAQCAtMTA4LDkgKzEwOCw5IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYWdfc2RwX2NiYWNrXzEoVUlOVDE2IHN0YXR1cykge2J0YV9hZ19zZHBfY2JhY2soc3RhdHVzLCAxKTt9Ci12b2lkIGJ0YV9hZ19zZHBfY2JhY2tfMihVSU5UMTYgc3RhdHVzKSB7YnRhX2FnX3NkcF9jYmFjayhzdGF0dXMsIDIpO30KLXZvaWQgYnRhX2FnX3NkcF9jYmFja18zKFVJTlQxNiBzdGF0dXMpIHtidGFfYWdfc2RwX2NiYWNrKHN0YXR1cywgMyk7fQordm9pZCBidGFfYWdfc2RwX2NiYWNrXzEodWludDE2X3Qgc3RhdHVzKSB7YnRhX2FnX3NkcF9jYmFjayhzdGF0dXMsIDEpO30KK3ZvaWQgYnRhX2FnX3NkcF9jYmFja18yKHVpbnQxNl90IHN0YXR1cykge2J0YV9hZ19zZHBfY2JhY2soc3RhdHVzLCAyKTt9Cit2b2lkIGJ0YV9hZ19zZHBfY2JhY2tfMyh1aW50MTZfdCBzdGF0dXMpIHtidGFfYWdfc2RwX2NiYWNrKHN0YXR1cywgMyk7fQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMTIxLDI0ICsxMjEsMjQgQEAKICoqICAgICAgICAgICAgICAgICAgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGNhbGwKICoqICAgICAgICAgICAgICAgICAgU0RQX0NyZWF0ZVJlY29yZCgpIHRvIGNyZWF0ZSBhbiBTRFAgcmVjb3JkLgogKioKLSoqIFJldHVybnMgICAgICAgICAgVFJVRSBpZiBmdW5jdGlvbiBleGVjdXRpb24gc3VjY2VlZGVkLAotKiogICAgICAgICAgICAgICAgICBGQUxTRSBpZiBmdW5jdGlvbiBleGVjdXRpb24gZmFpbGVkLgorKiogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGZ1bmN0aW9uIGV4ZWN1dGlvbiBzdWNjZWVkZWQsCisqKiAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIGZ1bmN0aW9uIGV4ZWN1dGlvbiBmYWlsZWQuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfYWdfYWRkX3JlY29yZChVSU5UMTYgc2VydmljZV91dWlkLCBjaGFyICpwX3NlcnZpY2VfbmFtZSwgVUlOVDggc2NuLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0FHX0ZFQVQgZmVhdHVyZXMsIFVJTlQzMiBzZHBfaGFuZGxlKQorYm9vbCBidGFfYWdfYWRkX3JlY29yZCh1aW50MTZfdCBzZXJ2aWNlX3V1aWQsIGNoYXIgKnBfc2VydmljZV9uYW1lLCB1aW50OF90IHNjbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9BR19GRUFUIGZlYXR1cmVzLCB1aW50MzJfdCBzZHBfaGFuZGxlKQogewogICAgIHRTRFBfUFJPVE9DT0xfRUxFTSAgcHJvdG9fZWxlbV9saXN0W0JUQV9BR19OVU1fUFJPVE9fRUxFTVNdOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgc3ZjX2NsYXNzX2lkX2xpc3RbQlRBX0FHX05VTV9TVkNfRUxFTVNdOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgYnJvd3NlX2xpc3RbXSA9IHtVVUlEX1NFUlZDTEFTU19QVUJMSUNfQlJPV1NFX0dST1VQfTsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIHZlcnNpb247Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBwcm9maWxlX3V1aWQ7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBuZXR3b3JrOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgcmVzdWx0ID0gVFJVRTsKLSAgICBCT09MRUFOICAgICAgICAgICAgIGNvZGVjX3N1cHBvcnRlZCA9IEZBTFNFOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgYnVmWzJdOworICAgIHVpbnQxNl90ICAgICAgICAgICAgc3ZjX2NsYXNzX2lkX2xpc3RbQlRBX0FHX05VTV9TVkNfRUxFTVNdOworICAgIHVpbnQxNl90ICAgICAgICAgICAgYnJvd3NlX2xpc3RbXSA9IHtVVUlEX1NFUlZDTEFTU19QVUJMSUNfQlJPV1NFX0dST1VQfTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgIHZlcnNpb247CisgICAgdWludDE2X3QgICAgICAgICAgICBwcm9maWxlX3V1aWQ7CisgICAgdWludDhfdCAgICAgICAgICAgICBuZXR3b3JrOworICAgIGJvb2wgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICBib29sICAgICAgICAgICAgICAgIGNvZGVjX3N1cHBvcnRlZCA9IGZhbHNlOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgYnVmWzJdOwogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2FnX2FkZF9yZWNvcmQgdXVpZDogJXgiLCBzZXJ2aWNlX3V1aWQpOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIHV1aWQ6ICV4IiwgX19mdW5jX18sIHNlcnZpY2VfdXVpZCk7CiAKICAgICBtZW1zZXQoIHByb3RvX2VsZW1fbGlzdCwgMCAsIEJUQV9BR19OVU1fUFJPVE9fRUxFTVMqc2l6ZW9mKHRTRFBfUFJPVE9DT0xfRUxFTSkpOwogCkBAIC0xNzIsNyArMTcyLDcgQEAKICAgICBpZiAocF9zZXJ2aWNlX25hbWUgIT0gTlVMTCAmJiBwX3NlcnZpY2VfbmFtZVswXSAhPSAwKQogICAgIHsKICAgICAgICAgcmVzdWx0ICY9IFNEUF9BZGRBdHRyaWJ1dGUoc2RwX2hhbmRsZSwgQVRUUl9JRF9TRVJWSUNFX05BTUUsIFRFWFRfU1RSX0RFU0NfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgKFVJTlQzMikoc3RybGVuKHBfc2VydmljZV9uYW1lKSsxKSwgKFVJTlQ4ICopIHBfc2VydmljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShzdHJsZW4ocF9zZXJ2aWNlX25hbWUpKzEpLCAodWludDhfdCAqKSBwX3NlcnZpY2VfbmFtZSk7CiAgICAgfQogCiAgICAgLyogYWRkIGZlYXR1cmVzIGFuZCBuZXR3b3JrICovCkBAIC0xODMsNyArMTgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgVUlOVF9ERVNDX1RZUEUsIDEsICZuZXR3b3JrKTsKIAogICAgICAgICBpZiAoZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9DT0RFQykKLSAgICAgICAgICAgIGNvZGVjX3N1cHBvcnRlZCA9IFRSVUU7CisgICAgICAgICAgICBjb2RlY19zdXBwb3J0ZWQgPSB0cnVlOwogCiAgICAgICAgIGZlYXR1cmVzICY9IEJUQV9BR19TRFBfRkVBVF9TUEVDOwogCkBAIC0yNjUsNyArMjY1LDcgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHAtPmluX3VzZSAmJiBwLT5kZWFsbG9jID09IEZBTFNFKQorICAgICAgICBpZiAocC0+aW5fdXNlICYmIHAtPmRlYWxsb2MgPT0gZmFsc2UpCiAgICAgICAgIHsKICAgICAgICAgICAgIG90aGVycyB8PSBwLT5yZWdfc2VydmljZXM7CiAgICAgICAgIH0KQEAgLTI5OSwxNiArMjk5LDE2IEBACiAqKiAgICAgICAgICAgICAgICAgIGZvciByZXF1ZXN0ZWQgc2VydmljZS4KICoqCiAqKgotKiogUmV0dXJucyAgICAgICAgICBUUlVFIGlmIHJlc3VsdHMgZm91bmQsIEZBTFNFIG90aGVyd2lzZS4KKyoqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiByZXN1bHRzIGZvdW5kLCBmYWxzZSBvdGhlcndpc2UuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX2FnX3NkcF9maW5kX2F0dHIodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlKQorYm9vbCBidGFfYWdfc2RwX2ZpbmRfYXR0cih0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfU0VSVklDRV9NQVNLIHNlcnZpY2UpCiB7CiAgICAgdFNEUF9ESVNDX1JFQyAgICAgICAqcF9yZWMgPSBOVUxMOwogICAgIHRTRFBfRElTQ19BVFRSICAgICAgKnBfYXR0cjsKICAgICB0U0RQX1BST1RPQ09MX0VMRU0gIHBlOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgdXVpZDsKLSAgICBCT09MRUFOICAgICAgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICB1dWlkOworICAgIGJvb2wgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CiAKICAgICBpZiAoc2VydmljZSAmIEJUQV9IRlBfU0VSVklDRV9NQVNLKQogICAgIHsKQEAgLTMyNiw3ICszMjYsNyBAQAogICAgIH0KIAogICAgIC8qIGxvb3AgdGhyb3VnaCBhbGwgcmVjb3JkcyB3ZSBmb3VuZCAqLwotICAgIHdoaWxlIChUUlVFKQorICAgIHdoaWxlICh0cnVlKQogICAgIHsKICAgICAgICAgLyogZ2V0IG5leHQgcmVjb3JkOyBpZiBub25lIGZvdW5kLCB3ZSdyZSBkb25lICovCiAgICAgICAgIGlmICgocF9yZWMgPSBTRFBfRmluZFNlcnZpY2VJbkRiKHBfc2NiLT5wX2Rpc2NfZGIsIHV1aWQsIHBfcmVjKSkgPT0gTlVMTCkKQEAgLTM0OSw3ICszNDksNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoU0RQX0ZpbmRQcm90b2NvbExpc3RFbGVtSW5SZWMocF9yZWMsIFVVSURfUFJPVE9DT0xfUkZDT01NLCAmcGUpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBfc2NiLT5wZWVyX3NjbiA9IChVSU5UOCkgcGUucGFyYW1zWzBdOworICAgICAgICAgICAgICAgIHBfc2NiLT5wZWVyX3NjbiA9ICh1aW50OF90KSBwZS5wYXJhbXNbMF07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7CkBAIC0zODYsNyArMzg2LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qIGZvdW5kIHdoYXQgd2UgbmVlZGVkICovCi0gICAgICAgIHJlc3VsdCA9IFRSVUU7CisgICAgICAgIHJlc3VsdCA9IHRydWU7CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNDA1LDEwICs0MDUsMTAgQEAKIHZvaWQgYnRhX2FnX2RvX2Rpc2ModEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlKQogewogICAgIHRTRFBfVVVJRCAgICAgICB1dWlkX2xpc3RbMl07Ci0gICAgVUlOVDE2ICAgICAgICAgIG51bV91dWlkID0gMTsKLSAgICBVSU5UMTYgICAgICAgICAgYXR0cl9saXN0WzRdOwotICAgIFVJTlQ4ICAgICAgICAgICBudW1fYXR0cjsKLSAgICBCT09MRUFOICAgICAgICAgZGJfaW5pdGVkID0gRkFMU0U7CisgICAgdWludDE2X3QgICAgICAgICAgbnVtX3V1aWQgPSAxOworICAgIHVpbnQxNl90ICAgICAgICAgIGF0dHJfbGlzdFs0XTsKKyAgICB1aW50OF90ICAgICAgICAgICBudW1fYXR0cjsKKyAgICBib29sICAgICAgICAgZGJfaW5pdGVkID0gZmFsc2U7CiAKICAgICAvKiBIRlAgaW5pdGlhdG9yOyBnZXQgcHJvdG8gbGlzdCBhbmQgZmVhdHVyZXMgKi8KICAgICBpZiAoc2VydmljZSAmIEJUQV9IRlBfU0VSVklDRV9NQVNLICYmIHBfc2NiLT5yb2xlID09IEJUQV9BR19JTlQpCmRpZmYgLS1naXQgYS9idGEvYXIvYnRhX2FyLmMgYi9idGEvYXIvYnRhX2FyLmMKaW5kZXggMjFkODljNy4uMjQ2NDYyMCAxMDA2NDQKLS0tIGEvYnRhL2FyL2J0YV9hci5jCisrKyBiL2J0YS9hci9idGFfYXIuYwpAQCAtNDEsOSArNDEsOSBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBVSU5UOCBidGFfYXJfaWQodEJUQV9TWVNfSUQgc3lzX2lkKQorc3RhdGljIHVpbnQ4X3QgYnRhX2FyX2lkKHRCVEFfU1lTX0lEIHN5c19pZCkKIHsKLSAgICBVSU5UOCAgIG1hc2sgPSAwOworICAgIHVpbnQ4X3QgICBtYXNrID0gMDsKICAgICBpZiAoc3lzX2lkID09IEJUQV9JRF9BVikKICAgICB7CiAgICAgICAgIG1hc2sgPSBCVEFfQVJfQVZfTUFTSzsKQEAgLTgwLDcgKzgwLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfYXJfYXZkdF9jYmFjayhVSU5UOCBoYW5kbGUsIEJEX0FERFIgYmRfYWRkciwgVUlOVDggZXZlbnQsIHRBVkRUX0NUUkwgKnBfZGF0YSkKK3N0YXRpYyB2b2lkIGJ0YV9hcl9hdmR0X2NiYWNrKHVpbnQ4X3QgaGFuZGxlLCBCRF9BRERSIGJkX2FkZHIsIHVpbnQ4X3QgZXZlbnQsIHRBVkRUX0NUUkwgKnBfZGF0YSkKIHsKICAgICAvKiByb3V0ZSB0aGUgQVZEVCByZWdpc3RyYXRpb24gY2FsbGJhY2sgdG8gYXYgb3IgYXZrICovCiAgICAgaWYgKGJ0YV9hcl9jYi5wX2F2X2Nvbm5fY2JhY2spCkBAIC0xMDAsNyArMTAwLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9hcl9yZWdfYXZkdCh0QVZEVF9SRUcgKnBfcmVnLCB0QVZEVF9DVFJMX0NCQUNLICpwX2NiYWNrLCB0QlRBX1NZU19JRCBzeXNfaWQpCiB7Ci0gICAgVUlOVDggICBtYXNrID0gMDsKKyAgICB1aW50OF90ICAgbWFzayA9IDA7CiAKICAgICBpZiAoc3lzX2lkID09IEJUQV9JRF9BVikKICAgICB7CkBAIC0xNDAsNyArMTQwLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9hcl9kZXJlZ19hdmR0KHRCVEFfU1lTX0lEIHN5c19pZCkKIHsKLSAgICBVSU5UOCAgIG1hc2sgPSAwOworICAgIHVpbnQ4X3QgICBtYXNrID0gMDsKIAogICAgIGlmIChzeXNfaWQgPT0gQlRBX0lEX0FWKQogICAgIHsKQEAgLTE3Miw3ICsxNzIsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2FyX2F2ZHRfY29ubih0QlRBX1NZU19JRCBzeXNfaWQsIEJEX0FERFIgYmRfYWRkcikKIHsKLSAgICBVSU5UOCAgICAgICBldmVudCA9IEJUQV9BUl9BVkRUX0NPTk5fRVZUOworICAgIHVpbnQ4X3QgICAgIGV2ZW50ID0gQlRBX0FSX0FWRFRfQ09OTl9FVlQ7CiAgICAgdEFWRFRfQ1RSTCAgZGF0YTsKIAogICAgIGlmIChzeXNfaWQgPT0gQlRBX0lEX0FWKQpAQCAtMjAwLDkgKzIwMCw5IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXJfcmVnX2F2Y3QoVUlOVDE2IG10dSwgVUlOVDE2IG10dV9iciwgVUlOVDggc2VjX21hc2ssIHRCVEFfU1lTX0lEIHN5c19pZCkKK3ZvaWQgYnRhX2FyX3JlZ19hdmN0KHVpbnQxNl90IG10dSwgdWludDE2X3QgbXR1X2JyLCB1aW50OF90IHNlY19tYXNrLCB0QlRBX1NZU19JRCBzeXNfaWQpCiB7Ci0gICAgVUlOVDggICBtYXNrID0gYnRhX2FyX2lkIChzeXNfaWQpOworICAgIHVpbnQ4X3QgICBtYXNrID0gYnRhX2FyX2lkIChzeXNfaWQpOwogCiAgICAgaWYgKG1hc2spCiAgICAgewpAQCAtMjI1LDcgKzIyNSw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfYXJfZGVyZWdfYXZjdCh0QlRBX1NZU19JRCBzeXNfaWQpCiB7Ci0gICAgVUlOVDggICBtYXNrID0gYnRhX2FyX2lkIChzeXNfaWQpOworICAgIHVpbnQ4X3QgICBtYXNrID0gYnRhX2FyX2lkIChzeXNfaWQpOwogCiAgICAgYnRhX2FyX2NiLmF2Y3RfcmVnaXN0ZXJlZCAmPSB+bWFzazsKIApAQCAtMjQyLDEyICsyNDIsMTIgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FyX3JlZ19hdnJjKFVJTlQxNiBzZXJ2aWNlX3V1aWQsIGNoYXIgKnNlcnZpY2VfbmFtZSwgY2hhciAqcHJvdmlkZXJfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBjYXRlZ29yaWVzLCB0QlRBX1NZU19JRCBzeXNfaWQsIEJPT0xFQU4gYnJvd3NlX3N1cHBvcnRlZCwKLSAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBwcm9maWxlX3ZlcnNpb24pCit2b2lkIGJ0YV9hcl9yZWdfYXZyYyh1aW50MTZfdCBzZXJ2aWNlX3V1aWQsIGNoYXIgKnNlcnZpY2VfbmFtZSwgY2hhciAqcHJvdmlkZXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNhdGVnb3JpZXMsIHRCVEFfU1lTX0lEIHN5c19pZCwgYm9vbCBicm93c2Vfc3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcHJvZmlsZV92ZXJzaW9uKQogewotICAgIFVJTlQ4ICAgbWFzayA9IGJ0YV9hcl9pZCAoc3lzX2lkKTsKLSAgICBVSU5UOCAgIHRlbXBbOF0sICpwOworICAgIHVpbnQ4X3QgICBtYXNrID0gYnRhX2FyX2lkIChzeXNfaWQpOworICAgIHVpbnQ4X3QgICB0ZW1wWzhdLCAqcDsKIAogICAgIGlmICghbWFzayB8fCAhY2F0ZWdvcmllcykKICAgICAgICAgcmV0dXJuOwpAQCAtMjg0LDcgKzI4NCw3IEBACiAgICAgICAgICAgICBwID0gdGVtcDsKICAgICAgICAgICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocCwgY2F0ZWdvcmllcyk7CiAgICAgICAgICAgICBTRFBfQWRkQXR0cmlidXRlKGJ0YV9hcl9jYi5zZHBfY3RfaGFuZGxlLCBBVFRSX0lEX1NVUFBPUlRFRF9GRUFUVVJFUywgVUlOVF9ERVNDX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgKFVJTlQzMikyLCAoVUlOVDgqKXRlbXApOworICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkyLCAodWludDhfdCopdGVtcCk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yOTgsMTEgKzI5OCwxMSBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXJfZGVyZWdfYXZyYyhVSU5UMTYgc2VydmljZV91dWlkLCB0QlRBX1NZU19JRCBzeXNfaWQpCit2b2lkIGJ0YV9hcl9kZXJlZ19hdnJjKHVpbnQxNl90IHNlcnZpY2VfdXVpZCwgdEJUQV9TWVNfSUQgc3lzX2lkKQogewotICAgIFVJTlQ4ICAgbWFzayA9IGJ0YV9hcl9pZCAoc3lzX2lkKTsKLSAgICBVSU5UMTYgIGNhdGVnb3JpZXMgPSAwOwotICAgIFVJTlQ4ICAgdGVtcFs4XSwgKnA7CisgICAgdWludDhfdCAgIG1hc2sgPSBidGFfYXJfaWQgKHN5c19pZCk7CisgICAgdWludDE2X3QgIGNhdGVnb3JpZXMgPSAwOworICAgIHVpbnQ4X3QgICB0ZW1wWzhdLCAqcDsKIAogICAgIGlmICghbWFzaykKICAgICAgICAgcmV0dXJuOwpAQCAtMzM2LDcgKzMzNiw3IEBACiAgICAgICAgICAgICAgICAgcCA9IHRlbXA7CiAgICAgICAgICAgICAgICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwLCBjYXRlZ29yaWVzKTsKICAgICAgICAgICAgICAgICBTRFBfQWRkQXR0cmlidXRlKGJ0YV9hcl9jYi5zZHBfY3RfaGFuZGxlLCBBVFRSX0lEX1NVUFBPUlRFRF9GRUFUVVJFUywgVUlOVF9ERVNDX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UMzIpMiwgKFVJTlQ4Kil0ZW1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KTIsICh1aW50OF90Kil0ZW1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2J0YS9hci9idGFfYXJfaW50LmggYi9idGEvYXIvYnRhX2FyX2ludC5oCmluZGV4IGQyMzA0NDguLjJjMTQyZmMgMTAwNjQ0Ci0tLSBhL2J0YS9hci9idGFfYXJfaW50LmgKKysrIGIvYnRhL2FyL2J0YV9hcl9pbnQuaApAQCAtMjksNyArMjksNyBAQAogCiAKICNpZm5kZWYgQlRBX0FSX0RFQlVHCi0jZGVmaW5lIEJUQV9BUl9ERUJVRyAgICBGQUxTRQorI2RlZmluZSBCVEFfQVJfREVCVUcgICAgVFJVRQogI2VuZGlmCiAKICNkZWZpbmUgQlRBX0FSX0FWX01BU0sgICAgICAweDAxCkBAIC00MCwxMiArNDAsMTIgQEAKIHsKICAgICB0QVZEVF9DVFJMX0NCQUNLICpwX2F2X2Nvbm5fY2JhY2s7ICAgICAgIC8qIGF2IGNvbm5lY3Rpb24gY2FsbGJhY2sgZnVuY3Rpb24gKi8KICAgICB0QVZEVF9DVFJMX0NCQUNLICpwX2F2a19jb25uX2NiYWNrOyAgICAgIC8qIGF2ayBjb25uZWN0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0gICAgVUlOVDggICAgICAgICAgIGF2ZHRfcmVnaXN0ZXJlZDsKLSAgICBVSU5UOCAgICAgICAgICAgYXZjdF9yZWdpc3RlcmVkOwotCVVJTlQzMiAgICAgICAgICBzZHBfdGdfaGFuZGxlOwotCVVJTlQzMiAgICAgICAgICBzZHBfY3RfaGFuZGxlOwotICAgIFVJTlQxNiAgICAgICAgICBjdF9jYXRlZ29yaWVzWzJdOwotICAgIFVJTlQ4ICAgICAgICAgICB0Z19yZWdpc3RlcmVkOworICAgIHVpbnQ4X3QgICAgICAgICAgIGF2ZHRfcmVnaXN0ZXJlZDsKKyAgICB1aW50OF90ICAgICAgICAgICBhdmN0X3JlZ2lzdGVyZWQ7CisgICAgdWludDMyX3QgICAgICAgICAgc2RwX3RnX2hhbmRsZTsKKyAgICB1aW50MzJfdCAgICAgICAgICBzZHBfY3RfaGFuZGxlOworICAgIHVpbnQxNl90ICAgICAgICAgIGN0X2NhdGVnb3JpZXNbMl07CisgICAgdWludDhfdCAgICAgICAgICAgdGdfcmVnaXN0ZXJlZDsKICAgICB0QlRBX0FWX0hOREwgICAgaG5kbDsgICAgICAgLyogSGFuZGxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RyZWFtIHRoYXQgcmVqZWN0ZWQgdGhlIGNvbm5lY3Rpb24uICovCiB9IHRCVEFfQVJfQ0I7CiAKZGlmZiAtLWdpdCBhL2J0YS9hdi9idGFfYXZfYWFjdC5jIGIvYnRhL2F2L2J0YV9hdl9hYWN0LmMKaW5kZXggNmM1ZDg3NC4uZjJiNjdjOCAxMDA2NDQKLS0tIGEvYnRhL2F2L2J0YV9hdl9hYWN0LmMKKysrIGIvYnRhL2F2L2J0YV9hdl9hYWN0LmMKQEAgLTI1LDcgKzI1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpZiBkZWZpbmVkKEJUQV9BVl9JTkNMVURFRCkgJiYgKEJUQV9BVl9JTkNMVURFRCA9PSBUUlVFKQorI2lmIChCVEFfQVZfSU5DTFVERUQgPT0gVFJVRSkKIAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtMzksNyArMzksNyBAQAogI2luY2x1ZGUgInV0bC5oIgogI2luY2x1ZGUgInZlbmRvci5oIgogCi0jaWYoIGRlZmluZWQgQlRBX0FSX0lOQ0xVREVEICkgJiYgKEJUQV9BUl9JTkNMVURFRCA9PSBUUlVFKQorI2lmIChCVEFfQVJfSU5DTFVERUQgPT0gVFJVRSkKICNpbmNsdWRlICJidGFfYXJfYXBpLmgiCiAjZW5kaWYKIApAQCAtMTU0LDcgKzE1NCw3IEBACiB9OwogCiAvKiB0aGVzZSB0YWJsZXMgdHJhbnNsYXRlIEFWRFQgZXZlbnRzIHRvIFNTTSBldmVudHMgKi8KLXN0YXRpYyBjb25zdCBVSU5UMTYgYnRhX2F2X3N0cmVhbV9ldnRfb2tbXSA9IHsKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBidGFfYXZfc3RyZWFtX2V2dF9va1tdID0gewogICAgIEJUQV9BVl9TVFJfRElTQ19PS19FVlQsICAgICAgICAgLyogQVZEVF9ESVNDT1ZFUl9DRk1fRVZUICovCiAgICAgQlRBX0FWX1NUUl9HRVRDQVBfT0tfRVZULCAgICAgICAvKiBBVkRUX0dFVENBUF9DRk1fRVZUICovCiAgICAgQlRBX0FWX1NUUl9PUEVOX09LX0VWVCwgICAgICAgICAvKiBBVkRUX09QRU5fQ0ZNX0VWVCAqLwpAQCAtMTgxLDcgKzE4MSw3IEBACiAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBVkRUX0RFTEFZX1JFUE9SVF9DRk1fRVZUICovCiB9OwogCi1zdGF0aWMgY29uc3QgVUlOVDE2IGJ0YV9hdl9zdHJlYW1fZXZ0X2ZhaWxbXSA9IHsKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBidGFfYXZfc3RyZWFtX2V2dF9mYWlsW10gPSB7CiAgICAgQlRBX0FWX1NUUl9ESVNDX0ZBSUxfRVZULCAgICAgICAvKiBBVkRUX0RJU0NPVkVSX0NGTV9FVlQgKi8KICAgICBCVEFfQVZfU1RSX0dFVENBUF9GQUlMX0VWVCwgICAgIC8qIEFWRFRfR0VUQ0FQX0NGTV9FVlQgKi8KICAgICBCVEFfQVZfU1RSX09QRU5fRkFJTF9FVlQsICAgICAgIC8qIEFWRFRfT1BFTl9DRk1fRVZUICovCkBAIC0yMDgsMjAgKzIwOCwyMCBAQAogICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQVZEVF9ERUxBWV9SRVBPUlRfQ0ZNX0VWVCAqLwogfTsKIAotdm9pZCBidGFfYXZfc3RyZWFtX2RhdGFfY2JhY2soVUlOVDggaGFuZGxlLCBCVF9IRFIgKnBfcGt0LCBVSU5UMzIgdGltZV9zdGFtcCwgVUlOVDggbV9wdCk7Ci1zdGF0aWMgdm9pZCBidGFfYXZfc3RyZWFtMF9jYmFjayhVSU5UOCBoYW5kbGUsIEJEX0FERFIgYmRfYWRkciwgVUlOVDggZXZlbnQsIHRBVkRUX0NUUkwgKnBfZGF0YSk7Ci1zdGF0aWMgdm9pZCBidGFfYXZfc3RyZWFtMV9jYmFjayhVSU5UOCBoYW5kbGUsIEJEX0FERFIgYmRfYWRkciwgVUlOVDggZXZlbnQsIHRBVkRUX0NUUkwgKnBfZGF0YSk7Cit2b2lkIGJ0YV9hdl9zdHJlYW1fZGF0YV9jYmFjayh1aW50OF90IGhhbmRsZSwgQlRfSERSICpwX3BrdCwgdWludDMyX3QgdGltZV9zdGFtcCwgdWludDhfdCBtX3B0KTsKK3N0YXRpYyB2b2lkIGJ0YV9hdl9zdHJlYW0wX2NiYWNrKHVpbnQ4X3QgaGFuZGxlLCBCRF9BRERSIGJkX2FkZHIsIHVpbnQ4X3QgZXZlbnQsIHRBVkRUX0NUUkwgKnBfZGF0YSk7CitzdGF0aWMgdm9pZCBidGFfYXZfc3RyZWFtMV9jYmFjayh1aW50OF90IGhhbmRsZSwgQkRfQUREUiBiZF9hZGRyLCB1aW50OF90IGV2ZW50LCB0QVZEVF9DVFJMICpwX2RhdGEpOwogI2lmIEJUQV9BVl9OVU1fU1RSUyA+IDIKLXN0YXRpYyB2b2lkIGJ0YV9hdl9zdHJlYW0yX2NiYWNrKFVJTlQ4IGhhbmRsZSwgQkRfQUREUiBiZF9hZGRyLCBVSU5UOCBldmVudCwgdEFWRFRfQ1RSTCAqcF9kYXRhKTsKK3N0YXRpYyB2b2lkIGJ0YV9hdl9zdHJlYW0yX2NiYWNrKHVpbnQ4X3QgaGFuZGxlLCBCRF9BRERSIGJkX2FkZHIsIHVpbnQ4X3QgZXZlbnQsIHRBVkRUX0NUUkwgKnBfZGF0YSk7CiAjZW5kaWYKICNpZiBCVEFfQVZfTlVNX1NUUlMgPiAzCi1zdGF0aWMgdm9pZCBidGFfYXZfc3RyZWFtM19jYmFjayhVSU5UOCBoYW5kbGUsIEJEX0FERFIgYmRfYWRkciwgVUlOVDggZXZlbnQsIHRBVkRUX0NUUkwgKnBfZGF0YSk7CitzdGF0aWMgdm9pZCBidGFfYXZfc3RyZWFtM19jYmFjayh1aW50OF90IGhhbmRsZSwgQkRfQUREUiBiZF9hZGRyLCB1aW50OF90IGV2ZW50LCB0QVZEVF9DVFJMICpwX2RhdGEpOwogI2VuZGlmCiAjaWYgQlRBX0FWX05VTV9TVFJTID4gNAotc3RhdGljIHZvaWQgYnRhX2F2X3N0cmVhbTRfY2JhY2soVUlOVDggaGFuZGxlLCBCRF9BRERSIGJkX2FkZHIsIFVJTlQ4IGV2ZW50LCB0QVZEVF9DVFJMICpwX2RhdGEpOworc3RhdGljIHZvaWQgYnRhX2F2X3N0cmVhbTRfY2JhY2sodWludDhfdCBoYW5kbGUsIEJEX0FERFIgYmRfYWRkciwgdWludDhfdCBldmVudCwgdEFWRFRfQ1RSTCAqcF9kYXRhKTsKICNlbmRpZgogI2lmIEJUQV9BVl9OVU1fU1RSUyA+IDUKLXN0YXRpYyB2b2lkIGJ0YV9hdl9zdHJlYW01X2NiYWNrKFVJTlQ4IGhhbmRsZSwgQkRfQUREUiBiZF9hZGRyLCBVSU5UOCBldmVudCwgdEFWRFRfQ1RSTCAqcF9kYXRhKTsKK3N0YXRpYyB2b2lkIGJ0YV9hdl9zdHJlYW01X2NiYWNrKHVpbnQ4X3QgaGFuZGxlLCBCRF9BRERSIGJkX2FkZHIsIHVpbnQ4X3QgZXZlbnQsIHRBVkRUX0NUUkwgKnBfZGF0YSk7CiAjZW5kaWYKIC8qIHRoZSBhcnJheSBvZiBjYWxsYmFjayBmdW5jdGlvbnMgdG8gcmVjZWl2ZSBldmVudHMgZnJvbSBBVkRUIGNvbnRyb2wgY2hhbm5lbCAqLwogdEFWRFRfQ1RSTF9DQkFDSyAqIGNvbnN0IGJ0YV9hdl9kdF9jYmFja1tdID0KQEAgLTI1MCw3ICsyNTAsNyBAQAogKioKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgVUlOVDggYnRhX2F2X2dldF9zY2JfaGFuZGxlKHRCVEFfQVZfU0NCICpwX3NjYiwgVUlOVDggbG9jYWxfc2VwKQorc3RhdGljIHVpbnQ4X3QgYnRhX2F2X2dldF9zY2JfaGFuZGxlKHRCVEFfQVZfU0NCICpwX3NjYiwgdWludDhfdCBsb2NhbF9zZXApCiB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCVEFfQVZfTUFYX1NFUFM7IGkrKykgewogICAgICAgICBpZiAoKHBfc2NiLT5zZXBzW2ldLnRzZXAgPT0gbG9jYWxfc2VwKSAmJgpAQCAtMjcwLDcgKzI3MCw3IEBACiAqKgogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBVSU5UOCBidGFfYXZfZ2V0X3NjYl9zZXBfdHlwZSh0QlRBX0FWX1NDQiAqcF9zY2IsIFVJTlQ4IHRhdmR0X2hhbmRsZSkKK3N0YXRpYyB1aW50OF90IGJ0YV9hdl9nZXRfc2NiX3NlcF90eXBlKHRCVEFfQVZfU0NCICpwX3NjYiwgdWludDhfdCB0YXZkdF9oYW5kbGUpCiB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCVEFfQVZfTUFYX1NFUFM7IGkrKykgewogICAgICAgICBpZiAocF9zY2ItPnNlcHNbaV0uYXZfaGFuZGxlID09IHRhdmR0X2hhbmRsZSkKQEAgLTI5OCw4ICsyOTgsOCBAQAogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigicmVzZXQgZmxhZ3MiKTsKICAgICAgICAgLyogYSBuZXcgYWRkciwgcmVzZXQgdGhlIHN1cHBvcnRlZCBmbGFncyAqLwotICAgICAgICBwX3NjYi0+cmVjZmdfc3VwICAgID0gVFJVRTsKLSAgICAgICAgcF9zY2ItPnN1c3BlbmRfc3VwICA9IFRSVUU7CisgICAgICAgIHBfc2NiLT5yZWNmZ19zdXAgICAgPSB0cnVlOworICAgICAgICBwX3NjYi0+c3VzcGVuZF9zdXAgID0gdHJ1ZTsKICAgICB9CiAKICAgICAvKiBkbyB0aGlzIGNvcHkgYW55d2F5LCBqdXN0IGluIGNhc2UgdGhlIGZpcnN0IGFkZHIgbWF0Y2hlcwpAQCAtMzI0LDcgKzMyNCw3IEBACiAgICAgcF9zY2ItPnJvbGUgJj0gfkJUQV9BVl9ST0xFX1NUQVJUX0lOVDsKICAgICBzdGFydC5jaG5sICAgPSBwX3NjYi0+Y2hubDsKICAgICBzdGFydC5zdGF0dXMgPSBCVEFfQVZfRkFJTDsKLSAgICBzdGFydC5pbml0aWF0b3IgPSBUUlVFOworICAgIHN0YXJ0LmluaXRpYXRvciA9IHRydWU7CiAgICAgc3RhcnQuaG5kbCAgID0gcF9zY2ItPmhuZGw7CiAgICAgKCpidGFfYXZfY2IucF9jYmFjaykoQlRBX0FWX1NUQVJUX0VWVCwgKHRCVEFfQVYgKikgJnN0YXJ0KTsKIH0KQEAgLTM0NCwxMiArMzQ0LDEyIEBACiB7CiAgICAgVU5VU0VEKHBfZGF0YSk7CiAKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfYXZfc3RfcmNfdGltZXIgcmNfaGFuZGxlOiVkLCB1c2VfcmM6ICVkIiwKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyByY19oYW5kbGU6JWQsIHVzZV9yYzogJWQiLCBfX2Z1bmNfXywKICAgICAgICAgcF9zY2ItPnJjX2hhbmRsZSwgcF9zY2ItPnVzZV9yYyk7CiAgICAgLyogZm9yIG91dGdvaW5nIFJDIGNvbm5lY3Rpb24gYXMgSU5UL0NUICovCiAgICAgaWYgKChwX3NjYi0+cmNfaGFuZGxlID09IEJUQV9BVl9SQ19IQU5ETEVfTk9ORSkgJiYKICAgICAgICAgLyogKGJ0YV9hdl9jYi5mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX1JDQ1QpICYmICovCi0gICAgICAgIChwX3NjYi0+dXNlX3JjID09IFRSVUUgfHwgKHBfc2NiLT5yb2xlICYgQlRBX0FWX1JPTEVfQURfQUNQKSkpCisgICAgICAgIChwX3NjYi0+dXNlX3JjID09IHRydWUgfHwgKHBfc2NiLT5yb2xlICYgQlRBX0FWX1JPTEVfQURfQUNQKSkpCiAgICAgewogICAgICAgICBpZiAoKHBfc2NiLT53YWl0ICYgQlRBX0FWX1dBSVRfUk9MRV9TV19CSVRTKSA9PSAwKSB7CiAgICAgICAgICAgICBidGFfc3lzX3N0YXJ0X3RpbWVyKHBfc2NiLT5hdnJjX2N0X3RpbWVyLCBCVEFfQVZfUkNfRElTQ19USU1FX1ZBTCwKQEAgLTM2OCwxNiArMzY4LDE2IEBACiAqKiBEZXNjcmlwdGlvbiAgICAgIFRoZSBmdW5jdGlvbiBnZXRzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIG5leHQgYXZhaWxhYmxlCiAqKiAgICAgICAgICAgICAgICAgIHN0cmVhbSBmb3VuZCBpbiB0aGUgZGlzY292ZXJ5IHJlc3VsdHMuCiAqKgotKiogUmV0dXJucyAgICAgICAgICBUUlVFIGlmIHdlIHNlbnQgcmVxdWVzdCB0byBBVkRULCBGQUxTRSBvdGhlcndpc2UuCisqKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgd2Ugc2VudCByZXF1ZXN0IHRvIEFWRFQsIGZhbHNlIG90aGVyd2lzZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIEJPT0xFQU4gYnRhX2F2X25leHRfZ2V0Y2FwKHRCVEFfQVZfU0NCICpwX3NjYiwgdEJUQV9BVl9EQVRBICpwX2RhdGEpCitzdGF0aWMgYm9vbCBidGFfYXZfbmV4dF9nZXRjYXAodEJUQV9BVl9TQ0IgKnBfc2NiLCB0QlRBX0FWX0RBVEEgKnBfZGF0YSkKIHsKICAgICBpbnQgICAgIGk7CiAgICAgdEFWRFRfR0VUQ0FQX1JFUSAgICAqcF9yZXE7Ci0gICAgQk9PTEVBTiAgICAgc2VudF9jbWQgPSBGQUxTRTsKLSAgICBVSU5UMTYgdXVpZF9pbnQgPSBwX3NjYi0+dXVpZF9pbnQ7Ci0gICAgVUlOVDggc2VwX3JlcXVlc3RlZCA9IDA7CisgICAgYm9vbCAgICAgc2VudF9jbWQgPSBmYWxzZTsKKyAgICB1aW50MTZfdCB1dWlkX2ludCA9IHBfc2NiLT51dWlkX2ludDsKKyAgICB1aW50OF90IHNlcF9yZXF1ZXN0ZWQgPSAwOwogCiAgICAgaWYodXVpZF9pbnQgPT0gVVVJRF9TRVJWQ0xBU1NfQVVESU9fU09VUkNFKQogICAgICAgIHNlcF9yZXF1ZXN0ZWQgPSBBVkRUX1RTRVBfU05LOwpAQCAtMzg3LDcgKzM4Nyw3IEBACiAgICAgZm9yIChpID0gcF9zY2ItPnNlcF9pbmZvX2lkeDsgaSA8IHBfc2NiLT5udW1fc2VwczsgaSsrKQogICAgIHsKICAgICAgICAgLyogc3RlYW0gbm90IGluIHVzZSwgaXMgYSBzaW5rLCBhbmQgaXMgdGhlIHJpZ2h0IG1lZGlhIHR5cGUgKGF1ZGlvL3ZpZGVvKSAqLwotICAgICAgICBpZiAoKHBfc2NiLT5zZXBfaW5mb1tpXS5pbl91c2UgPT0gRkFMU0UpICYmCisgICAgICAgIGlmICgocF9zY2ItPnNlcF9pbmZvW2ldLmluX3VzZSA9PSBmYWxzZSkgJiYKICAgICAgICAgICAgIChwX3NjYi0+c2VwX2luZm9baV0udHNlcCA9PSBzZXBfcmVxdWVzdGVkKSAmJgogICAgICAgICAgICAgKHBfc2NiLT5zZXBfaW5mb1tpXS5tZWRpYV90eXBlID09IHBfc2NiLT5tZWRpYV90eXBlKSkKICAgICAgICAgewpAQCAtNDA3LDcgKzQwNyw3IEBACiAgICAgICAgICAgICAoKnBfcmVxKShwX3NjYi0+cGVlcl9hZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zY2ItPnNlcF9pbmZvW2ldLnNlaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NjYi0+cF9jYXAsIGJ0YV9hdl9kdF9jYmFja1twX3NjYi0+aGRpXSk7Ci0gICAgICAgICAgICBzZW50X2NtZCA9IFRSVUU7CisgICAgICAgICAgICBzZW50X2NtZCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTQzMSw5ICs0MzEsOSBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hdl9wcm9jX3N0cmVhbV9ldnQoVUlOVDggaGFuZGxlLCBCRF9BRERSIGJkX2FkZHIsIFVJTlQ4IGV2ZW50LCB0QVZEVF9DVFJMICpwX2RhdGEsIGludCBpbmRleCkKK3N0YXRpYyB2b2lkIGJ0YV9hdl9wcm9jX3N0cmVhbV9ldnQodWludDhfdCBoYW5kbGUsIEJEX0FERFIgYmRfYWRkciwgdWludDhfdCBldmVudCwgdEFWRFRfQ1RSTCAqcF9kYXRhLCBpbnQgaW5kZXgpCiB7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBzZWNfbGVuID0gMDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgc2VjX2xlbiA9IDA7CiAgICAgdEJUQV9BVl9TQ0IgICAgICAgICAqcF9zY2IgPSBidGFfYXZfY2IucF9zY2JbaW5kZXhdOwogCiAgICAgaWYgKHBfZGF0YSkKQEAgLTUxMCwxMiArNTEwLDEyIEBACiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSBBVkRUX1NFQ1VSSVRZX0lORF9FVlQ6Ci0gICAgICAgICAgICAgICAgcF9tc2ctPm1zZy5zZWN1cml0eV9pbmQucF9kYXRhID0gKFVJTlQ4ICopIChwX21zZyArIDEpOworICAgICAgICAgICAgICAgIHBfbXNnLT5tc2cuc2VjdXJpdHlfaW5kLnBfZGF0YSA9ICh1aW50OF90ICopIChwX21zZyArIDEpOwogICAgICAgICAgICAgICAgIG1lbWNweShwX21zZy0+bXNnLnNlY3VyaXR5X2luZC5wX2RhdGEsIHBfZGF0YS0+c2VjdXJpdHlfaW5kLnBfZGF0YSwgc2VjX2xlbik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgQVZEVF9TRUNVUklUWV9DRk1fRVZUOgotICAgICAgICAgICAgICAgIHBfbXNnLT5tc2cuc2VjdXJpdHlfY2ZtLnBfZGF0YSA9IChVSU5UOCAqKSAocF9tc2cgKyAxKTsKKyAgICAgICAgICAgICAgICBwX21zZy0+bXNnLnNlY3VyaXR5X2NmbS5wX2RhdGEgPSAodWludDhfdCAqKSAocF9tc2cgKyAxKTsKICAgICAgICAgICAgICAgICBpZiAocF9kYXRhLT5oZHIuZXJyX2NvZGUgPT0gMCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwX21zZy0+bXNnLnNlY3VyaXR5X2NmbS5wX2RhdGEsIHBfZGF0YS0+c2VjdXJpdHlfY2ZtLnBfZGF0YSwgc2VjX2xlbik7CkBAIC01NDIsOSArNTQyLDkgQEAKICAgICAgICAgICAgIHBfbXNnLT5oZHIuZXZlbnQgPSBidGFfYXZfc3RyZWFtX2V2dF9mYWlsW2V2ZW50XTsKICAgICAgICAgfQogCi0gICAgICAgIHBfbXNnLT5pbml0aWF0b3IgPSBGQUxTRTsKKyAgICAgICAgcF9tc2ctPmluaXRpYXRvciA9IGZhbHNlOwogICAgICAgICBpZiAoZXZlbnQgPT0gQVZEVF9TVVNQRU5EX0NGTV9FVlQpCi0gICAgICAgICAgICBwX21zZy0+aW5pdGlhdG9yID0gVFJVRTsKKyAgICAgICAgICAgIHBfbXNnLT5pbml0aWF0b3IgPSB0cnVlOwogCiAgICAgICAgIEFQUExfVFJBQ0VfVkVSQk9TRSgiaG5kbDp4JXgiLCBwX3NjYi0+aG5kbCk7CiAgICAgICAgIHBfbXNnLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSBwX3NjYi0+aG5kbDsKQEAgLTU3NSwxMiArNTc1LDEyIEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfc3RyZWFtX2RhdGFfY2JhY2soVUlOVDggaGFuZGxlLCBCVF9IRFIgKnBfcGt0LCBVSU5UMzIgdGltZV9zdGFtcCwgVUlOVDggbV9wdCkKK3ZvaWQgYnRhX2F2X3N0cmVhbV9kYXRhX2NiYWNrKHVpbnQ4X3QgaGFuZGxlLCBCVF9IRFIgKnBfcGt0LCB1aW50MzJfdCB0aW1lX3N0YW1wLCB1aW50OF90IG1fcHQpCiB7CiAgICAgaW50IGluZGV4ID0gMDsKICAgICB0QlRBX0FWX1NDQiAgICAgICAgICpwX3NjYiA7CiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2F2X3N0cmVhbV9kYXRhX2NiYWNrIGF2ZHRfaGFuZGxlOiAlZCBwa3RfbGVuPTB4JXggIG9mc3QgPSAweCV4IiwgaGFuZGxlLHBfcGt0LT5sZW4scF9wa3QtPm9mZnNldCk7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiIE51bWJlciBvZiBmcmFtZXMgMHgleCIsKigoVUlOVDgqKShwX3BrdCArIDEpICsgcF9wa3QtPm9mZnNldCkpOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiBOdW1iZXIgb2YgZnJhbWVzIDB4JXgiLCooKHVpbnQ4X3QqKShwX3BrdCArIDEpICsgcF9wa3QtPm9mZnNldCkpOwogICAgIEFQUExfVFJBQ0VfREVCVUcoIlNlcXVlbmNlIE51bWJlciAweCV4IixwX3BrdC0+bGF5ZXJfc3BlY2lmaWMpOwogICAgIC8qIEdldCAgU0NCICBhbmQgY29ycmVjdCBzZXAgdHlwZSovCiAgICAgZm9yKGluZGV4ID0gMDsgaW5kZXggPCBCVEFfQVZfTlVNX1NUUlM7aW5kZXggKysgKQpAQCAtNjA4LDcgKzYwOCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2F2X3N0cmVhbTBfY2JhY2soVUlOVDggaGFuZGxlLCBCRF9BRERSIGJkX2FkZHIsIFVJTlQ4IGV2ZW50LCB0QVZEVF9DVFJMICpwX2RhdGEpCitzdGF0aWMgdm9pZCBidGFfYXZfc3RyZWFtMF9jYmFjayh1aW50OF90IGhhbmRsZSwgQkRfQUREUiBiZF9hZGRyLCB1aW50OF90IGV2ZW50LCB0QVZEVF9DVFJMICpwX2RhdGEpCiB7CiAgICAgQVBQTF9UUkFDRV9WRVJCT1NFKCJidGFfYXZfc3RyZWFtMF9jYmFjayBhdmR0X2hhbmRsZTogJWQgZXZlbnQ9MHgleCIsIGhhbmRsZSwgZXZlbnQpOwogICAgIGJ0YV9hdl9wcm9jX3N0cmVhbV9ldnQoaGFuZGxlLCBiZF9hZGRyLCBldmVudCwgcF9kYXRhLCAwKTsKQEAgLTYyMyw3ICs2MjMsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hdl9zdHJlYW0xX2NiYWNrKFVJTlQ4IGhhbmRsZSwgQkRfQUREUiBiZF9hZGRyLCBVSU5UOCBldmVudCwgdEFWRFRfQ1RSTCAqcF9kYXRhKQorc3RhdGljIHZvaWQgYnRhX2F2X3N0cmVhbTFfY2JhY2sodWludDhfdCBoYW5kbGUsIEJEX0FERFIgYmRfYWRkciwgdWludDhfdCBldmVudCwgdEFWRFRfQ1RSTCAqcF9kYXRhKQogewogICAgIEFQUExfVFJBQ0VfRVZFTlQoImJ0YV9hdl9zdHJlYW0xX2NiYWNrIGF2ZHRfaGFuZGxlOiAlZCBldmVudD0weCV4IiwgaGFuZGxlLCBldmVudCk7CiAgICAgYnRhX2F2X3Byb2Nfc3RyZWFtX2V2dChoYW5kbGUsIGJkX2FkZHIsIGV2ZW50LCBwX2RhdGEsIDEpOwpAQCAtNjM5LDcgKzYzOSw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2F2X3N0cmVhbTJfY2JhY2soVUlOVDggaGFuZGxlLCBCRF9BRERSIGJkX2FkZHIsIFVJTlQ4IGV2ZW50LCB0QVZEVF9DVFJMICpwX2RhdGEpCitzdGF0aWMgdm9pZCBidGFfYXZfc3RyZWFtMl9jYmFjayh1aW50OF90IGhhbmRsZSwgQkRfQUREUiBiZF9hZGRyLCB1aW50OF90IGV2ZW50LCB0QVZEVF9DVFJMICpwX2RhdGEpCiB7CiAgICAgQVBQTF9UUkFDRV9FVkVOVCgiYnRhX2F2X3N0cmVhbTJfY2JhY2sgYXZkdF9oYW5kbGU6ICVkIGV2ZW50PTB4JXgiLCBoYW5kbGUsIGV2ZW50KTsKICAgICBidGFfYXZfcHJvY19zdHJlYW1fZXZ0KGhhbmRsZSwgYmRfYWRkciwgZXZlbnQsIHBfZGF0YSwgMik7CkBAIC02NTYsNyArNjU2LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfYXZfc3RyZWFtM19jYmFjayhVSU5UOCBoYW5kbGUsIEJEX0FERFIgYmRfYWRkciwgVUlOVDggZXZlbnQsIHRBVkRUX0NUUkwgKnBfZGF0YSkKK3N0YXRpYyB2b2lkIGJ0YV9hdl9zdHJlYW0zX2NiYWNrKHVpbnQ4X3QgaGFuZGxlLCBCRF9BRERSIGJkX2FkZHIsIHVpbnQ4X3QgZXZlbnQsIHRBVkRUX0NUUkwgKnBfZGF0YSkKIHsKICAgICBBUFBMX1RSQUNFX0VWRU5UKCJidGFfYXZfc3RyZWFtM19jYmFjayBhdmR0X2hhbmRsZTogJWQgZXZlbnQ9MHgleCIsIGhhbmRsZSwgZXZlbnQpOwogICAgIGJ0YV9hdl9wcm9jX3N0cmVhbV9ldnQoaGFuZGxlLCBiZF9hZGRyLCBldmVudCwgcF9kYXRhLCAzKTsKQEAgLTY3Myw3ICs2NzMsNyBAQAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWYgQlRBX0FWX05VTV9TVFJTID4gNAotc3RhdGljIHZvaWQgYnRhX2F2X3N0cmVhbTRfY2JhY2soVUlOVDggaGFuZGxlLCBCRF9BRERSIGJkX2FkZHIsIFVJTlQ4IGV2ZW50LCB0QVZEVF9DVFJMICpwX2RhdGEpCitzdGF0aWMgdm9pZCBidGFfYXZfc3RyZWFtNF9jYmFjayh1aW50OF90IGhhbmRsZSwgQkRfQUREUiBiZF9hZGRyLCB1aW50OF90IGV2ZW50LCB0QVZEVF9DVFJMICpwX2RhdGEpCiB7CiAgICAgQVBQTF9UUkFDRV9FVkVOVCgiYnRhX2F2X3N0cmVhbTRfY2JhY2sgYXZkdF9oYW5kbGU6ICVkIGV2ZW50PTB4JXgiLCBoYW5kbGUsIGV2ZW50KTsKICAgICBidGFfYXZfcHJvY19zdHJlYW1fZXZ0KGhhbmRsZSwgYmRfYWRkciwgZXZlbnQsIHBfZGF0YSwgNCk7CkBAIC02OTAsNyArNjkwLDcgQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmIEJUQV9BVl9OVU1fU1RSUyA+IDUKLXN0YXRpYyB2b2lkIGJ0YV9hdl9zdHJlYW01X2NiYWNrKFVJTlQ4IGhhbmRsZSwgQkRfQUREUiBiZF9hZGRyLCBVSU5UOCBldmVudCwgdEFWRFRfQ1RSTCAqcF9kYXRhKQorc3RhdGljIHZvaWQgYnRhX2F2X3N0cmVhbTVfY2JhY2sodWludDhfdCBoYW5kbGUsIEJEX0FERFIgYmRfYWRkciwgdWludDhfdCBldmVudCwgdEFWRFRfQ1RSTCAqcF9kYXRhKQogewogICAgIEFQUExfVFJBQ0VfRVZFTlQoImJ0YV9hdl9zdHJlYW01X2NiYWNrIGF2ZHRfaGFuZGxlOiAlZCBldmVudD0weCV4IiwgaGFuZGxlLCBldmVudCk7CiAgICAgYnRhX2F2X3Byb2Nfc3RyZWFtX2V2dChoYW5kbGUsIGJkX2FkZHIsIGV2ZW50LCBwX2RhdGEsIDUpOwpAQCAtNzA2LDcgKzcwNiw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2F2X2EyZF9zZHBfY2JhY2soQk9PTEVBTiBmb3VuZCwgdEEyRF9TZXJ2aWNlICpwX3NlcnZpY2UpCitzdGF0aWMgdm9pZCBidGFfYXZfYTJkX3NkcF9jYmFjayhib29sIGZvdW5kLCB0QTJEX1NlcnZpY2UgKnBfc2VydmljZSkKIHsKICAgICB0QlRBX0FWX1NDQiAqcF9zY2IgPSBidGFfYXZfaG5kbF90b19zY2IoYnRhX2F2X2NiLmhhbmRsZSk7CiAKQEAgLTczOCw3ICs3MzgsNyBAQAogKiogUmV0dXJucwogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfYXZfYWRqdXN0X3NlcHNfaWR4KHRCVEFfQVZfU0NCICpwX3NjYiwgVUlOVDggYXZkdF9oYW5kbGUpCitzdGF0aWMgdm9pZCBidGFfYXZfYWRqdXN0X3NlcHNfaWR4KHRCVEFfQVZfU0NCICpwX3NjYiwgdWludDhfdCBhdmR0X2hhbmRsZSkKIHsKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfYXZfYWRqdXN0X3NlcHNfaWR4IGNvZGVjX3R5cGU6ICVkIiwgcF9zY2ItPmNvZGVjX3R5cGUpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQlRBX0FWX01BWF9TRVBTOyBpKyspIHsKQEAgLTgyMSwxMyArODIxLDE0IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfYXZfcm9sZV9yZXMgKHRCVEFfQVZfU0NCICpwX3NjYiwgdEJUQV9BVl9EQVRBICpwX2RhdGEpCiB7Ci0gICAgQk9PTEVBTiAgICAgICAgIGluaXRpYXRvciA9IEZBTFNFOwotICAgIHRCVEFfQVZfU1RBUlQgICBzdGFydDsKLSAgICB0QlRBX0FWX09QRU4gICAgYXZfb3BlbjsKKyAgICBib29sICAgICAgICAgICBpbml0aWF0b3IgPSBmYWxzZTsKKyAgICB0QlRBX0FWX1NUQVJUICBzdGFydDsKKyAgICB0QlRBX0FWX09QRU4gICBhdl9vcGVuOwogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2F2X3JvbGVfcmVzIHFfdGFnOiVkLCB3YWl0OngleCwgcm9sZTp4JXgiLCBwX3NjYi0+cV90YWcsIHBfc2NiLT53YWl0LCBwX3NjYi0+cm9sZSk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgcV90YWc6JWQsIHdhaXQ6eCV4LCByb2xlOngleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgcF9zY2ItPnFfdGFnLCBwX3NjYi0+d2FpdCwgcF9zY2ItPnJvbGUpOwogICAgIGlmIChwX3NjYi0+cm9sZSAmIEJUQV9BVl9ST0xFX1NUQVJUX0lOVCkKLSAgICAgICAgaW5pdGlhdG9yID0gVFJVRTsKKyAgICAgICAgaW5pdGlhdG9yID0gdHJ1ZTsKIAogICAgIGlmIChwX3NjYi0+cV90YWcgPT0gQlRBX0FWX1FfVEFHX1NUQVJUKQogICAgIHsKQEAgLTkxNSwxMiArOTE2LDEyIEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfYXZfZG9fZGlzY19hMmQgKHRCVEFfQVZfU0NCICpwX3NjYiwgdEJUQV9BVl9EQVRBICpwX2RhdGEpCiB7Ci0gICAgQk9PTEVBTiAgICAgb2tfY29udGludWUgPSBGQUxTRTsKKyAgICBib29sICAgICAgICBva19jb250aW51ZSA9IGZhbHNlOwogICAgIHRBMkRfU0RQX0RCX1BBUkFNUyAgZGJfcGFyYW1zOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgYXR0cl9saXN0W10gPSB7QVRUUl9JRF9TRVJWSUNFX0NMQVNTX0lEX0xJU1QsCisgICAgdWludDE2X3QgICAgICAgICAgICBhdHRyX2xpc3RbXSA9IHtBVFRSX0lEX1NFUlZJQ0VfQ0xBU1NfSURfTElTVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUVFJfSURfUFJPVE9DT0xfREVTQ19MSVNULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRUUl9JRF9CVF9QUk9GSUxFX0RFU0NfTElTVH07Ci0gICAgVUlOVDE2IHNkcF91dWlkID0gMDsgLyogVVVJRCBmb3Igd2hpY2ggU0RQIGhhcyB0byBiZSBkb25lICovCisgICAgdWludDE2X3Qgc2RwX3V1aWQgPSAwOyAvKiBVVUlEIGZvciB3aGljaCBTRFAgaGFzIHRvIGJlIGRvbmUgKi8KIAogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9hdl9kb19kaXNjX2EyZCB1c2VfcmM6ICVkIHJzOiVkLCBvYzolZCIsCiAgICAgICAgIHBfZGF0YS0+YXBpX29wZW4udXNlX3JjLCBwX2RhdGEtPmFwaV9vcGVuLnN3aXRjaF9yZXMsIGJ0YV9hdl9jYi5hdWRpb19vcGVuX2NudCk7CkBAIC05MzksNyArOTQwLDcgQEAKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIG9rX2NvbnRpbnVlID0gVFJVRTsKKyAgICAgICAgICAgIG9rX2NvbnRpbnVlID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKIApAQCAtOTU0LDcgKzk1NSw3IEBACiAgICAgICAgIC8qIGNvbnRpbnVlIHRvIG9wZW4gaWYgbGluayByb2xlIGlzIG9rICovCiAgICAgICAgIGlmIChidGFfYXZfbGlua19yb2xlX29rKHBfc2NiLCBBMkRfU0VUX01VTFRMX0JJVCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG9rX2NvbnRpbnVlID0gVFJVRTsKKyAgICAgICAgICAgIG9rX2NvbnRpbnVlID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKQEAgLTk2Myw3ICs5NjQsNyBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgQlRBX0FWX1JTX0RPTkU6Ci0gICAgICAgIG9rX2NvbnRpbnVlID0gVFJVRTsKKyAgICAgICAgb2tfY29udGludWUgPSB0cnVlOwogICAgICAgICBicmVhazsKICAgICB9CiAKQEAgLTk5OCwxNiArOTk5LDE2IEBACiAKICAgICBidGFfc3lzX2FwcF9vcGVuKEJUQV9JRF9BViwgcF9zY2ItPmFwcF9pZCwgcF9zY2ItPnBlZXJfYWRkcik7CiAKLSAgICBpZiAocF9zY2ItPnNraXBfc2RwID09IFRSVUUpCisgICAgaWYgKHBfc2NiLT5za2lwX3NkcCA9PSB0cnVlKQogICAgIHsKICAgICAgICAgdEEyRF9TZXJ2aWNlIGEyZF9zZXI7CiAgICAgICAgIGEyZF9zZXIuYXZkdF92ZXJzaW9uID0gQVZEVF9WRVJTSU9OOwotICAgICAgICBwX3NjYi0+c2tpcF9zZHAgPSBGQUxTRTsKKyAgICAgICAgcF9zY2ItPnNraXBfc2RwID0gZmFsc2U7CiAgICAgICAgIHBfc2NiLT51dWlkX2ludCA9IHBfZGF0YS0+YXBpX29wZW4udXVpZDsKICAgICAgICAgLyogb25seSBvbmUgQTJEIGZpbmQgc2VydmljZSBpcyBhY3RpdmUgYXQgYSB0aW1lICovCiAgICAgICAgIGJ0YV9hdl9jYi5oYW5kbGUgPSBwX3NjYi0+aG5kbDsKICAgICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogU2tpcCBTZHAgZm9yIGluY29taW5nIEEyZHAgY29ubmVjdGlvbiIsIF9fZnVuY19fKTsKLSAgICAgICAgYnRhX2F2X2EyZF9zZHBfY2JhY2soVFJVRSwgJmEyZF9zZXIpOworICAgICAgICBidGFfYXZfYTJkX3NkcF9jYmFjayh0cnVlLCAmYTJkX3Nlcik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTEwMTksNyArMTAyMCw3IEBACiAgICAgZGJfcGFyYW1zLm51bV9hdHRyID0gMzsKICAgICBkYl9wYXJhbXMucF9hdHRycyA9IGF0dHJfbGlzdDsKICAgICBwX3NjYi0+dXVpZF9pbnQgPSBwX2RhdGEtPmFwaV9vcGVuLnV1aWQ7Ci0gICAgcF9zY2ItPnNkcF9kaXNjb3Zlcnlfc3RhcnRlZCA9IFRSVUU7CisgICAgcF9zY2ItPnNkcF9kaXNjb3Zlcnlfc3RhcnRlZCA9IHRydWU7CiAgICAgaWYgKHBfc2NiLT51dWlkX2ludCA9PSBVVUlEX1NFUlZDTEFTU19BVURJT19TSU5LKQogICAgICAgICBzZHBfdXVpZCA9IFVVSURfU0VSVkNMQVNTX0FVRElPX1NPVVJDRTsKICAgICBlbHNlIGlmIChwX3NjYi0+dXVpZF9pbnQgPT0gVVVJRF9TRVJWQ0xBU1NfQVVESU9fU09VUkNFKQpAQCAtMTAzMyw3ICsxMDM0LDcgQEAKIAogICAgIC8qIHdoZW4gdGhlIGNvZGUgcmVhY2hlcyBoZXJlLCBlaXRoZXIgdGhlIERCIGlzIE5VTEwKICAgICAgKiBvciBBMkRfRmluZFNlcnZpY2UgaXMgbm90IHN1Y2Nlc3NmdWwgKi8KLSAgICBidGFfYXZfYTJkX3NkcF9jYmFjayhGQUxTRSwgTlVMTCk7CisgICAgYnRhX2F2X2EyZF9zZHBfY2JhY2soZmFsc2UsIE5VTEwpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTA0OCwxNCArMTA0OSwxNCBAQAogdm9pZCBidGFfYXZfY2xlYW51cCh0QlRBX0FWX1NDQiAqcF9zY2IsIHRCVEFfQVZfREFUQSAqcF9kYXRhKQogewogICAgIHRCVEFfQVZfQ09OTl9DSEcgbXNnOwotICAgIFVJTlQ4IHJvbGUgPSBCVEFfQVZfUk9MRV9BRF9JTlQ7CisgICAgdWludDhfdCByb2xlID0gQlRBX0FWX1JPTEVfQURfSU5UOwogICAgIFVOVVNFRChwX2RhdGEpOwogCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2F2X2NsZWFudXAiKTsKIAogICAgIC8qIGZyZWUgYW55IGJ1ZmZlcnMgKi8KICAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQgKiopJnBfc2NiLT5wX2NhcCk7Ci0gICAgcF9zY2ItPnNkcF9kaXNjb3Zlcnlfc3RhcnRlZCA9IEZBTFNFOworICAgIHBfc2NiLT5zZHBfZGlzY292ZXJ5X3N0YXJ0ZWQgPSBmYWxzZTsKICAgICBwX3NjYi0+YXZkdF92ZXJzaW9uID0gMDsKIAogICAgIC8qIGluaXRpYWxpemUgc29tZSBjb250cm9sIGJsb2NrIHZhcmlhYmxlcyAqLwpAQCAtMTA2Myw4ICsxMDY0LDggQEAKIAogICAgIC8qIGlmIGRlLXJlZ2lzdGVyaW5nIHNodXQgZXZlcnl0aGluZyBkb3duICovCiAgICAgbXNnLmhkci5sYXllcl9zcGVjaWZpYyAgPSBwX3NjYi0+aG5kbDsKLSAgICBwX3NjYi0+c3RhcnRlZCAgPSBGQUxTRTsKLSAgICBwX3NjYi0+Y29uZyA9IEZBTFNFOworICAgIHBfc2NiLT5zdGFydGVkICA9IGZhbHNlOworICAgIHBfc2NiLT5jb25nID0gZmFsc2U7CiAgICAgcF9zY2ItPnJvbGUgPSByb2xlOwogICAgIHBfc2NiLT5jdXJfcHNjX21hc2sgPSAwOwogICAgIHBfc2NiLT53YWl0ID0gMDsKQEAgLTEwNzcsOSArMTA3OCw5IEBACiAgICAgICAgIHRCVEFfQVZfU1RBVFVTIHN0YXR1cyA9IEJUQV9BVl9GQUlMX1NUUkVBTTsKICAgICAgICAgKCpidGFfYXZfY2IucF9jYmFjaykoQlRBX0FWX09GRkxPQURfU1RBUlRfUlNQX0VWVCwgKHRCVEFfQVYgKikmc3RhdHVzKTsKICAgICB9Ci0gICAgcF9zY2ItPm9mZmxvYWRfc3RhcnRfcGVuZGluZyA9IEZBTFNFOworICAgIHBfc2NiLT5vZmZsb2FkX3N0YXJ0X3BlbmRpbmcgPSBmYWxzZTsKIAotICAgIHBfc2NiLT5za2lwX3NkcCA9IEZBTFNFOworICAgIHBfc2NiLT5za2lwX3NkcCA9IGZhbHNlOwogICAgIGlmIChwX3NjYi0+ZGVyZWdpc3RyaW5nKQogICAgIHsKICAgICAgICAgLyogcmVtb3ZlIHN0cmVhbSAqLwpAQCAtMTA5NCw3ICsxMDk1LDcgQEAKICAgICBlbHNlCiAgICAgewogICAgICAgICAvKiByZXBvcnQgc3RyZWFtIGNsb3NlZCB0byBtYWluIFNNICovCi0gICAgICAgIG1zZy5pc191cCA9IEZBTFNFOworICAgICAgICBtc2cuaXNfdXAgPSBmYWxzZTsKICAgICAgICAgYmRjcHkobXNnLnBlZXJfYWRkciwgcF9zY2ItPnBlZXJfYWRkcik7CiAgICAgICAgIGJ0YV9hdl9jb25uX2NoZygodEJUQV9BVl9EQVRBICopICZtc2cpOwogICAgIH0KQEAgLTExMTIsNyArMTExMyw3IEBACiB2b2lkIGJ0YV9hdl9mcmVlX3NkYih0QlRBX0FWX1NDQiAqcF9zY2IsIHRCVEFfQVZfREFUQSAqcF9kYXRhKQogewogICAgIFVOVVNFRChwX2RhdGEpOwotICAgIHBfc2NiLT5zZHBfZGlzY292ZXJ5X3N0YXJ0ZWQgPSBGQUxTRTsKKyAgICBwX3NjYi0+c2RwX2Rpc2NvdmVyeV9zdGFydGVkID0gZmFsc2U7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMTI5LDggKzExMzAsOCBAQAogICAgIHRCVEFfQVZfQ0lfU0VUQ09ORklHIHNldGNvbmZpZzsKICAgICB0QVZEVF9TRVBfSU5GTyAgICAgICAqcF9pbmZvOwogICAgIHRBVkRUX0NGRyAgICAgICAgICAgICpwX2V2dF9jZmcgPSAmcF9kYXRhLT5zdHJfbXNnLmNmZzsKLSAgICBVSU5UOCAgIHBzY19tYXNrID0gKHBfZXZ0X2NmZy0+cHNjX21hc2sgfCBwX3NjYi0+Y2ZnLnBzY19tYXNrKTsKLSAgICBVSU5UOCBsb2NhbF9zZXA7ICAgIC8qIHNlcCB0eXBlIG9mIGxvY2FsIGhhbmRsZSBvbiB3aGljaCBjb25uZWN0aW9uIHdhcyByZWNlaXZlZCAqLworICAgIHVpbnQ4X3QgICBwc2NfbWFzayA9IChwX2V2dF9jZmctPnBzY19tYXNrIHwgcF9zY2ItPmNmZy5wc2NfbWFzayk7CisgICAgdWludDhfdCBsb2NhbF9zZXA7ICAgIC8qIHNlcCB0eXBlIG9mIGxvY2FsIGhhbmRsZSBvbiB3aGljaCBjb25uZWN0aW9uIHdhcyByZWNlaXZlZCAqLwogICAgIHRCVEFfQVZfU1RSX01TRyAgKnBfbXNnID0gKHRCVEFfQVZfU1RSX01TRyAqKXBfZGF0YTsKICAgICBVTlVTRUQocF9kYXRhKTsKIApAQCAtMTE3MCw5ICsxMTcxLDkgQEAKICAgICAgICAgcF9zY2ItPnJvbGUgICAgICB8PSBCVEFfQVZfUk9MRV9BRF9BQ1A7CiAgICAgICAgIHBfc2NiLT5jdXJfcHNjX21hc2sgPSBwX2V2dF9jZmctPnBzY19tYXNrOwogICAgICAgICBpZiAoYnRhX2F2X2NiLmZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfUkNURykKLSAgICAgICAgICAgIHBfc2NiLT51c2VfcmMgPSBUUlVFOworICAgICAgICAgICAgcF9zY2ItPnVzZV9yYyA9IHRydWU7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBfc2NiLT51c2VfcmMgPSBGQUxTRTsKKyAgICAgICAgICAgIHBfc2NiLT51c2VfcmMgPSBmYWxzZTsKIAogICAgICAgICBwX3NjYi0+bnVtX3NlcHMgID0gMTsKICAgICAgICAgcF9zY2ItPnNlcF9pbmZvX2lkeCA9IDA7CkBAIC0xMjIzLDcgKzEyMjQsNyBAQAogICAgIGFsYXJtX2NhbmNlbChwX3NjYi0+YXZyY19jdF90aW1lcik7CiAKICAgICBpZiAoYnRhX2F2X2NiLmNvbm5fbGNiKSB7Ci0gICAgICAgIHBfcmNiID0gYnRhX2F2X2dldF9yY2JfYnlfc2hkbCgoVUlOVDgpKHBfc2NiLT5oZGkgKyAxKSk7CisgICAgICAgIHBfcmNiID0gYnRhX2F2X2dldF9yY2JfYnlfc2hkbCgodWludDhfdCkocF9zY2ItPmhkaSArIDEpKTsKICAgICAgICAgaWYgKHBfcmNiKQogICAgICAgICAgICAgYnRhX2F2X2RlbF9yYyhwX3JjYik7CiAgICAgICAgIEFWRFRfRGlzY29ubmVjdFJlcShwX3NjYi0+cGVlcl9hZGRyLCBidGFfYXZfZHRfY2JhY2tbcF9zY2ItPmhkaV0pOwpAQCAtMTI4NCwxNiArMTI4NSwxNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2F2X3NldGNvbmZpZ19yc3AgKHRCVEFfQVZfU0NCICpwX3NjYiwgdEJUQV9BVl9EQVRBICpwX2RhdGEpCiB7Ci0gICAgVUlOVDggICBudW0gPSBwX2RhdGEtPmNpX3NldGNvbmZpZy5udW1fc2VpZCArIDE7Ci0gICAgVUlOVDggICBhdmR0X2hhbmRsZSA9IHBfZGF0YS0+Y2lfc2V0Y29uZmlnLmF2ZHRfaGFuZGxlOwotICAgIFVJTlQ4ICAgKnBfc2VpZCA9IHBfZGF0YS0+Y2lfc2V0Y29uZmlnLnBfc2VpZDsKKyAgICB1aW50OF90IG51bSA9IHBfZGF0YS0+Y2lfc2V0Y29uZmlnLm51bV9zZWlkICsgMTsKKyAgICB1aW50OF90IGF2ZHRfaGFuZGxlID0gcF9kYXRhLT5jaV9zZXRjb25maWcuYXZkdF9oYW5kbGU7CisgICAgdWludDhfdCAqcF9zZWlkID0gcF9kYXRhLT5jaV9zZXRjb25maWcucF9zZWlkOwogICAgIGludCAgICAgaTsKLSAgICBVSU5UOCAgIGxvY2FsX3NlcDsKKyAgICB1aW50OF90IGxvY2FsX3NlcDsKIAogICAgIC8qIHdlIGxpa2UgdGhpcyBjb2RlY190eXBlLiBmaW5kIHRoZSBzZXBfaWR4ICovCiAgICAgbG9jYWxfc2VwID0gYnRhX2F2X2dldF9zY2Jfc2VwX3R5cGUocF9zY2IsYXZkdF9oYW5kbGUpOwogICAgIGJ0YV9hdl9hZGp1c3Rfc2Vwc19pZHgocF9zY2IsIGF2ZHRfaGFuZGxlKTsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfYXZfc2V0Y29uZmlnX3JzcDogc2VwX2lkeDogJWQgY3VyX3BzY19tYXNrOjB4JXgiLCBwX3NjYi0+c2VwX2lkeCwgcF9zY2ItPmN1cl9wc2NfbWFzayk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHNlcF9pZHg6ICVkIGN1cl9wc2NfbWFzazoweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICBwX3NjYi0+c2VwX2lkeCwgcF9zY2ItPmN1cl9wc2NfbWFzayk7CiAKICAgICBpZiAoKEFWRFRfVFNFUF9TTksgPT0gbG9jYWxfc2VwKSAmJiAocF9kYXRhLT5jaV9zZXRjb25maWcuZXJyX2NvZGUgPT0gQVZEVF9TVUNDRVNTKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwX3NjYi0+c2Vwc1twX3NjYi0+c2VwX2lkeF0ucF9hcHBfZGF0YV9jYmFjayAhPSBOVUxMKSkgewpAQCAtMTMxNSw3ICsxMzE3LDcgQEAKICAgICAgICAgcF9zY2ItPndhaXQgPSBCVEFfQVZfV0FJVF9BQ1BfQ0FQU19PTjsKICAgICAgICAgaWYocF9kYXRhLT5jaV9zZXRjb25maWcucmVjZmdfbmVlZGVkKQogICAgICAgICAgICAgcF9zY2ItPnJvbGUgfD0gQlRBX0FWX1JPTEVfU1VTUEVORF9PUFQ7Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9hdl9zZXRjb25maWdfcnNwIHJlY2ZnX25lZWRlZDolZCByb2xlOngleCBudW06JWQiLAorICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyByZWNmZ19uZWVkZWQ6JWQgcm9sZTp4JXggbnVtOiVkIiwgX19mdW5jX18sCiAgICAgICAgICAgICBwX2RhdGEtPmNpX3NldGNvbmZpZy5yZWNmZ19uZWVkZWQsIHBfc2NiLT5yb2xlLCBudW0pOwogICAgICAgICAvKiBjYWxsb3V0IG1vZHVsZSB0ZWxscyBCVEEgdGhlIG51bWJlciBvZiAiZ29vZCIgU0VQcyBhbmQgdGhlaXIgU0VJRHMuCiAgICAgICAgICAqIGdldGNhcCBvbiB0aGVzZSBTRUlEICovCkBAIC0xMzQ2LDcgKzEzNDgsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJzZXBfaW5mb1slZF0gU0VJRDogJWQiLCBpLCBwX3NlaWRbaS0xXSk7CiAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHRoZSBzZXBfaW5mb1tdIHRvIGdldCBjYXBhYmlsaXRpZXMgKi8KLSAgICAgICAgICAgIHBfc2NiLT5zZXBfaW5mb1tpXS5pbl91c2UgPSBGQUxTRTsKKyAgICAgICAgICAgIHBfc2NiLT5zZXBfaW5mb1tpXS5pbl91c2UgPSBmYWxzZTsKICAgICAgICAgICAgIHBfc2NiLT5zZXBfaW5mb1tpXS50c2VwID0gQVZEVF9UU0VQX1NOSzsKICAgICAgICAgICAgIHBfc2NiLT5zZXBfaW5mb1tpXS5tZWRpYV90eXBlID0gcF9zY2ItPm1lZGlhX3R5cGU7CiAgICAgICAgICAgICBwX3NjYi0+c2VwX2luZm9baV0uc2VpZCA9IHBfc2VpZFtpLTFdOwpAQCAtMTM3NiwxNyArMTM3OCwxNyBAQAogewogICAgIHRCVEFfQVZfQ09OTl9DSEcgbXNnOwogICAgIHRCVEFfQVZfT1BFTiAgICBvcGVuOwotICAgIFVJTlQ4ICpwOwotICAgIFVJTlQxNiBtdHU7CisgICAgdWludDhfdCAqcDsKKyAgICB1aW50MTZfdCBtdHU7CiAKICAgICBtc2cuaGRyLmxheWVyX3NwZWNpZmljID0gcF9zY2ItPmhuZGw7Ci0gICAgbXNnLmlzX3VwID0gVFJVRTsKKyAgICBtc2cuaXNfdXAgPSB0cnVlOwogICAgIGJkY3B5KG1zZy5wZWVyX2FkZHIsIHBfc2NiLT5wZWVyX2FkZHIpOwogICAgIHBfc2NiLT5sMmNfY2lkICAgICAgPSBBVkRUX0dldEwyQ2FwQ2hhbm5lbChwX3NjYi0+YXZkdF9oYW5kbGUpOwogICAgIGJ0YV9hdl9jb25uX2NoZygodEJUQV9BVl9EQVRBICopICZtc2cpOwogICAgIC8qIHNldCB0aGUgY29uZ2VzdGlvbiBmbGFnLCBzbyBBViB3b3VsZCBub3Qgc2VuZCBtZWRpYSBwYWNrZXRzIGJ5IGFjY2lkZW50ICovCi0gICAgcF9zY2ItPmNvbmcgPSBUUlVFOwotICAgIHBfc2NiLT5vZmZsb2FkX3N0YXJ0X3BlbmRpbmcgPSBGQUxTRTsKKyAgICBwX3NjYi0+Y29uZyA9IHRydWU7CisgICAgcF9zY2ItPm9mZmxvYWRfc3RhcnRfcGVuZGluZyA9IGZhbHNlOwogCiAKICAgICBwX3NjYi0+c3RyZWFtX210dSA9IHBfZGF0YS0+c3RyX21zZy5tc2cub3Blbl9pbmQucGVlcl9tdHUgLSBBVkRUX01FRElBX0hEUl9TSVpFOwpAQCAtMTM5OCw3ICsxNDAwLDcgQEAKIAogICAgIC8qIFNldCB0aGUgbWVkaWEgY2hhbm5lbCBhcyBtZWRpdW0gcHJpb3JpdHkgKi8KICAgICBMMkNBX1NldFR4UHJpb3JpdHkocF9zY2ItPmwyY19jaWQsIEwyQ0FQX0NITkxfUFJJT1JJVFlfTUVESVVNKTsKLSAgICBMMkNBX1NldENobmxGbHVzaGFiaWxpdHkgKHBfc2NiLT5sMmNfY2lkLCBUUlVFKTsKKyAgICBMMkNBX1NldENobmxGbHVzaGFiaWxpdHkgKHBfc2NiLT5sMmNfY2lkLCB0cnVlKTsKIAogICAgIGJ0YV9zeXNfY29ubl9vcGVuKEJUQV9JRF9BViwgcF9zY2ItPmFwcF9pZCwgcF9zY2ItPnBlZXJfYWRkcik7CiAgICAgbWVtc2V0KCZwX3NjYi0+cV9pbmZvLCAwLCBzaXplb2YodEJUQV9BVl9RX0lORk8pKTsKQEAgLTE0MzAsNyArMTQzMiw3IEBACiAgICAgICAgICAgICBpZihIQ0lfRURSX0FDTF8zTVBTX1NVUFBPUlRFRChwKSkKICAgICAgICAgICAgICAgICBvcGVuLmVkciB8PSBCVEFfQVZfRURSXzNNQlBTOwogICAgICAgICB9Ci0jaWYoIGRlZmluZWQgQlRBX0FSX0lOQ0xVREVEICkgJiYgKEJUQV9BUl9JTkNMVURFRCA9PSBUUlVFKQorI2lmIChCVEFfQVJfSU5DTFVERUQgPT0gVFJVRSkKICAgICAgICAgYnRhX2FyX2F2ZHRfY29ubihCVEFfSURfQVYsIG9wZW4uYmRfYWRkcik7CiAjZW5kaWYKICAgICAgICAgaWYgKHBfc2NiLT5zZXBzW3Bfc2NiLT5zZXBfaWR4XS50c2VwID09IEFWRFRfVFNFUF9TUkMgKQpAQCAtMTUzNSw3ICsxNTM3LDcgQEAKICAgICBhbGFybV9jYW5jZWwoYnRhX2F2X2NiLmxpbmtfc2lnbmFsbGluZ190aW1lcik7CiAKICAgICAvKiBjbG9zZSBzdHJlYW0gKi8KLSAgICBwX3NjYi0+c3RhcnRlZCA9IEZBTFNFOworICAgIHBfc2NiLT5zdGFydGVkID0gZmFsc2U7CiAKICAgICAvKiBkcm9wIHRoZSBidWZmZXJzIHF1ZXVlZCBpbiBMMkNBUCAqLwogICAgIEwyQ0FfRmx1c2hDaGFubmVsIChwX3NjYi0+bDJjX2NpZCwgTDJDQVBfRkxVU0hfQ0hBTlNfQUxMKTsKQEAgLTE1NjIsNyArMTU2NCw3IEBACiB7CiAgICAgVU5VU0VEKHBfZGF0YSk7CiAKLSAgICBwX3NjYi0+c2RwX2Rpc2NvdmVyeV9zdGFydGVkID0gRkFMU0U7CisgICAgcF9zY2ItPnNkcF9kaXNjb3Zlcnlfc3RhcnRlZCA9IGZhbHNlOwogICAgIGlmIChwX3NjYi0+Y29sbF9tYXNrICYgQlRBX0FWX0NPTExfSU5DX1RNUikKICAgICB7CiAgICAgICAgIC8qIFNOSyBpbml0aWF0ZWQgTDJDIGNvbm5lY3Rpb24gd2hpbGUgU1JDIHdhcyBkb2luZyBTRFAuICAgICovCkBAIC0xNTg4LDcgKzE1OTAsNyBAQAogICAgIGlmICghcF9zY2ItPm9wZW5fc3RhdHVzKQogICAgICAgICBwX3NjYi0+b3Blbl9zdGF0dXMgPSBCVEFfQVZfRkFJTF9TRFA7CiAKLSAgICBwX3NjYi0+c2RwX2Rpc2NvdmVyeV9zdGFydGVkID0gRkFMU0U7CisgICAgcF9zY2ItPnNkcF9kaXNjb3Zlcnlfc3RhcnRlZCA9IGZhbHNlOwogICAgIGJ0YV9hdl9zdHJfY2xvc2VkKHBfc2NiLCBwX2RhdGEpOwogfQogCkBAIC0xNjA1LDkgKzE2MDcsOSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2F2X2Rpc2NfcmVzdWx0cyAodEJUQV9BVl9TQ0IgKnBfc2NiLCB0QlRBX0FWX0RBVEEgKnBfZGF0YSkKIHsKLSAgICBVSU5UOCBudW1fc25rcyA9IDAsIG51bV9zcmNzID0wLCBpOworICAgIHVpbnQ4X3QgbnVtX3Nua3MgPSAwLCBudW1fc3JjcyA9MCwgaTsKICAgICAvKiBvdXIgdXVpZCBpbiBjYXNlIHdlIGluaXRpYXRlIGNvbm5lY3Rpb24gKi8KLSAgICBVSU5UMTYgdXVpZF9pbnQgPSBwX3NjYi0+dXVpZF9pbnQ7CisgICAgdWludDE2X3QgdXVpZF9pbnQgPSBwX3NjYi0+dXVpZF9pbnQ7CiAKICAgICBBUFBMX1RSQUNFX0RFQlVHKCIgaW5pdGlhdG9yIFVVSUQgMHgleCIsIHV1aWRfaW50KTsKICAgICAvKiBzdG9yZSBudW1iZXIgb2Ygc3RyZWFtIGVuZHBvaW50cyByZXR1cm5lZCAqLwpAQCAtMTYxNiw3ICsxNjE4LDcgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgcF9zY2ItPm51bV9zZXBzOyBpKyspCiAgICAgewogICAgICAgICAvKiBzdGVhbSBub3QgaW4gdXNlLCBpcyBhIHNpbmssIGFuZCBpcyBhdWRpbyAqLwotICAgICAgICBpZiAoKHBfc2NiLT5zZXBfaW5mb1tpXS5pbl91c2UgPT0gRkFMU0UpICYmCisgICAgICAgIGlmICgocF9zY2ItPnNlcF9pbmZvW2ldLmluX3VzZSA9PSBmYWxzZSkgJiYKICAgICAgICAgICAgIChwX3NjYi0+c2VwX2luZm9baV0ubWVkaWFfdHlwZSA9PSBwX3NjYi0+bWVkaWFfdHlwZSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmKChwX3NjYi0+c2VwX2luZm9baV0udHNlcCA9PSBBVkRUX1RTRVBfU05LKSAmJgpAQCAtMTY2NCw3ICsxNjY2LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9hdl9kaXNjX3Jlc19hc19hY3AgKHRCVEFfQVZfU0NCICpwX3NjYiwgdEJUQV9BVl9EQVRBICpwX2RhdGEpCiB7Ci0gICAgVUlOVDggbnVtX3Nua3MgPSAwLCBpOworICAgIHVpbnQ4X3QgbnVtX3Nua3MgPSAwLCBpOwogCiAgICAgLyogc3RvcmUgbnVtYmVyIG9mIHN0cmVhbSBlbmRwb2ludHMgcmV0dXJuZWQgKi8KICAgICBwX3NjYi0+bnVtX3NlcHMgPSBwX2RhdGEtPnN0cl9tc2cubXNnLmRpc2NvdmVyX2NmbS5udW1fc2VwczsKQEAgLTE2NzcsNyArMTY3OSw3IEBACiAgICAgICAgIGlmICgocF9zY2ItPnNlcF9pbmZvW2ldLnRzZXAgPT0gQVZEVF9UU0VQX1NOSykgJiYKICAgICAgICAgICAgIChwX3NjYi0+c2VwX2luZm9baV0ubWVkaWFfdHlwZSA9PSBwX3NjYi0+bWVkaWFfdHlwZSkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHBfc2NiLT5zZXBfaW5mb1tpXS5pbl91c2UgPSBGQUxTRTsKKyAgICAgICAgICAgIHBfc2NiLT5zZXBfaW5mb1tpXS5pbl91c2UgPSBmYWxzZTsKICAgICAgICAgICAgIG51bV9zbmtzKys7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNzEzLDEyICsxNzE1LDEyIEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfYXZfc2F2ZV9jYXBzKHRCVEFfQVZfU0NCICpwX3NjYiwgdEJUQV9BVl9EQVRBICpwX2RhdGEpCiB7Ci0gICAgdEFWRFRfQ0ZHICAgY2ZnOwotICAgIHRBVkRUX1NFUF9JTkZPICAqcF9pbmZvID0gJnBfc2NiLT5zZXBfaW5mb1twX3NjYi0+c2VwX2luZm9faWR4XTsKLSAgICBVSU5UOCAgICAgICBvbGRfd2FpdCA9IHBfc2NiLT53YWl0OwotICAgIEJPT0xFQU4gICAgIGdldGNhcF9kb25lID0gRkFMU0U7CisgICAgdEFWRFRfQ0ZHIGNmZzsKKyAgICB0QVZEVF9TRVBfSU5GTyAqcF9pbmZvID0gJnBfc2NiLT5zZXBfaW5mb1twX3NjYi0+c2VwX2luZm9faWR4XTsKKyAgICB1aW50OF90IG9sZF93YWl0ID0gcF9zY2ItPndhaXQ7CisgICAgYm9vbCBnZXRjYXBfZG9uZSA9IGZhbHNlOwogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2F2X3NhdmVfY2FwcyBudW1fc2VwczolZCBzZXBfaW5mb19pZHg6JWQgd2FpdDp4JXgiLAorICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIG51bV9zZXBzOiVkIHNlcF9pbmZvX2lkeDolZCB3YWl0OngleCIsIF9fZnVuY19fLAogICAgICAgICBwX3NjYi0+bnVtX3NlcHMsIHBfc2NiLT5zZXBfaW5mb19pZHgsIHBfc2NiLT53YWl0KTsKICAgICBtZW1jcHkoJmNmZywgcF9zY2ItPnBfY2FwLCBzaXplb2YodEFWRFRfQ0ZHKSk7CiAgICAgLyogbGV0IGFwcGxpY2F0aW9uIGtub3cgdGhlIGNhcGFiaWxpdHkgb2YgdGhlIFNOSyAqLwpAQCAtMTczNCwxMCArMTczNiwxMCBAQAogICAgICAgICAvKiBJbiB0aGlzIGNhc2UsIHdlIGFyZSBkb25lIHdpdGggZ2V0Y2FwIHdpdGhvdXQgc2VuZGluZyBhbm90aGVyICAgICAgICAqLwogICAgICAgICAvKiByZXF1ZXN0IHRvIEFWRFQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICBpZiAoIWJ0YV9hdl9uZXh0X2dldGNhcChwX3NjYiwgcF9kYXRhKSkKLSAgICAgICAgICAgIGdldGNhcF9kb25lID0gVFJVRTsKKyAgICAgICAgICAgIGdldGNhcF9kb25lID0gdHJ1ZTsKICAgICB9CiAgICAgZWxzZQotICAgICAgICBnZXRjYXBfZG9uZSA9IFRSVUU7CisgICAgICAgIGdldGNhcF9kb25lID0gdHJ1ZTsKIAogICAgIGlmIChnZXRjYXBfZG9uZSkKICAgICB7CkBAIC0xNzY0LDcgKzE3NjYsNyBAQAogewogICAgIFVOVVNFRChwX2RhdGEpOwogCi0gICAgcF9zY2ItPnVzZV9yYyA9IFRSVUU7CisgICAgcF9zY2ItPnVzZV9yYyA9IHRydWU7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNzc4LDcgKzE3ODAsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2F2X2Njb19jbG9zZSAodEJUQV9BVl9TQ0IgKnBfc2NiLCB0QlRBX0FWX0RBVEEgKnBfZGF0YSkKIHsKLSAgICBVSU5UMTYgbXR1OworICAgIHVpbnQxNl90IG10dTsKICAgICBVTlVTRUQocF9kYXRhKTsKIAogICAgIG10dSA9IGJ0YV9hdl9jaGtfbXR1KHBfc2NiLCBCVEFfQVZfTUFYX0EyRFBfTVRVKTsKQEAgLTE3OTgsOSArMTgwMCw5IEBACiB2b2lkIGJ0YV9hdl9vcGVuX2ZhaWxlZCAodEJUQV9BVl9TQ0IgKnBfc2NiLCB0QlRBX0FWX0RBVEEgKnBfZGF0YSkKIHsKIAotICAgIEJPT0xFQU4gaXNfYXZfb3BlbmVkID0gRkFMU0U7CisgICAgYm9vbCBpc19hdl9vcGVuZWQgPSBmYWxzZTsKICAgICB0QlRBX0FWX1NDQiAqIHBfb3BlbmVkX3NjYiA9IE5VTEw7Ci0gICAgVUlOVDggaWR4OworICAgIHVpbnQ4X3QgaWR4OwogICAgIHRCVEFfQVZfT1BFTiAgICBvcGVuOwogCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2F2X29wZW5fZmFpbGVkIik7CkBAIC0xODA4LDE3ICsxODEwLDE3IEBACiAgICAgYnRhX2F2X2Njb19jbG9zZShwX3NjYiwgcF9kYXRhKTsKIAogICAgIC8qIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYWxyZWFkeSBhbiBvcGVuZWQgYXVkaW8gb3IgdmlkZW8gY29ubmVjdGlvbiB3aXRoIHRoZSBzYW1lIGRldmljZSAqLwotICAgIGZvciAoaWR4ID0gMDsgKGlkeCA8IEJUQV9BVl9OVU1fU1RSUykgJiYgKGlzX2F2X29wZW5lZCA9PSBGQUxTRSk7IGlkeCsrICkKKyAgICBmb3IgKGlkeCA9IDA7IChpZHggPCBCVEFfQVZfTlVNX1NUUlMpICYmIChpc19hdl9vcGVuZWQgPT0gZmFsc2UpOyBpZHgrKyApCiAgICAgewogICAgICAgICBwX29wZW5lZF9zY2IgPSBidGFfYXZfY2IucF9zY2JbaWR4XTsKICAgICAgICAgaWYgKHBfb3BlbmVkX3NjYiAmJiAocF9vcGVuZWRfc2NiLT5zdGF0ZSA9PSBCVEFfQVZfT1BFTl9TU1QpICYmICghYmRjbXAocF9vcGVuZWRfc2NiLT5wZWVyX2FkZHIscF9zY2ItPnBlZXJfYWRkciApKSApCi0gICAgICAgICAgICBpc19hdl9vcGVuZWQgPSBUUlVFOworICAgICAgICAgICAgaXNfYXZfb3BlbmVkID0gdHJ1ZTsKIAogICAgIH0KIAogICAgIC8qIGlmIHRoZXJlIGlzIGFscmVhZHkgYW4gYWN0aXZlIEFWIGNvbm5uZWN0aW9uIHdpdGggdGhlIHNhbWUgYmRfYWRkciwKICAgICAgICBkb24ndCBzZW5kIGRpc2Nvbm5lY3QgcmVxLCBqdXN0IHJlcG9ydCB0aGUgb3BlbiBldmVudCB3aXRoIEJUQV9BVl9GQUlMX0dFVF9DQVAgc3RhdHVzICovCi0gICAgaWYgKGlzX2F2X29wZW5lZCA9PSBUUlVFKQorICAgIGlmIChpc19hdl9vcGVuZWQgPT0gdHJ1ZSkKICAgICB7CiAgICAgICAgIGJkY3B5KG9wZW4uYmRfYWRkciwgcF9zY2ItPnBlZXJfYWRkcik7CiAgICAgICAgIG9wZW4uY2hubCAgID0gcF9zY2ItPmNobmw7CkBAIC0xODU4LDkgKzE4NjAsOSBAQAogdm9pZCBidGFfYXZfZ2V0Y2FwX3Jlc3VsdHMgKHRCVEFfQVZfU0NCICpwX3NjYiwgdEJUQV9BVl9EQVRBICpwX2RhdGEpCiB7CiAgICAgdEFWRFRfQ0ZHICAgY2ZnOwotICAgIFVJTlQ4ICAgICAgIG1lZGlhX3R5cGU7CisgICAgdWludDhfdCAgICAgICBtZWRpYV90eXBlOwogICAgIHRBVkRUX1NFUF9JTkZPICAqcF9pbmZvID0gJnBfc2NiLT5zZXBfaW5mb1twX3NjYi0+c2VwX2luZm9faWR4XTsKLSAgICBVSU5UMTYgdXVpZF9pbnQ7IC8qIFVVSUQgZm9yIHdoaWNoIGNvbm5lY3Rpb24gd2FzIGluaXRpYXRpZWQgKi8KKyAgICB1aW50MTZfdCB1dWlkX2ludDsgLyogVVVJRCBmb3Igd2hpY2ggY29ubmVjdGlvbiB3YXMgaW5pdGlhdGllZCAqLwogCiAgICAgbWVtY3B5KCZjZmcsICZwX3NjYi0+Y2ZnLCBzaXplb2YodEFWRFRfQ0ZHKSk7CiAgICAgY2ZnLm51bV9jb2RlYyA9IDE7CkBAIC0xOTUyLDEwICsxOTU0LDEwIEBACiB2b2lkIGJ0YV9hdl9zZXRjb25maWdfcmVqICh0QlRBX0FWX1NDQiAqcF9zY2IsIHRCVEFfQVZfREFUQSAqcF9kYXRhKQogewogICAgIHRCVEFfQVZfUkVKRUNUIHJlamVjdDsKLSAgICBVSU5UOCAgIGF2ZHRfaGFuZGxlID0gcF9kYXRhLT5jaV9zZXRjb25maWcuYXZkdF9oYW5kbGU7CisgICAgdWludDhfdCBhdmR0X2hhbmRsZSA9IHBfZGF0YS0+Y2lfc2V0Y29uZmlnLmF2ZHRfaGFuZGxlOwogCiAgICAgYnRhX2F2X2FkanVzdF9zZXBzX2lkeChwX3NjYiwgYXZkdF9oYW5kbGUpOwotICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9hdl9zZXRjb25maWdfcmVqOiBzZXBfaWR4OiAlZCIscF9zY2ItPnNlcF9pZHgpOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBzZXBfaWR4OiAlZCIsIF9fZnVuY19fLCBwX3NjYi0+c2VwX2lkeCk7CiAgICAgQVZEVF9Db25maWdSc3AocF9zY2ItPmF2ZHRfaGFuZGxlLCBwX3NjYi0+YXZkdF9sYWJlbCwgQVZEVF9FUlJfVU5TVVBfQ0ZHLCAwKTsKIAogICAgIGJkY3B5KHJlamVjdC5iZF9hZGRyLCBwX2RhdGEtPnN0cl9tc2cuYmRfYWRkcik7CkBAIC0yMDA3LDEwICsyMDA5LDExIEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfYXZfZG9fc3RhcnQgKHRCVEFfQVZfU0NCICpwX3NjYiwgdEJUQV9BVl9EQVRBICpwX2RhdGEpCiB7Ci0gICAgVUlOVDggcG9saWN5ID0gSENJX0VOQUJMRV9TTklGRl9NT0RFOwotICAgIFVJTlQ4ICAgICAgIGN1cl9yb2xlOworICAgIHVpbnQ4X3QgcG9saWN5ID0gSENJX0VOQUJMRV9TTklGRl9NT0RFOworICAgIHVpbnQ4X3QgY3VyX3JvbGU7CiAKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfYXZfZG9fc3RhcnQgc2NvX29jY3VwaWVkOiVkLCByb2xlOngleCwgc3RhcnRlZDolZCIsIGJ0YV9hdl9jYi5zY29fb2NjdXBpZWQsIHBfc2NiLT5yb2xlLCBwX3NjYi0+c3RhcnRlZCk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgc2NvX29jY3VwaWVkOiVkLCByb2xlOngleCwgc3RhcnRlZDolZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgYnRhX2F2X2NiLnNjb19vY2N1cGllZCwgcF9zY2ItPnJvbGUsIHBfc2NiLT5zdGFydGVkKTsKICAgICBpZiAoYnRhX2F2X2NiLnNjb19vY2N1cGllZCkKICAgICB7CiAgICAgICAgIGJ0YV9hdl9zdGFydF9mYWlsZWQocF9zY2IsIHBfZGF0YSk7CkBAIC0yMDI4LDcgKzIwMzEsNyBAQAogCiAgICAgYnRhX3N5c19jbGVhcl9wb2xpY3koQlRBX0lEX0FWLCBwb2xpY3ksIHBfc2NiLT5wZWVyX2FkZHIpOwogCi0gICAgaWYgKChwX3NjYi0+c3RhcnRlZCA9PSBGQUxTRSkgJiYgKChwX3NjYi0+cm9sZSAmIEJUQV9BVl9ST0xFX1NUQVJUX0lOVCkgPT0gMCkpCisgICAgaWYgKChwX3NjYi0+c3RhcnRlZCA9PSBmYWxzZSkgJiYgKChwX3NjYi0+cm9sZSAmIEJUQV9BVl9ST0xFX1NUQVJUX0lOVCkgPT0gMCkpCiAgICAgewogICAgICAgICBwX3NjYi0+cm9sZSB8PSBCVEFfQVZfUk9MRV9TVEFSVF9JTlQ7CiAgICAgICAgIGJ0YV9zeXNfYnVzeShCVEFfSURfQVYsIGJ0YV9hdl9jYi5hdWRpb19vcGVuX2NudCwgcF9zY2ItPnBlZXJfYWRkcik7CkBAIC0yMDYxLDEyICsyMDY0LDEyIEBACiB2b2lkIGJ0YV9hdl9zdHJfc3RvcHBlZCAodEJUQV9BVl9TQ0IgKnBfc2NiLCB0QlRBX0FWX0RBVEEgKnBfZGF0YSkKIHsKICAgICB0QlRBX0FWX1NVU1BFTkQgc3VzcGVuZF9yc3A7Ci0gICAgVUlOVDggICBzdGFydCA9IHBfc2NiLT5zdGFydGVkOwotICAgIEJPT0xFQU4gc3VzX2V2dCA9IFRSVUU7Ci0gICAgQlRfSERSICAqcF9idWY7Ci0gICAgVUlOVDggcG9saWN5ID0gSENJX0VOQUJMRV9TTklGRl9NT0RFOworICAgIHVpbnQ4X3Qgc3RhcnQgPSBwX3NjYi0+c3RhcnRlZDsKKyAgICBib29sIHN1c19ldnQgPSB0cnVlOworICAgIEJUX0hEUiAqcF9idWY7CisgICAgdWludDhfdCBwb2xpY3kgPSBIQ0lfRU5BQkxFX1NOSUZGX01PREU7CiAKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCJidGFfYXZfc3RyX3N0b3BwZWQ6YXVkaW9fb3Blbl9jbnQ9JWQsIHBfZGF0YSAleCIsCisgICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6YXVkaW9fb3Blbl9jbnQ9JWQsIHBfZGF0YSAleCIsIF9fZnVuY19fLAogICAgICAgICAgICAgYnRhX2F2X2NiLmF1ZGlvX29wZW5fY250LCBwX2RhdGEpOwogCiAgICAgYnRhX3N5c19pZGxlKEJUQV9JRF9BViwgYnRhX2F2X2NiLmF1ZGlvX29wZW5fY250LCBwX3NjYi0+cGVlcl9hZGRyKTsKQEAgLTIwODMsMTAgKzIwODYsMTAgQEAKICAgICAgICAgICAgIHRCVEFfQVZfU1RBVFVTIHN0YXR1cyA9IEJUQV9BVl9GQUlMX1NUUkVBTTsKICAgICAgICAgICAgICgqYnRhX2F2X2NiLnBfY2JhY2spKEJUQV9BVl9PRkZMT0FEX1NUQVJUX1JTUF9FVlQsICh0QlRBX0FWICopJnN0YXR1cyk7CiAgICAgICAgIH0KLSAgICAgICAgcF9zY2ItPm9mZmxvYWRfc3RhcnRfcGVuZGluZyA9IEZBTFNFOworICAgICAgICBwX3NjYi0+b2ZmbG9hZF9zdGFydF9wZW5kaW5nID0gZmFsc2U7CiAKLSAgICAgICAgYnRhX2F2X3N0cmVhbV9jaGcocF9zY2IsIEZBTFNFKTsKLSAgICAgICAgcF9zY2ItPmNvX3N0YXJ0ZWQgPSBGQUxTRTsKKyAgICAgICAgYnRhX2F2X3N0cmVhbV9jaGcocF9zY2IsIGZhbHNlKTsKKyAgICAgICAgcF9zY2ItPmNvX3N0YXJ0ZWQgPSBmYWxzZTsKIAogICAgICAgICBwX3NjYi0+cF9jb3MtPnN0b3AocF9zY2ItPmhuZGwsIHBfc2NiLT5jb2RlY190eXBlKTsKICAgICAgICAgTDJDQV9TZXRGbHVzaFRpbWVvdXQocF9zY2ItPnBlZXJfYWRkciwgTDJDQVBfREVGQVVMVF9GTFVTSF9UTyk7CkBAIC0yMTE0LDIzICsyMTE3LDIzIEBACiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoInN1c3BlbmRpbmc6ICVkLCBzdXA6JWQiLCBzdGFydCwgcF9zY2ItPnN1c3BlbmRfc3VwKTsKICAgICAgICAgaWYgKChzdGFydCkgICYmIChwX3NjYi0+c3VzcGVuZF9zdXApKQogICAgICAgICB7Ci0gICAgICAgICAgICBzdXNfZXZ0ID0gRkFMU0U7CisgICAgICAgICAgICBzdXNfZXZ0ID0gZmFsc2U7CiAgICAgICAgICAgICBwX3NjYi0+bDJjX2J1ZnMgPSAwOwogICAgICAgICAgICAgQVZEVF9TdXNwZW5kUmVxKCZwX3NjYi0+YXZkdF9oYW5kbGUsIDEpOwogICAgICAgICB9CiAKLSAgICAgICAgLyogc2VuZCBTVVNQRU5EX0VWVCBldmVudCBvbmx5IGlmIG5vdCBpbiByZWNvbmZpZ3VyaW5nIHN0YXRlIGFuZCBzdXNfZXZ0IGlzIFRSVUUqLworICAgICAgICAvKiBzZW5kIFNVU1BFTkRfRVZUIGV2ZW50IG9ubHkgaWYgbm90IGluIHJlY29uZmlndXJpbmcgc3RhdGUgYW5kIHN1c19ldnQgaXMgdHJ1ZSovCiAgICAgICAgIGlmICgoc3VzX2V2dCkmJihwX3NjYi0+c3RhdGUgIT0gQlRBX0FWX1JDRkdfU1NUKSkKICAgICAgICAgewogICAgICAgICAgICAgc3VzcGVuZF9yc3Auc3RhdHVzID0gQlRBX0FWX1NVQ0NFU1M7Ci0gICAgICAgICAgICBzdXNwZW5kX3JzcC5pbml0aWF0b3IgPSBUUlVFOworICAgICAgICAgICAgc3VzcGVuZF9yc3AuaW5pdGlhdG9yID0gdHJ1ZTsKICAgICAgICAgICAgICgqYnRhX2F2X2NiLnBfY2JhY2spKEJUQV9BVl9TVVNQRU5EX0VWVCwgKHRCVEFfQVYgKikgJnN1c3BlbmRfcnNwKTsKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlCiAgICAgewogICAgICAgICBzdXNwZW5kX3JzcC5zdGF0dXMgPSBCVEFfQVZfU1VDQ0VTUzsKLSAgICAgICAgc3VzcGVuZF9yc3AuaW5pdGlhdG9yID0gVFJVRTsKKyAgICAgICAgc3VzcGVuZF9yc3AuaW5pdGlhdG9yID0gdHJ1ZTsKICAgICAgICAgQVBQTF9UUkFDRV9FVkVOVCgiYnRhX2F2X3N0cl9zdG9wcGVkIHN0YXR1cyAlZCIsIHN1c3BlbmRfcnNwLnN0YXR1cyk7CiAKICAgICAgICAgLyogc2VuZCBTVE9QX0VWVCBldmVudCBvbmx5IGlmIG5vdCBpbiByZWNvbmZpZ3VyaW5nIHN0YXRlICovCkBAIC0yMTgzLDggKzIxODYsOCBAQAogICAgIHsKICAgICAgICAgaWYocF9zY2ItPnN0YXJ0ZWQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHN0b3AuZmx1c2ggICA9IEZBTFNFOwotICAgICAgICAgICAgc3RvcC5zdXNwZW5kID0gVFJVRTsKKyAgICAgICAgICAgIHN0b3AuZmx1c2ggICA9IGZhbHNlOworICAgICAgICAgICAgc3RvcC5zdXNwZW5kID0gdHJ1ZTsKICAgICAgICAgICAgIGJ0YV9hdl9zdHJfc3RvcHBlZChwX3NjYiwgKHRCVEFfQVZfREFUQSAqKSZzdG9wKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCkBAIC0yMjAxLDcgKzIyMDQsNyBAQAogICAgICAgICBpZihwX3NjYi0+c3RhcnRlZCkKICAgICAgICAgewogICAgICAgICAgICAgYnRhX2F2X3N0cl9zdG9wcGVkKHBfc2NiLCBOVUxMKTsKLSAgICAgICAgICAgIHBfc2NiLT5zdGFydGVkID0gRkFMU0U7CisgICAgICAgICAgICBwX3NjYi0+c3RhcnRlZCA9IGZhbHNlOwogCiAgICAgICAgICAgICAvKiBkcm9wIHRoZSBidWZmZXJzIHF1ZXVlZCBpbiBMMkNBUCAqLwogICAgICAgICAgICAgTDJDQV9GbHVzaENoYW5uZWwgKHBfc2NiLT5sMmNfY2lkLCBMMkNBUF9GTFVTSF9DSEFOU19BTEwpOwpAQCAtMjIyMywxMCArMjIyNiwxMCBAQAogdm9pZCBidGFfYXZfZGF0YV9wYXRoICh0QlRBX0FWX1NDQiAqcF9zY2IsIHRCVEFfQVZfREFUQSAqcF9kYXRhKQogewogICAgIEJUX0hEUiAgKnBfYnVmID0gTlVMTDsKLSAgICBVSU5UMzIgIGRhdGFfbGVuOwotICAgIFVJTlQzMiAgdGltZXN0YW1wOwotICAgIEJPT0xFQU4gbmV3X2J1ZiA9IEZBTFNFOwotICAgIFVJTlQ4ICAgbV9wdCA9IDB4NjAgfCBwX3NjYi0+Y29kZWNfdHlwZTsKKyAgICB1aW50MzJfdCAgZGF0YV9sZW47CisgICAgdWludDMyX3QgIHRpbWVzdGFtcDsKKyAgICBib29sIG5ld19idWYgPSBmYWxzZTsKKyAgICB1aW50OF90ICAgbV9wdCA9IDB4NjAgfCBwX3NjYi0+Y29kZWNfdHlwZTsKICAgICB0QVZEVF9EQVRBX09QVF9NQVNLICAgICBvcHQ7CiAgICAgVU5VU0VEKHBfZGF0YSk7CiAKQEAgLTIyMzksMTcgKzIyNDIsMTcgQEAKICAgICBBUFBMX1RSQUNFX0VSUk9SKCJxOiAlZCIsIHBfc2NiLT5sMmNfYnVmcyk7CiAgICAgKi8KICAgICAvL0Fsd2F5cyBnZXQgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGJ1ZnMgcXVlJ2QgdXAKLSAgICBwX3NjYi0+bDJjX2J1ZnMgPSAoVUlOVDgpTDJDQV9GbHVzaENoYW5uZWwgKHBfc2NiLT5sMmNfY2lkLCBMMkNBUF9GTFVTSF9DSEFOU19HRVQpOworICAgIHBfc2NiLT5sMmNfYnVmcyA9ICh1aW50OF90KUwyQ0FfRmx1c2hDaGFubmVsIChwX3NjYi0+bDJjX2NpZCwgTDJDQVBfRkxVU0hfQ0hBTlNfR0VUKTsKIAogICAgIGlmICghbGlzdF9pc19lbXB0eShwX3NjYi0+YTJkX2xpc3QpKSB7CiAgICAgICAgIHBfYnVmID0gKEJUX0hEUiAqKWxpc3RfZnJvbnQocF9zY2ItPmEyZF9saXN0KTsKICAgICAgICAgbGlzdF9yZW1vdmUocF9zY2ItPmEyZF9saXN0LCBwX2J1Zik7CiAgICAgICAgICAvKiB1c2UgcV9pbmZvLmEyZCBkYXRhLCByZWFkIHRoZSB0aW1lc3RhbXAgKi8KLSAgICAgICAgdGltZXN0YW1wID0gKihVSU5UMzIgKikocF9idWYgKyAxKTsKKyAgICAgICAgdGltZXN0YW1wID0gKih1aW50MzJfdCAqKShwX2J1ZiArIDEpOwogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgICBuZXdfYnVmID0gVFJVRTsKKyAgICAgICAgbmV3X2J1ZiA9IHRydWU7CiAgICAgICAgIC8qIGEyZF9saXN0IGVtcHR5LCBjYWxsIGNvX2RhdGEsIGR1cCBkYXRhIHRvIG90aGVyIGNoYW5uZWxzICovCiAgICAgICAgIHBfYnVmID0gKEJUX0hEUiAqKXBfc2NiLT5wX2Nvcy0+ZGF0YShwX3NjYi0+Y29kZWNfdHlwZSwgJmRhdGFfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZXN0YW1wKTsKQEAgLTIyNTcsNyArMjI2MCw3IEBACiAgICAgICAgIGlmIChwX2J1ZikKICAgICAgICAgewogICAgICAgICAgICAgLyogdXNlIHRoZSBvZmZzZXQgYXJlYSBmb3IgdGhlIHRpbWUgc3RhbXAgKi8KLSAgICAgICAgICAgICooVUlOVDMyICopKHBfYnVmICsgMSkgPSB0aW1lc3RhbXA7CisgICAgICAgICAgICAqKHVpbnQzMl90ICopKHBfYnVmICsgMSkgPSB0aW1lc3RhbXA7CiAKICAgICAgICAgICAgIC8qIGR1cCB0aGUgZGF0YSB0byBvdGhlciBjaGFubmVscyAqLwogICAgICAgICAgICAgYnRhX2F2X2R1cF9hdWRpb19idWYocF9zY2IsIHBfYnVmKTsKQEAgLTIyODMsNyArMjI4Niw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEFWRFRfV3JpdGVSZXFPcHQocF9zY2ItPmF2ZHRfaGFuZGxlLCBwX2J1ZiwgdGltZXN0YW1wLCBtX3B0LCBvcHQpOwotICAgICAgICAgICAgcF9zY2ItPmNvbmcgPSBUUlVFOworICAgICAgICAgICAgcF9zY2ItPmNvbmcgPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewpAQCAtMjMyMywyNiArMjMyNiwyNiBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2F2X3N0YXJ0X29rICh0QlRBX0FWX1NDQiAqcF9zY2IsIHRCVEFfQVZfREFUQSAqcF9kYXRhKQogewotICAgIHRCVEFfQVZfU1RBUlQgICBzdGFydDsKKyAgICB0QlRBX0FWX1NUQVJUICAgIHN0YXJ0OwogICAgIHRCVEFfQVZfQVBJX1NUT1Agc3RvcDsKLSAgICBCT09MRUFOICAgICAgICAgaW5pdGlhdG9yID0gRkFMU0U7Ci0gICAgQk9PTEVBTiAgICAgICAgIHN1c3BlbmQgPSBGQUxTRTsKLSAgICBVSU5UMTYgICAgICAgICAgZmx1c2hfdG87Ci0gICAgVUlOVDggICAgICAgICAgIG5ld19yb2xlID0gcF9zY2ItPnJvbGU7Ci0gICAgQlRfSERSICAgICAgICAgIGhkcjsKLSAgICBVSU5UOCAgICAgICAgICAgcG9saWN5ID0gSENJX0VOQUJMRV9TTklGRl9NT0RFOwotICAgIFVJTlQ4ICAgICAgICAgICBjdXJfcm9sZTsKKyAgICBib29sICAgICAgICAgICAgIGluaXRpYXRvciA9IGZhbHNlOworICAgIGJvb2wgICAgICAgICAgICAgc3VzcGVuZCA9IGZhbHNlOworICAgIHVpbnQxNl90ICAgICAgICAgZmx1c2hfdG87CisgICAgdWludDhfdCAgICAgICAgICBuZXdfcm9sZSA9IHBfc2NiLT5yb2xlOworICAgIEJUX0hEUiAgICAgICAgICAgaGRyOworICAgIHVpbnQ4X3QgICAgICAgICAgcG9saWN5ID0gSENJX0VOQUJMRV9TTklGRl9NT0RFOworICAgIHVpbnQ4X3QgICAgICAgICAgY3VyX3JvbGU7CiAKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfYXZfc3RhcnRfb2sgd2FpdDp4JXgsIHJvbGU6eCV4IiwgcF9zY2ItPndhaXQsIHBfc2NiLT5yb2xlKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyB3YWl0OngleCwgcm9sZTp4JXgiLCBfX2Z1bmNfXywgcF9zY2ItPndhaXQsIHBfc2NiLT5yb2xlKTsKIAotICAgIHBfc2NiLT5zdGFydGVkID0gVFJVRTsKKyAgICBwX3NjYi0+c3RhcnRlZCA9IHRydWU7CiAgICAgaWYgKHBfc2NiLT5zY29fc3VzcGVuZCkKICAgICB7Ci0gICAgICAgIHBfc2NiLT5zY29fc3VzcGVuZCA9IEZBTFNFOworICAgICAgICBwX3NjYi0+c2NvX3N1c3BlbmQgPSBmYWxzZTsKICAgICB9CiAKICAgICBpZiAobmV3X3JvbGUgJiBCVEFfQVZfUk9MRV9TVEFSVF9JTlQpCi0gICAgICAgIGluaXRpYXRvciA9IFRSVUU7CisgICAgICAgIGluaXRpYXRvciA9IHRydWU7CiAKICAgICAvKiBmb3IgQTJEUCBTSU5LIHdlIGRvIG5vdCBzZW5kIGdldF9jYXBzICovCiAgICAgaWYgKChwX3NjYi0+YXZkdF9oYW5kbGUgPT0gcF9zY2ItPnNlcHNbcF9zY2ItPnNlcF9pZHhdLmF2X2hhbmRsZSkKQEAgLTI0MjQsNyArMjQyNyw3IEBACiAgICAgTDJDQV9TZXRGbHVzaFRpbWVvdXQocF9zY2ItPnBlZXJfYWRkciwgZmx1c2hfdG8gKTsKIAogICAgIC8qIGNsZWFyIHRoZSBjb25nZXN0aW9uIGZsYWcgKi8KLSAgICBwX3NjYi0+Y29uZyA9IEZBTFNFOworICAgIHBfc2NiLT5jb25nID0gZmFsc2U7CiAKICAgICBpZiAobmV3X3JvbGUgJiBCVEFfQVZfUk9MRV9TVEFSVF9JTlQpCiAgICAgewpAQCAtMjQzMiwxMyArMjQzNSwxMyBAQAogICAgIH0KICAgICBlbHNlIGlmICgobmV3X3JvbGUgJiBCVEFfQVZfUk9MRV9BRF9BQ1ApICYmIChuZXdfcm9sZSAmIEJUQV9BVl9ST0xFX1NVU1BFTkRfT1BUKSkKICAgICB7Ci0gICAgICAgIHN1c3BlbmQgPSBUUlVFOworICAgICAgICBzdXNwZW5kID0gdHJ1ZTsKICAgICB9CiAKICAgICBpZiAoIXN1c3BlbmQpCiAgICAgewogICAgICAgICBwX3NjYi0+cV90YWcgPSBCVEFfQVZfUV9UQUdfU1RSRUFNOwotICAgICAgICBidGFfYXZfc3RyZWFtX2NoZyhwX3NjYiwgVFJVRSk7CisgICAgICAgIGJ0YV9hdl9zdHJlYW1fY2hnKHBfc2NiLCB0cnVlKTsKICAgICB9CiAKICAgICB7CkBAIC0yNDYxLDkgKzI0NjQsOSBAQAogICAgICAgICBwX3NjYi0+cm9sZSAmPSB+QlRBX0FWX1JPTEVfQURfQUNQOwogICAgICAgICBwX3NjYi0+cm9sZSAmPSB+QlRBX0FWX1JPTEVfU1VTUEVORF9PUFQ7CiAKLSAgICAgICAgcF9zY2ItPm5vX3J0cF9oZHIgPSBGQUxTRTsKKyAgICAgICAgcF9zY2ItPm5vX3J0cF9oZHIgPSBmYWxzZTsKICAgICAgICAgcF9zY2ItPnBfY29zLT5zdGFydChwX3NjYi0+aG5kbCwgcF9zY2ItPmNvZGVjX3R5cGUsIHBfc2NiLT5jZmcuY29kZWNfaW5mbywgJnBfc2NiLT5ub19ydHBfaGRyKTsKLSAgICAgICAgcF9zY2ItPmNvX3N0YXJ0ZWQgPSBUUlVFOworICAgICAgICBwX3NjYi0+Y29fc3RhcnRlZCA9IHRydWU7CiAKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2F2X3N0YXJ0X29rIHN1c3BlbmRpbmc6ICVkLCByb2xlOngleCwgaW5pdCAlZCIsCiAgICAgICAgICAgICBzdXNwZW5kLCBwX3NjYi0+cm9sZSwgaW5pdGlhdG9yKTsKQEAgLTI0NzgsMTIgKzI0ODEsMTIgQEAKICAgICAgICAgaWYoc3VzcGVuZCkKICAgICAgICAgewogICAgICAgICAgICAgcF9zY2ItPnJvbGUgfD0gQlRBX0FWX1JPTEVfU1VTUEVORDsKLSAgICAgICAgICAgIHBfc2NiLT5jb25nID0gVFJVRTsgIC8qIGRvIG5vdCBhbGxvdyB0aGUgbWVkaWEgZGF0YSB0byBnbyB0aHJvdWdoICovCisgICAgICAgICAgICBwX3NjYi0+Y29uZyA9IHRydWU7ICAvKiBkbyBub3QgYWxsb3cgdGhlIG1lZGlhIGRhdGEgdG8gZ28gdGhyb3VnaCAqLwogICAgICAgICAgICAgLyogZG8gbm90IGR1cGxpY2F0ZSB0aGUgbWVkaWEgcGFja2V0cyB0byB0aGlzIGNoYW5uZWwgKi8KICAgICAgICAgICAgIHBfc2NiLT5wX2Nvcy0+c3RvcChwX3NjYi0+aG5kbCwgcF9zY2ItPmNvZGVjX3R5cGUpOwotICAgICAgICAgICAgcF9zY2ItPmNvX3N0YXJ0ZWQgPSBGQUxTRTsKLSAgICAgICAgICAgIHN0b3AuZmx1c2ggICA9IEZBTFNFOwotICAgICAgICAgICAgc3RvcC5zdXNwZW5kID0gVFJVRTsKKyAgICAgICAgICAgIHBfc2NiLT5jb19zdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICBzdG9wLmZsdXNoICAgPSBmYWxzZTsKKyAgICAgICAgICAgIHN0b3Auc3VzcGVuZCA9IHRydWU7CiAgICAgICAgICAgICBidGFfYXZfc3NtX2V4ZWN1dGUocF9zY2IsIEJUQV9BVl9BUF9TVE9QX0VWVCwgKHRCVEFfQVZfREFUQSAqKSZzdG9wKTsKICAgICAgICAgfQogICAgIH0KQEAgLTI1MDIsMTQgKzI1MDUsMTQgQEAKIHsKICAgICBVTlVTRUQocF9kYXRhKTsKIAotICAgIGlmKHBfc2NiLT5zdGFydGVkID09IEZBTFNFICYmIHBfc2NiLT5jb19zdGFydGVkID09IEZBTFNFKQorICAgIGlmKHBfc2NiLT5zdGFydGVkID09IGZhbHNlICYmIHBfc2NiLT5jb19zdGFydGVkID09IGZhbHNlKQogICAgIHsKICAgICAgICAgYnRhX3N5c19pZGxlKEJUQV9JRF9BViwgYnRhX2F2X2NiLmF1ZGlvX29wZW5fY250LCBwX3NjYi0+cGVlcl9hZGRyKTsKICAgICAgICAgbm90aWZ5X3N0YXJ0X2ZhaWxlZChwX3NjYik7CiAgICAgfQogCiAgICAgYnRhX3N5c19zZXRfcG9saWN5KEJUQV9JRF9BViwgKEhDSV9FTkFCTEVfU05JRkZfTU9ERXxIQ0lfRU5BQkxFX01BU1RFUl9TTEFWRV9TV0lUQ0gpLCBwX3NjYi0+cGVlcl9hZGRyKTsKLSAgICBwX3NjYi0+c2NvX3N1c3BlbmQgPSBGQUxTRTsKKyAgICBwX3NjYi0+c2NvX3N1c3BlbmQgPSBmYWxzZTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI1MjUsOCArMjUyOCw4IEBACiB7CiAgICAgdEJUQV9BViAgICAgZGF0YTsKICAgICB0QlRBX0FWX0VWVCBldmVudDsKLSAgICBVSU5UMTYgICAgICBtdHU7Ci0gICAgVUlOVDggcG9saWN5ID0gSENJX0VOQUJMRV9TTklGRl9NT0RFOworICAgIHVpbnQxNl90ICAgICAgbXR1OworICAgIHVpbnQ4X3QgcG9saWN5ID0gSENJX0VOQUJMRV9TTklGRl9NT0RFOwogCiAgICAgaWYgKChidGFfYXZfY2IuZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9NQVNURVIpID09IDAgfHwgYnRhX2F2X2NiLmF1ZGlvX29wZW5fY250ID09IDEpCiAgICAgICAgIHBvbGljeSB8PSBIQ0lfRU5BQkxFX01BU1RFUl9TTEFWRV9TV0lUQ0g7CkBAIC0yNTk1LDcgKzI1OTgsNyBAQAogICAgIFVOVVNFRChwX2RhdGEpOwogCiAgICAgaWYocF9zY2ItPmNvX3N0YXJ0ZWQpCi0gICAgICAgIHBfc2NiLT5jb25nID0gRkFMU0U7CisgICAgICAgIHBfc2NiLT5jb25nID0gZmFsc2U7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yNjEwLDE4ICsyNjEzLDE4IEBACiB2b2lkIGJ0YV9hdl9zdXNwZW5kX2NmbSAodEJUQV9BVl9TQ0IgKnBfc2NiLCB0QlRBX0FWX0RBVEEgKnBfZGF0YSkKIHsKICAgICB0QlRBX0FWX1NVU1BFTkQgc3VzcGVuZF9yc3A7Ci0gICAgVUlOVDggICAgICAgICAgIGVycl9jb2RlID0gcF9kYXRhLT5zdHJfbXNnLm1zZy5oZHIuZXJyX2NvZGU7Ci0gICAgVUlOVDggcG9saWN5ID0gSENJX0VOQUJMRV9TTklGRl9NT0RFOworICAgIHVpbnQ4X3QgICAgICAgICAgIGVycl9jb2RlID0gcF9kYXRhLT5zdHJfbXNnLm1zZy5oZHIuZXJyX2NvZGU7CisgICAgdWludDhfdCBwb2xpY3kgPSBIQ0lfRU5BQkxFX1NOSUZGX01PREU7CiAKLSAgICBBUFBMX1RSQUNFX0RFQlVHICgiYnRhX2F2X3N1c3BlbmRfY2ZtOmF1ZGlvX29wZW5fY250ID0gJWQsIGVycl9jb2RlID0gJWQiLAorICAgIEFQUExfVFJBQ0VfREVCVUcgKCIlczphdWRpb19vcGVuX2NudCA9ICVkLCBlcnJfY29kZSA9ICVkIiwgX19mdW5jX18sCiAgICAgICAgIGJ0YV9hdl9jYi5hdWRpb19vcGVuX2NudCwgZXJyX2NvZGUpOwogCi0gICAgaWYgKHBfc2NiLT5zdGFydGVkID09IEZBTFNFKQorICAgIGlmIChwX3NjYi0+c3RhcnRlZCA9PSBmYWxzZSkKICAgICB7CiAgICAgICAgIC8qIGhhbmRsZSB0aGUgY29uZGl0aW9uIHdoZXJlIHRoZXJlIGlzIGEgY29sbGlzaW9uIG9mIFNVU1BFTkQgcmVxIGZyb20gZWl0aGVyIHNpZGUKICAgICAgICAgKiogU2Vjb25kIFNVU1BFTkQgcmVxIGNvdWxkIGJlIHJlamVjdGVkLiBEbyBub3QgdHJlYXQgdGhpcyBhcyBhIGZhaWx1cmUKICAgICAgICAgKi8KLSAgICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HKCJidGFfYXZfc3VzcGVuZF9jZm06IGFscmVhZHkgc3VzcGVuZGVkLCBpZ25vcmUsIGVycl9jb2RlICVkIiwKKyAgICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogYWxyZWFkeSBzdXNwZW5kZWQsIGlnbm9yZSwgZXJyX2NvZGUgJWQiLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJfY29kZSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0yNjMyLDI1ICsyNjM1LDI1IEBACiAgICAgICAgICAvKiBEaXNhYmxlIHN1c3BlbmQgZmVhdHVyZSBvbmx5IHdpdGggZXhwbGljaXQgcmVqZWN0aW9uKG5vdCB3aXRoIHRpbWVvdXQpICovCiAgICAgICAgIGlmIChlcnJfY29kZSAhPSBBVkRUX0VSUl9USU1FT1VUKQogICAgICAgICB7Ci0gICAgICAgICAgICBwX3NjYi0+c3VzcGVuZF9zdXAgPSBGQUxTRTsKKyAgICAgICAgICAgIHBfc2NiLT5zdXNwZW5kX3N1cCA9IGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHN1c3BlbmRfcnNwLnN0YXR1cyA9IEJUQV9BVl9GQUlMOwogCi0gICAgICAgIEFQUExfVFJBQ0VfRVJST1IgKCJidGFfYXZfc3VzcGVuZF9jZm06IHN1c3BlbmQgZmFpbGVkLCBjbG9zaW5nIGNvbm5lY3Rpb24iKTsKKyAgICAgICAgQVBQTF9UUkFDRV9FUlJPUiAoIiVzOiBzdXNwZW5kIGZhaWxlZCwgY2xvc2luZyBjb25uZWN0aW9uIiwgX19mdW5jX18pOwogCiAgICAgICAgIC8qIFNVU1BFTkQgZmFpbGVkLiBDbG9zZSBjb25uZWN0aW9uLiAqLwogICAgICAgICBidGFfYXZfc3NtX2V4ZWN1dGUocF9zY2IsIEJUQV9BVl9BUElfQ0xPU0VfRVZULCBOVUxMKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgLyogb25seSBzZXQgc3RhcnRlZCB0byBGQUxTRSB3aGVuIHN1c3BlbmQgaXMgc3VjY2Vzc2Z1bCAqLwotICAgICAgICBwX3NjYi0+c3RhcnRlZCA9IEZBTFNFOworICAgICAgICAvKiBvbmx5IHNldCBzdGFydGVkIHRvIGZhbHNlIHdoZW4gc3VzcGVuZCBpcyBzdWNjZXNzZnVsICovCisgICAgICAgIHBfc2NiLT5zdGFydGVkID0gZmFsc2U7CiAgICAgfQogCiAgICAgaWYgKHBfc2NiLT5yb2xlICYgQlRBX0FWX1JPTEVfU1VTUEVORCkKICAgICB7CiAgICAgICAgIHBfc2NiLT5yb2xlICY9IH5CVEFfQVZfUk9MRV9TVVNQRU5EOwotICAgICAgICBwX3NjYi0+Y29uZyA9IEZBTFNFOworICAgICAgICBwX3NjYi0+Y29uZyA9IGZhbHNlOwogICAgIH0KIAogICAgIGJ0YV9zeXNfaWRsZShCVEFfSURfQVYsIGJ0YV9hdl9jYi5hdWRpb19vcGVuX2NudCwgcF9zY2ItPnBlZXJfYWRkcik7CkBAIC0yNjY4LDEyICsyNjcxLDEyIEBACiAgICAgICAgICAgICB0QlRBX0FWX1NUQVRVUyBzdGF0dXMgPSBCVEFfQVZfRkFJTF9TVFJFQU07CiAgICAgICAgICAgICAoKmJ0YV9hdl9jYi5wX2NiYWNrKShCVEFfQVZfT0ZGTE9BRF9TVEFSVF9SU1BfRVZULCAodEJUQV9BViAqKSZzdGF0dXMpOwogICAgICAgICB9Ci0gICAgICAgIHBfc2NiLT5vZmZsb2FkX3N0YXJ0X3BlbmRpbmcgPSBGQUxTRTsKKyAgICAgICAgcF9zY2ItPm9mZmxvYWRfc3RhcnRfcGVuZGluZyA9IGZhbHNlOwogCi0gICAgICAgIGJ0YV9hdl9zdHJlYW1fY2hnKHBfc2NiLCBGQUxTRSk7CisgICAgICAgIGJ0YV9hdl9zdHJlYW1fY2hnKHBfc2NiLCBmYWxzZSk7CiAKICAgICAgICAgewotICAgICAgICAgICAgcF9zY2ItPmNvX3N0YXJ0ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIHBfc2NiLT5jb19zdGFydGVkID0gZmFsc2U7CiAgICAgICAgICAgICBwX3NjYi0+cF9jb3MtPnN0b3AocF9zY2ItPmhuZGwsIHBfc2NiLT5jb2RlY190eXBlKTsKICAgICAgICAgfQogICAgICAgICBMMkNBX1NldEZsdXNoVGltZW91dChwX3NjYi0+cGVlcl9hZGRyLCBMMkNBUF9ERUZBVUxUX0ZMVVNIX1RPKTsKQEAgLTI3MDIsNyArMjcwNSw3IEBACiAgICAgVU5VU0VEKHBfZGF0YSk7CiAKICAgICBwX3NjYi0+bDJjX2NpZCAgICAgID0gQVZEVF9HZXRMMkNhcENoYW5uZWwocF9zY2ItPmF2ZHRfaGFuZGxlKTsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfYXZfcmNmZ19zdHJfb2s6IGwyY19jaWQ6ICVkIiwgcF9zY2ItPmwyY19jaWQpOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBsMmNfY2lkOiAlZCIsIF9fZnVuY19fLCBwX3NjYi0+bDJjX2NpZCk7CiAKICAgICAvKiByYyBsaXN0ZW4gKi8KICAgICBidGFfYXZfc3RfcmNfdGltZXIocF9zY2IsIE5VTEwpOwpAQCAtMjc3Niw3ICsyNzc5LDcgQEAKIHsKICAgICBVTlVTRUQocF9kYXRhKTsKIAotICAgIHBfc2NiLT5jb25nICAgID0gRkFMU0U7CisgICAgcF9zY2ItPmNvbmcgICAgPSBmYWxzZTsKICAgICBwX3NjYi0+bnVtX3JlY2ZnKys7CiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2F2X3JjZmdfY29ubmVjdCBudW1fcmVjZmc6ICVkIiwgcF9zY2ItPm51bV9yZWNmZyk7CiAgICAgaWYocF9zY2ItPm51bV9yZWNmZyA+IEJUQV9BVl9SRUNPTkZJR19SRVRSWSkKQEAgLTI4MzAsMTEgKzI4MzMsMTEgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9hdl9zdXNwZW5kX2NvbnQgKHRCVEFfQVZfU0NCICpwX3NjYiwgdEJUQV9BVl9EQVRBICpwX2RhdGEpCiB7Ci0gICAgVUlOVDggICAgICAgZXJyX2NvZGUgPSBwX2RhdGEtPnN0cl9tc2cubXNnLmhkci5lcnJfY29kZTsKKyAgICB1aW50OF90ICAgICAgIGVycl9jb2RlID0gcF9kYXRhLT5zdHJfbXNnLm1zZy5oZHIuZXJyX2NvZGU7CiAgICAgdEJUQV9BVl9SRUNPTkZJRyAgICBldnQ7CiAKLSAgICBwX3NjYi0+c3RhcnRlZCA9IEZBTFNFOwotICAgIHBfc2NiLT5jb25nICAgID0gRkFMU0U7CisgICAgcF9zY2ItPnN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBwX3NjYi0+Y29uZyAgICA9IGZhbHNlOwogICAgIGlmIChlcnJfY29kZSkKICAgICB7CiAgICAgICAgIGlmIChBVkRUX0VSUl9DT05ORUNUID09IGVycl9jb2RlKQpAQCAtMjg1MCw3ICsyODUzLDcgQEAKICAgICAgICAgICAgICAvKiBEaXNhYmxlIHN1c3BlbmQgZmVhdHVyZSBvbmx5IHdpdGggZXhwbGljaXQgcmVqZWN0aW9uKG5vdCB3aXRoIHRpbWVvdXQpICovCiAgICAgICAgICAgICBpZiAoZXJyX2NvZGUgIT0gQVZEVF9FUlJfVElNRU9VVCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwX3NjYi0+c3VzcGVuZF9zdXAgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBwX3NjYi0+c3VzcGVuZF9zdXAgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8qIGRyb3AgdGhlIGJ1ZmZlcnMgcXVldWVkIGluIEwyQ0FQICovCiAgICAgICAgICAgICBMMkNBX0ZsdXNoQ2hhbm5lbCAocF9zY2ItPmwyY19jaWQsIEwyQ0FQX0ZMVVNIX0NIQU5TX0FMTCk7CkBAIC0yODgwLDcgKzI4ODMsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2F2X3JjZmdfY2ZtICh0QlRBX0FWX1NDQiAqcF9zY2IsIHRCVEFfQVZfREFUQSAqcF9kYXRhKQogewotICAgIFVJTlQ4ICAgZXJyX2NvZGUgPSBwX2RhdGEtPnN0cl9tc2cubXNnLmhkci5lcnJfY29kZTsKKyAgICB1aW50OF90ICAgZXJyX2NvZGUgPSBwX2RhdGEtPnN0cl9tc2cubXNnLmhkci5lcnJfY29kZTsKIAogICAgIC8qCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2F2X3JjZmdfY2ZtIik7CkBAIC0yODkxLDkgKzI4OTQsOSBAQAogICAgICAgICAgLyogRGlzYWJsZSByZWNvbmZpZ3VyYXRpb24gZmVhdHVyZSBvbmx5IHdpdGggZXhwbGljaXQgcmVqZWN0aW9uKG5vdCB3aXRoIHRpbWVvdXQpICovCiAgICAgICAgIGlmIChlcnJfY29kZSAhPSBBVkRUX0VSUl9USU1FT1VUKQogICAgICAgICB7Ci0gICAgICAgICAgICBwX3NjYi0+cmVjZmdfc3VwID0gRkFMU0U7CisgICAgICAgICAgICBwX3NjYi0+cmVjZmdfc3VwID0gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgLyogc3RhcnRlZCBmbGFnIGlzIEZBTFNFIHdoZW4gcmVjb25maWd1cmUgY29tbWFuZCBpcyBzZW50ICovCisgICAgICAgIC8qIHN0YXJ0ZWQgZmxhZyBpcyBmYWxzZSB3aGVuIHJlY29uZmlndXJlIGNvbW1hbmQgaXMgc2VudCAqLwogICAgICAgICAvKiBkcm9wIHRoZSBidWZmZXJzIHF1ZXVlZCBpbiBMMkNBUCAqLwogICAgICAgICBMMkNBX0ZsdXNoQ2hhbm5lbCAocF9zY2ItPmwyY19jaWQsIEwyQ0FQX0ZMVVNIX0NIQU5TX0FMTCk7CiAgICAgICAgIEFWRFRfQ2xvc2VSZXEocF9zY2ItPmF2ZHRfaGFuZGxlKTsKQEAgLTI5NzcsNyArMjk4MCw3IEBACiB7CiAgICAgdEJUQV9BVl9TQ0IgKnBfc2NiaTsKICAgICBpbnQgaTsKLSAgICBCT09MRUFOIG5ld19zdGFydGVkID0gRkFMU0U7CisgICAgYm9vbCBuZXdfc3RhcnRlZCA9IGZhbHNlOwogICAgIFVOVVNFRChwX2RhdGEpOwogCiAgICAgaWYgKChwX3NjYi0+Y2hubCA9PSBCVEFfQVZfQ0hOTF9BVURJTykgJiYgKGJ0YV9hdl9jYi5hdWRpb19vcGVuX2NudCA+PSAyKSkKQEAgLTI5OTUsNyArMjk5OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmICghbmV3X3N0YXJ0ZWQpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IHRoZSBuZXcgc3RyZWFtICovCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3RhcnRlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3RhcnRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBidGFfYXZfc3NtX2V4ZWN1dGUocF9zY2IsIEJUQV9BVl9BUF9TVEFSVF9FVlQsIE5VTEwpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC8qIG1heSBuZWVkIHRvIHVwZGF0ZSB0aGUgZmx1c2ggdGltZW91dCBvZiB0aGlzIGFscmVhZHkgc3RhcnRlZCBzdHJlYW0gKi8KQEAgLTMwMzMsNyArMzAzNiw3IEBACiAgICAgICAgICAgICBhbGFybV9jYW5jZWwocF9zY2ItPmF2cmNfY3RfdGltZXIpOwogICAgICAgICAgICAgc3RhcnQuY2hubCAgID0gcF9zY2ItPmNobmw7CiAgICAgICAgICAgICBzdGFydC5zdGF0dXMgPSBCVEFfQVZfRkFJTF9ST0xFOwotICAgICAgICAgICAgc3RhcnQuaW5pdGlhdG9yID0gVFJVRTsKKyAgICAgICAgICAgIHN0YXJ0LmluaXRpYXRvciA9IHRydWU7CiAgICAgICAgICAgICBzdGFydC5obmRsICAgPSBwX3NjYi0+aG5kbDsKICAgICAgICAgICAgIHBfc2NiLT53YWl0ICY9IH5CVEFfQVZfV0FJVF9ST0xFX1NXX0JJVFM7CiAgICAgICAgICAgICBidGFfYXZfY2IucnNfaWR4ID0gMDsKQEAgLTMwNDksNyArMzA1Miw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZihwX3NjYi0+dXNlX3JjID09IFRSVUUgfHwgKHBfc2NiLT5yb2xlICYgQlRBX0FWX1JPTEVfQURfQUNQKSApCisgICAgaWYocF9zY2ItPnVzZV9yYyA9PSB0cnVlIHx8IChwX3NjYi0+cm9sZSAmIEJUQV9BVl9ST0xFX0FEX0FDUCkgKQogICAgIHsKICAgICAgICAgaWYoYnRhX2F2X2NiLmRpc2MpCiAgICAgICAgIHsKQEAgLTMwNjksNyArMzA3Miw3IEBACiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICAgLyogdXNlIG1haW4gU00gZm9yIEFWUkMgU0RQIGFjdGl2aXRpZXMgKi8KLSAgICAgICAgICAgIGJ0YV9hdl9yY19kaXNjKChVSU5UOCkocF9zY2ItPmhkaSArIDEpKTsKKyAgICAgICAgICAgIGJ0YV9hdl9yY19kaXNjKCh1aW50OF90KShwX3NjYi0+aGRpICsgMSkpOwogICAgICAgICB9CiAgICAgfQogICAgIGVsc2UKQEAgLTMxMTQsNyArMzExNyw3IEBACiAgICAgICAgIHRCVEFfQVZfQVBJX09QRU4gKnBfYnVmID0KICAgICAgICAgICAgICh0QlRBX0FWX0FQSV9PUEVOICopb3NpX21hbGxvYyhzaXplb2YodEJUQV9BVl9BUElfT1BFTikpOwogICAgICAgICBtZW1jcHkocF9idWYsICYocF9zY2ItPm9wZW5fYXBpKSwgc2l6ZW9mKHRCVEFfQVZfQVBJX09QRU4pKTsKLSAgICAgICAgcF9zY2ItPnNraXBfc2RwID0gVFJVRTsKKyAgICAgICAgcF9zY2ItPnNraXBfc2RwID0gdHJ1ZTsKICAgICAgICAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKICAgICB9CiB9CkBAIC0zMTMyLDE0ICszMTM1LDE0IEBACiB2b2lkIGJ0YV9hdl9vZmZsb2FkX3JlcSh0QlRBX0FWX1NDQiAqcF9zY2IsIHRCVEFfQVZfREFUQSAqcF9kYXRhKQogewogICAgIHRCVEFfQVZfU1RBVFVTIHN0YXR1cyA9IEJUQV9BVl9GQUlMX1JFU09VUkNFUzsKLSAgICBVSU5UMTYgbXR1ID0gYnRhX2F2X2Noa19tdHUocF9zY2IsIHBfc2NiLT5zdHJlYW1fbXR1KTsKKyAgICB1aW50MTZfdCBtdHUgPSBidGFfYXZfY2hrX210dShwX3NjYiwgcF9zY2ItPnN0cmVhbV9tdHUpOwogCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgc3RyZWFtICVzLCBhdWRpbyBjaGFubmVscyBvcGVuICVkIiwgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgICAgICBwX3NjYi0+c3RhcnRlZCA/ICJTVEFSVEVEIiA6ICJTVE9QUEVEIiwgYnRhX2F2X2NiLmF1ZGlvX29wZW5fY250KTsKIAogICAgIC8qIENoZWNrIGlmIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQuICovCiAgICAgLyogU3VwcG9ydCBvZmZsb2FkIGlmIG9ubHkgb25lIGF1ZGlvIHNvdXJjZSBzdHJlYW0gaXMgb3Blbi4gKi8KLSAgICBpZiAocF9zY2ItPnN0YXJ0ZWQgIT0gVFJVRSkgeworICAgIGlmIChwX3NjYi0+c3RhcnRlZCAhPSB0cnVlKSB7CiAgICAgICAgIHN0YXR1cyA9IEJUQV9BVl9GQUlMX1NUUkVBTTsKIAogICAgIH0gZWxzZSBpZiAoYnRhX2F2X2NiLmF1ZGlvX29wZW5fY250ID09IDEgJiYKQEAgLTMxNTksOCArMzE2Miw4IEBACiAgICAgICAgICAgICBhMmRwX29mZmxvYWRfc3RhcnQueG1pdF9xdW90YSA9IEJUQV9BVl9BMkRQX09GRkxPQURfWE1JVF9RVU9UQTsKICAgICAgICAgICAgIGEyZHBfb2ZmbG9hZF9zdGFydC5zdHJlYW1fbXR1ID0gKG10dSA8IHBfc2NiLT5zdHJlYW1fbXR1KSA/IG10dSA6IHBfc2NiLT5zdHJlYW1fbXR1OwogICAgICAgICAgICAgYTJkcF9vZmZsb2FkX3N0YXJ0LmxvY2FsX2NpZCA9IHBfc2NiLT5sMmNfY2lkOwotICAgICAgICAgICAgYTJkcF9vZmZsb2FkX3N0YXJ0LmlzX2ZsdXNoYWJsZSA9IFRSVUU7Ci0gICAgICAgICAgICBhMmRwX29mZmxvYWRfc3RhcnQuc3RyZWFtX3NvdXJjZSA9ICgoVUlOVDMyKShwX3NjYi0+Y2ZnLmNvZGVjX2luZm9bMV0gfCBwX3NjYi0+Y2ZnLmNvZGVjX2luZm9bMl0pKTsKKyAgICAgICAgICAgIGEyZHBfb2ZmbG9hZF9zdGFydC5pc19mbHVzaGFibGUgPSB0cnVlOworICAgICAgICAgICAgYTJkcF9vZmZsb2FkX3N0YXJ0LnN0cmVhbV9zb3VyY2UgPSAoKHVpbnQzMl90KShwX3NjYi0+Y2ZnLmNvZGVjX2luZm9bMV0gfCBwX3NjYi0+Y2ZnLmNvZGVjX2luZm9bMl0pKTsKIAogICAgICAgICAgICAgbWVtY3B5KGEyZHBfb2ZmbG9hZF9zdGFydC5jb2RlY19pbmZvLCBwX3NjYi0+Y2ZnLmNvZGVjX2luZm8sCiAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGEyZHBfb2ZmbG9hZF9zdGFydC5jb2RlY19pbmZvKSk7CkBAIC0zMTY5LDcgKzMxNzIsNyBAQAogICAgICAgICAgICAgICAgICAgKHZlbmRvcl9vcGNvZGVfdClCVF9WTkRfT1BfQTJEUF9PRkZMT0FEX1NUQVJULAogICAgICAgICAgICAgICAgICAgJmEyZHBfb2ZmbG9hZF9zdGFydCkpIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCVEFfQVZfU1VDQ0VTUzsKLSAgICAgICAgICAgICAgICBwX3NjYi0+b2ZmbG9hZF9zdGFydF9wZW5kaW5nID0gVFJVRTsKKyAgICAgICAgICAgICAgICBwX3NjYi0+b2ZmbG9hZF9zdGFydF9wZW5kaW5nID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTMxOTcsMTEgKzMyMDAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA/ICJGQUlMIiA6ICJTVUNDRVNTIik7CiAKICAgICAvKiBDaGVjayBpZiBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkLiAqLwotICAgIGlmIChzdGF0dXMgPT0gQlRBX0FWX1NVQ0NFU1MgJiYgcF9zY2ItPnN0YXJ0ZWQgIT0gVFJVRSkgeworICAgIGlmIChzdGF0dXMgPT0gQlRBX0FWX1NVQ0NFU1MgJiYgcF9zY2ItPnN0YXJ0ZWQgIT0gdHJ1ZSkgewogICAgICAgICBzdGF0dXMgPSBCVEFfQVZfRkFJTF9TVFJFQU07CiAgICAgfQogCi0gICAgcF9zY2ItPm9mZmxvYWRfc3RhcnRfcGVuZGluZyA9IEZBTFNFOworICAgIHBfc2NiLT5vZmZsb2FkX3N0YXJ0X3BlbmRpbmcgPSBmYWxzZTsKICAgICAoKmJ0YV9hdl9jYi5wX2NiYWNrKShCVEFfQVZfT0ZGTE9BRF9TVEFSVF9SU1BfRVZULCAodEJUQV9BViAqKSZzdGF0dXMpOwogfQogCmRpZmYgLS1naXQgYS9idGEvYXYvYnRhX2F2X2FjdC5jIGIvYnRhL2F2L2J0YV9hdl9hY3QuYwppbmRleCBhNmNkMDVmLi44ZjdjOWYyIDEwMDY0NAotLS0gYS9idGEvYXYvYnRhX2F2X2FjdC5jCisrKyBiL2J0YS9hdi9idGFfYXZfYWN0LmMKQEAgLTI3LDcgKzI3LDcgQEAKIAogI2luY2x1ZGUgImJ0X3RhcmdldC5oIgogCi0jaWYgZGVmaW5lZChCVEFfQVZfSU5DTFVERUQpICYmIChCVEFfQVZfSU5DTFVERUQgPT0gVFJVRSkKKyNpZiAoQlRBX0FWX0lOQ0xVREVEID09IFRSVUUpCiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIApAQCAtNDEsNyArNDEsNyBAQAogI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCIKICNpbmNsdWRlICJ1dGwuaCIKIAotI2lmICggZGVmaW5lZCBCVEFfQVJfSU5DTFVERUQgKSAmJiAoQlRBX0FSX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9BUl9JTkNMVURFRCA9PSBUUlVFKQogI2luY2x1ZGUgImJ0YV9hcl9hcGkuaCIKICNlbmRpZgogCkBAIC03Miw3ICs3Miw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHRCVEFfQVZfUkNCCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfQVZfUkNCICogYnRhX2F2X2dldF9yY2JfYnlfc2hkbChVSU5UOCBzaGRsKQordEJUQV9BVl9SQ0IgKiBidGFfYXZfZ2V0X3JjYl9ieV9zaGRsKHVpbnQ4X3Qgc2hkbCkKIHsKICAgICB0QlRBX0FWX1JDQiAqcF9yY2IgPSBOVUxMOwogICAgIGludCAgICAgICAgIGk7CkBAIC0xMDEsNyArMTAxLDcgQEAKIHZvaWQgYnRhX2F2X2RlbF9yYyh0QlRBX0FWX1JDQiAqcF9yY2IpCiB7CiAgICAgdEJUQV9BVl9TQ0IgICpwX3NjYjsKLSAgICBVSU5UOCAgICAgICAgcmNfaGFuZGxlOyAgICAgIC8qIGNvbm5lY3RlZCBBVlJDUCBoYW5kbGUgKi8KKyAgICB1aW50OF90ICAgICAgICByY19oYW5kbGU7ICAgICAgLyogY29ubmVjdGVkIEFWUkNQIGhhbmRsZSAqLwogCiAgICAgcF9zY2IgPSBOVUxMOwogICAgIGlmIChwX3JjYi0+aGFuZGxlICE9IEJUQV9BVl9SQ19IQU5ETEVfTk9ORSkKQEAgLTE2MCw3ICsxNjAsNyBAQAogCiAgICAgZm9yKGk9MDsgaTxCVEFfQVZfTlVNX1JDQjsgaSsrKQogICAgIHsKLSAgICAgICAgaWYgKChwX2NiLT5kaXNhYmxpbmcgPT0gVFJVRSkgfHwgKGJ0YV9hdl9jYi5yY2JbaV0uc2hkbCAhPSAwKSkKKyAgICAgICAgaWYgKChwX2NiLT5kaXNhYmxpbmcgPT0gdHJ1ZSkgfHwgKGJ0YV9hdl9jYi5yY2JbaV0uc2hkbCAhPSAwKSkKICAgICAgICAgICAgIGJ0YV9hdl9kZWxfcmMoJmJ0YV9hdl9jYi5yY2JbaV0pOwogICAgIH0KIH0KQEAgLTE3NCw3ICsxNzQsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hdl9kZWxfc2RwX3JlYyhVSU5UMzIgKnBfc2RwX2hhbmRsZSkKK3N0YXRpYyB2b2lkIGJ0YV9hdl9kZWxfc2RwX3JlYyh1aW50MzJfdCAqcF9zZHBfaGFuZGxlKQogewogICAgIGlmICgqcF9zZHBfaGFuZGxlICE9IDApCiAgICAgewpAQCAtMTkyLDcgKzE5Miw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2F2X2F2cmNfc2RwX2NiYWNrKFVJTlQxNiBzdGF0dXMpCitzdGF0aWMgdm9pZCBidGFfYXZfYXZyY19zZHBfY2JhY2sodWludDE2X3Qgc3RhdHVzKQogewogICAgIEJUX0hEUiAqcF9tc2cgPSAoQlRfSERSICopb3NpX21hbGxvYyhzaXplb2YoQlRfSERSKSk7CiAKQEAgLTIxMiwxNiArMjEyLDEyIEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2F2X3JjX2N0cmxfY2JhY2soVUlOVDggaGFuZGxlLCBVSU5UOCBldmVudCwgVUlOVDE2IHJlc3VsdCwgQkRfQUREUiBwZWVyX2FkZHIpCitzdGF0aWMgdm9pZCBidGFfYXZfcmNfY3RybF9jYmFjayh1aW50OF90IGhhbmRsZSwgdWludDhfdCBldmVudCwgdWludDE2X3QgcmVzdWx0LCBCRF9BRERSIHBlZXJfYWRkcikKIHsKLSAgICBVSU5UMTYgbXNnX2V2ZW50ID0gMDsKKyAgICB1aW50MTZfdCBtc2dfZXZlbnQgPSAwOwogICAgIFVOVVNFRChyZXN1bHQpOwogCi0jaWYgKGRlZmluZWQoQlRBX0FWX01JTl9ERUJVR19UUkFDRVMpICYmIEJUQV9BVl9NSU5fREVCVUdfVFJBQ0VTID09IFRSVUUpCi0gICAgQVBQTF9UUkFDRV9FVkVOVCgicmNfY3RybCBoYW5kbGU6ICVkIGV2ZW50PTB4JXgiLCBoYW5kbGUsIGV2ZW50KTsKLSNlbHNlCi0gICAgQVBQTF9UUkFDRV9FVkVOVCgiYnRhX2F2X3JjX2N0cmxfY2JhY2sgaGFuZGxlOiAlZCBldmVudD0weCV4IiwgaGFuZGxlLCBldmVudCk7Ci0jZW5kaWYKKyAgICBBUFBMX1RSQUNFX0VWRU5UKCIlcyBoYW5kbGU6ICVkIGV2ZW50PTB4JXgiLCBfX2Z1bmNfXywgaGFuZGxlLCBldmVudCk7CiAgICAgaWYgKGV2ZW50ID09IEFWUkNfT1BFTl9JTkRfRVZUKQogICAgIHsKICAgICAgICAgLyogc2F2ZSBoYW5kbGUgb2Ygb3BlbmVkIGNvbm5lY3Rpb24KQEAgLTI1NCwyMCArMjUwLDIwIEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2F2X3JjX21zZ19jYmFjayhVSU5UOCBoYW5kbGUsIFVJTlQ4IGxhYmVsLCBVSU5UOCBvcGNvZGUsIHRBVlJDX01TRyAqcF9tc2cpCitzdGF0aWMgdm9pZCBidGFfYXZfcmNfbXNnX2NiYWNrKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IGxhYmVsLCB1aW50OF90IG9wY29kZSwgdEFWUkNfTVNHICpwX21zZykKIHsKLSAgICBVSU5UOCAgICAgICAgICAgKnBfZGF0YV9zcmMgPSBOVUxMOwotICAgIFVJTlQxNiAgICAgICAgICBkYXRhX2xlbiA9IDA7CisgICAgdWludDhfdCAgICAgICAgICAgKnBfZGF0YV9zcmMgPSBOVUxMOworICAgIHVpbnQxNl90ICAgICAgICAgIGRhdGFfbGVuID0gMDsKIAogICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIGhhbmRsZTogJXUgb3Bjb2RlPTB4JXgiLCBfX2Z1bmNfXywgaGFuZGxlLCBvcGNvZGUpOwogCiAgICAgLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgd2UgbmVlZCAqLwogICAgIGlmIChvcGNvZGUgPT0gQVZSQ19PUF9WRU5ET1IgJiYgcF9tc2ctPnZlbmRvci5wX3ZlbmRvcl9kYXRhICE9IE5VTEwpIHsKICAgICAgICAgcF9kYXRhX3NyYyA9IHBfbXNnLT52ZW5kb3IucF92ZW5kb3JfZGF0YTsKLSAgICAgICAgZGF0YV9sZW4gPSAoVUlOVDE2KSBwX21zZy0+dmVuZG9yLnZlbmRvcl9sZW47CisgICAgICAgIGRhdGFfbGVuID0gKHVpbnQxNl90KSBwX21zZy0+dmVuZG9yLnZlbmRvcl9sZW47CiAgICAgfSBlbHNlIGlmIChvcGNvZGUgPT0gQVZSQ19PUF9QQVNTX1RIUlUgJiYgcF9tc2ctPnBhc3MucF9wYXNzX2RhdGEgIT0gTlVMTCkgewogICAgICAgICBwX2RhdGFfc3JjID0gcF9tc2ctPnBhc3MucF9wYXNzX2RhdGE7Ci0gICAgICAgIGRhdGFfbGVuID0gKFVJTlQxNikgcF9tc2ctPnBhc3MucGFzc19sZW47CisgICAgICAgIGRhdGFfbGVuID0gKHVpbnQxNl90KSBwX21zZy0+cGFzcy5wYXNzX2xlbjsKICAgICB9CiAKICAgICAvKiBDcmVhdGUgYSBjb3B5IG9mIHRoZSBtZXNzYWdlICovCkBAIC0yODAsNyArMjc2LDcgQEAKICAgICBtZW1jcHkoJnBfYnVmLT5tc2csIHBfbXNnLCBzaXplb2YodEFWUkNfTVNHKSk7CiAgICAgLyogQ29weSB0aGUgZGF0YSBwYXlsb2FkLCBhbmQgc2V0IHRoZSBwb2ludGVyIHRvIGl0ICovCiAgICAgaWYgKHBfZGF0YV9zcmMgIT0gTlVMTCkgewotICAgICAgICBVSU5UOCAqcF9kYXRhX2RzdCA9IChVSU5UOCAqKShwX2J1ZiArIDEpOworICAgICAgICB1aW50OF90ICpwX2RhdGFfZHN0ID0gKHVpbnQ4X3QgKikocF9idWYgKyAxKTsKICAgICAgICAgbWVtY3B5KHBfZGF0YV9kc3QsIHBfZGF0YV9zcmMsIGRhdGFfbGVuKTsKICAgICAgICAgaWYgKG9wY29kZSA9PSBBVlJDX09QX1ZFTkRPUikKICAgICAgICAgICAgIHBfYnVmLT5tc2cudmVuZG9yLnBfdmVuZG9yX2RhdGEgPSBwX2RhdGFfZHN0OwpAQCAtMzAwLDE0ICsyOTYsMTQgQEAKICoqIFJldHVybnMgICAgICAgICAgdGhlIGNyZWF0ZWQgcmMgaGFuZGxlCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVVJTlQ4IGJ0YV9hdl9yY19jcmVhdGUodEJUQV9BVl9DQiAqcF9jYiwgVUlOVDggcm9sZSwgVUlOVDggc2hkbCwgVUlOVDggbGlkeCkKK3VpbnQ4X3QgYnRhX2F2X3JjX2NyZWF0ZSh0QlRBX0FWX0NCICpwX2NiLCB1aW50OF90IHJvbGUsIHVpbnQ4X3Qgc2hkbCwgdWludDhfdCBsaWR4KQogewogICAgIHRBVlJDX0NPTk5fQ0IgY2NiOwogICAgIEJEX0FERFJfUFRSICAgYmRhID0gKEJEX0FERFJfUFRSKWJkX2FkZHJfYW55OwotICAgIFVJTlQ4ICAgICAgICAgc3RhdHVzID0gQlRBX0FWX1JDX1JPTEVfQUNQOworICAgIHVpbnQ4X3QgICAgICAgICBzdGF0dXMgPSBCVEFfQVZfUkNfUk9MRV9BQ1A7CiAgICAgdEJUQV9BVl9TQ0IgICpwX3NjYiA9IHBfY2ItPnBfc2NiW3NoZGwgLSAxXTsKICAgICBpbnQgaTsKLSAgICBVSU5UOCAgIHJjX2hhbmRsZTsKKyAgICB1aW50OF90ICAgcmNfaGFuZGxlOwogICAgIHRCVEFfQVZfUkNCICpwX3JjYjsKIAogICAgIGlmIChyb2xlID09IEFWQ1RfSU5UKQpAQCAtMzY5LDEyICszNjUsMTIgQEAKICoqIFJldHVybnMgICAgICAgICAgQlRBX0FWX1JTUF9BQ0NFUFQgb3IgQlRBX0FWX1JTUF9OT1RfSU1QTC4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRCVEFfQVZfQ09ERSBidGFfYXZfZ3JvdXBfbmF2aV9zdXBwb3J0ZWQoVUlOVDggbGVuLCBVSU5UOCAqcF9kYXRhLCBCT09MRUFOIGlzX2lucXVpcnkpCitzdGF0aWMgdEJUQV9BVl9DT0RFIGJ0YV9hdl9ncm91cF9uYXZpX3N1cHBvcnRlZCh1aW50OF90IGxlbiwgdWludDhfdCAqcF9kYXRhLCBib29sIGlzX2lucXVpcnkpCiB7CiAgICAgdEJUQV9BVl9DT0RFIHJldD1CVEFfQVZfUlNQX05PVF9JTVBMOwotICAgIFVJTlQ4ICpwX3B0ciA9IHBfZGF0YTsKLSAgICBVSU5UMTYgdTE2OwotICAgIFVJTlQzMiB1MzI7CisgICAgdWludDhfdCAqcF9wdHIgPSBwX2RhdGE7CisgICAgdWludDE2X3QgdTE2OworICAgIHVpbnQzMl90IHUzMjsKIAogICAgIGlmIChwX2J0YV9hdl9jZmctPmF2cmNfZ3JvdXAgJiYgbGVuID09IEJUQV9HUk9VUF9OQVZJX01TR19PUF9EQVRBX0xFTikKICAgICB7CkBAIC00MTAsNyArNDA2LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgQlRBX0FWX1JTUF9BQ0NFUFQgb2Ygc3VwcG9ydGVkLCBCVEFfQVZfUlNQX05PVF9JTVBMIGlmIG5vdC4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRCVEFfQVZfQ09ERSBidGFfYXZfb3Bfc3VwcG9ydGVkKHRCVEFfQVZfUkMgcmNfaWQsIEJPT0xFQU4gaXNfaW5xdWlyeSkKK3N0YXRpYyB0QlRBX0FWX0NPREUgYnRhX2F2X29wX3N1cHBvcnRlZCh0QlRBX0FWX1JDIHJjX2lkLCBib29sIGlzX2lucXVpcnkpCiB7CiAgICAgdEJUQV9BVl9DT0RFIHJldF9jb2RlID0gQlRBX0FWX1JTUF9OT1RfSU1QTDsKIApAQCAtNDUxLDExICs0NDcsMTEgQEAKICoqIFJldHVybnMgICAgICAgICAgTlVMTCwgaWYgbm90IGZvdW5kLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0FWX0xDQiAqIGJ0YV9hdl9maW5kX2xjYihCRF9BRERSIGFkZHIsIFVJTlQ4IG9wKQordEJUQV9BVl9MQ0IgKiBidGFfYXZfZmluZF9sY2IoQkRfQUREUiBhZGRyLCB1aW50OF90IG9wKQogewogICAgIHRCVEFfQVZfQ0IgICAqcF9jYiA9ICZidGFfYXZfY2I7CiAgICAgaW50ICAgICB4eDsKLSAgICBVSU5UOCAgIG1hc2s7CisgICAgdWludDhfdCAgIG1hc2s7CiAgICAgdEJUQV9BVl9MQ0IgKnBfbGNiID0gTlVMTDsKIAogICAgIGZvcih4eD0wOyB4eDxCVEFfQVZfTlVNX0xJTktTOyB4eCsrKQpAQCAtNDg5LDExICs0ODUsMTEgQEAKICAgICB0QlRBX0FWX1JDX09QRU4gcmNfb3BlbjsKICAgICB0QlRBX0FWX1NDQiAgICAgKnBfc2NiOwogICAgIGludCAgICAgICAgIGk7Ci0gICAgVUlOVDggICAgICAgc2hkbCA9IDA7CisgICAgdWludDhfdCAgICAgICBzaGRsID0gMDsKICAgICB0QlRBX0FWX0xDQiAqcF9sY2I7CiAgICAgdEJUQV9BVl9SQ0IgKnBfcmNiOwotICAgIFVJTlQ4ICAgICAgIHRtcDsKLSAgICBVSU5UOCAgICAgICBkaXNjID0gMDsKKyAgICB1aW50OF90ICAgICAgIHRtcDsKKyAgICB1aW50OF90ICAgICAgIGRpc2MgPSAwOwogCiAgICAgLyogZmluZCB0aGUgU0NCICYgc3RvcCB0aGUgdGltZXIgKi8KICAgICBmb3IoaT0wOyBpPEJUQV9BVl9OVU1fU1RSUzsgaSsrKQpAQCAtNjY0LDcgKzY2MCw3IEBACiB2b2lkIGJ0YV9hdl9yY19tZXRhX3JzcCh0QlRBX0FWX0NCICpwX2NiLCB0QlRBX0FWX0RBVEEgKnBfZGF0YSkKIHsKICAgICB0QlRBX0FWX1JDQiAqcF9yY2I7Ci0gICAgQk9PTEVBTiAgICAgICAgIGRvX2ZyZWUgPSBUUlVFOworICAgIGJvb2wgICAgICAgICBkb19mcmVlID0gdHJ1ZTsKIAogICAgIGlmICgocF9jYi0+ZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9NRVRBREFUQSkgJiYgKHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljIDwgQlRBX0FWX05VTV9SQ0IpKQogICAgIHsKQEAgLTY3Niw3ICs2NzIsNyBAQAogICAgICAgICAgICAgICAgIEFWUkNfTXNnUmVxKHBfcmNiLT5oYW5kbGUsIHBfZGF0YS0+YXBpX21ldGFfcnNwLmxhYmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+YXBpX21ldGFfcnNwLnJzcF9jb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+YXBpX21ldGFfcnNwLnBfcGt0KTsKLSAgICAgICAgICAgICAgICBkb19mcmVlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgZG9fZnJlZSA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNzI3LDkgKzcyMyw5IEBACiBzdGF0aWMgdEFWUkNfU1RTIGJ0YV9hdl9jaGtfbm90aWZfZXZ0X2lkKHRBVlJDX01TR19WRU5ET1IgKnBfdmVuZG9yKQogewogICAgIHRBVlJDX1NUUyAgIHN0YXR1cyA9IEJUQV9BVl9TVFNfTk9fUlNQOwotICAgIFVJTlQ4ICAgICAgIHh4OwotICAgIFVJTlQxNiAgICAgIHUxNjsKLSAgICBVSU5UOCAgICAgICAqcCA9IHBfdmVuZG9yLT5wX3ZlbmRvcl9kYXRhICsgMjsKKyAgICB1aW50OF90ICAgICAgIHh4OworICAgIHVpbnQxNl90ICAgICAgdTE2OworICAgIHVpbnQ4X3QgICAgICAgKnAgPSBwX3ZlbmRvci0+cF92ZW5kb3JfZGF0YSArIDI7CiAKICAgICBCRV9TVFJFQU1fVE9fVUlOVDE2ICh1MTYsIHApOwogICAgIC8qIGRvdWJsZSBjaGVjayB0aGUgZml4ZWQgbGVuZ3RoICovCkBAIC03NjIsMTQgKzc1OCwxNCBAQAogKioKICoqIERlc2NyaXB0aW9uICAgICAgUHJvY2VzcyBhbiBBVlJDUCBtZXRhZGF0YSBjb21tYW5kIGZyb20gdGhlIHBlZXIuCiAqKgotKiogUmV0dXJucyAgICAgICAgICBUUlVFIHRvIHJlc3BvbmQgaW1tZWRpYXRlbHkKKyoqIFJldHVybnMgICAgICAgICAgdHJ1ZSB0byByZXNwb25kIGltbWVkaWF0ZWx5CiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfQVZfRVZUIGJ0YV9hdl9wcm9jX21ldGFfY21kKHRBVlJDX1JFU1BPTlNFICAqcF9yY19yc3AsIHRCVEFfQVZfUkNfTVNHICpwX21zZywgVUlOVDggKnBfY3R5cGUpCit0QlRBX0FWX0VWVCBidGFfYXZfcHJvY19tZXRhX2NtZCh0QVZSQ19SRVNQT05TRSAgKnBfcmNfcnNwLCB0QlRBX0FWX1JDX01TRyAqcF9tc2csIHVpbnQ4X3QgKnBfY3R5cGUpCiB7CiAgICAgdEJUQV9BVl9FVlQgZXZ0ID0gQlRBX0FWX01FVEFfTVNHX0VWVDsKLSAgICBVSU5UOCAgICAgICB1OCwgcGR1LCAqcDsKLSAgICBVSU5UMTYgICAgICB1MTY7CisgICAgdWludDhfdCAgICAgICB1OCwgcGR1LCAqcDsKKyAgICB1aW50MTZfdCAgICAgIHUxNjsKICAgICB0QVZSQ19NU0dfVkVORE9SICAgICpwX3ZlbmRvciA9ICZwX21zZy0+bXNnLnZlbmRvcjsKIAogI2lmIChBVlJDX01FVEFEQVRBX0lOQ0xVREVEID09IFRSVUUpCkBAIC04NjgsMTEgKzg2NCwxMSBAQAogICAgIHRCVEFfQVYgICAgIGF2OwogICAgIEJUX0hEUiAgICAgICpwX3BrdCA9IE5VTEw7CiAgICAgdEFWUkNfTVNHX1ZFTkRPUiAgICAqcF92ZW5kb3IgPSAmcF9kYXRhLT5yY19tc2cubXNnLnZlbmRvcjsKLSAgICBCT09MRUFOIGlzX2lucXVpcnkgPQorICAgIGJvb2wgaXNfaW5xdWlyeSA9CiAgICAgICAgICgocF9kYXRhLT5yY19tc2cubXNnLmhkci5jdHlwZSA9PSBBVlJDX0NNRF9TUEVDX0lOUSkgfHwKICAgICAgICAgIHBfZGF0YS0+cmNfbXNnLm1zZy5oZHIuY3R5cGUgPT0gQVZSQ19DTURfR0VOX0lOUSk7CiAjaWYgKEFWUkNfTUVUQURBVEFfSU5DTFVERUQgPT0gVFJVRSkKLSAgICBVSU5UOCAgICAgICBjdHlwZSA9IDA7CisgICAgdWludDhfdCAgICAgICBjdHlwZSA9IDA7CiAgICAgdEFWUkNfUkVTUE9OU0UgIHJjX3JzcDsKIAogICAgIHJjX3JzcC5yc3Auc3RhdHVzID0gQlRBX0FWX1NUU19OT19SU1A7CkBAIC04OTksNyArODk1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+cmNfbXNnLm1zZy5wYXNzLnBfcGFzc19kYXRhLCBpc19pbnF1aXJ5KTsKICNlbmRpZgogICAgICAgICAgICAgfQotI2lmIChBVlJDX0NUUkxfSU5DTFVERUQgPT0gVFJVRSkKKyNpZiAoQVZSQ19DVExSX0lOQ0xVREVEID09IFRSVUUpCiAgICAgICAgICAgICBlbHNlIGlmICgoKHBfZGF0YS0+cmNfbXNnLm1zZy5wYXNzLm9wX2lkID09IEFWUkNfSURfVk9MX1VQKXx8CiAgICAgICAgICAgICAgICAgICAgICAgKHBfZGF0YS0+cmNfbXNnLm1zZy5wYXNzLm9wX2lkID09IEFWUkNfSURfVk9MX0RPV04pKSAmJgogICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChhdnJjcF9jdF9zdXBwb3J0LCAidHJ1ZSIpKQpAQCAtOTQ3LDcgKzk0Myw3IEBACiAgICAgICAgICAgICAgIChwX2RhdGEtPnJjX21zZy5tc2cucGFzcy5wYXNzX2xlbiA+IDApKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGF2LnJlbW90ZV9yc3AucF9kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgKFVJTlQ4ICopb3NpX21hbGxvYyhwX2RhdGEtPnJjX21zZy5tc2cucGFzcy5wYXNzX2xlbik7CisgICAgICAgICAgICAgICAgICAgICh1aW50OF90ICopb3NpX21hbGxvYyhwX2RhdGEtPnJjX21zZy5tc2cucGFzcy5wYXNzX2xlbik7CiAgICAgICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiVmVuZG9yIFVuaXF1ZSBkYXRhIGxlbiA9ICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+cmNfbXNnLm1zZy5wYXNzLnBhc3NfbGVuKTsKICAgICAgICAgICAgICAgICBtZW1jcHkoYXYucmVtb3RlX3JzcC5wX2RhdGEscF9kYXRhLT5yY19tc2cubXNnLnBhc3MucF9wYXNzX2RhdGEsCkBAIC0xMDQ5LDcgKzEwNDUsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2F2X3JjX2Nsb3NlICh0QlRBX0FWX0NCICpwX2NiLCB0QlRBX0FWX0RBVEEgKnBfZGF0YSkKIHsKLSAgICBVSU5UMTYgaGFuZGxlID0gcF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWM7CisgICAgdWludDE2X3QgaGFuZGxlID0gcF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWM7CiAgICAgdEJUQV9BVl9TQ0IgICpwX3NjYjsKICAgICB0QlRBX0FWX1JDQiAqcF9yY2I7CiAKQEAgLTEwNTcsNyArMTA1Myw4IEBACiAgICAgewogICAgICAgICBwX3JjYiA9ICZwX2NiLT5yY2JbaGFuZGxlXTsKIAotICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfYXZfcmNfY2xvc2UgaGFuZGxlOiAlZCwgc3RhdHVzPTB4JXgiLCBwX3JjYi0+aGFuZGxlLCBwX3JjYi0+c3RhdHVzKTsKKyAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgaGFuZGxlOiAlZCwgc3RhdHVzPTB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwX3JjYi0+aGFuZGxlLCBwX3JjYi0+c3RhdHVzKTsKICAgICAgICAgaWYgKHBfcmNiLT5oYW5kbGUgIT0gQlRBX0FWX1JDX0hBTkRMRV9OT05FKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAocF9yY2ItPnNoZGwpCkBAIC0xMDg0LDEwICsxMDgxLDEwIEBACiAqKiBSZXR1cm5zICAgICAgICAgIFRoZSBpbmRleCB0byBwX3NjYltdCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBVSU5UOCBidGFfYXZfZ2V0X3NoZGwodEJUQV9BVl9TQ0IgKnBfc2NiKQorc3RhdGljIHVpbnQ4X3QgYnRhX2F2X2dldF9zaGRsKHRCVEFfQVZfU0NCICpwX3NjYikKIHsKICAgICBpbnQgICAgIGk7Ci0gICAgVUlOVDggICBzaGRsID0gMDsKKyAgICB1aW50OF90ICAgc2hkbCA9IDA7CiAgICAgLyogZmluZCB0aGUgU0NCICYgc3RvcCB0aGUgdGltZXIgKi8KICAgICBmb3IoaT0wOyBpPEJUQV9BVl9OVU1fU1RSUzsgaSsrKQogICAgIHsKQEAgLTExMDksMTIgKzExMDYsMTIgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9zdHJlYW1fY2hnKHRCVEFfQVZfU0NCICpwX3NjYiwgQk9PTEVBTiBzdGFydGVkKQordm9pZCBidGFfYXZfc3RyZWFtX2NoZyh0QlRBX0FWX1NDQiAqcF9zY2IsIGJvb2wgc3RhcnRlZCkKIHsKLSAgICBVSU5UOCAgIHN0YXJ0ZWRfbXNrOworICAgIHVpbnQ4X3QgICBzdGFydGVkX21zazsKICAgICBpbnQgICAgIGk7Ci0gICAgVUlOVDggICAqcF9zdHJlYW1zOwotICAgIEJPT0xFQU4gbm9fc3RyZWFtcyA9IEZBTFNFOworICAgIHVpbnQ4X3QgICAqcF9zdHJlYW1zOworICAgIGJvb2wgbm9fc3RyZWFtcyA9IGZhbHNlOwogICAgIHRCVEFfQVZfU0NCICpwX3NjYmk7CiAKICAgICBzdGFydGVkX21zayA9IEJUQV9BVl9ITkRMX1RPX01TSyhwX3NjYi0+aGRpKTsKQEAgLTExNDIsMTEgKzExMzksMTEgQEAKICAgICAgICAgaWYgKEJUQV9BVl9DSE5MX0FVRElPID09IHBfc2NiLT5jaG5sKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoYnRhX2F2X2NiLnZpZGVvX3N0cmVhbXMgPT0gMCkKLSAgICAgICAgICAgICAgICBub19zdHJlYW1zID0gVFJVRTsKKyAgICAgICAgICAgICAgICBub19zdHJlYW1zID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIG5vX3N0cmVhbXMgPSBUUlVFOworICAgICAgICAgICAgbm9fc3RyZWFtcyA9IHRydWU7CiAgICAgICAgICAgICBpZiAoIGJ0YV9hdl9jYi5hdWRpb19zdHJlYW1zICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBmb3IgKDsgaTxCVEFfQVZfTlVNX1NUUlM7IGkrKykKQEAgLTExNTYsNyArMTE1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmICggcF9zY2JpICYmIChidGFfYXZfY2IuYXVkaW9fc3RyZWFtcyAmIEJUQV9BVl9ITkRMX1RPX01TSyhpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICYmIGJkY21wKHBfc2NiaS0+cGVlcl9hZGRyLCBwX3NjYi0+cGVlcl9hZGRyKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub19zdHJlYW1zID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBub19zdHJlYW1zID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTExODksMTUgKzExODYsMTUgQEAKICAgICB0QlRBX0FWX0NCICAgKnBfY2IgPSAmYnRhX2F2X2NiOwogICAgIHRCVEFfQVZfU0NCICAgICAqcF9zY2IgPSBOVUxMOwogICAgIHRCVEFfQVZfU0NCICAgICAqcF9zY2JpOwotICAgIFVJTlQ4ICAgbWFzazsKLSAgICBVSU5UOCAgIGNvbm5fbXNrOwotICAgIFVJTlQ4ICAgb2xkX21zazsKKyAgICB1aW50OF90ICAgbWFzazsKKyAgICB1aW50OF90ICAgY29ubl9tc2s7CisgICAgdWludDhfdCAgIG9sZF9tc2s7CiAgICAgaW50IGk7CiAgICAgaW50IGluZGV4ID0gKHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljICYgQlRBX0FWX0hORExfTVNLKSAtIDE7CiAgICAgdEJUQV9BVl9MQ0IgKnBfbGNiOwogICAgIHRCVEFfQVZfTENCICpwX2xjYl9yYzsKICAgICB0QlRBX0FWX1JDQiAqcF9yY2IsICpwX3JjYjI7Ci0gICAgQk9PTEVBTiAgICAgY2hrX3Jlc3RvcmUgPSBGQUxTRTsKKyAgICBib29sICAgICBjaGtfcmVzdG9yZSA9IGZhbHNlOwogCiAgICAgLyogVmFsaWRhdGUgYXJyYXkgaW5kZXgqLwogICAgIGlmIChpbmRleCA8IEJUQV9BVl9OVU1fU1RSUykKQEAgLTEzMjAsNyArMTMxNyw3IEBACiAgICAgICAgICAgICAgICAgICAgIGFsYXJtX2NhbmNlbChwX3NjYi0+YXZyY19jdF90aW1lcik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8qIG9uZSBhdWRpbyBjaGFubmVsIGdvZXMgZG93bi4gY2hlY2sgaWYgd2UgbmVlZCB0byByZXN0b3JlIGhpZ2ggcHJpb3JpdHkgKi8KLSAgICAgICAgICAgICAgICBjaGtfcmVzdG9yZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgY2hrX3Jlc3RvcmUgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTEzOTQsMTAgKzEzOTEsMTAgQEAKIHZvaWQgYnRhX2F2X2Rpc2FibGUodEJUQV9BVl9DQiAqcF9jYiwgdEJUQV9BVl9EQVRBICpwX2RhdGEpCiB7CiAgICAgQlRfSERSICBoZHI7Ci0gICAgVUlOVDE2ICB4eDsKKyAgICB1aW50MTZfdCAgeHg7CiAgICAgVU5VU0VEKHBfZGF0YSk7CiAKLSAgICBwX2NiLT5kaXNhYmxpbmcgPSBUUlVFOworICAgIHBfY2ItPmRpc2FibGluZyA9IHRydWU7CiAKICAgICBidGFfYXZfY2xvc2VfYWxsX3JjKHBfY2IpOwogCkBAIC0xNDQzLDEwICsxNDQwLDEwIEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfYXZfc2lnX2NoZyh0QlRBX0FWX0RBVEEgKnBfZGF0YSkKIHsKLSAgICBVSU5UMTYgZXZlbnQgPSBwX2RhdGEtPnN0cl9tc2cuaGRyLmxheWVyX3NwZWNpZmljOworICAgIHVpbnQxNl90IGV2ZW50ID0gcF9kYXRhLT5zdHJfbXNnLmhkci5sYXllcl9zcGVjaWZpYzsKICAgICB0QlRBX0FWX0NCICAgKnBfY2IgPSAmYnRhX2F2X2NiOwotICAgIFVJTlQzMiB4eDsKLSAgICBVSU5UOCAgIG1hc2s7CisgICAgdWludDMyX3QgeHg7CisgICAgdWludDhfdCAgIG1hc2s7CiAgICAgdEJUQV9BVl9MQ0IgKnBfbGNiID0gTlVMTDsKIAogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9hdl9zaWdfY2hnIGV2ZW50OiAlZCIsIGV2ZW50KTsKQEAgLTE0NjMsNyArMTQ2MCw3IEBACiAgICAgICAgICAgICAgICAgdEJUQV9BVl9TQ0IgKnBfc2NiID0gcF9jYi0+cF9zY2JbeHhdOwogICAgICAgICAgICAgICAgIGlmIChwX3NjYiAhPSBOVUxMKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVUlOVDggYXZkdF90c2VwX3R5cGUgPSBwX3NjYi0+c2VwX2luZm9bcF9zY2ItPnNlcF9pbmZvX2lkeF0udHNlcDsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhdmR0X3RzZXBfdHlwZSA9IHBfc2NiLT5zZXBfaW5mb1twX3NjYi0+c2VwX2luZm9faWR4XS50c2VwOwogICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgZGV2aWNlIGlzIGEgQTJEUCBzb3VyY2UsIGRpc2Nvbm5lY3QgdGhlIEFWRFQgY29ubmVjdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICBpZiAoKGF2ZHRfdHNlcF90eXBlID09IEFWRFRfVFNFUF9TUkMpICYmIChwX2RhdGEtPmhkci5vZmZzZXQgPT0gQVZEVF9BQ1ApKQogICAgICAgICAgICAgICAgICAgICB7CkBAIC0xNDkxLDcgKzE0ODgsNyBAQAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJJbmNvbWluZyBMMkNBUCBhY3F1aXJlZCwgc2V0IHN0YXRlIGFzIGluY29taW5nIiwgTlVMTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBiZGNweShwX2NiLT5wX3NjYlt4eF0tPnBlZXJfYWRkciwgcF9kYXRhLT5zdHJfbXNnLmJkX2FkZHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9jYi0+cF9zY2JbeHhdLT51c2VfcmMgPSBUUlVFOyAgICAgLyogYWxsb3dpbmcgUkMgZm9yIGluY29taW5nIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBfY2ItPnBfc2NiW3h4XS0+dXNlX3JjID0gdHJ1ZTsgICAgIC8qIGFsbG93aW5nIFJDIGZvciBpbmNvbWluZyBjb25uZWN0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICBidGFfYXZfc3NtX2V4ZWN1dGUocF9jYi0+cF9zY2JbeHhdLCBCVEFfQVZfQUNQX0NPTk5FQ1RfRVZULCBwX2RhdGEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgUGVuZGluZyBFdmVudCBzaG91bGQgYmUgc2VudCBhcyBzb29uIGFzIHRoZSBMMkNBUCBzaWduYWxsaW5nIGNoYW5uZWwKQEAgLTE1MjQsNyArMTUyMSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0jaWYgKCBkZWZpbmVkIEJUQV9BUl9JTkNMVURFRCApICYmIChCVEFfQVJfSU5DTFVERUQgPT0gVFJVRSkKKyNpZiAoQlRBX0FSX0lOQ0xVREVEID09IFRSVUUpCiAgICAgZWxzZSBpZiAoZXZlbnQgPT0gQlRBX0FSX0FWRFRfQ09OTl9FVlQpCiAgICAgewogICAgICAgICBhbGFybV9jYW5jZWwoYnRhX2F2X2NiLmxpbmtfc2lnbmFsbGluZ190aW1lcik7CkBAIC0xNTcxLDcgKzE1NjgsNyBAQAogewogICAgIHRCVEFfQVZfQ0IgICAqcF9jYiA9ICZidGFfYXZfY2I7CiAgICAgaW50ICAgICB4eDsKLSAgICBVSU5UOCAgIG1hc2s7CisgICAgdWludDhfdCAgIG1hc2s7CiAgICAgdEJUQV9BVl9MQ0IgKnBfbGNiID0gTlVMTDsKICAgICB0QlRBX0FWX1BFTkQgcGVuZDsKICAgICBVTlVTRUQocF9kYXRhKTsKQEAgLTE2MDcsNyArMTYwNCw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgYnRhX2F2X2FjY2VwdF9zaWduYWxsaW5nX3RpbWVyX2NiYWNrKHZvaWQgKmRhdGEpCiB7Ci0gICAgVUlOVDMyICAgaW54ID0gUFRSX1RPX1VJTlQoZGF0YSk7CisgICAgdWludDMyX3QgICBpbnggPSBQVFJfVE9fVUlOVChkYXRhKTsKICAgICB0QlRBX0FWX0NCICAqcF9jYiA9ICZidGFfYXZfY2I7CiAgICAgdEJUQV9BVl9TQ0IgKnBfc2NiID0gTlVMTDsKICAgICBpZiAoaW54IDwgQlRBX0FWX05VTV9TVFJTKQpAQCAtMTY3MSwxOCArMTY2OCwxOCBAQAogKiogUmV0dXJucyAgICAgICAgICB0QlRBX0FWX0ZFQVQgcGVlciBkZXZpY2UgZmVhdHVyZSBtYXNrCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfQVZfRkVBVCBidGFfYXZfY2hlY2tfcGVlcl9mZWF0dXJlcyAoVUlOVDE2IHNlcnZpY2VfdXVpZCkKK3RCVEFfQVZfRkVBVCBidGFfYXZfY2hlY2tfcGVlcl9mZWF0dXJlcyAodWludDE2X3Qgc2VydmljZV91dWlkKQogewogICAgIHRCVEFfQVZfRkVBVCBwZWVyX2ZlYXR1cmVzID0gMDsKICAgICB0QlRBX0FWX0NCICAgKnBfY2IgPSAmYnRhX2F2X2NiOwogICAgIHRTRFBfRElTQ19SRUMgICAgICAgKnBfcmVjID0gTlVMTDsKICAgICB0U0RQX0RJU0NfQVRUUiAgICAgICpwX2F0dHI7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBwZWVyX3JjX3ZlcnNpb249MDsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIGNhdGVnb3JpZXMgPSAwOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBwZWVyX3JjX3ZlcnNpb249MDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgY2F0ZWdvcmllcyA9IDA7CiAKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfYXZfY2hlY2tfcGVlcl9mZWF0dXJlcyBzZXJ2aWNlX3V1aWQ6eCV4Iiwgc2VydmljZV91dWlkKTsKICAgICAvKiBsb29wIHRocm91Z2ggYWxsIHJlY29yZHMgd2UgZm91bmQgKi8KLSAgICB3aGlsZSAoVFJVRSkKKyAgICB3aGlsZSAodHJ1ZSkKICAgICB7CiAgICAgICAgIC8qIGdldCBuZXh0IHJlY29yZDsgaWYgbm9uZSBmb3VuZCwgd2UncmUgZG9uZSAqLwogICAgICAgICBpZiAoKHBfcmVjID0gU0RQX0ZpbmRTZXJ2aWNlSW5EYihwX2NiLT5wX2Rpc2NfZGIsIHNlcnZpY2VfdXVpZCwgcF9yZWMpKSA9PSBOVUxMKQpAQCAtMTc0MSwxOCArMTczOCwxOCBAQAogKiogUmV0dXJucyAgICAgICAgICB0QlRBX0FWX0ZFQVQgcGVlciBkZXZpY2UgZmVhdHVyZSBtYXNrCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfQVZfRkVBVCBidGFfYXZrX2NoZWNrX3BlZXJfZmVhdHVyZXMgKFVJTlQxNiBzZXJ2aWNlX3V1aWQpCit0QlRBX0FWX0ZFQVQgYnRhX2F2a19jaGVja19wZWVyX2ZlYXR1cmVzICh1aW50MTZfdCBzZXJ2aWNlX3V1aWQpCiB7CiAgICAgdEJUQV9BVl9GRUFUIHBlZXJfZmVhdHVyZXMgPSAwOwogICAgIHRCVEFfQVZfQ0IgKnBfY2IgPSAmYnRhX2F2X2NiOwogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgc2VydmljZV91dWlkOngleCIsIF9fRlVOQ1RJT05fXywgc2VydmljZV91dWlkKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBzZXJ2aWNlX3V1aWQ6eCV4IiwgX19mdW5jX18sIHNlcnZpY2VfdXVpZCk7CiAKICAgICAvKiBsb29wIHRocm91Z2ggYWxsIHJlY29yZHMgd2UgZm91bmQgKi8KICAgICB0U0RQX0RJU0NfUkVDICpwX3JlYyA9IFNEUF9GaW5kU2VydmljZUluRGIocF9jYi0+cF9kaXNjX2RiLCBzZXJ2aWNlX3V1aWQsIE5VTEwpOwogICAgIHdoaWxlIChwX3JlYykKICAgICB7Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIGZvdW5kIFNlcnZpY2UgcmVjb3JkIGZvciB4JXgiLCBfX0ZVTkNUSU9OX18sIHNlcnZpY2VfdXVpZCk7CisgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIGZvdW5kIFNlcnZpY2UgcmVjb3JkIGZvciB4JXgiLCBfX2Z1bmNfXywgc2VydmljZV91dWlkKTsKIAogICAgICAgICBpZiAoKCBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfcmVjLCBBVFRSX0lEX1NFUlZJQ0VfQ0xBU1NfSURfTElTVCkpICE9IE5VTEwpCiAgICAgICAgIHsKQEAgLTE3NzAsMTEgKzE3NjcsMTEgQEAKICAgICAgICAgaWYgKCggU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYyhwX3JlYywgQVRUUl9JRF9CVF9QUk9GSUxFX0RFU0NfTElTVCkpICE9IE5VTEwpCiAgICAgICAgIHsKICAgICAgICAgICAgIC8qIGdldCBwcm9maWxlIHZlcnNpb24gKGlmIGZhaWx1cmUsIHZlcnNpb24gcGFyYW1ldGVyIGlzIG5vdCB1cGRhdGVkKSAqLwotICAgICAgICAgICAgVUlOVDE2IHBlZXJfcmNfdmVyc2lvbiA9IDA7Ci0gICAgICAgICAgICBCT09MRUFOIHZhbCA9IFNEUF9GaW5kUHJvZmlsZVZlcnNpb25JblJlYygKKyAgICAgICAgICAgIHVpbnQxNl90IHBlZXJfcmNfdmVyc2lvbiA9IDA7CisgICAgICAgICAgICBib29sIHZhbCA9IFNEUF9GaW5kUHJvZmlsZVZlcnNpb25JblJlYygKICAgICAgICAgICAgICAgICBwX3JlYywgVVVJRF9TRVJWQ0xBU1NfQVZfUkVNT1RFX0NPTlRST0wsICZwZWVyX3JjX3ZlcnNpb24pOwogICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgcGVlcl9yY192ZXJzaW9uIGZvciBURyAweCV4LCBwcm9maWxlX2ZvdW5kICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwZWVyX3JjX3ZlcnNpb24sIHZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwZWVyX3JjX3ZlcnNpb24sIHZhbCk7CiAKICAgICAgICAgICAgIGlmIChwZWVyX3JjX3ZlcnNpb24gPj0gQVZSQ19SRVZfMV8zKQogICAgICAgICAgICAgICAgIHBlZXJfZmVhdHVyZXMgfD0gKEJUQV9BVl9GRUFUX1ZFTkRPUiB8IEJUQV9BVl9GRUFUX01FVEFEQVRBKTsKQEAgLTE3OTAsNyArMTc4Nyw3IEBACiAgICAgICAgICAgICAgICAgdFNEUF9ESVNDX0FUVFIgKnBfYXR0ciA9IFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIEFUVFJfSURfU1VQUE9SVEVEX0ZFQVRVUkVTKTsKICAgICAgICAgICAgICAgICBpZiAocF9hdHRyICE9IE5VTEwpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBVSU5UMTYgY2F0ZWdvcmllcyA9IHBfYXR0ci0+YXR0cl92YWx1ZS52LnUxNjsKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY2F0ZWdvcmllcyA9IHBfYXR0ci0+YXR0cl92YWx1ZS52LnUxNjsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNhdGVnb3JpZXMgJiBBVlJDX1NVUEZfQ1RfQ0FUMikKICAgICAgICAgICAgICAgICAgICAgICAgIHBlZXJfZmVhdHVyZXMgfD0gKEJUQV9BVl9GRUFUX0FEVl9DVFJMKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNhdGVnb3JpZXMgJiBBVlJDX1NVUEZfQ1RfQVBQX1NFVFRJTkdTKQpAQCAtMTgwMSw3ICsxNzk4LDcgQEAKICAgICAgICAgLyogZ2V0IG5leHQgcmVjb3JkOyBpZiBub25lIGZvdW5kLCB3ZSdyZSBkb25lICovCiAgICAgICAgIHBfcmVjID0gU0RQX0ZpbmRTZXJ2aWNlSW5EYihwX2NiLT5wX2Rpc2NfZGIsIHNlcnZpY2VfdXVpZCwgcF9yZWMpOwogICAgIH0KLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBwZWVyX2ZlYXR1cmVzOngleCIsIF9fRlVOQ1RJT05fXywgcGVlcl9mZWF0dXJlcyk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgcGVlcl9mZWF0dXJlczp4JXgiLCBfX2Z1bmNfXywgcGVlcl9mZWF0dXJlcyk7CiAgICAgcmV0dXJuIHBlZXJfZmVhdHVyZXM7CiB9CiAKQEAgLTE4MjIsMTEgKzE4MTksMTEgQEAKICAgICB0QlRBX0FWX0xDQiAgKnBfbGNiOwogICAgIHRCVEFfQVZfUkNfT1BFTiByY19vcGVuOwogICAgIHRCVEFfQVZfUkNfRkVBVCByY19mZWF0OwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgcmNfaGFuZGxlOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICByY19oYW5kbGU7CiAgICAgdEJUQV9BVl9GRUFUICAgICAgICBwZWVyX2ZlYXR1cmVzID0gMDsgIC8qIHBlZXIgZmVhdHVyZXMgbWFzayAqLwogICAgIFVOVVNFRChwX2RhdGEpOwogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgYnRhX2F2X3JjX2Rpc2NfZG9uZSBkaXNjOngleCIsIF9fRlVOQ1RJT05fXywgcF9jYi0+ZGlzYyk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgYnRhX2F2X3JjX2Rpc2NfZG9uZSBkaXNjOngleCIsIF9fZnVuY19fLCBwX2NiLT5kaXNjKTsKICAgICBpZiAoIXBfY2ItPmRpc2MpCiAgICAgewogICAgICAgICByZXR1cm47CkBAIC0xODU1LDcgKzE4NTIsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgcmNfaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLCByY19oYW5kbGUpOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIHJjX2hhbmRsZSAlZCIsIF9fZnVuY19fLCByY19oYW5kbGUpOwogI2lmIChCVEFfQVZfU0lOS19JTkNMVURFRCA9PSBUUlVFKQogICAgIGlmIChwX2NiLT5zZHBfYTJkX3Nua19oYW5kbGUpCiAgICAgewpAQCAtMTg4OSwxNCArMTg4NiwxNCBAQAogICAgIHsKICAgICAgICAgaWYgKHBfc2NiKQogICAgICAgICB7Ci0gICAgICAgICAgICAvKiBpZiBwZWVyIHJlbW90ZSBjb250cm9sIHNlcnZpY2UgbWF0Y2hlcyBvdXJzIGFuZCBVU0VfUkMgaXMgVFJVRSAqLworICAgICAgICAgICAgLyogaWYgcGVlciByZW1vdGUgY29udHJvbCBzZXJ2aWNlIG1hdGNoZXMgb3VycyBhbmQgVVNFX1JDIGlzIHRydWUgKi8KICAgICAgICAgICAgIGlmICgoKChwX2NiLT5mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX1JDQ1QpICYmIChwZWVyX2ZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfUkNURykpIHx8CiAgICAgICAgICAgICAgICAgICgocF9jYi0+ZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9SQ1RHKSAmJiAocGVlcl9mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX1JDQ1QpKSkgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHBfbGNiID0gYnRhX2F2X2ZpbmRfbGNiKHBfc2NiLT5wZWVyX2FkZHIsIEJUQV9BVl9MQ0JfRklORCk7CiAgICAgICAgICAgICAgICAgaWYgKHBfbGNiKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmNfaGFuZGxlID0gYnRhX2F2X3JjX2NyZWF0ZShwX2NiLCBBVkNUX0lOVCwgKFVJTlQ4KShwX3NjYi0+aGRpICsgMSksIHBfbGNiLT5saWR4KTsKKyAgICAgICAgICAgICAgICAgICAgcmNfaGFuZGxlID0gYnRhX2F2X3JjX2NyZWF0ZShwX2NiLCBBVkNUX0lOVCwgKHVpbnQ4X3QpKHBfc2NiLT5oZGkgKyAxKSwgcF9sY2ItPmxpZHgpOwogICAgICAgICAgICAgICAgICAgICBwX2NiLT5yY2JbcmNfaGFuZGxlXS5wZWVyX2ZlYXR1cmVzID0gcGVlcl9mZWF0dXJlczsKICAgICAgICAgICAgICAgICB9CiAjaWYgKEJUX1VTRV9UUkFDRVMgPT0gVFJVRSB8fCBCVF9UUkFDRV9BUFBMID09IFRSVUUpCkBAIC0xOTA5LDcgKzE5MDYsNyBAQAogICAgICAgICAgICAgZWxzZSBpZiAocF9zY2ItPnVzZV9yYykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvKiBjYW4gbm90IGZpbmQgQVZSQyBvbiBwZWVyIGRldmljZS4gcmVwb3J0IGZhaWx1cmUgKi8KLSAgICAgICAgICAgICAgICBwX3NjYi0+dXNlX3JjID0gRkFMU0U7CisgICAgICAgICAgICAgICAgcF9zY2ItPnVzZV9yYyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGJkY3B5KHJjX29wZW4ucGVlcl9hZGRyLCBwX3NjYi0+cGVlcl9hZGRyKTsKICAgICAgICAgICAgICAgICByY19vcGVuLnBlZXJfZmVhdHVyZXMgPSAwOwogICAgICAgICAgICAgICAgIHJjX29wZW4uc3RhdHVzID0gQlRBX0FWX0ZBSUxfU0RQOwpAQCAtMTk1NCw3ICsxOTUxLDcgQEAKICAgICB0QlRBX0FWX1JDQiAgICAqcF9yY2I7CiAgICAgdEJUQV9BVl9TQ0IgICAgKnBfc2NiOwogICAgIGludCBpOwotICAgIEJPT0xFQU4gY29ubiA9IEZBTFNFOworICAgIGJvb2wgY29ubiA9IGZhbHNlOwogICAgIHRCVEFfQVZfTENCICpwX2xjYjsKIAogICAgIHJjX2Nsb3NlLnJjX2hhbmRsZSA9IEJUQV9BVl9SQ19IQU5ETEVfTk9ORTsKQEAgLTIwMTgsNyArMjAxNSw3IEBACiAgICAgICAgIGVsc2UgaWYgKChwX3JjYi0+aGFuZGxlICE9IEJUQV9BVl9SQ19IQU5ETEVfTk9ORSkgJiYgKHBfcmNiLT5zdGF0dXMgJiBCVEFfQVZfUkNfQ09OTl9NQVNLKSkKICAgICAgICAgewogICAgICAgICAgICAgLyogYXQgbGVhc3Qgb25lIGNoYW5uZWwgaXMgc3RpbGwgY29ubmVjdGVkICovCi0gICAgICAgICAgICBjb25uID0gVFJVRTsKKyAgICAgICAgICAgIGNvbm4gPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMDQ1LDE3ICsyMDQyLDE3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfcmNfZGlzYyhVSU5UOCBkaXNjKQordm9pZCBidGFfYXZfcmNfZGlzYyh1aW50OF90IGRpc2MpCiB7CiAgICAgdEJUQV9BVl9DQiAgICpwX2NiID0gJmJ0YV9hdl9jYjsKICAgICB0QVZSQ19TRFBfREJfUEFSQU1TIGRiX3BhcmFtczsKLSAgICAgIFVJTlQxNiAgICAgICAgICAgICAgYXR0cl9saXN0W10gPSB7QVRUUl9JRF9TRVJWSUNFX0NMQVNTX0lEX0xJU1QsCisgICAgICB1aW50MTZfdCAgICAgICAgICAgICAgYXR0cl9saXN0W10gPSB7QVRUUl9JRF9TRVJWSUNFX0NMQVNTX0lEX0xJU1QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFRSX0lEX0JUX1BST0ZJTEVfREVTQ19MSVNULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRUUl9JRF9TVVBQT1JURURfRkVBVFVSRVN9OwotICAgIFVJTlQ4ICAgICAgIGhkaTsKKyAgICB1aW50OF90ICAgICAgIGhkaTsKICAgICB0QlRBX0FWX1NDQiAqcF9zY2I7Ci0gICAgVUlOVDggICAgICAgKnBfYWRkciA9IE5VTEw7Ci0gICAgVUlOVDggICAgICAgcmNfaGFuZGxlOworICAgIHVpbnQ4X3QgICAgICAgKnBfYWRkciA9IE5VTEw7CisgICAgdWludDhfdCAgICAgICByY19oYW5kbGU7CiAKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfYXZfcmNfZGlzYyAweCV4LCAlZCIsIGRpc2MsIGJ0YV9hdl9jYi5kaXNjKTsKICAgICBpZiAoKGJ0YV9hdl9jYi5kaXNjICE9IDApIHx8IChkaXNjID09IDApKQpAQCAtMjExNyw3ICsyMTE0LDcgQEAKICAgICB0QlRBX0FWX0NCICAgKnBfY2IgPSAmYnRhX2F2X2NiOwogICAgIHRCVEFfQVZfU0NCICAqcF9zY2I7CiAgICAgdEJUQV9VVExfQ09EICAgIGNvZDsKLSAgICBVSU5UOCAgIG1hc2s7CisgICAgdWludDhfdCAgIG1hc2s7CiAgICAgQlRfSERSICAqcF9idWY7CiAKICAgICAvKiBmaW5kIHRoZSBzdHJlYW0gY29udHJvbCBibG9jayAqLwpAQCAtMjE0OSw3ICsyMTQ2LDcgQEAKICAgICAgICAgICAgIC8qIHJlbW92ZSB0aGUgQTJEUCBTRFAgcmVjb3JkLCBpZiBubyBtb3JlIGF1ZGlvIHN0cmVhbSBpcyBsZWZ0ICovCiAgICAgICAgICAgICBpZiAoIXBfY2ItPnJlZ19hdWRpbykKICAgICAgICAgICAgIHsKLSNpZiAoIGRlZmluZWQgQlRBX0FSX0lOQ0xVREVEICkgJiYgKEJUQV9BUl9JTkNMVURFRCA9PSBUUlVFKQorI2lmIChCVEFfQVJfSU5DTFVERUQgPT0gVFJVRSkKICAgICAgICAgICAgICAgICBidGFfYXJfZGVyZWdfYXZyYyAoVVVJRF9TRVJWQ0xBU1NfQVZfUkVNT1RFX0NPTlRST0wsIEJUQV9JRF9BVik7CiAjZW5kaWYKICAgICAgICAgICAgICAgICBpZiAocF9jYi0+c2RwX2EyZF9oYW5kbGUpCkBAIC0yMTg5LDcgKzIxODYsNyBAQAogICAgIC8qIGlmIG5vIHN0cmVhbSBjb250cm9sIGJsb2NrIGlzIGFjdGl2ZSAqLwogICAgIGlmICgocF9jYi0+cmVnX2F1ZGlvICsgcF9jYi0+cmVnX3ZpZGVvKSA9PSAwKQogICAgIHsKLSNpZiAoIGRlZmluZWQgQlRBX0FSX0lOQ0xVREVEICkgJiYgKEJUQV9BUl9JTkNMVURFRCA9PSBUUlVFKQorI2lmIChCVEFfQVJfSU5DTFVERUQgPT0gVFJVRSkKICAgICAgICAgLyogZGVyZWdpc3RlciBmcm9tIEFWRFQgKi8KICAgICAgICAgYnRhX2FyX2RlcmVnX2F2ZHQoQlRBX0lEX0FWKTsKIApAQCAtMjIwMCw3ICsyMTk3LDcgQEAKIAogICAgICAgICBpZiAocF9jYi0+ZGlzYWJsaW5nKQogICAgICAgICB7Ci0gICAgICAgICAgICBwX2NiLT5kaXNhYmxpbmcgICAgID0gRkFMU0U7CisgICAgICAgICAgICBwX2NiLT5kaXNhYmxpbmcgICAgID0gZmFsc2U7CiAgICAgICAgICAgICBidGFfYXZfY2IuZmVhdHVyZXMgID0gMDsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9idGEvYXYvYnRhX2F2X2FwaS5jIGIvYnRhL2F2L2J0YV9hdl9hcGkuYwppbmRleCA1YTAzM2M5Li4yYzEzNDQ3IDEwMDY0NAotLS0gYS9idGEvYXYvYnRhX2F2X2FwaS5jCisrKyBiL2J0YS9hdi9idGFfYXZfYXBpLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxhc3NlcnQuaD4KIAogI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2lmIGRlZmluZWQoQlRBX0FWX0lOQ0xVREVEKSAmJiAoQlRBX0FWX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9BVl9JTkNMVURFRCA9PSBUUlVFKQogCiAjaW5jbHVkZSAiYnRhX2FwaS5oIgogI2luY2x1ZGUgImJ0YV9zeXMuaCIKQEAgLTEwOSw4ICsxMDksOCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2UmVnaXN0ZXIodEJUQV9BVl9DSE5MIGNobmwsIGNvbnN0IGNoYXIgKnBfc2VydmljZV9uYW1lLCBVSU5UOCBhcHBfaWQsCi0gICAgICAgICAgICAgICAgICAgIHRCVEFfQVZfREFUQV9DQkFDSyAgKnBfZGF0YV9jYmFjaywgVUlOVDE2IHNlcnZpY2VfdXVpZCkKK3ZvaWQgQlRBX0F2UmVnaXN0ZXIodEJUQV9BVl9DSE5MIGNobmwsIGNvbnN0IGNoYXIgKnBfc2VydmljZV9uYW1lLCB1aW50OF90IGFwcF9pZCwKKyAgICAgICAgICAgICAgICAgICAgdEJUQV9BVl9EQVRBX0NCQUNLICAqcF9kYXRhX2NiYWNrLCB1aW50MTZfdCBzZXJ2aWNlX3V1aWQpCiB7CiAgICAgdEJUQV9BVl9BUElfUkVHICpwX2J1ZiA9CiAgICAgICAgICh0QlRBX0FWX0FQSV9SRUcgKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0FWX0FQSV9SRUcpKTsKQEAgLTE1OCw4ICsxNTgsOCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2T3BlbihCRF9BRERSIGJkX2FkZHIsIHRCVEFfQVZfSE5ETCBoYW5kbGUsIEJPT0xFQU4gdXNlX3JjLCB0QlRBX1NFQyBzZWNfbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IHV1aWQpCit2b2lkIEJUQV9Bdk9wZW4oQkRfQUREUiBiZF9hZGRyLCB0QlRBX0FWX0hOREwgaGFuZGxlLCBib29sIHVzZV9yYywgdEJUQV9TRUMgc2VjX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHV1aWQpCiB7CiAgICAgdEJUQV9BVl9BUElfT1BFTiAqcF9idWYgPQogICAgICAgICAodEJUQV9BVl9BUElfT1BFTiAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfQVZfQVBJX09QRU4pKTsKQEAgLTI5OSwxOSArMjk5LDE5IEBACiAqKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BdlN0b3AKICoqCiAqKiBEZXNjcmlwdGlvbiAgICAgIFN0b3AgYXVkaW8vdmlkZW8gc3RyZWFtIGRhdGEgdHJhbnNmZXIuCi0qKiAgICAgICAgICAgICAgICAgIElmIHN1c3BlbmQgaXMgVFJVRSwgdGhpcyBmdW5jdGlvbiBzZW5kcyBBVkRUIHN1c3BlbmQgc2lnbmFsCisqKiAgICAgICAgICAgICAgICAgIElmIHN1c3BlbmQgaXMgdHJ1ZSwgdGhpcyBmdW5jdGlvbiBzZW5kcyBBVkRUIHN1c3BlbmQgc2lnbmFsCiAqKiAgICAgICAgICAgICAgICAgIHRvIHRoZSBjb25uZWN0ZWQgcGVlcihzKS4KICoqCiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQXZTdG9wKEJPT0xFQU4gc3VzcGVuZCkKK3ZvaWQgQlRBX0F2U3RvcChib29sIHN1c3BlbmQpCiB7CiAgICAgdEJUQV9BVl9BUElfU1RPUCAqcF9idWYgPQogICAgICAgICAodEJUQV9BVl9BUElfU1RPUCAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfQVZfQVBJX1NUT1ApKTsKIAogICAgIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfQVZfQVBJX1NUT1BfRVZUOwotICAgIHBfYnVmLT5mbHVzaCA9IFRSVUU7CisgICAgcF9idWYtPmZsdXNoID0gdHJ1ZTsKICAgICBwX2J1Zi0+c3VzcGVuZCA9IHN1c3BlbmQ7CiAKICAgICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwpAQCAtMzIyLDE2ICszMjIsMTYgQEAKICoqIEZ1bmN0aW9uICAgICAgICAgQlRBX0F2UmVjb25maWcKICoqCiAqKiBEZXNjcmlwdGlvbiAgICAgIFJlY29uZmlndXJlIHRoZSBhdWRpby92aWRlbyBzdHJlYW0uCi0qKiAgICAgICAgICAgICAgICAgIElmIHN1c3BlbmQgaXMgVFJVRSwgdGhpcyBmdW5jdGlvbiB0cmllcyB0aGUgc3VzcGVuZC9yZWNvbmZpZ3VyZQorKiogICAgICAgICAgICAgICAgICBJZiBzdXNwZW5kIGlzIHRydWUsIHRoaXMgZnVuY3Rpb24gdHJpZXMgdGhlIHN1c3BlbmQvcmVjb25maWd1cmUKICoqICAgICAgICAgICAgICAgICAgcHJvY2VkdXJlIGZpcnN0LgotKiogICAgICAgICAgICAgICAgICBJZiBzdXNwZW5kIGlzIEZBTFNFIG9yIHdoZW4gc3VzcGVuZC9yZWNvbmZpZ3VyZSBmYWlscywKKyoqICAgICAgICAgICAgICAgICAgSWYgc3VzcGVuZCBpcyBmYWxzZSBvciB3aGVuIHN1c3BlbmQvcmVjb25maWd1cmUgZmFpbHMsCiAqKiAgICAgICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gY2xvc2VzIGFuZCByZS1vcGVucyB0aGUgQVZEVCBjb25uZWN0aW9uLgogKioKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BdlJlY29uZmlnKHRCVEFfQVZfSE5ETCBobmRsLCBCT09MRUFOIHN1c3BlbmQsIFVJTlQ4IHNlcF9pbmZvX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfY29kZWNfaW5mbywgVUlOVDggbnVtX3Byb3RlY3QsIFVJTlQ4ICpwX3Byb3RlY3RfaW5mbykKK3ZvaWQgQlRBX0F2UmVjb25maWcodEJUQV9BVl9ITkRMIGhuZGwsIGJvb2wgc3VzcGVuZCwgdWludDhfdCBzZXBfaW5mb19pZHgsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfY29kZWNfaW5mbywgdWludDhfdCBudW1fcHJvdGVjdCwgdWludDhfdCAqcF9wcm90ZWN0X2luZm8pCiB7CiAgICAgdEJUQV9BVl9BUElfUkNGRyAqcF9idWYgPQogICAgICAgICAodEJUQV9BVl9BUElfUkNGRyAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfQVZfQVBJX1JDRkcpICsgbnVtX3Byb3RlY3QpOwpAQCAtMzQxLDcgKzM0MSw3IEBACiAgICAgcF9idWYtPm51bV9wcm90ZWN0ID0gbnVtX3Byb3RlY3Q7CiAgICAgcF9idWYtPnN1c3BlbmQgPSBzdXNwZW5kOwogICAgIHBfYnVmLT5zZXBfaW5mb19pZHggPSBzZXBfaW5mb19pZHg7Ci0gICAgcF9idWYtPnBfcHJvdGVjdF9pbmZvID0gKFVJTlQ4ICopKHBfYnVmICsgMSk7CisgICAgcF9idWYtPnBfcHJvdGVjdF9pbmZvID0gKHVpbnQ4X3QgKikocF9idWYgKyAxKTsKICAgICBtZW1jcHkocF9idWYtPmNvZGVjX2luZm8sIHBfY29kZWNfaW5mbywgQVZEVF9DT0RFQ19TSVpFKTsKICAgICBtZW1jcHkocF9idWYtPnBfcHJvdGVjdF9pbmZvLCBwX3Byb3RlY3RfaW5mbywgbnVtX3Byb3RlY3QpOwogCkBAIC0zNTgsNyArMzU4LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BdlByb3RlY3RSZXEodEJUQV9BVl9ITkRMIGhuZGwsIFVJTlQ4ICpwX2RhdGEsIFVJTlQxNiBsZW4pCit2b2lkIEJUQV9BdlByb3RlY3RSZXEodEJUQV9BVl9ITkRMIGhuZGwsIHVpbnQ4X3QgKnBfZGF0YSwgdWludDE2X3QgbGVuKQogewogICAgIHRCVEFfQVZfQVBJX1BST1RFQ1RfUkVRICpwX2J1ZiA9CiAgICAgICAgICh0QlRBX0FWX0FQSV9QUk9URUNUX1JFUSAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfQVZfQVBJX1BST1RFQ1RfUkVRKSArIGxlbik7CkBAIC0zNjksNyArMzY5LDcgQEAKICAgICBpZiAocF9kYXRhID09IE5VTEwpIHsKICAgICAgICAgcF9idWYtPnBfZGF0YSA9IE5VTEw7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcF9idWYtPnBfZGF0YSA9IChVSU5UOCAqKSAocF9idWYgKyAxKTsKKyAgICAgICAgcF9idWYtPnBfZGF0YSA9ICh1aW50OF90ICopIChwX2J1ZiArIDEpOwogICAgICAgICBtZW1jcHkocF9idWYtPnBfZGF0YSwgcF9kYXRhLCBsZW4pOwogICAgIH0KIApAQCAtMzg4LDcgKzM4OCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQXZQcm90ZWN0UnNwKHRCVEFfQVZfSE5ETCBobmRsLCBVSU5UOCBlcnJvcl9jb2RlLCBVSU5UOCAqcF9kYXRhLCBVSU5UMTYgbGVuKQordm9pZCBCVEFfQXZQcm90ZWN0UnNwKHRCVEFfQVZfSE5ETCBobmRsLCB1aW50OF90IGVycm9yX2NvZGUsIHVpbnQ4X3QgKnBfZGF0YSwgdWludDE2X3QgbGVuKQogewogICAgIHRCVEFfQVZfQVBJX1BST1RFQ1RfUlNQICpwX2J1ZiA9CiAgICAgICAgICh0QlRBX0FWX0FQSV9QUk9URUNUX1JTUCAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfQVZfQVBJX1BST1RFQ1RfUlNQKSArIGxlbik7CkBAIC00MDAsNyArNDAwLDcgQEAKICAgICBpZiAocF9kYXRhID09IE5VTEwpIHsKICAgICAgICAgcF9idWYtPnBfZGF0YSA9IE5VTEw7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcF9idWYtPnBfZGF0YSA9IChVSU5UOCAqKSAocF9idWYgKyAxKTsKKyAgICAgICAgcF9idWYtPnBfZGF0YSA9ICh1aW50OF90ICopIChwX2J1ZiArIDEpOwogICAgICAgICBtZW1jcHkocF9idWYtPnBfZGF0YSwgcF9kYXRhLCBsZW4pOwogICAgIH0KIApAQCAtNDE3LDcgKzQxNyw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQXZSZW1vdGVDbWQoVUlOVDggcmNfaGFuZGxlLCBVSU5UOCBsYWJlbCwgdEJUQV9BVl9SQyByY19pZCwgdEJUQV9BVl9TVEFURSBrZXlfc3RhdGUpCit2b2lkIEJUQV9BdlJlbW90ZUNtZCh1aW50OF90IHJjX2hhbmRsZSwgdWludDhfdCBsYWJlbCwgdEJUQV9BVl9SQyByY19pZCwgdEJUQV9BVl9TVEFURSBrZXlfc3RhdGUpCiB7CiAgICAgdEJUQV9BVl9BUElfUkVNT1RFX0NNRCAqcF9idWYgPQogICAgICAgICAodEJUQV9BVl9BUElfUkVNT1RFX0NNRCAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfQVZfQVBJX1JFTU9URV9DTUQpKTsKQEAgLTQ0NCw5ICs0NDQsOSBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2UmVtb3RlVmVuZG9yVW5pcXVlQ21kKFVJTlQ4IHJjX2hhbmRsZSwgVUlOVDggbGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0FWX1NUQVRFIGtleV9zdGF0ZSwgVUlOVDgqIHBfbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggYnVmX2xlbikKK3ZvaWQgQlRBX0F2UmVtb3RlVmVuZG9yVW5pcXVlQ21kKHVpbnQ4X3QgcmNfaGFuZGxlLCB1aW50OF90IGxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9BVl9TVEFURSBrZXlfc3RhdGUsIHVpbnQ4X3QqIHBfbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBidWZfbGVuKQogewogICAgIHRCVEFfQVZfQVBJX1JFTU9URV9DTUQgKnBfYnVmID0KICAgICAgICh0QlRBX0FWX0FQSV9SRU1PVEVfQ01EICopb3NpX21hbGxvYyhzaXplb2YodEJUQV9BVl9BUElfUkVNT1RFX0NNRCkgKwpAQCAtNDYxLDcgKzQ2MSw3IEBACiAgICAgaWYgKHBfbXNnID09IE5VTEwpIHsKICAgICAgICAgcF9idWYtPm1zZy5wX3Bhc3NfZGF0YSA9IE5VTEw7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcF9idWYtPm1zZy5wX3Bhc3NfZGF0YSA9IChVSU5UOCAqKShwX2J1ZiArIDEpOworICAgICAgICBwX2J1Zi0+bXNnLnBfcGFzc19kYXRhID0gKHVpbnQ4X3QgKikocF9idWYgKyAxKTsKICAgICAgICAgbWVtY3B5KHBfYnVmLT5tc2cucF9wYXNzX2RhdGEsIHBfbXNnLCBidWZfbGVuKTsKICAgICB9CiAgICAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKQEAgLTQ3OCw3ICs0NzgsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2VmVuZG9yQ21kKFVJTlQ4IHJjX2hhbmRsZSwgVUlOVDggbGFiZWwsIHRCVEFfQVZfQ09ERSBjbWRfY29kZSwgVUlOVDggKnBfZGF0YSwgVUlOVDE2IGxlbikKK3ZvaWQgQlRBX0F2VmVuZG9yQ21kKHVpbnQ4X3QgcmNfaGFuZGxlLCB1aW50OF90IGxhYmVsLCB0QlRBX0FWX0NPREUgY21kX2NvZGUsIHVpbnQ4X3QgKnBfZGF0YSwgdWludDE2X3QgbGVuKQogewogICAgIHRCVEFfQVZfQVBJX1ZFTkRPUiAqcF9idWYgPQogICAgICAgICAodEJUQV9BVl9BUElfVkVORE9SICopb3NpX21hbGxvYyhzaXplb2YodEJUQV9BVl9BUElfVkVORE9SKSArIGxlbik7CkBAIC00OTQsNyArNDk0LDcgQEAKICAgICBpZiAocF9kYXRhID09IE5VTEwpIHsKICAgICAgICAgcF9idWYtPm1zZy5wX3ZlbmRvcl9kYXRhID0gTlVMTDsKICAgICB9IGVsc2UgewotICAgICAgICBwX2J1Zi0+bXNnLnBfdmVuZG9yX2RhdGEgPSAoVUlOVDggKikgKHBfYnVmICsgMSk7CisgICAgICAgIHBfYnVmLT5tc2cucF92ZW5kb3JfZGF0YSA9ICh1aW50OF90ICopIChwX2J1ZiArIDEpOwogICAgICAgICBtZW1jcHkocF9idWYtPm1zZy5wX3ZlbmRvcl9kYXRhLCBwX2RhdGEsIGxlbik7CiAgICAgfQogCkBAIC01MTMsNyArNTEzLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BdlZlbmRvclJzcChVSU5UOCByY19oYW5kbGUsIFVJTlQ4IGxhYmVsLCB0QlRBX0FWX0NPREUgcnNwX2NvZGUsIFVJTlQ4ICpwX2RhdGEsIFVJTlQxNiBsZW4sIFVJTlQzMiBjb21wYW55X2lkKQordm9pZCBCVEFfQXZWZW5kb3JSc3AodWludDhfdCByY19oYW5kbGUsIHVpbnQ4X3QgbGFiZWwsIHRCVEFfQVZfQ09ERSByc3BfY29kZSwgdWludDhfdCAqcF9kYXRhLCB1aW50MTZfdCBsZW4sIHVpbnQzMl90IGNvbXBhbnlfaWQpCiB7CiAgICAgdEJUQV9BVl9BUElfVkVORE9SICpwX2J1ZiA9CiAgICAgICAgICh0QlRBX0FWX0FQSV9WRU5ET1IgKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0FWX0FQSV9WRU5ET1IpICsgbGVuKTsKQEAgLTUzMiw3ICs1MzIsNyBAQAogICAgIGlmIChwX2RhdGEgPT0gTlVMTCkgewogICAgICAgICBwX2J1Zi0+bXNnLnBfdmVuZG9yX2RhdGEgPSBOVUxMOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHBfYnVmLT5tc2cucF92ZW5kb3JfZGF0YSA9IChVSU5UOCAqKSAocF9idWYgKyAxKTsKKyAgICAgICAgcF9idWYtPm1zZy5wX3ZlbmRvcl9kYXRhID0gKHVpbnQ4X3QgKikgKHBfYnVmICsgMSk7CiAgICAgICAgIG1lbWNweShwX2J1Zi0+bXNnLnBfdmVuZG9yX2RhdGEsIHBfZGF0YSwgbGVuKTsKICAgICB9CiAKQEAgLTU2OSw3ICs1NjksNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2Q2xvc2VSYyhVSU5UOCByY19oYW5kbGUpCit2b2lkIEJUQV9BdkNsb3NlUmModWludDhfdCByY19oYW5kbGUpCiB7CiAgICAgdEJUQV9BVl9BUElfQ0xPU0VfUkMgKnBfYnVmID0KICAgICAgICAgKHRCVEFfQVZfQVBJX0NMT1NFX1JDICopb3NpX21hbGxvYyhzaXplb2YodEJUQV9BVl9BUElfQ0xPU0VfUkMpKTsKQEAgLTU5Miw3ICs1OTIsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2TWV0YVJzcChVSU5UOCByY19oYW5kbGUsIFVJTlQ4IGxhYmVsLCB0QlRBX0FWX0NPREUgcnNwX2NvZGUsCit2b2lkIEJUQV9Bdk1ldGFSc3AodWludDhfdCByY19oYW5kbGUsIHVpbnQ4X3QgbGFiZWwsIHRCVEFfQVZfQ09ERSByc3BfY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIgKnBfcGt0KQogewogICAgIHRCVEFfQVZfQVBJX01FVEFfUlNQICAqcF9idWYgPQpAQCAtNjAyLDcgKzYwMiw3IEBACiAgICAgcF9idWYtPmhkci5sYXllcl9zcGVjaWZpYyA9IHJjX2hhbmRsZTsKICAgICBwX2J1Zi0+cnNwX2NvZGUgPSByc3BfY29kZTsKICAgICBwX2J1Zi0+cF9wa3QgPSBwX3BrdDsKLSAgICBwX2J1Zi0+aXNfcnNwID0gVFJVRTsKKyAgICBwX2J1Zi0+aXNfcnNwID0gdHJ1ZTsKICAgICBwX2J1Zi0+bGFiZWwgPSBsYWJlbDsKIAogICAgIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7CkBAIC02MjIsNyArNjIyLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9Bdk1ldGFDbWQoVUlOVDggcmNfaGFuZGxlLCBVSU5UOCBsYWJlbCwgdEJUQV9BVl9DTUQgY21kX2NvZGUsIEJUX0hEUiAqcF9wa3QpCit2b2lkIEJUQV9Bdk1ldGFDbWQodWludDhfdCByY19oYW5kbGUsIHVpbnQ4X3QgbGFiZWwsIHRCVEFfQVZfQ01EIGNtZF9jb2RlLCBCVF9IRFIgKnBfcGt0KQogewogICAgIHRCVEFfQVZfQVBJX01FVEFfUlNQICpwX2J1ZiA9CiAgICAgICAgICh0QlRBX0FWX0FQSV9NRVRBX1JTUCAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfQVZfQVBJX01FVEFfUlNQKSk7CkBAIC02MzEsNyArNjMxLDcgQEAKICAgICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljICAgPSByY19oYW5kbGU7CiAgICAgcF9idWYtPnBfcGt0ID0gcF9wa3Q7CiAgICAgcF9idWYtPnJzcF9jb2RlID0gY21kX2NvZGU7Ci0gICAgcF9idWYtPmlzX3JzcCA9IEZBTFNFOworICAgIHBfYnVmLT5pc19yc3AgPSBmYWxzZTsKICAgICBwX2J1Zi0+bGFiZWwgPSBsYWJlbDsKIAogICAgIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7CmRpZmYgLS1naXQgYS9idGEvYXYvYnRhX2F2X2NmZy5jIGIvYnRhL2F2L2J0YV9hdl9jZmcuYwppbmRleCA3ZTEzMzE2Li4wYjZmNGJlIDEwMDY0NAotLS0gYS9idGEvYXYvYnRhX2F2X2NmZy5jCisrKyBiL2J0YS9hdi9idGFfYXZfY2ZnLmMKQEAgLTM0LDcgKzM0LDcgQEAKICNkZWZpbmUgQlRBX0FWX1JDX1BBU1NfUlNQX0NPREUgICAgIEJUQV9BVl9SU1BfTk9UX0lNUEwKICNlbmRpZgogCi1jb25zdCBVSU5UMzIgIGJ0YV9hdl9tZXRhX2NhcHNfY29faWRzW10gPSB7Citjb25zdCB1aW50MzJfdCAgYnRhX2F2X21ldGFfY2Fwc19jb19pZHNbXSA9IHsKICAgICBBVlJDX0NPX01FVEFEQVRBLAogICAgIEFWUkNfQ09fQlJPQURDT00KIH07CkBAIC01NCw3ICs1NCw3IEBACiAqLwogLyogRmx1c2hpbmcgcGFydGlhbCBhdmR0cCBwYWNrZXRzIGNhbiBjYXVzZSBzb21lIGhlYWRzZXRzIHRvIGRpc2Nvbm5lY3QgdGhlIGxpbmsKICAgIGlmIHJlY2VpdmluZyBwYXJ0aWFsIGEyZHAgZnJhbWVzICovCi1jb25zdCBVSU5UMTYgIGJ0YV9hdl9hdWRpb19mbHVzaF90b1tdID0geworY29uc3QgdWludDE2X3QgIGJ0YV9hdl9hdWRpb19mbHVzaF90b1tdID0gewogICAgICAwLCAvKiAxIHN0cmVhbSAqLwogICAgICAwLCAvKiAyIHN0cmVhbXMgKi8KICAgICAgMCwgLyogMyBzdHJlYW1zICovCkBAIC02Myw4ICs2Myw4IEBACiB9OyAgICAgLyogQVZEVFAgYXVkaW8gdHJhbnNwb3J0IGNoYW5uZWwgZmx1c2ggdGltZW91dCAqLwogCiAvKiBOb3RlOiBBbmRyb2lkIGRvZXNudCBzdXBwb3J0IEFWUkNfU1VQRl9UR19HUk9VUF9OQVZJICAqLwotLyogTm90ZTogaWYgQVZSQ19TVVBGX1RHX0dST1VQX05BVkkgaXMgc2V0LCBidGFfYXZfY2ZnLmF2cmNfZ3JvdXAgc2hvdWxkIGJlIFRSVUUgKi8KLSNpZiBBVlJDX01FVEFEQVRBX0lOQ0xVREVEID09IFRSVUUKKy8qIE5vdGU6IGlmIEFWUkNfU1VQRl9UR19HUk9VUF9OQVZJIGlzIHNldCwgYnRhX2F2X2NmZy5hdnJjX2dyb3VwIHNob3VsZCBiZSB0cnVlICovCisjaWYgKEFWUkNfTUVUQURBVEFfSU5DTFVERUQgPT0gVFJVRSkKICNkZWZpbmUgQlRBX0FWX1JDX1NVUEZfVEcgICAgICAgKEFWUkNfU1VQRl9UR19DQVQxKSAvKiBUT0RPOiB8IEFWUkNfU1VQRl9UR19BUFBfU0VUVElOR1MpICovCiAjZWxzZQogI2RlZmluZSBCVEFfQVZfUkNfU1VQRl9URyAgICAgICAoQVZSQ19TVVBGX1RHX0NBVDEpCkBAIC03Myw3ICs3Myw3IEBACiAvKgogICogSWYgdGhlIG51bWJlciBvZiBldmVudCBJRHMgaXMgY2hhbmdlZCBpbiB0aGlzIGFycmF5LCBCVEFfQVZfIE5VTV9SQ19FVlRfSURTICAgYWxzbyBuZWVkcyB0byBiZSBjaGFuZ2VkLgogICovCi1jb25zdCBVSU5UOCAgYnRhX2F2X21ldGFfY2Fwc19ldnRfaWRzW10gPSB7Citjb25zdCB1aW50OF90ICBidGFfYXZfbWV0YV9jYXBzX2V2dF9pZHNbXSA9IHsKICAgICBBVlJDX0VWVF9QTEFZX1NUQVRVU19DSEFOR0UsCiAgICAgQVZSQ19FVlRfVFJBQ0tfQ0hBTkdFLAogICAgIEFWUkNfRVZUX1BMQVlfUE9TX0NIQU5HRUQsCkBAIC04NSw4ICs4NSw4IEBACiAjZGVmaW5lIEJUQV9BVl9OVU1fUkNfRVZUX0lEUyAgIChzaXplb2YoYnRhX2F2X21ldGFfY2Fwc19ldnRfaWRzKSAvIHNpemVvZihidGFfYXZfbWV0YV9jYXBzX2V2dF9pZHNbMF0pKQogI2VuZGlmIC8qIEJUQV9BVl9OVU1fUkNfRVZUX0lEUyAqLwogCi1jb25zdCBVSU5UOCAgYnRhX2F2a19tZXRhX2NhcHNfZXZ0X2lkc1tdID0gewotI2lmIEFWUkNfQURWX0NUUkxfSU5DTFVERUQgPT0gVFJVRQorY29uc3QgdWludDhfdCAgYnRhX2F2a19tZXRhX2NhcHNfZXZ0X2lkc1tdID0geworI2lmIChBVlJDX0FEVl9DVFJMX0lOQ0xVREVEID09IFRSVUUpCiAgICAgQVZSQ19FVlRfVk9MVU1FX0NIQU5HRSwKICNlbmRpZgogfTsKQEAgLTEwNCw3ICsxMDQsNyBAQAogY29uc3QgdEJUQV9BVl9DRkcgYnRhX2F2X2NmZyA9CiB7CiAgICAgQVZSQ19DT19CUk9BRENPTSwgICAgICAgLyogQVZSQ1AgQ29tcGFueSBJRCAqLwotI2lmIEFWUkNfTUVUQURBVEFfSU5DTFVERUQgPT0gVFJVRQorI2lmIChBVlJDX01FVEFEQVRBX0lOQ0xVREVEID09IFRSVUUpCiAgICAgNTEyLCAgICAgICAgICAgICAgICAgICAgLyogQVZSQ1AgTVRVIGF0IEwyQ0FQIGZvciBjb250cm9sIGNoYW5uZWwgKi8KICNlbHNlCiAgICAgNDgsICAgICAgICAgICAgICAgICAgICAgLyogQVZSQ1AgTVRVIGF0IEwyQ0FQIGZvciBjb250cm9sIGNoYW5uZWwgKi8KQEAgLTExOCw3ICsxMTgsNyBAQAogICAgIDYsICAgICAgICAgICAgICAgICAgICAgIC8qIEFWRFRQIGF1ZGlvIGNoYW5uZWwgbWF4IGRhdGEgcXVldWUgc2l6ZSAqLwogICAgIEJUQV9BVl9NQVhfVkRQX01UVSwgICAgIC8qIEFWRFRQIHZpZGVvIHRyYW5zcG9ydCBjaGFubmVsIE1UVSBhdCBMMkNBUCAqLwogICAgIDYwMCwgICAgICAgICAgICAgICAgICAgIC8qIEFWRFRQIHZpZGVvIHRyYW5zcG9ydCBjaGFubmVsIGZsdXNoIHRpbWVvdXQgKi8KLSAgICBGQUxTRSwgICAgICAgICAgICAgICAgICAgLyogVFJVRSwgdG8gYWNjZXB0IEFWUkMgMS4zIGdyb3VwIG5ldmlnYXRpb24gY29tbWFuZCAqLworICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgICAvKiB0cnVlLCB0byBhY2NlcHQgQVZSQyAxLjMgZ3JvdXAgbmV2aWdhdGlvbiBjb21tYW5kICovCiAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgLyogY29tcGFueSBpZCBjb3VudCBpbiBwX21ldGFfY29faWRzICovCiAgICAgQlRBX0FWX05VTV9SQ19FVlRfSURTLCAvKiBldmVudCBpZCBjb3VudCBpbiBwX21ldGFfZXZ0X2lkcyAqLwogICAgIEJUQV9BVl9SQ19QQVNTX1JTUF9DT0RFLC8qIHRoZSBkZWZhdWx0IHJlc3BvbnNlIGNvZGUgZm9yIHBhc3MgdGhyb3VnaCBjb21tYW5kcyAqLwpAQCAtMTM0LDcgKzEzNCw3IEBACiBjb25zdCB0QlRBX0FWX0NGRyBidGFfYXZrX2NmZyA9CiB7CiAgICAgQVZSQ19DT19NRVRBREFUQSwgICAgICAgLyogQVZSQ1AgQ29tcGFueSBJRCAqLwotI2lmIEFWUkNfTUVUQURBVEFfSU5DTFVERUQgPT0gVFJVRQorI2lmIChBVlJDX01FVEFEQVRBX0lOQ0xVREVEID09IFRSVUUpCiAgICAgNTEyLCAgICAgICAgICAgICAgICAgICAgLyogQVZSQ1AgTVRVIGF0IEwyQ0FQIGZvciBjb250cm9sIGNoYW5uZWwgKi8KICNlbHNlCiAgICAgNDgsICAgICAgICAgICAgICAgICAgICAgLyogQVZSQ1AgTVRVIGF0IEwyQ0FQIGZvciBjb250cm9sIGNoYW5uZWwgKi8KQEAgLTE0OCw3ICsxNDgsNyBAQAogICAgIDYsICAgICAgICAgICAgICAgICAgICAgIC8qIEFWRFRQIGF1ZGlvIGNoYW5uZWwgbWF4IGRhdGEgcXVldWUgc2l6ZSAqLwogICAgIEJUQV9BVl9NQVhfVkRQX01UVSwgICAgIC8qIEFWRFRQIHZpZGVvIHRyYW5zcG9ydCBjaGFubmVsIE1UVSBhdCBMMkNBUCAqLwogICAgIDYwMCwgICAgICAgICAgICAgICAgICAgIC8qIEFWRFRQIHZpZGVvIHRyYW5zcG9ydCBjaGFubmVsIGZsdXNoIHRpbWVvdXQgKi8KLSAgICBGQUxTRSwgICAgICAgICAgICAgICAgICAgLyogVFJVRSwgdG8gYWNjZXB0IEFWUkMgMS4zIGdyb3VwIG5ldmlnYXRpb24gY29tbWFuZCAqLworICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgICAvKiB0cnVlLCB0byBhY2NlcHQgQVZSQyAxLjMgZ3JvdXAgbmV2aWdhdGlvbiBjb21tYW5kICovCiAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgLyogY29tcGFueSBpZCBjb3VudCBpbiBwX21ldGFfY29faWRzICovCiAgICAgQlRBX0FWS19OVU1fUkNfRVZUX0lEUywgLyogZXZlbnQgaWQgY291bnQgaW4gcF9tZXRhX2V2dF9pZHMgKi8KICAgICBCVEFfQVZfUkNfUEFTU19SU1BfQ09ERSwvKiB0aGUgZGVmYXVsdCByZXNwb25zZSBjb2RlIGZvciBwYXNzIHRocm91Z2ggY29tbWFuZHMgKi8KQEAgLTE2Miw3ICsxNjIsNyBAQAogCiB0QlRBX0FWX0NGRyAqcF9idGFfYXZfY2ZnID0gTlVMTDsKIAotY29uc3QgVUlOVDE2IGJ0YV9hdl9yY19pZFtdID0KK2NvbnN0IHVpbnQxNl90IGJ0YV9hdl9yY19pZFtdID0KIHsKICAgICAweDAwMDAsIC8qIGJpdCBtYXNrOiAwPVNFTEVDVCwgMT1VUCwgMj1ET1dOLCAzPUxFRlQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgND1SSUdIVCwgNT1SSUdIVF9VUCwgNj1SSUdIVF9ET1dOLCA3PUxFRlRfVVAsCkBAIC0xODgsMTkgKzE4OCwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIDQ9UExBWSwgNT1TVE9QLCA2PVBBVVNFLCA3PVJFQ09SRCwKICAgICAgICAgICAgICAgICAgICAgICAgICA4PVJFV0lORCwgOT1GQVNUX0ZPUiwgMTA9RUpFQ1QsIDExPUZPUldBUkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgMTI9QkFDS1dBUkQgKi8KLSNlbHNlCi0jaWYgKGRlZmluZWQgQlRBX0FWUkNQX0ZGX1JXX1NVUFBPUlQpICYmIChCVEFfQVZSQ1BfRkZfUldfU1VQUE9SVCA9PSBUUlVFKQorI2Vsc2UgLyogQlRBX0FWX1JDX1BBU1NfUlNQX0NPREUgIT0gQlRBX0FWX1JTUF9JTlRFUklNICovCisjaWYgKEJUQV9BVlJDUF9GRl9SV19TVVBQT1JUID09IFRSVUUpCiAgICAgMHgxYjcwLCAvKiBiaXQgbWFzazogMD1QT1dFUiwgMT1WT0xfVVAsIDI9Vk9MX0RPV04sIDM9TVVURSwKICAgICAgICAgICAgICAgICAgICAgICAgICA0PVBMQVksIDU9U1RPUCwgNj1QQVVTRSwgNz1SRUNPUkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgOD1SRVdJTkQsIDk9RkFTVF9GT1IsIDEwPUVKRUNULCAxMT1GT1JXQVJELAogICAgICAgICAgICAgICAgICAgICAgICAgIDEyPUJBQ0tXQVJEICovCi0jZWxzZQorI2Vsc2UgLyogQlRBX0FWUkNQX0ZGX1JXX1NVUFBPUlQgPT0gRkFMU0UgKi8KICAgICAweDE4NzAsIC8qIGJpdCBtYXNrOiAwPVBPV0VSLCAxPVZPTF9VUCwgMj1WT0xfRE9XTiwgMz1NVVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgIDQ9UExBWSwgNT1TVE9QLCA2PVBBVVNFLCA3PVJFQ09SRCwKICAgICAgICAgICAgICAgICAgICAgICAgICA4PVJFV0lORCwgOT1GQVNUX0ZPUiwgMTA9RUpFQ1QsIDExPUZPUldBUkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgMTI9QkFDS1dBUkQgKi8KLSNlbmRpZgotI2VuZGlmCisjZW5kaWYgLyogQlRBX0FWUkNQX0ZGX1JXX1NVUFBPUlQgKi8KKyNlbmRpZiAvKiBCVEFfQVZfUkNfUEFTU19SU1BfQ09ERSAqLwogCiAgICAgMHgwMDAwLCAvKiBiaXQgbWFzazogMD1BTkdMRSwgMT1TVUJQSUNUICovCiAKQEAgLTIxMSw3ICsyMTEsNyBAQAogfTsKIAogI2lmIChCVEFfQVZfUkNfUEFTU19SU1BfQ09ERSA9PSBCVEFfQVZfUlNQX0lOVEVSSU0pCi1jb25zdCBVSU5UMTYgYnRhX2F2X3JjX2lkX2FjW10gPQorY29uc3QgdWludDE2X3QgYnRhX2F2X3JjX2lkX2FjW10gPQogewogICAgIDB4MDAwMCwgLyogYml0IG1hc2s6IDA9U0VMRUNULCAxPVVQLCAyPURPV04sIDM9TEVGVCwKICAgICAgICAgICAgICAgICAgICAgICAgICA0PVJJR0hULCA1PVJJR0hUX1VQLCA2PVJJR0hUX0RPV04sIDc9TEVGVF9VUCwKQEAgLTI0NCw5ICsyNDQsOSBAQAogICAgIDB4MDAwMCAgLyogYml0IG1hc2s6IDA9bm90IHVzZWQsIDE9RjEsIDI9RjIsIDM9RjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgND1GNCwgNT1GNSAqLwogfTsKLVVJTlQxNiAqcF9idGFfYXZfcmNfaWRfYWMgPSAoVUlOVDE2ICopIGJ0YV9hdl9yY19pZF9hYzsKK3VpbnQxNl90ICpwX2J0YV9hdl9yY19pZF9hYyA9ICh1aW50MTZfdCAqKSBidGFfYXZfcmNfaWRfYWM7CiAjZWxzZQotVUlOVDE2ICpwX2J0YV9hdl9yY19pZF9hYyA9IE5VTEw7Cit1aW50MTZfdCAqcF9idGFfYXZfcmNfaWRfYWMgPSBOVUxMOwogI2VuZGlmCiAKLVVJTlQxNiAqcF9idGFfYXZfcmNfaWQgPSAoVUlOVDE2ICopIGJ0YV9hdl9yY19pZDsKK3VpbnQxNl90ICpwX2J0YV9hdl9yY19pZCA9ICh1aW50MTZfdCAqKSBidGFfYXZfcmNfaWQ7CmRpZmYgLS1naXQgYS9idGEvYXYvYnRhX2F2X2NpLmMgYi9idGEvYXYvYnRhX2F2X2NpLmMKaW5kZXggMzYxNjljNi4uNGVhMzBkMCAxMDA2NDQKLS0tIGEvYnRhL2F2L2J0YV9hdl9jaS5jCisrKyBiL2J0YS9hdi9idGFfYXZfY2kuYwpAQCAtNjUsOCArNjUsOCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X2NpX3NldGNvbmZpZyh0QlRBX0FWX0hOREwgaG5kbCwgVUlOVDggZXJyX2NvZGUsIFVJTlQ4IGNhdGVnb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4IG51bV9zZWlkLCBVSU5UOCAqcF9zZWlkLCBCT09MRUFOIHJlY2ZnX25lZWRlZCwgVUlOVDggYXZkdF9oYW5kbGUpCit2b2lkIGJ0YV9hdl9jaV9zZXRjb25maWcodEJUQV9BVl9ITkRMIGhuZGwsIHVpbnQ4X3QgZXJyX2NvZGUsIHVpbnQ4X3QgY2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fc2VpZCwgdWludDhfdCAqcF9zZWlkLCBib29sIHJlY2ZnX25lZWRlZCwgdWludDhfdCBhdmR0X2hhbmRsZSkKIHsKICAgICB0QlRBX0FWX0NJX1NFVENPTkZJRyAqcF9idWYgPQogICAgICAgICAodEJUQV9BVl9DSV9TRVRDT05GSUcgKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0FWX0NJX1NFVENPTkZJRykpOwpAQCAtODAsNyArODAsNyBAQAogICAgIHBfYnVmLT5udW1fc2VpZCA9IG51bV9zZWlkOwogICAgIHBfYnVmLT5hdmR0X2hhbmRsZT0gYXZkdF9oYW5kbGU7CiAgICAgaWYgKHBfc2VpZCAmJiBudW1fc2VpZCkgewotICAgICAgICBwX2J1Zi0+cF9zZWlkICAgPSAoVUlOVDggKikocF9idWYgKyAxKTsKKyAgICAgICAgcF9idWYtPnBfc2VpZCAgID0gKHVpbnQ4X3QgKikocF9idWYgKyAxKTsKICAgICAgICAgbWVtY3B5KHBfYnVmLT5wX3NlaWQsIHBfc2VpZCwgbnVtX3NlaWQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHBfYnVmLT5wX3NlaWQgICA9IE5VTEw7CmRpZmYgLS1naXQgYS9idGEvYXYvYnRhX2F2X2ludC5oIGIvYnRhL2F2L2J0YV9hdl9pbnQuaAppbmRleCA1YjgxNDc5Li5kZTdhNTljIDEwMDY0NAotLS0gYS9idGEvYXYvYnRhX2F2X2ludC5oCisrKyBiL2J0YS9hdi9idGFfYXZfaW50LmgKQEAgLTE0Nyw4ICsxNDcsOCBAQAogLyogdGhlIG51bWJlciBvZiBBQ0wgbGlua3Mgd2l0aCBBVkRUICovCiAjZGVmaW5lIEJUQV9BVl9OVU1fTElOS1MgICAgICAgICAgICBBVkRUX05VTV9MSU5LUwogCi0jZGVmaW5lIEJUQV9BVl9DT19JRF9UT19CRV9TVFJFQU0ocCwgdTMyKSB7KihwKSsrID0gKFVJTlQ4KSgodTMyKSA+PiAxNik7ICoocCkrKyA9IChVSU5UOCkoKHUzMikgPj4gOCk7ICoocCkrKyA9IChVSU5UOCkodTMyKTsgfQotI2RlZmluZSBCVEFfQVZfQkVfU1RSRUFNX1RPX0NPX0lEKHUzMiwgcCkgeyh1MzIpID0gKCgoVUlOVDMyKSgqKChwKSArIDIpKSkgKyAoKChVSU5UMzIpKCooKHApICsgMSkpKSA8PCA4KSArICgoKFVJTlQzMikoKihwKSkpIDw8IDE2KSk7IChwKSArPSAzO30KKyNkZWZpbmUgQlRBX0FWX0NPX0lEX1RPX0JFX1NUUkVBTShwLCB1MzIpIHsqKHApKysgPSAodWludDhfdCkoKHUzMikgPj4gMTYpOyAqKHApKysgPSAodWludDhfdCkoKHUzMikgPj4gOCk7ICoocCkrKyA9ICh1aW50OF90KSh1MzIpOyB9CisjZGVmaW5lIEJUQV9BVl9CRV9TVFJFQU1fVE9fQ09fSUQodTMyLCBwKSB7KHUzMikgPSAoKCh1aW50MzJfdCkoKigocCkgKyAyKSkpICsgKCgodWludDMyX3QpKCooKHApICsgMSkpKSA8PCA4KSArICgoKHVpbnQzMl90KSgqKHApKSkgPDwgMTYpKTsgKHApICs9IDM7fQogCiAvKiB0aGVzZSBiaXRzIGFyZSBkZWZpbmVkIGZvciBidGFfYXZfY2IubXVsdGlfYXYgKi8KICNkZWZpbmUgQlRBX0FWX01VTFRJX0FWX1NVUFBPUlRFRCAgIDB4MDEKQEAgLTE2MCwyNiArMTYwLDI2IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogZnVuY3Rpb24gdHlwZXMgZm9yIGNhbGwtb3V0IGZ1bmN0aW9ucyAqLwotdHlwZWRlZiBCT09MRUFOICgqdEJUQV9BVl9DT19JTklUKSAoVUlOVDggKnBfY29kZWNfdHlwZSwgVUlOVDggKnBfY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfbnVtX3Byb3RlY3QsIFVJTlQ4ICpwX3Byb3RlY3RfaW5mbywgVUlOVDggaW5kZXgpOwotdHlwZWRlZiB2b2lkICgqdEJUQV9BVl9DT19ESVNDX1JFUykgKHRCVEFfQVZfSE5ETCBobmRsLCBVSU5UOCBudW1fc2VwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBudW1fc25rLCBVSU5UOCBudW1fc3JjLCBCRF9BRERSIGFkZHIsIFVJTlQxNiB1dWlkX2xvY2FsKTsKLXR5cGVkZWYgVUlOVDggKCp0QlRBX0FWX0NPX0dFVENGRykgKHRCVEFfQVZfSE5ETCBobmRsLCB0QlRBX0FWX0NPREVDIGNvZGVjX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfY29kZWNfaW5mbywgVUlOVDggKnBfc2VwX2luZm9faWR4LCBVSU5UOCBzZWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4ICpwX251bV9wcm90ZWN0LCBVSU5UOCAqcF9wcm90ZWN0X2luZm8pOwordHlwZWRlZiBib29sICgqdEJUQV9BVl9DT19JTklUKSAodWludDhfdCAqcF9jb2RlY190eXBlLCB1aW50OF90ICpwX2NvZGVjX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfbnVtX3Byb3RlY3QsIHVpbnQ4X3QgKnBfcHJvdGVjdF9pbmZvLCB1aW50OF90IGluZGV4KTsKK3R5cGVkZWYgdm9pZCAoKnRCVEFfQVZfQ09fRElTQ19SRVMpICh0QlRBX0FWX0hOREwgaG5kbCwgdWludDhfdCBudW1fc2VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9zbmssIHVpbnQ4X3QgbnVtX3NyYywgQkRfQUREUiBhZGRyLCB1aW50MTZfdCB1dWlkX2xvY2FsKTsKK3R5cGVkZWYgdWludDhfdCAoKnRCVEFfQVZfQ09fR0VUQ0ZHKSAodEJUQV9BVl9ITkRMIGhuZGwsIHRCVEFfQVZfQ09ERUMgY29kZWNfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwX2NvZGVjX2luZm8sIHVpbnQ4X3QgKnBfc2VwX2luZm9faWR4LCB1aW50OF90IHNlaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9udW1fcHJvdGVjdCwgdWludDhfdCAqcF9wcm90ZWN0X2luZm8pOwogdHlwZWRlZiB2b2lkICgqdEJUQV9BVl9DT19TRVRDRkcpICh0QlRBX0FWX0hOREwgaG5kbCwgdEJUQV9BVl9DT0RFQyBjb2RlY190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4ICpwX2NvZGVjX2luZm8sIFVJTlQ4IHNlaWQsIEJEX0FERFIgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBudW1fcHJvdGVjdCwgVUlOVDggKnBfcHJvdGVjdF9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4IHRfbG9jYWxfc2VwLCBVSU5UOCBhdmR0X2hhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9jb2RlY19pbmZvLCB1aW50OF90IHNlaWQsIEJEX0FERFIgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9wcm90ZWN0LCB1aW50OF90ICpwX3Byb3RlY3RfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHRfbG9jYWxfc2VwLCB1aW50OF90IGF2ZHRfaGFuZGxlKTsKIHR5cGVkZWYgdm9pZCAoKnRCVEFfQVZfQ09fT1BFTikgKHRCVEFfQVZfSE5ETCBobmRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9BVl9DT0RFQyBjb2RlY190eXBlLCBVSU5UOCAqcF9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgbXR1KTsKLXR5cGVkZWYgdm9pZCAoKnRCVEFfQVZfQ09fQ0xPU0UpICh0QlRBX0FWX0hOREwgaG5kbCwgdEJUQV9BVl9DT0RFQyBjb2RlY190eXBlLCBVSU5UMTYgbXR1KTsKLXR5cGVkZWYgdm9pZCAoKnRCVEFfQVZfQ09fU1RBUlQpICh0QlRBX0FWX0hOREwgaG5kbCwgdEJUQV9BVl9DT0RFQyBjb2RlY190eXBlLFVJTlQ4ICpwX2NvZGVjX2luZm8sIEJPT0xFQU4gKnBfbm9fcnRwX2hkcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0FWX0NPREVDIGNvZGVjX3R5cGUsIHVpbnQ4X3QgKnBfY29kZWNfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbXR1KTsKK3R5cGVkZWYgdm9pZCAoKnRCVEFfQVZfQ09fQ0xPU0UpICh0QlRBX0FWX0hOREwgaG5kbCwgdEJUQV9BVl9DT0RFQyBjb2RlY190eXBlLCB1aW50MTZfdCBtdHUpOwordHlwZWRlZiB2b2lkICgqdEJUQV9BVl9DT19TVEFSVCkgKHRCVEFfQVZfSE5ETCBobmRsLCB0QlRBX0FWX0NPREVDIGNvZGVjX3R5cGUsdWludDhfdCAqcF9jb2RlY19pbmZvLCBib29sICpwX25vX3J0cF9oZHIpOwogdHlwZWRlZiB2b2lkICgqdEJUQV9BVl9DT19TVE9QKSAodEJUQV9BVl9ITkRMIGhuZGwsIHRCVEFfQVZfQ09ERUMgY29kZWNfdHlwZSk7CiB0eXBlZGVmIHZvaWQgKiAoKnRCVEFfQVZfQ09fREFUQVBBVEgpICh0QlRBX0FWX0NPREVDIGNvZGVjX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgKnBfbGVuLCBVSU5UMzIgKnBfdGltZXN0YW1wKTsKLXR5cGVkZWYgdm9pZCAoKnRCVEFfQVZfQ09fREVMQVkpICh0QlRBX0FWX0hOREwgaG5kbCwgVUlOVDE2IGRlbGF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwX2xlbiwgdWludDMyX3QgKnBfdGltZXN0YW1wKTsKK3R5cGVkZWYgdm9pZCAoKnRCVEFfQVZfQ09fREVMQVkpICh0QlRBX0FWX0hOREwgaG5kbCwgdWludDE2X3QgZGVsYXkpOwogCiAvKiB0aGUgY2FsbC1vdXQgZnVuY3Rpb25zIGZvciBvbmUgc3RyZWFtICovCiB0eXBlZGVmIHN0cnVjdApAQCAtMjEwLDkgKzIxMCw5IEBACiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICBoZHI7CiAgICAgY2hhciAgICAgICAgICAgICAgICBwX3NlcnZpY2VfbmFtZVtCVEFfU0VSVklDRV9OQU1FX0xFTisxXTsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGFwcF9pZDsKLSAgICB0QlRBX0FWX0RBVEFfQ0JBQ0sgICAgICAgKnBfYXBwX2RhdGFfY2JhY2s7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBzZXJ2aWNlX3V1aWQ7CisgICAgdWludDhfdCAgICAgICAgICAgICBhcHBfaWQ7CisgICAgdEJUQV9BVl9EQVRBX0NCQUNLICAqcF9hcHBfZGF0YV9jYmFjazsKKyAgICB1aW50MTZfdCAgICAgICAgICAgIHNlcnZpY2VfdXVpZDsKIH0gdEJUQV9BVl9BUElfUkVHOwogCiAKQEAgLTIyMywyNCArMjIzLDI0IEBACiAgICAgQlRBX0FWX1JTX0ZBSUwsICAgICAvKiB0aGUgcm9sZSBzd2l0Y2ggcmVzdWx0IC0gZmFpbGVkICovCiAgICAgQlRBX0FWX1JTX0RPTkUgICAgICAvKiB0aGUgcm9sZSBzd2l0Y2ggaXMgZG9uZSAtIGNvbnRpbnVlICovCiB9OwotdHlwZWRlZiBVSU5UOCB0QlRBX0FWX1JTX1JFUzsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0FWX1JTX1JFUzsKIC8qIGRhdGEgdHlwZSBmb3IgQlRBX0FWX0FQSV9PUEVOX0VWVCAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICAgICAgICAgIGhkcjsKICAgICBCRF9BRERSICAgICAgICAgICAgIGJkX2FkZHI7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICB1c2VfcmM7CisgICAgYm9vbCAgICAgICAgICAgICAgICB1c2VfcmM7CiAgICAgdEJUQV9TRUMgICAgICAgICAgICBzZWNfbWFzazsKICAgICB0QlRBX0FWX1JTX1JFUyAgICAgIHN3aXRjaF9yZXM7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICB1dWlkOyAgLyogdXVpZCBvZiBpbml0aWF0b3IgKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgIHV1aWQ7ICAvKiB1dWlkIG9mIGluaXRpYXRvciAqLwogfSB0QlRBX0FWX0FQSV9PUEVOOwogCiAvKiBkYXRhIHR5cGUgZm9yIEJUQV9BVl9BUElfU1RPUF9FVlQgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgQlRfSERSICAgICAgICAgICAgICBoZHI7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBzdXNwZW5kOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgZmx1c2g7CisgICAgQlRfSERSICAgICAgICAgICBoZHI7CisgICAgYm9vbCAgICAgICAgICAgICBzdXNwZW5kOworICAgIGJvb2wgICAgICAgICAgICAgZmx1c2g7CiB9IHRCVEFfQVZfQVBJX1NUT1A7CiAKIC8qIGRhdGEgdHlwZSBmb3IgQlRBX0FWX0FQSV9ESVNDT05ORUNUX0VWVCAqLwpAQCAtMjU0LDE3ICsyNTQsMTcgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICBoZHI7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAqcF9kYXRhOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgbGVuOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgKnBfZGF0YTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgIGxlbjsKIH0gdEJUQV9BVl9BUElfUFJPVEVDVF9SRVE7CiAKIC8qIGRhdGEgdHlwZSBmb3IgQlRBX0FWX0FQSV9QUk9URUNUX1JTUF9FVlQgKi8KIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICBoZHI7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAqcF9kYXRhOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgbGVuOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgZXJyb3JfY29kZTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICpwX2RhdGE7CisgICAgdWludDE2X3QgICAgICAgICAgICBsZW47CisgICAgdWludDhfdCAgICAgICAgICAgICBlcnJvcl9jb2RlOwogfSB0QlRBX0FWX0FQSV9QUk9URUNUX1JTUDsKIAogLyogZGF0YSB0eXBlIGZvciBCVEFfQVZfQVBJX1JFTU9URV9DTURfRVZUICovCkBAIC0yNzIsNyArMjcyLDcgQEAKIHsKICAgICBCVF9IRFIgICAgICAgICAgICAgIGhkcjsKICAgICB0QVZSQ19NU0dfUEFTUyAgICAgIG1zZzsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGxhYmVsOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgbGFiZWw7CiB9IHRCVEFfQVZfQVBJX1JFTU9URV9DTUQ7CiAKIC8qIGRhdGEgdHlwZSBmb3IgQlRBX0FWX0FQSV9WRU5ET1JfQ01EX0VWVCBhbmQgUlNQICovCkBAIC0yODAsNyArMjgwLDcgQEAKIHsKICAgICBCVF9IRFIgICAgICAgICAgICAgIGhkcjsKICAgICB0QVZSQ19NU0dfVkVORE9SICAgIG1zZzsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGxhYmVsOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgbGFiZWw7CiB9IHRCVEFfQVZfQVBJX1ZFTkRPUjsKIAogLyogZGF0YSB0eXBlIGZvciBCVEFfQVZfQVBJX1JDX09QRU5fRVZUICovCkBAIC0yOTksOCArMjk5LDggQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICBoZHI7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBpc19yc3A7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBsYWJlbDsKKyAgICBib29sICAgICAgICAgICAgICAgIGlzX3JzcDsKKyAgICB1aW50OF90ICAgICAgICAgICAgIGxhYmVsOwogICAgIHRCVEFfQVZfQ09ERSAgICAgICAgcnNwX2NvZGU7CiAgICAgQlRfSERSICAgICAgICAgICAgICAqcF9wa3Q7CiB9IHRCVEFfQVZfQVBJX01FVEFfUlNQOwpAQCAtMzEwLDExICszMTAsMTEgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICBoZHI7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBjb2RlY19pbmZvW0FWRFRfQ09ERUNfU0laRV07ICAgIC8qIGNvZGVjIGNvbmZpZ3VyYXRpb24gKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgICpwX3Byb3RlY3RfaW5mbzsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIG51bV9wcm90ZWN0OwotICAgIEJPT0xFQU4gICAgICAgICAgICAgc3VzcGVuZDsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIHNlcF9pbmZvX2lkeDsKKyAgICB1aW50OF90ICAgICAgICAgICAgIGNvZGVjX2luZm9bQVZEVF9DT0RFQ19TSVpFXTsgICAgLyogY29kZWMgY29uZmlndXJhdGlvbiAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgKnBfcHJvdGVjdF9pbmZvOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgbnVtX3Byb3RlY3Q7CisgICAgYm9vbCAgICAgICAgICAgICAgICBzdXNwZW5kOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgc2VwX2luZm9faWR4OwogfSB0QlRBX0FWX0FQSV9SQ0ZHOwogCiAvKiBkYXRhIHR5cGUgZm9yIEJUQV9BVl9DSV9TRVRDT05GSUdfT0tfRVZUIGFuZCBCVEFfQVZfQ0lfU0VUQ09ORklHX0ZBSUxfRVZUICovCkBAIC0zMjIsMTIgKzMyMiwxMiBAQAogewogICAgIEJUX0hEUiAgICAgICAgICAgICAgaGRyOwogICAgIHRCVEFfQVZfSE5ETCAgICAgICAgaG5kbDsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGVycl9jb2RlOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgY2F0ZWdvcnk7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBudW1fc2VpZDsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICpwX3NlaWQ7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICByZWNmZ19uZWVkZWQ7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBhdmR0X2hhbmRsZTsgIC8qIGxvY2FsIHNlcCB0eXBlIGZvciB3aGljaCB0aGlzIHN0cmVhbSB3aWxsIGJlIHNldCB1cCAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgZXJyX2NvZGU7CisgICAgdWludDhfdCAgICAgICAgICAgICBjYXRlZ29yeTsKKyAgICB1aW50OF90ICAgICAgICAgICAgIG51bV9zZWlkOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgKnBfc2VpZDsKKyAgICBib29sICAgICAgICAgICAgICAgIHJlY2ZnX25lZWRlZDsKKyAgICB1aW50OF90ICAgICAgICAgICAgIGF2ZHRfaGFuZGxlOyAgLyogbG9jYWwgc2VwIHR5cGUgZm9yIHdoaWNoIHRoaXMgc3RyZWFtIHdpbGwgYmUgc2V0IHVwICovCiB9IHRCVEFfQVZfQ0lfU0VUQ09ORklHOwogCiAvKiBkYXRhIHR5cGUgZm9yIGFsbCBzdHJlYW0gZXZlbnRzIGZyb20gQVZEVFAgKi8KQEAgLTMzNiw5ICszMzYsOSBAQAogICAgIHRBVkRUX0NGRyAgICAgICAgICAgY2ZnOyAgICAgICAgLyogY29uZmlndXJhdGlvbi9jYXBhYmlsaXRpZXMgcGFyYW1ldGVycyAqLwogICAgIHRBVkRUX0NUUkwgICAgICAgICAgbXNnOyAgICAgICAgLyogQVZEVFAgY2FsbGJhY2sgbWVzc2FnZSBwYXJhbWV0ZXJzICovCiAgICAgQkRfQUREUiAgICAgICAgICAgICBiZF9hZGRyOyAgICAvKiBiZCBhZGRyZXNzICovCi0gICAgVUlOVDggICAgICAgICAgICAgICBoYW5kbGU7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBhdmR0X2V2ZW50OwotICAgIEJPT0xFQU4gICAgICAgICAgICAgaW5pdGlhdG9yOyAvKiBUUlVFLCBpZiBsb2NhbCBkZXZpY2UgaW5pdGlhdGVzIHRoZSBTVVNQRU5EICovCisgICAgdWludDhfdCAgICAgICAgICAgICBoYW5kbGU7CisgICAgdWludDhfdCAgICAgICAgICAgICBhdmR0X2V2ZW50OworICAgIGJvb2wgICAgICAgICAgICAgICAgaW5pdGlhdG9yOyAvKiB0cnVlLCBpZiBsb2NhbCBkZXZpY2UgaW5pdGlhdGVzIHRoZSBTVVNQRU5EICovCiB9IHRCVEFfQVZfU1RSX01TRzsKIAogLyogZGF0YSB0eXBlIGZvciBCVEFfQVZfQVZSQ19NU0dfRVZUICovCkBAIC0zNDYsOSArMzQ2LDkgQEAKIHsKICAgICBCVF9IRFIgICAgICAgICAgICAgIGhkcjsKICAgICB0QVZSQ19NU0cgICAgICAgICAgIG1zZzsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGhhbmRsZTsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGxhYmVsOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgb3Bjb2RlOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgaGFuZGxlOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgbGFiZWw7CisgICAgdWludDhfdCAgICAgICAgICAgICBvcGNvZGU7CiB9IHRCVEFfQVZfUkNfTVNHOwogCiAvKiBkYXRhIHR5cGUgZm9yIEJUQV9BVl9BVlJDX09QRU5fRVZULCBCVEFfQVZfQVZSQ19DTE9TRV9FVlQgKi8KQEAgLTM1Niw3ICszNTYsNyBAQAogewogICAgIEJUX0hEUiAgICAgICAgICAgICAgaGRyOwogICAgIEJEX0FERFIgICAgICAgICAgICAgcGVlcl9hZGRyOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgaGFuZGxlOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgaGFuZGxlOwogfSB0QlRBX0FWX1JDX0NPTk5fQ0hHOwogCiAvKiBkYXRhIHR5cGUgZm9yIEJUQV9BVl9DT05OX0NIR19FVlQgKi8KQEAgLTM2NCwyMiArMzY0LDIyIEBACiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICBoZHI7CiAgICAgQkRfQUREUiAgICAgICAgICAgICBwZWVyX2FkZHI7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBpc191cDsKKyAgICBib29sICAgICAgICAgICAgICAgIGlzX3VwOwogfSB0QlRBX0FWX0NPTk5fQ0hHOwogCiAvKiBkYXRhIHR5cGUgZm9yIEJUQV9BVl9ST0xFX0NIQU5HRV9FVlQgKi8KIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICBoZHI7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBuZXdfcm9sZTsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGhjaV9zdGF0dXM7CisgICAgdWludDhfdCAgICAgICAgICAgICBuZXdfcm9sZTsKKyAgICB1aW50OF90ICAgICAgICAgICAgIGhjaV9zdGF0dXM7CiB9IHRCVEFfQVZfUk9MRV9SRVM7CiAKIC8qIGRhdGEgdHlwZSBmb3IgQlRBX0FWX1NEUF9ESVNDX09LX0VWVCAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICAgICAgICAgIGhkcjsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIGF2ZHRfdmVyc2lvbjsgICAvKiBBVkRUUCBwcm90b2NvbCB2ZXJzaW9uICovCisgICAgdWludDE2X3QgICAgICAgICAgICBhdmR0X3ZlcnNpb247ICAgLyogQVZEVFAgcHJvdG9jb2wgdmVyc2lvbiAqLwogfSB0QlRBX0FWX1NEUF9SRVM7CiAKIC8qIGRhdGEgdHlwZSBmb3IgQlRBX0FWX0FQSV9PRkZMT0FEX1JTUF9FVlQgKi8KQEAgLTM5Myw5ICszOTMsOSBAQAogLyogdHlwZSBmb3IgU0VQIGNvbnRyb2wgYmxvY2sgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBhdl9oYW5kbGU7ICAgICAgICAgLyogQVZEVFAgaGFuZGxlICovCisgICAgdWludDhfdCAgICAgICAgICAgICBhdl9oYW5kbGU7ICAgICAgICAgLyogQVZEVFAgaGFuZGxlICovCiAgICAgdEJUQV9BVl9DT0RFQyAgICAgICBjb2RlY190eXBlOyAgICAgICAgLyogY29kZWMgdHlwZSAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgdHNlcDsgICAgICAgICAgICAgIC8qIFNFUCB0eXBlIG9mIGxvY2FsIFNFUCAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgdHNlcDsgICAgICAgICAgICAgIC8qIFNFUCB0eXBlIG9mIGxvY2FsIFNFUCAqLwogICAgIHRCVEFfQVZfREFUQV9DQkFDSyAgKnBfYXBwX2RhdGFfY2JhY2s7IC8qIEFwcGxpY2F0aW9uIGNhbGxiYWNrIGZvciBtZWRpYSBwYWNrZXRzICovCiB9IHRCVEFfQVZfU0VQOwogCkBAIC00NDEsMTEgKzQ0MSwxMSBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICB0QlRBX0FWX1ZEUF9EQVRBX0FDVCAgICAqcF9hY3Q7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgKnBfZnJhbWU7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgYnVmX3NpemU7Ci0gICAgVUlOVDMyICAgICAgICAgICAgICAgICAgbGVuOwotICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgIG9mZnNldDsKLSAgICBVSU5UMzIgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgKnBfZnJhbWU7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgYnVmX3NpemU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbGVuOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG9mZnNldDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICB0aW1lc3RhbXA7CiB9IHRCVEFfQVZfVkZfSU5GTzsKIAogdHlwZWRlZiB1bmlvbgpAQCAtNDc5LDcgKzQ3OSw3IEBACiB7CiAgICAgY29uc3QgdEJUQV9BVl9BQ1QgICAqcF9hY3RfdGJsOyAgICAgLyogdGhlIGFjdGlvbiB0YWJsZSBmb3Igc3RyZWFtIHN0YXRlIG1hY2hpbmUgKi8KICAgICBjb25zdCB0QlRBX0FWX0NPX0ZVTkNUUyAqcF9jb3M7ICAgICAvKiB0aGUgYXNzb2NpYXRlZCBjYWxsb3V0IGZ1bmN0aW9ucyAqLwotICAgIEJPT0xFQU4gICAgICAgICAgICAgc2RwX2Rpc2NvdmVyeV9zdGFydGVkOyAvKiB2YXJpYWJsZSB0byBkZXRlcm1pbmUgd2hldGhlciBTRFAgaXMgc3RhcnRlZCAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgc2RwX2Rpc2NvdmVyeV9zdGFydGVkOyAvKiB2YXJpYWJsZSB0byBkZXRlcm1pbmUgd2hldGhlciBTRFAgaXMgc3RhcnRlZCAqLwogICAgIHRCVEFfQVZfU0VQICAgICAgICAgc2Vwc1tCVEFfQVZfTUFYX1NFUFNdOwogICAgIHRBVkRUX0NGRyAgICAgICAgICAgKnBfY2FwOyAgICAgICAgIC8qIGJ1ZmZlciB1c2VkIGZvciBnZXQgY2FwYWJpbGl0aWVzICovCiAgICAgbGlzdF90ICAgICAgICAgICAgICAqYTJkX2xpc3Q7ICAgICAgLyogdXNlZCBmb3IgYXVkaW8gY2hhbm5lbHMgb25seSAqLwpAQCAtNDg4LDQ3ICs0ODgsNDcgQEAKICAgICB0QVZEVF9DRkcgICAgICAgICAgIGNmZzsgICAgICAgICAgICAvKiBsb2NhbCBTRVAgY29uZmlndXJhdGlvbiAqLwogICAgIGFsYXJtX3QgICAgICAgICAgICAgKmF2cmNfY3RfdGltZXI7IC8qIGRlbGF5IHRpbWVyIGZvciBBVlJDIENUICovCiAgICAgQkRfQUREUiAgICAgICAgICAgICBwZWVyX2FkZHI7ICAgICAgLyogcGVlciBCRCBhZGRyZXNzICovCi0gICAgVUlOVDE2ICAgICAgICAgICAgICBsMmNfY2lkOyAgICAgICAgLyogTDJDQVAgY2hhbm5lbCBJRCAqLwotICAgIFVJTlQxNiAgICAgICAgICAgICAgc3RyZWFtX210dTsgICAgIC8qIE1UVSBvZiBzdHJlYW0gKi8KLSAgICBVSU5UMTYgICAgICAgICAgICAgIGF2ZHRfdmVyc2lvbjsgICAvKiB0aGUgYXZkdCB2ZXJzaW9uIG9mIHBlZXIgZGV2aWNlICovCisgICAgdWludDE2X3QgICAgICAgICAgICBsMmNfY2lkOyAgICAgICAgLyogTDJDQVAgY2hhbm5lbCBJRCAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgc3RyZWFtX210dTsgICAgIC8qIE1UVSBvZiBzdHJlYW0gKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgIGF2ZHRfdmVyc2lvbjsgICAvKiB0aGUgYXZkdCB2ZXJzaW9uIG9mIHBlZXIgZGV2aWNlICovCiAgICAgdEJUQV9TRUMgICAgICAgICAgICBzZWNfbWFzazsgICAgICAgLyogc2VjdXJpdHkgbWFzayAqLwogICAgIHRCVEFfQVZfQ09ERUMgICAgICAgY29kZWNfdHlwZTsgICAgIC8qIGNvZGVjIHR5cGUgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIG1lZGlhX3R5cGU7ICAgICAvKiBNZWRpYSB0eXBlICovCi0gICAgQk9PTEVBTiAgICAgICAgICAgICBjb25nOyAgICAgICAgICAgLyogVFJVRSBpZiBBVkRUUCBjb25nZXN0ZWQgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgIG1lZGlhX3R5cGU7ICAgICAvKiBNZWRpYSB0eXBlICovCisgICAgYm9vbCAgICAgICAgICAgICAgICBjb25nOyAgICAgICAgICAgLyogdHJ1ZSBpZiBBVkRUUCBjb25nZXN0ZWQgKi8KICAgICB0QlRBX0FWX1NUQVRVUyAgICAgIG9wZW5fc3RhdHVzOyAgICAvKiBvcGVuIGZhaWx1cmUgc3RhdHVzICovCiAgICAgdEJUQV9BVl9DSE5MICAgICAgICBjaG5sOyAgICAgICAgICAgLyogdGhlIGNoYW5uZWw6IGF1ZGlvL3ZpZGVvICovCiAgICAgdEJUQV9BVl9ITkRMICAgICAgICBobmRsOyAgICAgICAgICAgLyogdGhlIGhhbmRsZTogKChoZGkgKyAxKXxjaG5sKSAqLwotICAgIFVJTlQxNiAgICAgICAgICAgICAgY3VyX3BzY19tYXNrOyAgIC8qIFByb3RvY29sIHNlcnZpY2UgY2FwYWJpbGl0aWVzIG1hc2sgZm9yIGN1cnJlbnQgY29ubmVjdGlvbiAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgYXZkdF9oYW5kbGU7ICAgIC8qIEFWRFRQIGhhbmRsZSAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgaGRpOyAgICAgICAgICAgIC8qIHRoZSBpbmRleCB0byBTQ0JbXSAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgbnVtX3NlcHM7ICAgICAgIC8qIG51bWJlciBvZiBzZXBzIHJldHVybmVkIGJ5IHN0cmVhbSBkaXNjb3ZlcnkgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIG51bV9kaXNjX3Nua3M7ICAvKiBudW1iZXIgb2YgZGlzY292ZXJlZCBzbmtzICovCi0gICAgVUlOVDggICAgICAgICAgICAgICBudW1fZGlzY19zcmNzOyAgLyogbnVtYmVyIG9mIGRpc2NvdmVyZWQgc3JjcyAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgc2VwX2luZm9faWR4OyAgIC8qIGN1cnJlbnQgaW5kZXggaW50byBzZXBfaW5mbyAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgc2VwX2lkeDsgICAgICAgIC8qIGN1cnJlbnQgaW5kZXggaW50byBsb2NhbCBzZXBzW10gKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIHJjZmdfaWR4OyAgICAgICAvKiByZWNvbmZpZyByZXF1ZXN0ZWQgaW5kZXggaW50byBzZXBfaW5mbyAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgc3RhdGU7ICAgICAgICAgIC8qIHN0YXRlIG1hY2hpbmUgc3RhdGUgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIGF2ZHRfbGFiZWw7ICAgICAvKiBBVkRUUCBsYWJlbCAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgYXBwX2lkOyAgICAgICAgIC8qIGFwcGxpY2F0aW9uIGlkICovCi0gICAgVUlOVDggICAgICAgICAgICAgICBudW1fcmVjZmc7ICAgICAgLyogbnVtYmVyIG9mIHJlY29uZmlndXJlIHNlbnQgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIHJvbGU7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBsMmNfYnVmczsgICAgICAgLyogdGhlIG51bWJlciBvZiBidWZmZXJzIHF1ZXVlZCB0byBMMkNBUCAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgcmNfaGFuZGxlOyAgICAgIC8qIGNvbm5lY3RlZCBBVlJDUCBoYW5kbGUgKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgIHVzZV9yYzsgICAgICAgICAvKiBUUlVFIGlmIEFWUkNQIGlzIGFsbG93ZWQgKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgIHN0YXJ0ZWQ7ICAgICAgICAvKiBUUlVFIGlmIHN0cmVhbSBzdGFydGVkICovCi0gICAgVUlOVDggICAgICAgICAgICAgICBjb19zdGFydGVkOyAgICAgLyogbm9uLXplcm8sIGlmIHN0cmVhbSBzdGFydGVkIGZyb20gY2FsbC1vdXQgcGVyc3BlY3RpdmUgKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgIHJlY2ZnX3N1cDsgICAgICAvKiBUUlVFIGlmIHRoZSBmaXJzdCBhdHRlbXB0IHRvIHJlY29uZmlndXJlIHRoZSBzdHJlYW0gd2FzIHN1Y2Nlc3NmdWxsLCBlbHNlIEZhbHNlIGlmIGNvbW1hbmQgZmFpbHMgKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgIHN1c3BlbmRfc3VwOyAgICAvKiBUUlVFIGlmIFN1c3BlbmQgc3RyZWFtIGlzIHN1cHBvcnRlZCwgZWxzZSBGQUxTRSBpZiBzdXNwZW5kIGNvbW1hbmQgZmFpbHMgKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgIGRlcmVnaXN0cmluZzsgICAvKiBUUlVFIGlmIGRlcmVnaXN0ZXJpbmcgKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgIHNjb19zdXNwZW5kOyAgICAvKiBUUlVFIGlmIFNVU1BFTkQgaXMgaXNzdWVkIGF1dG9tYXRpY2FsbHkgZm9yIFNDTyAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgY29sbF9tYXNrOyAgICAgIC8qIE1hc2sgdG8gY2hlY2sgaW5jb21pbmcgYW5kIG91dGdvaW5nIGNvbGxpc2lvbiAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgY3VyX3BzY19tYXNrOyAgIC8qIFByb3RvY29sIHNlcnZpY2UgY2FwYWJpbGl0aWVzIG1hc2sgZm9yIGN1cnJlbnQgY29ubmVjdGlvbiAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgYXZkdF9oYW5kbGU7ICAgIC8qIEFWRFRQIGhhbmRsZSAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgaGRpOyAgICAgICAgICAgIC8qIHRoZSBpbmRleCB0byBTQ0JbXSAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgbnVtX3NlcHM7ICAgICAgIC8qIG51bWJlciBvZiBzZXBzIHJldHVybmVkIGJ5IHN0cmVhbSBkaXNjb3ZlcnkgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgIG51bV9kaXNjX3Nua3M7ICAvKiBudW1iZXIgb2YgZGlzY292ZXJlZCBzbmtzICovCisgICAgdWludDhfdCAgICAgICAgICAgICBudW1fZGlzY19zcmNzOyAgLyogbnVtYmVyIG9mIGRpc2NvdmVyZWQgc3JjcyAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgc2VwX2luZm9faWR4OyAgIC8qIGN1cnJlbnQgaW5kZXggaW50byBzZXBfaW5mbyAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgc2VwX2lkeDsgICAgICAgIC8qIGN1cnJlbnQgaW5kZXggaW50byBsb2NhbCBzZXBzW10gKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgIHJjZmdfaWR4OyAgICAgICAvKiByZWNvbmZpZyByZXF1ZXN0ZWQgaW5kZXggaW50byBzZXBfaW5mbyAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgc3RhdGU7ICAgICAgICAgIC8qIHN0YXRlIG1hY2hpbmUgc3RhdGUgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgIGF2ZHRfbGFiZWw7ICAgICAvKiBBVkRUUCBsYWJlbCAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgYXBwX2lkOyAgICAgICAgIC8qIGFwcGxpY2F0aW9uIGlkICovCisgICAgdWludDhfdCAgICAgICAgICAgICBudW1fcmVjZmc7ICAgICAgLyogbnVtYmVyIG9mIHJlY29uZmlndXJlIHNlbnQgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgIHJvbGU7CisgICAgdWludDhfdCAgICAgICAgICAgICBsMmNfYnVmczsgICAgICAgLyogdGhlIG51bWJlciBvZiBidWZmZXJzIHF1ZXVlZCB0byBMMkNBUCAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcmNfaGFuZGxlOyAgICAgIC8qIGNvbm5lY3RlZCBBVlJDUCBoYW5kbGUgKi8KKyAgICBib29sICAgICAgICAgICAgICAgIHVzZV9yYzsgICAgICAgICAvKiB0cnVlIGlmIEFWUkNQIGlzIGFsbG93ZWQgKi8KKyAgICBib29sICAgICAgICAgICAgICAgIHN0YXJ0ZWQ7ICAgICAgICAvKiB0cnVlIGlmIHN0cmVhbSBzdGFydGVkICovCisgICAgdWludDhfdCAgICAgICAgICAgICBjb19zdGFydGVkOyAgICAgLyogbm9uLXplcm8sIGlmIHN0cmVhbSBzdGFydGVkIGZyb20gY2FsbC1vdXQgcGVyc3BlY3RpdmUgKi8KKyAgICBib29sICAgICAgICAgICAgICAgIHJlY2ZnX3N1cDsgICAgICAvKiB0cnVlIGlmIHRoZSBmaXJzdCBhdHRlbXB0IHRvIHJlY29uZmlndXJlIHRoZSBzdHJlYW0gd2FzIHN1Y2Nlc3NmdWxsLCBlbHNlIEZhbHNlIGlmIGNvbW1hbmQgZmFpbHMgKi8KKyAgICBib29sICAgICAgICAgICAgICAgIHN1c3BlbmRfc3VwOyAgICAvKiB0cnVlIGlmIFN1c3BlbmQgc3RyZWFtIGlzIHN1cHBvcnRlZCwgZWxzZSBmYWxzZSBpZiBzdXNwZW5kIGNvbW1hbmQgZmFpbHMgKi8KKyAgICBib29sICAgICAgICAgICAgICAgIGRlcmVnaXN0cmluZzsgICAvKiB0cnVlIGlmIGRlcmVnaXN0ZXJpbmcgKi8KKyAgICBib29sICAgICAgICAgICAgICAgIHNjb19zdXNwZW5kOyAgICAvKiB0cnVlIGlmIFNVU1BFTkQgaXMgaXNzdWVkIGF1dG9tYXRpY2FsbHkgZm9yIFNDTyAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgY29sbF9tYXNrOyAgICAgIC8qIE1hc2sgdG8gY2hlY2sgaW5jb21pbmcgYW5kIG91dGdvaW5nIGNvbGxpc2lvbiAqLwogICAgIHRCVEFfQVZfQVBJX09QRU4gICAgb3Blbl9hcGk7ICAgICAgIC8qIFNhdmVkIE9QRU4gYXBpIG1lc3NhZ2UgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIHdhaXQ7ICAgICAgICAgICAvKiBzZXQgMHgxLCB3aGVuIGdldHRpbmcgQ2FwcyBhcyBBQ1AsIHNldCAweDIsIHdoZW4gc3RhcnRlZCAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgcV90YWc7ICAgICAgICAgIC8qIGlkZW50aWZ5IHRoZSBhc3NvY2lhdGVkIHFfaW5mbyB1bmlvbiBtZW1iZXIgKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgIG5vX3J0cF9oZHI7ICAgICAvKiBUUlVFIGlmIGFkZCBubyBSVFAgaGVhZGVyKi8KLSAgICBVSU5UMTYgICAgICAgICAgICAgIHV1aWRfaW50OyAgICAgICAvKmludGVuZGVkIFVVSUQgb2YgSW5pdGlhdG9yIHRvIGNvbm5lY3QgdG8gKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgIG9mZmxvYWRfc3RhcnRfcGVuZGluZzsKLSAgICBCT09MRUFOICAgICAgICAgICAgIHNraXBfc2RwOyAgICAgICAvKiBEZWNpZGVzIGlmIHNkcCB0byBiZSBkb25lIHByaW9yIHRvIHByb2ZpbGUgY29ubmVjdGlvbiAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgd2FpdDsgICAgICAgICAgIC8qIHNldCAweDEsIHdoZW4gZ2V0dGluZyBDYXBzIGFzIEFDUCwgc2V0IDB4Miwgd2hlbiBzdGFydGVkICovCisgICAgdWludDhfdCAgICAgICAgICAgICBxX3RhZzsgICAgICAgICAgLyogaWRlbnRpZnkgdGhlIGFzc29jaWF0ZWQgcV9pbmZvIHVuaW9uIG1lbWJlciAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgbm9fcnRwX2hkcjsgICAgIC8qIHRydWUgaWYgYWRkIG5vIFJUUCBoZWFkZXIqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgdXVpZF9pbnQ7ICAgICAgIC8qaW50ZW5kZWQgVVVJRCBvZiBJbml0aWF0b3IgdG8gY29ubmVjdCB0byAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgb2ZmbG9hZF9zdGFydF9wZW5kaW5nOworICAgIGJvb2wgICAgICAgICAgICAgICAgc2tpcF9zZHA7ICAgICAgIC8qIERlY2lkZXMgaWYgc2RwIHRvIGJlIGRvbmUgcHJpb3IgdG8gcHJvZmlsZSBjb25uZWN0aW9uICovCiB9IHRCVEFfQVZfU0NCOwogCiAjZGVmaW5lIEJUQV9BVl9SQ19ST0xFX01BU0sgICAgIDB4MTAKQEAgLTU0MSwxMCArNTQxLDEwIEBACiAvKiBpbmRleCB0byB0aGlzIGNvbnRyb2wgYmxvY2sgaXMgdGhlIHJjIGhhbmRsZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UOCAgIHN0YXR1czsKLSAgICBVSU5UOCAgIGhhbmRsZTsKLSAgICBVSU5UOCAgIHNoZGw7ICAgLyogc3RyZWFtIGhhbmRsZSAoaGRpICsgMSkgKi8KLSAgICBVSU5UOCAgIGxpZHg7ICAgLyogKGluZGV4KzEpIHRvIExDQiAqLworICAgIHVpbnQ4X3QgICBzdGF0dXM7CisgICAgdWludDhfdCAgIGhhbmRsZTsKKyAgICB1aW50OF90ICAgc2hkbDsgICAvKiBzdHJlYW0gaGFuZGxlIChoZGkgKyAxKSAqLworICAgIHVpbnQ4X3QgICBsaWR4OyAgIC8qIChpbmRleCsxKSB0byBMQ0IgKi8KICAgICB0QlRBX0FWX0ZFQVQgICAgICAgIHBlZXJfZmVhdHVyZXM7ICAvKiBwZWVyIGZlYXR1cmVzIG1hc2sgKi8KIH0gdEJUQV9BVl9SQ0I7CiAjZGVmaW5lIEJUQV9BVl9OVU1fUkNCICAgICAgKEJUQV9BVl9OVU1fU1RSUyAgKyAyKQpAQCAtNTU5LDggKzU1OSw4IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJEX0FERFIgICAgICAgICAgICAgYWRkcjsgICAgICAgICAgIC8qIHBlZXIgQkQgYWRkcmVzcyAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgY29ubl9tc2s7ICAgICAgIC8qIGhhbmRsZSBtYXNrIG9mIGNvbm5lY3RlZCBzdHJlYW0gaGFuZGxlICovCi0gICAgVUlOVDggICAgICAgICAgICAgICBsaWR4OyAgICAgICAgICAgLyogaW5kZXggKyAxICovCisgICAgdWludDhfdCAgICAgICAgICAgICBjb25uX21zazsgICAgICAgLyogaGFuZGxlIG1hc2sgb2YgY29ubmVjdGVkIHN0cmVhbSBoYW5kbGUgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgIGxpZHg7ICAgICAgICAgICAvKiBpbmRleCArIDEgKi8KIH0gdEJUQV9BVl9MQ0I7CiAKIC8qIHR5cGUgZm9yIHN0cmVhbSBzdGF0ZSBtYWNoaW5lIGFjdGlvbiBmdW5jdGlvbnMgKi8KQEAgLTU3NywzMCArNTc3LDMwIEBACiAgICAgdEJUQV9BVl9MQ0IgICAgICAgICBsY2JbQlRBX0FWX05VTV9MSU5LUysxXTsgIC8qIGxpbmsgY29udHJvbCBibG9jayAqLwogICAgIGFsYXJtX3QgICAgICAgICAgICAgKmxpbmtfc2lnbmFsbGluZ190aW1lcjsKICAgICBhbGFybV90ICAgICAgICAgICAgICphY2NlcHRfc2lnbmFsbGluZ190aW1lcjsgLyogdGltZXIgdG8gbW9uaXRvciBzaWduYWxsaW5nIHdoZW4gYWNjZXB0aW5nICovCi0gICAgVUlOVDMyICAgICAgICAgICAgICBzZHBfYTJkX2hhbmRsZTsgLyogU0RQIHJlY29yZCBoYW5kbGUgZm9yIGF1ZGlvIHNyYyAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgc2RwX2EyZF9oYW5kbGU7IC8qIFNEUCByZWNvcmQgaGFuZGxlIGZvciBhdWRpbyBzcmMgKi8KICNpZiAoQlRBX0FWX1NJTktfSU5DTFVERUQgPT0gVFJVRSkKLSAgICBVSU5UMzIgICAgICAgICAgICAgIHNkcF9hMmRfc25rX2hhbmRsZTsgLyogU0RQIHJlY29yZCBoYW5kbGUgZm9yIGF1ZGlvIHNuayAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgc2RwX2EyZF9zbmtfaGFuZGxlOyAvKiBTRFAgcmVjb3JkIGhhbmRsZSBmb3IgYXVkaW8gc25rICovCiAjZW5kaWYKLSAgICBVSU5UMzIgICAgICAgICAgICAgIHNkcF92ZHBfaGFuZGxlOyAvKiBTRFAgcmVjb3JkIGhhbmRsZSBmb3IgdmlkZW8gc3JjICovCisgICAgdWludDMyX3QgICAgICAgICAgICBzZHBfdmRwX2hhbmRsZTsgLyogU0RQIHJlY29yZCBoYW5kbGUgZm9yIHZpZGVvIHNyYyAqLwogICAgIHRCVEFfQVZfRkVBVCAgICAgICAgZmVhdHVyZXM7ICAgICAgIC8qIGZlYXR1cmVzIG1hc2sgKi8KICAgICB0QlRBX1NFQyAgICAgICAgICAgIHNlY19tYXNrOyAgICAgICAvKiBzZWN1cml0eSBtYXNrICovCiAgICAgdEJUQV9BVl9ITkRMICAgICAgICBoYW5kbGU7ICAgICAgICAgLyogdGhlIGhhbmRsZSBmb3IgU0RQIGFjdGl2aXR5ICovCi0gICAgQk9PTEVBTiAgICAgICAgICAgICBkaXNhYmxpbmc7ICAgICAgLyogVFJVRSBpZiBhcGkgZGlzYWJsZWQgY2FsbGVkICovCi0gICAgVUlOVDggICAgICAgICAgICAgICBkaXNjOyAgICAgICAgICAgLyogKGhkaSsxKSBvciAocmNfaGFuZGxlfEJUQV9BVl9DSE5MX01TSykgaWYgcF9kaXNjX2RiIGlzIGluIHVzZSAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgc3RhdGU7ICAgICAgICAgIC8qIHN0YXRlIG1hY2hpbmUgc3RhdGUgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIGNvbm5fcmM7ICAgICAgICAvKiBoYW5kbGUgbWFzayBvZiBjb25uZWN0ZWQgUkNQIGNoYW5uZWxzICovCi0gICAgVUlOVDggICAgICAgICAgICAgICBjb25uX2F1ZGlvOyAgICAgLyogaGFuZGxlIG1hc2sgb2YgY29ubmVjdGVkIGF1ZGlvIGNoYW5uZWxzICovCi0gICAgVUlOVDggICAgICAgICAgICAgICBjb25uX3ZpZGVvOyAgICAgLyogaGFuZGxlIG1hc2sgb2YgY29ubmVjdGVkIHZpZGVvIGNoYW5uZWxzICovCi0gICAgVUlOVDggICAgICAgICAgICAgICBjb25uX2xjYjsgICAgICAgLyogaW5kZXggbWFzayBvZiB1c2VkIExDQnMgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIGF1ZGlvX29wZW5fY250OyAvKiBudW1iZXIgb2YgY29ubmVjdGVkIGF1ZGlvIGNoYW5uZWxzICovCi0gICAgVUlOVDggICAgICAgICAgICAgICByZWdfYXVkaW87ICAgICAgLyogaGFuZGxlIG1hc2sgb2YgcmVnaXN0ZXJlZCBhdWRpbyBjaGFubmVscyAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgcmVnX3ZpZGVvOyAgICAgIC8qIGhhbmRsZSBtYXNrIG9mIHJlZ2lzdGVyZWQgdmlkZW8gY2hhbm5lbHMgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIHJjX2FjcF9oYW5kbGU7Ci0gICAgVUlOVDggICAgICAgICAgICAgICByY19hY3BfaWR4OyAgICAgLyogKGluZGV4ICsgMSkgdG8gUkNCICovCi0gICAgVUlOVDggICAgICAgICAgICAgICByc19pZHg7ICAgICAgICAgLyogKGluZGV4ICsgMSkgdG8gU0NCIGZvciB0aGUgb25lIHdhaXRpbmcgZm9yIFJTIG9uIG9wZW4gKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgIHNjb19vY2N1cGllZDsgICAvKiBUUlVFIGlmIFNDTyBpcyBiZWluZyB1c2VkIG9yIGNhbGwgaXMgaW4gcHJvZ3Jlc3MgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbXM7ICAvKiBoYW5kbGUgbWFzayBvZiBzdHJlYW1pbmcgYXVkaW8gY2hhbm5lbHMgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIHZpZGVvX3N0cmVhbXM7ICAvKiBoYW5kbGUgbWFzayBvZiBzdHJlYW1pbmcgdmlkZW8gY2hhbm5lbHMgKi8KKyAgICBib29sICAgICAgICAgICAgICAgIGRpc2FibGluZzsgICAgICAvKiB0cnVlIGlmIGFwaSBkaXNhYmxlZCBjYWxsZWQgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgIGRpc2M7ICAgICAgICAgICAvKiAoaGRpKzEpIG9yIChyY19oYW5kbGV8QlRBX0FWX0NITkxfTVNLKSBpZiBwX2Rpc2NfZGIgaXMgaW4gdXNlICovCisgICAgdWludDhfdCAgICAgICAgICAgICBzdGF0ZTsgICAgICAgICAgLyogc3RhdGUgbWFjaGluZSBzdGF0ZSAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgY29ubl9yYzsgICAgICAgIC8qIGhhbmRsZSBtYXNrIG9mIGNvbm5lY3RlZCBSQ1AgY2hhbm5lbHMgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgIGNvbm5fYXVkaW87ICAgICAvKiBoYW5kbGUgbWFzayBvZiBjb25uZWN0ZWQgYXVkaW8gY2hhbm5lbHMgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgIGNvbm5fdmlkZW87ICAgICAvKiBoYW5kbGUgbWFzayBvZiBjb25uZWN0ZWQgdmlkZW8gY2hhbm5lbHMgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgIGNvbm5fbGNiOyAgICAgICAvKiBpbmRleCBtYXNrIG9mIHVzZWQgTENCcyAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgYXVkaW9fb3Blbl9jbnQ7IC8qIG51bWJlciBvZiBjb25uZWN0ZWQgYXVkaW8gY2hhbm5lbHMgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgIHJlZ19hdWRpbzsgICAgICAvKiBoYW5kbGUgbWFzayBvZiByZWdpc3RlcmVkIGF1ZGlvIGNoYW5uZWxzICovCisgICAgdWludDhfdCAgICAgICAgICAgICByZWdfdmlkZW87ICAgICAgLyogaGFuZGxlIG1hc2sgb2YgcmVnaXN0ZXJlZCB2aWRlbyBjaGFubmVscyAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcmNfYWNwX2hhbmRsZTsKKyAgICB1aW50OF90ICAgICAgICAgICAgIHJjX2FjcF9pZHg7ICAgICAvKiAoaW5kZXggKyAxKSB0byBSQ0IgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgIHJzX2lkeDsgICAgICAgICAvKiAoaW5kZXggKyAxKSB0byBTQ0IgZm9yIHRoZSBvbmUgd2FpdGluZyBmb3IgUlMgb24gb3BlbiAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgc2NvX29jY3VwaWVkOyAgIC8qIHRydWUgaWYgU0NPIGlzIGJlaW5nIHVzZWQgb3IgY2FsbCBpcyBpbiBwcm9ncmVzcyAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgYXVkaW9fc3RyZWFtczsgIC8qIGhhbmRsZSBtYXNrIG9mIHN0cmVhbWluZyBhdWRpbyBjaGFubmVscyAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgdmlkZW9fc3RyZWFtczsgIC8qIGhhbmRsZSBtYXNrIG9mIHN0cmVhbWluZyB2aWRlbyBjaGFubmVscyAqLwogfSB0QlRBX0FWX0NCOwogCiAKQEAgLTYxMCw3ICs2MTAsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIGNvbnRyb2wgYmxvY2sgZGVjbGFyYXRpb24gKi8KLSNpZiBCVEFfRFlOQU1JQ19NRU1PUlkgPT0gRkFMU0UKKyNpZiAoQlRBX0RZTkFNSUNfTUVNT1JZID09IEZBTFNFKQogZXh0ZXJuIHRCVEFfQVZfQ0IgYnRhX2F2X2NiOwogI2Vsc2UKIGV4dGVybiB0QlRBX0FWX0NCICpidGFfYXZfY2JfcHRyOwpAQCAtNjIzLDQ2ICs2MjMsNDYgQEAKIGV4dGVybiBjb25zdCB0QlRBX0FWX0NGRyBidGFfYXZfY2ZnOwogCiAvKiByYyBpZCBjb25maWcgc3RydWN0ICovCi1leHRlcm4gVUlOVDE2ICpwX2J0YV9hdl9yY19pZDsKLWV4dGVybiBVSU5UMTYgKnBfYnRhX2F2X3JjX2lkX2FjOworZXh0ZXJuIHVpbnQxNl90ICpwX2J0YV9hdl9yY19pZDsKK2V4dGVybiB1aW50MTZfdCAqcF9idGFfYXZfcmNfaWRfYWM7CiAKIGV4dGVybiBjb25zdCB0QlRBX0FWX1NBQ1QgYnRhX2F2X2EyZF9hY3Rpb25bXTsKIGV4dGVybiBjb25zdCB0QlRBX0FWX0NPX0ZVTkNUUyBidGFfYXZfYTJkX2NvczsKIGV4dGVybiBjb25zdCB0QlRBX0FWX1NBQ1QgYnRhX2F2X3ZkcF9hY3Rpb25bXTsKIGV4dGVybiB0QVZEVF9DVFJMX0NCQUNLICogY29uc3QgYnRhX2F2X2R0X2NiYWNrW107Ci1leHRlcm4gdm9pZCBidGFfYXZfc3RyZWFtX2RhdGFfY2JhY2soVUlOVDggaGFuZGxlLCBCVF9IRFIgKnBfcGt0LCBVSU5UMzIgdGltZV9zdGFtcCwgVUlOVDggbV9wdCk7CitleHRlcm4gdm9pZCBidGFfYXZfc3RyZWFtX2RhdGFfY2JhY2sodWludDhfdCBoYW5kbGUsIEJUX0hEUiAqcF9wa3QsIHVpbnQzMl90IHRpbWVfc3RhbXAsIHVpbnQ4X3QgbV9wdCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiogIEZ1bmN0aW9uIHByb3RvdHlwZXMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogdXRpbGl0eSBmdW5jdGlvbnMgKi8KLWV4dGVybiB0QlRBX0FWX1NDQiAqYnRhX2F2X2huZGxfdG9fc2NiKFVJTlQxNiBoYW5kbGUpOwotZXh0ZXJuIEJPT0xFQU4gYnRhX2F2X2Noa19zdGFydCh0QlRBX0FWX1NDQiAqcF9zY2IpOworZXh0ZXJuIHRCVEFfQVZfU0NCICpidGFfYXZfaG5kbF90b19zY2IodWludDE2X3QgaGFuZGxlKTsKK2V4dGVybiBib29sIGJ0YV9hdl9jaGtfc3RhcnQodEJUQV9BVl9TQ0IgKnBfc2NiKTsKIGV4dGVybiB2b2lkIGJ0YV9hdl9yZXN0b3JlX3N3aXRjaCAodm9pZCk7Ci1leHRlcm4gVUlOVDE2IGJ0YV9hdl9jaGtfbXR1KHRCVEFfQVZfU0NCICpwX3NjYiwgVUlOVDE2IG10dSk7Ci1leHRlcm4gdm9pZCBidGFfYXZfY29ubl9jYmFjayhVSU5UOCBoYW5kbGUsIEJEX0FERFIgYmRfYWRkciwgVUlOVDggZXZlbnQsIHRBVkRUX0NUUkwgKnBfZGF0YSk7Ci1leHRlcm4gVUlOVDggYnRhX2F2X3JjX2NyZWF0ZSh0QlRBX0FWX0NCICpwX2NiLCBVSU5UOCByb2xlLCBVSU5UOCBzaGRsLCBVSU5UOCBsaWR4KTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9zdHJlYW1fY2hnKHRCVEFfQVZfU0NCICpwX3NjYiwgQk9PTEVBTiBzdGFydGVkKTsKLWV4dGVybiBCT09MRUFOIGJ0YV9hdl9pc19zY2Jfb3BlbmluZyAodEJUQV9BVl9TQ0IgKnBfc2NiKTsKLWV4dGVybiBCT09MRUFOIGJ0YV9hdl9pc19zY2JfaW5jb21pbmcgKHRCVEFfQVZfU0NCICpwX3NjYik7CitleHRlcm4gdWludDE2X3QgYnRhX2F2X2Noa19tdHUodEJUQV9BVl9TQ0IgKnBfc2NiLCB1aW50MTZfdCBtdHUpOworZXh0ZXJuIHZvaWQgYnRhX2F2X2Nvbm5fY2JhY2sodWludDhfdCBoYW5kbGUsIEJEX0FERFIgYmRfYWRkciwgdWludDhfdCBldmVudCwgdEFWRFRfQ1RSTCAqcF9kYXRhKTsKK2V4dGVybiB1aW50OF90IGJ0YV9hdl9yY19jcmVhdGUodEJUQV9BVl9DQiAqcF9jYiwgdWludDhfdCByb2xlLCB1aW50OF90IHNoZGwsIHVpbnQ4X3QgbGlkeCk7CitleHRlcm4gdm9pZCBidGFfYXZfc3RyZWFtX2NoZyh0QlRBX0FWX1NDQiAqcF9zY2IsIGJvb2wgc3RhcnRlZCk7CitleHRlcm4gYm9vbCBidGFfYXZfaXNfc2NiX29wZW5pbmcgKHRCVEFfQVZfU0NCICpwX3NjYik7CitleHRlcm4gYm9vbCBidGFfYXZfaXNfc2NiX2luY29taW5nICh0QlRBX0FWX1NDQiAqcF9zY2IpOwogZXh0ZXJuIHZvaWQgYnRhX2F2X3NldF9zY2Jfc3N0X2luaXQgKHRCVEFfQVZfU0NCICpwX3NjYik7Ci1leHRlcm4gQk9PTEVBTiBidGFfYXZfaXNfc2NiX2luaXQgKHRCVEFfQVZfU0NCICpwX3NjYik7CitleHRlcm4gYm9vbCBidGFfYXZfaXNfc2NiX2luaXQgKHRCVEFfQVZfU0NCICpwX3NjYik7CiBleHRlcm4gdm9pZCBidGFfYXZfc2V0X3NjYl9zc3RfaW5jb21pbmcgKHRCVEFfQVZfU0NCICpwX3NjYik7Ci1leHRlcm4gdEJUQV9BVl9MQ0IgKiBidGFfYXZfZmluZF9sY2IoQkRfQUREUiBhZGRyLCBVSU5UOCBvcCk7CitleHRlcm4gdEJUQV9BVl9MQ0IgKiBidGFfYXZfZmluZF9sY2IoQkRfQUREUiBhZGRyLCB1aW50OF90IG9wKTsKIAogCiAvKiBtYWluIGZ1bmN0aW9ucyAqLwogZXh0ZXJuIHZvaWQgYnRhX2F2X2FwaV9kZXJlZ2lzdGVyKHRCVEFfQVZfREFUQSAqcF9kYXRhKTsKIGV4dGVybiB2b2lkIGJ0YV9hdl9kdXBfYXVkaW9fYnVmKHRCVEFfQVZfU0NCICpwX3NjYiwgQlRfSERSICpwX2J1Zik7Ci1leHRlcm4gdm9pZCBidGFfYXZfc21fZXhlY3V0ZSh0QlRBX0FWX0NCICpwX2NiLCBVSU5UMTYgZXZlbnQsIHRCVEFfQVZfREFUQSAqcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9zc21fZXhlY3V0ZSh0QlRBX0FWX1NDQiAqcF9zY2IsIFVJTlQxNiBldmVudCwgdEJUQV9BVl9EQVRBICpwX2RhdGEpOwotZXh0ZXJuIEJPT0xFQU4gYnRhX2F2X2hkbF9ldmVudChCVF9IRFIgKnBfbXNnKTsKLSNpZiAoZGVmaW5lZChCVEFfQVZfREVCVUcpICYmIEJUQV9BVl9ERUJVRyA9PSBUUlVFKQotZXh0ZXJuIGNoYXIgKmJ0YV9hdl9ldnRfY29kZShVSU5UMTYgZXZ0X2NvZGUpOworZXh0ZXJuIHZvaWQgYnRhX2F2X3NtX2V4ZWN1dGUodEJUQV9BVl9DQiAqcF9jYiwgdWludDE2X3QgZXZlbnQsIHRCVEFfQVZfREFUQSAqcF9kYXRhKTsKK2V4dGVybiB2b2lkIGJ0YV9hdl9zc21fZXhlY3V0ZSh0QlRBX0FWX1NDQiAqcF9zY2IsIHVpbnQxNl90IGV2ZW50LCB0QlRBX0FWX0RBVEEgKnBfZGF0YSk7CitleHRlcm4gYm9vbCBidGFfYXZfaGRsX2V2ZW50KEJUX0hEUiAqcF9tc2cpOworI2lmIChCVEFfQVZfREVCVUcgPT0gVFJVRSkKK2V4dGVybiBjaGFyICpidGFfYXZfZXZ0X2NvZGUodWludDE2X3QgZXZ0X2NvZGUpOwogI2VuZGlmCi1leHRlcm4gQk9PTEVBTiBidGFfYXZfc3dpdGNoX2lmX25lZWRlZCh0QlRBX0FWX1NDQiAqcF9zY2IpOwotZXh0ZXJuIEJPT0xFQU4gYnRhX2F2X2xpbmtfcm9sZV9vayh0QlRBX0FWX1NDQiAqcF9zY2IsIFVJTlQ4IGJpdHMpOwotZXh0ZXJuIEJPT0xFQU4gYnRhX2F2X2lzX3JjZmdfc3N0KHRCVEFfQVZfU0NCICpwX3NjYik7CitleHRlcm4gYm9vbCBidGFfYXZfc3dpdGNoX2lmX25lZWRlZCh0QlRBX0FWX1NDQiAqcF9zY2IpOworZXh0ZXJuIGJvb2wgYnRhX2F2X2xpbmtfcm9sZV9vayh0QlRBX0FWX1NDQiAqcF9zY2IsIHVpbnQ4X3QgYml0cyk7CitleHRlcm4gYm9vbCBidGFfYXZfaXNfcmNmZ19zc3QodEJUQV9BVl9TQ0IgKnBfc2NiKTsKIAogLyogbnNtIGFjdGlvbiBmdW5jdGlvbnMgKi8KIGV4dGVybiB2b2lkIGJ0YV9hdl9hcGlfZGlzY29ubmVjdCh0QlRBX0FWX0RBVEEgKnBfZGF0YSk7CkBAIC02NzAsNyArNjcwLDcgQEAKIGV4dGVybiB2b2lkIGJ0YV9hdl9zaWduYWxsaW5nX3RpbWVyKHRCVEFfQVZfREFUQSAqcF9kYXRhKTsKIGV4dGVybiB2b2lkIGJ0YV9hdl9yY19kaXNjX2RvbmUodEJUQV9BVl9EQVRBICpwX2RhdGEpOwogZXh0ZXJuIHZvaWQgYnRhX2F2X3JjX2Nsb3NlZCh0QlRBX0FWX0RBVEEgKnBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYXZfcmNfZGlzYyhVSU5UOCBkaXNjKTsKK2V4dGVybiB2b2lkIGJ0YV9hdl9yY19kaXNjKHVpbnQ4X3QgZGlzYyk7CiBleHRlcm4gdm9pZCBidGFfYXZfY29ubl9jaGcodEJUQV9BVl9EQVRBICpwX2RhdGEpOwogZXh0ZXJuIHZvaWQgYnRhX2F2X2RlcmVnX2NvbXAodEJUQV9BVl9EQVRBICpwX2RhdGEpOwogCkBAIC02ODYsNyArNjg2LDcgQEAKIGV4dGVybiB2b2lkIGJ0YV9hdl9yY19mcmVlX3JzcCAodEJUQV9BVl9DQiAqcF9jYiwgdEJUQV9BVl9EQVRBICpwX2RhdGEpOwogZXh0ZXJuIHZvaWQgYnRhX2F2X3JjX2ZyZWVfbXNnICh0QlRBX0FWX0NCICpwX2NiLCB0QlRBX0FWX0RBVEEgKnBfZGF0YSk7CiAKLWV4dGVybiB0QlRBX0FWX1JDQiAqIGJ0YV9hdl9nZXRfcmNiX2J5X3NoZGwoVUlOVDggc2hkbCk7CitleHRlcm4gdEJUQV9BVl9SQ0IgKiBidGFfYXZfZ2V0X3JjYl9ieV9zaGRsKHVpbnQ4X3Qgc2hkbCk7CiBleHRlcm4gdm9pZCBidGFfYXZfZGVsX3JjKHRCVEFfQVZfUkNCICpwX3JjYik7CiAKIC8qIHNzbSBhY3Rpb24gZnVuY3Rpb25zICovCmRpZmYgLS1naXQgYS9idGEvYXYvYnRhX2F2X21haW4uYyBiL2J0YS9hdi9idGFfYXZfbWFpbi5jCmluZGV4IDczNWVlMmMuLjU1NmQ5N2MgMTAwNjQ0Ci0tLSBhL2J0YS9hdi9idGFfYXZfbWFpbi5jCisrKyBiL2J0YS9hdi9idGFfYXZfbWFpbi5jCkBAIC0zMCwxNCArMzAsMTQgQEAKICNpbmNsdWRlICJidF90YXJnZXQuaCIKICNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKIAotI2lmIGRlZmluZWQoQlRBX0FWX0lOQ0xVREVEKSAmJiAoQlRBX0FWX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9BVl9JTkNMVURFRCA9PSBUUlVFKQogI2luY2x1ZGUgImJ0YV9hdl9jby5oIgogI2luY2x1ZGUgImJ0YV9hdl9pbnQuaCIKICNpbmNsdWRlICJsMmNfYXBpLmgiCiAjaW5jbHVkZSAibDJjZGVmcy5oIgogI2luY2x1ZGUgInV0bC5oIgogCi0jaWYoIGRlZmluZWQgQlRBX0FSX0lOQ0xVREVEICkgJiYgKEJUQV9BUl9JTkNMVURFRCA9PSBUUlVFKQorI2lmIChCVEFfQVJfSU5DTFVERUQgPT0gVFJVRSkKICNpbmNsdWRlICJidGFfYXJfYXBpLmgiCiAjZW5kaWYKIApAQCAtMTE1LDcgKzExNSw3IEBACiAjZGVmaW5lIEJUQV9BVl9OVU1fQ09MUyAgICAgICAgICAgICAyICAgICAgIC8qIG51bWJlciBvZiBjb2x1bW5zIGluIHN0YXRlIHRhYmxlcyAqLwogCiAvKiBzdGF0ZSB0YWJsZSBmb3IgaW5pdCBzdGF0ZSAqLwotc3RhdGljIGNvbnN0IFVJTlQ4IGJ0YV9hdl9zdF9pbml0W11bQlRBX0FWX05VTV9DT0xTXSA9CitzdGF0aWMgY29uc3QgdWludDhfdCBidGFfYXZfc3RfaW5pdFtdW0JUQV9BVl9OVU1fQ09MU10gPQogewogLyogRXZlbnQgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gMSAgICAgICAgICAgICAgIE5leHQgc3RhdGUgKi8KIC8qIEFQSV9ESVNBQkxFX0VWVCAqLyAgICAgICB7QlRBX0FWX0RJU0FCTEUsICAgICAgICBCVEFfQVZfSU5JVF9TVCB9LApAQCAtMTMwLDcgKzEzMCw3IEBACiB9OwogCiAvKiBzdGF0ZSB0YWJsZSBmb3Igb3BlbiBzdGF0ZSAqLwotc3RhdGljIGNvbnN0IFVJTlQ4IGJ0YV9hdl9zdF9vcGVuW11bQlRBX0FWX05VTV9DT0xTXSA9CitzdGF0aWMgY29uc3QgdWludDhfdCBidGFfYXZfc3Rfb3BlbltdW0JUQV9BVl9OVU1fQ09MU10gPQogewogLyogRXZlbnQgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gMSAgICAgICAgICAgICAgIE5leHQgc3RhdGUgKi8KIC8qIEFQSV9ESVNBQkxFX0VWVCAqLyAgICAgICB7QlRBX0FWX0RJU0FCTEUsICAgICAgICBCVEFfQVZfSU5JVF9TVCB9LApAQCAtMTQ1LDcgKzE0NSw3IEBACiB9OwogCiAvKiB0eXBlIGZvciBzdGF0ZSB0YWJsZSAqLwotdHlwZWRlZiBjb25zdCBVSU5UOCAoKnRCVEFfQVZfU1RfVEJMKVtCVEFfQVZfTlVNX0NPTFNdOwordHlwZWRlZiBjb25zdCB1aW50OF90ICgqdEJUQV9BVl9TVF9UQkwpW0JUQV9BVl9OVU1fQ09MU107CiAKIC8qIHN0YXRlIHRhYmxlICovCiBzdGF0aWMgY29uc3QgdEJUQV9BVl9TVF9UQkwgYnRhX2F2X3N0X3RibFtdID0KQEAgLTE2Niw5ICsxNjYsOSBAQAogI2VuZGlmCiBzdGF0aWMgdm9pZCBidGFfYXZfYXBpX3RvX3NzbSh0QlRBX0FWX0RBVEEgKnBfZGF0YSk7CiAKLXN0YXRpYyB2b2lkIGJ0YV9hdl9zY29fY2hnX2NiYWNrKHRCVEFfU1lTX0NPTk5fU1RBVFVTIHN0YXR1cywgVUlOVDggaWQsIFVJTlQ4CitzdGF0aWMgdm9pZCBidGFfYXZfc2NvX2NoZ19jYmFjayh0QlRBX1NZU19DT05OX1NUQVRVUyBzdGF0dXMsIHVpbnQ4X3QgaWQsIHVpbnQ4X3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpOwotc3RhdGljIHZvaWQgYnRhX2F2X3N5c19yc19jYmFjayAodEJUQV9TWVNfQ09OTl9TVEFUVVMgc3RhdHVzLFVJTlQ4IGlkLCBVSU5UOCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKTsKK3N0YXRpYyB2b2lkIGJ0YV9hdl9zeXNfcnNfY2JhY2sgKHRCVEFfU1lTX0NPTk5fU1RBVFVTIHN0YXR1cyx1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpOwogCiAvKiBhY3Rpb24gZnVuY3Rpb25zICovCiBjb25zdCB0QlRBX0FWX05TTV9BQ1QgYnRhX2F2X25zbV9hY3RbXSA9CkBAIC0xOTksMTIgKzE5OSwxMiBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEFWIGNvbnRyb2wgYmxvY2sgKi8KLSNpZiBCVEFfRFlOQU1JQ19NRU1PUlkgPT0gRkFMU0UKKyNpZiAoQlRBX0RZTkFNSUNfTUVNT1JZID09IEZBTFNFKQogdEJUQV9BVl9DQiAgYnRhX2F2X2NiOwogI2VuZGlmCiAKLSNpZiAoZGVmaW5lZChCVEFfQVZfREVCVUcpICYmIEJUQV9BVl9ERUJVRyA9PSBUUlVFKQotc3RhdGljIGNoYXIgKmJ0YV9hdl9zdF9jb2RlKFVJTlQ4IHN0YXRlKTsKKyNpZiAoQlRBX0FWX0RFQlVHID09IFRSVUUpCitzdGF0aWMgY2hhciAqYnRhX2F2X3N0X2NvZGUodWludDhfdCBzdGF0ZSk7CiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI5MCwxMSArMjkwLDExIEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9BVl9TQ0IgKiBidGFfYXZfaG5kbF90b19zY2IoVUlOVDE2IGhhbmRsZSkKK3RCVEFfQVZfU0NCICogYnRhX2F2X2huZGxfdG9fc2NiKHVpbnQxNl90IGhhbmRsZSkKIHsKICAgICB0QlRBX0FWX0hOREwgaG5kbCA9ICh0QlRBX0FWX0hOREwpaGFuZGxlOwogICAgIHRCVEFfQVZfU0NCICogcF9zY2IgPSBOVUxMOwotICAgIFVJTlQ4IGlkeCA9IChobmRsICYgQlRBX0FWX0hORExfTVNLKTsKKyAgICB1aW50OF90IGlkeCA9IChobmRsICYgQlRBX0FWX0hORExfTVNLKTsKIAogICAgIGlmKGlkeCAmJiAoaWR4IDw9IEJUQV9BVl9OVU1fU1RSUykgKQogICAgIHsKQEAgLTM2NywxMyArMzY3LDEzIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfY29ubl9jYmFjayhVSU5UOCBoYW5kbGUsIEJEX0FERFIgYmRfYWRkciwgVUlOVDggZXZlbnQsIHRBVkRUX0NUUkwgKnBfZGF0YSkKK3ZvaWQgYnRhX2F2X2Nvbm5fY2JhY2sodWludDhfdCBoYW5kbGUsIEJEX0FERFIgYmRfYWRkciwgdWludDhfdCBldmVudCwgdEFWRFRfQ1RSTCAqcF9kYXRhKQogewotICAgIFVJTlQxNiAgZXZ0ID0gMDsKKyAgICB1aW50MTZfdCAgZXZ0ID0gMDsKICAgICB0QlRBX0FWX1NDQiAqcF9zY2IgPSBOVUxMOwogICAgIFVOVVNFRChoYW5kbGUpOwogCi0jaWYoIGRlZmluZWQgQlRBX0FSX0lOQ0xVREVEICkgJiYgKEJUQV9BUl9JTkNMVURFRCA9PSBUUlVFKQorI2lmIChCVEFfQVJfSU5DTFVERUQgPT0gVFJVRSkKICAgICBpZiAoZXZlbnQgPT0gQlRBX0FSX0FWRFRfQ09OTl9FVlQgfHwKICAgICAgICAgZXZlbnQgPT0gQVZEVF9DT05ORUNUX0lORF9FVlQgfHwgZXZlbnQgPT0gQVZEVF9ESVNDT05ORUNUX0lORF9FVlQpCiAjZWxzZQpAQCAtMzgzLDcgKzM4Myw3IEBACiAgICAgICAgIGV2dCA9IEJUQV9BVl9TSUdfQ0hHX0VWVDsKICAgICAgICAgaWYoQVZEVF9ESVNDT05ORUNUX0lORF9FVlQgPT0gZXZlbnQpCiAgICAgICAgICAgICBwX3NjYiA9IGJ0YV9hdl9hZGRyX3RvX3NjYihiZF9hZGRyKTsKLSNpZiAoZGVmaW5lZChCVEFfQVZfREVCVUcpICYmIEJUQV9BVl9ERUJVRyA9PSBUUlVFKQorI2lmIChCVEFfQVZfREVCVUcgPT0gVFJVRSkKICAgICAgICAgZWxzZSBpZiAoQVZEVF9DT05ORUNUX0lORF9FVlQgPT0gZXZlbnQpCiAgICAgICAgIHsKICAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIkNPTk5fSU5EIGlzIEFDUDolZCIsIHBfZGF0YS0+aGRyLmVycl9wYXJhbSk7CkBAIC0zOTYsNyArMzk2LDcgQEAKICAgICAgICAgcF9tc2ctPmhkci5sYXllcl9zcGVjaWZpYyA9IGV2ZW50OwogICAgICAgICBwX21zZy0+aGRyLm9mZnNldCA9IHBfZGF0YS0+aGRyLmVycl9wYXJhbTsKICAgICAgICAgYmRjcHkocF9tc2ctPmJkX2FkZHIsIGJkX2FkZHIpOwotI2lmIChkZWZpbmVkKEJUQV9BVl9ERUJVRykgJiYgQlRBX0FWX0RFQlVHID09IFRSVUUpCisjaWYgKEJUQV9BVl9ERUJVRyA9PSBUUlVFKQogICAgICAgICBpZihwX3NjYikgewogICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygic2NiIGhuZGwgeCV4LCByb2xlIHgleCIsIHBfc2NiLT5obmRsLCBwX3NjYi0+cm9sZSk7CiAgICAgICAgIH0KQEAgLTQwOSw3ICs0MDksNyBAQAogICAgIH0KIH0KIAotI2lmIEFWRFRfUkVQT1JUSU5HID09IFRSVUUKKyNpZiAoQVZEVF9SRVBPUlRJTkcgPT0gVFJVRSkKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgogKiogRnVuY3Rpb24gICAgICAgICBidGFfYXZfYTJkcF9yZXBvcnRfY2JhY2sKQEAgLTQxOSw3ICs0MTksNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hdl9hMmRwX3JlcG9ydF9jYmFjayhVSU5UOCBoYW5kbGUsIEFWRFRfUkVQT1JUX1RZUEUgdHlwZSwKK3N0YXRpYyB2b2lkIGJ0YV9hdl9hMmRwX3JlcG9ydF9jYmFjayh1aW50OF90IGhhbmRsZSwgQVZEVF9SRVBPUlRfVFlQRSB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWRFRfUkVQT1JUX0RBVEEgKnBfZGF0YSkKIHsKICAgICBVTlVTRUQoaGFuZGxlKTsKQEAgLTQ0Myw3ICs0NDMsNyBAQAogCiBzdGF0aWMgdm9pZCBidGFfYXZfYXBpX3NpbmtfZW5hYmxlKHRCVEFfQVZfREFUQSAqcF9kYXRhKQogewotICAgIFVJTlQxNiBhY3RpdmF0ZV9zaW5rID0gMDsKKyAgICB1aW50MTZfdCBhY3RpdmF0ZV9zaW5rID0gMDsKICAgICBhY3RpdmF0ZV9zaW5rID0gcF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWM7CiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2F2X2FwaV9zaW5rX2VuYWJsZSAlZCAiLCBhY3RpdmF0ZV9zaW5rKQogICAgIGNoYXIgcF9zZXJ2aWNlX25hbWVbQlRBX1NFUlZJQ0VfTkFNRV9MRU4rMV07CkBAIC00OTIsNyArNDkyLDcgQEAKICAgICBjaGFyICAgICAgICAgICAgKnBfc2VydmljZV9uYW1lOwogICAgIHRCVEFfQVZfQ09ERUMgICBjb2RlY190eXBlOwogICAgIHRCVEFfVVRMX0NPRCAgICBjb2Q7Ci0gICAgVUlOVDggICAgICAgICAgIGluZGV4ID0gMDsKKyAgICB1aW50OF90ICAgICAgICAgICBpbmRleCA9IDA7CiAKICAgICBtZW1zZXQoJmNzLDAsc2l6ZW9mKHRBVkRUX0NTKSk7CiAKQEAgLTUwMCw3ICs1MDAsNyBAQAogICAgIHJlZ2lzdHIuYXBwX2lkID0gcF9kYXRhLT5hcGlfcmVnLmFwcF9pZDsKICAgICByZWdpc3RyLmNobmwgICA9ICh0QlRBX0FWX0NITkwpcF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWM7CiAKLSAgICBVSU5UMTYgcHJvZmlsZV9pbml0aWFsaXplZCA9IHBfZGF0YS0+YXBpX3JlZy5zZXJ2aWNlX3V1aWQ7CisgICAgdWludDE2X3QgcHJvZmlsZV9pbml0aWFsaXplZCA9IHBfZGF0YS0+YXBpX3JlZy5zZXJ2aWNlX3V1aWQ7CiAgICAgaWYgKHByb2ZpbGVfaW5pdGlhbGl6ZWQgPT0gVVVJRF9TRVJWQ0xBU1NfQVVESU9fU0lOSykKICAgICB7CiAgICAgICAgIHBfYnRhX2F2X2NmZyAgPSAodEJUQV9BVl9DRkcgKikgJmJ0YV9hdmtfY2ZnOwpAQCAtNTMzLDcgKzUzMyw3IEBACiAgICAgICAgICAgICByZWcuc2lnX3RvdXQgPSBCVEFfQVZfU0lHX1RPVVQ7CiAgICAgICAgICAgICByZWcuaWRsZV90b3V0ID0gQlRBX0FWX0lETEVfVE9VVDsKICAgICAgICAgICAgIHJlZy5zZWNfbWFzayA9IGJ0YV9hdl9jYi5zZWNfbWFzazsKLSNpZiggZGVmaW5lZCBCVEFfQVJfSU5DTFVERUQgKSAmJiAoQlRBX0FSX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9BUl9JTkNMVURFRCA9PSBUUlVFKQogICAgICAgICAgICAgYnRhX2FyX3JlZ19hdmR0KCZyZWcsIGJ0YV9hdl9jb25uX2NiYWNrLCBCVEFfSURfQVYpOwogI2VuZGlmCiAgICAgICAgICAgICBidGFfc3lzX3JvbGVfY2hnX3JlZ2lzdGVyKCZidGFfYXZfc3lzX3JzX2NiYWNrKTsKQEAgLTU0MiwxMyArNTQyLDEzIEBACiAgICAgICAgICAgICBpZiAoYnRhX2F2X2NiLmZlYXR1cmVzICYgKEJUQV9BVl9GRUFUX1JDVEcpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHdpdGggbm8gYXV0aG9yaXphdGlvbjsgbGV0IEFWRFRQIHVzZSBhdXRob3JpemF0aW9uIGluc3RlYWQgKi8KLSNpZiggZGVmaW5lZCBCVEFfQVJfSU5DTFVERUQgKSAmJiAoQlRBX0FSX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9BUl9JTkNMVURFRCA9PSBUUlVFKQogI2lmIChCVEFfQVZfV0lUSF9BVkNUUF9BVVRIT1JJWkFUSU9OID09IFRSVUUpCiAgICAgICAgICAgICAgICAgYnRhX2FyX3JlZ19hdmN0KHBfYnRhX2F2X2NmZy0+YXZyY19tdHUsIHBfYnRhX2F2X2NmZy0+YXZyY19icl9tdHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hdl9jYi5zZWNfbWFzaywgQlRBX0lEX0FWKTsKICNlbHNlCiAgICAgICAgICAgICAgICAgYnRhX2FyX3JlZ19hdmN0KHBfYnRhX2F2X2NmZy0+YXZyY19tdHUsIHBfYnRhX2F2X2NmZy0+YXZyY19icl9tdHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UOCkoYnRhX2F2X2NiLnNlY19tYXNrICYgKH5CVEFfU0VDX0FVVEhPUklaRSkpLCBCVEFfSURfQVYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCkoYnRhX2F2X2NiLnNlY19tYXNrICYgKH5CVEFfU0VDX0FVVEhPUklaRSkpLCBCVEFfSURfQVYpOwogI2VuZGlmCiAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGVfaW5pdGlhbGl6ZWQgPT0gVVVJRF9TRVJWQ0xBU1NfQVVESU9fU09VUkNFKQogICAgICAgICAgICAgICAgIHsKQEAgLTU5Nyw5ICs1OTcsOSBAQAogICAgICAgICAgICAgcF9zZXJ2aWNlX25hbWUgPSBwX2RhdGEtPmFwaV9yZWcucF9zZXJ2aWNlX25hbWU7CiAgICAgICAgIH0KIAotICAgICAgICBwX3NjYi0+c3VzcGVuZF9zdXAgID0gVFJVRTsKLSAgICAgICAgcF9zY2ItPnJlY2ZnX3N1cCAgICA9IFRSVUU7Ci0gICAgICAgIHBfc2NiLT5za2lwX3NkcCAgICAgPSBGQUxTRTsKKyAgICAgICAgcF9zY2ItPnN1c3BlbmRfc3VwICA9IHRydWU7CisgICAgICAgIHBfc2NiLT5yZWNmZ19zdXAgICAgPSB0cnVlOworICAgICAgICBwX3NjYi0+c2tpcF9zZHAgICAgID0gZmFsc2U7CiAKICAgICAgICAgY3MucF9jdHJsX2NiYWNrICA9IGJ0YV9hdl9kdF9jYmFja1twX3NjYi0+aGRpXTsKICAgICAgICAgaWYocmVnaXN0ci5jaG5sID09IEJUQV9BVl9DSE5MX0FVRElPKQpAQCAtNjEyLDEyICs2MTIsMTIgQEAKICAgICAgICAgICAgIGNzLm1lZGlhX3R5cGUgICAgPSBBVkRUX01FRElBX0FVRElPOwogICAgICAgICAgICAgY3MubXR1ICAgICAgICAgICA9IHBfYnRhX2F2X2NmZy0+YXVkaW9fbXR1OwogICAgICAgICAgICAgY3MuZmx1c2hfdG8gICAgICA9IEwyQ0FQX0RFRkFVTFRfRkxVU0hfVE87Ci0jaWYgQVZEVF9SRVBPUlRJTkcgPT0gVFJVRQorI2lmIChBVkRUX1JFUE9SVElORyA9PSBUUlVFKQogICAgICAgICAgICAgaWYoYnRhX2F2X2NiLmZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfUkVQT1JUKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGNzLmNmZy5wc2NfbWFzayB8PSBBVkRUX1BTQ19SRVBPUlQ7CiAgICAgICAgICAgICAgICAgY3MucF9yZXBvcnRfY2JhY2sgPSBidGFfYXZfYTJkcF9yZXBvcnRfY2JhY2s7Ci0jaWYgQVZEVF9NVUxUSVBMRVhJTkcgPT0gVFJVRQorI2lmIChBVkRUX01VTFRJUExFWElORyA9PSBUUlVFKQogICAgICAgICAgICAgICAgIGNzLmNmZy5tdXhfdHNpZF9yZXBvcnQgPSAyOwogI2VuZGlmCiAgICAgICAgICAgICB9CkBAIC02NDYsNyArNjQ2LDcgQEAKICAgICAgICAgICAgIC8qIGtlZXAgdGhlIGNvbmZpZ3VyYXRpb24gaW4gdGhlIHN0cmVhbSBjb250cm9sIGJsb2NrICovCiAgICAgICAgICAgICBtZW1jcHkoJnBfc2NiLT5jZmcsICZjcy5jZmcsIHNpemVvZih0QVZEVF9DRkcpKTsKICAgICAgICAgICAgIGlmICgoKmJ0YV9hdl9hMmRfY29zLmluaXQpKCZjb2RlY190eXBlLCBjcy5jZmcuY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAmY3MuY2ZnLm51bV9wcm90ZWN0LCBjcy5jZmcucHJvdGVjdF9pbmZvLCBpbmRleCkgPT0gVFJVRSkKKyAgICAgICAgICAgICAgICAmY3MuY2ZnLm51bV9wcm90ZWN0LCBjcy5jZmcucHJvdGVjdF9pbmZvLCBpbmRleCkgPT0gdHJ1ZSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZihBVkRUX0NyZWF0ZVN0cmVhbSgmcF9zY2ItPnNlcHNbaW5kZXhdLmF2X2hhbmRsZSwgJmNzKSA9PSBBVkRUX1NVQ0NFU1MpCiAgICAgICAgICAgICAgICAgewpAQCAtNjkzLDE4ICs2OTMsMTggQEAKICAgICAgICAgICAgICAgICAgICAgLyogaWYgVEcgaXMgbm90IHN1cHBvcnRlZCwgd2UgbmVlZCB0byByZWdpc3RlciB0byBBVkNUIG5vdyAqLwogICAgICAgICAgICAgICAgICAgICBpZiAoKGJ0YV9hdl9jYi5mZWF0dXJlcyAmIChCVEFfQVZfRkVBVF9SQ1RHKSkgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgewotI2lmKCBkZWZpbmVkIEJUQV9BUl9JTkNMVURFRCApICYmIChCVEFfQVJfSU5DTFVERUQgPT0gVFJVRSkKKyNpZiAoQlRBX0FSX0lOQ0xVREVEID09IFRSVUUpCiAjaWYgKEJUQV9BVl9XSVRIX0FWQ1RQX0FVVEhPUklaQVRJT04gPT0gVFJVRSkKICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hcl9yZWdfYXZjdChwX2J0YV9hdl9jZmctPmF2cmNfbXR1LCBwX2J0YV9hdl9jZmctPmF2cmNfYnJfbXR1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hdl9jYi5zZWNfbWFzaywgQlRBX0lEX0FWKTsKICNlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICBidGFfYXJfcmVnX2F2Y3QocF9idGFfYXZfY2ZnLT5hdnJjX210dSwgcF9idGFfYXZfY2ZnLT5hdnJjX2JyX210dSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgpKGJ0YV9hdl9jYi5zZWNfbWFzayAmICh+QlRBX1NFQ19BVVRIT1JJWkUpKSwgQlRBX0lEX0FWKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCkoYnRhX2F2X2NiLnNlY19tYXNrICYgKH5CVEFfU0VDX0FVVEhPUklaRSkpLCBCVEFfSURfQVYpOwogI2VuZGlmCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hdl9yY19jcmVhdGUoJmJ0YV9hdl9jYiwgQVZDVF9BQ1AsIDAsIEJUQV9BVl9OVU1fTElOS1MgKyAxKTsKICAgICAgICAgICAgICAgICAgICAgfQotI2lmKCBkZWZpbmVkIEJUQV9BUl9JTkNMVURFRCApICYmIChCVEFfQVJfSU5DTFVERUQgPT0gVFJVRSkKKyNpZiAoQlRBX0FSX0lOQ0xVREVEID09IFRSVUUpCiAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBhbiBTRFAgcmVjb3JkIGFzIEFWUkMgQ1QuIFdlIGNyZWF0ZSAxLjMgZm9yIFNPVVJDRQogICAgICAgICAgICAgICAgICAgICAgKiBiZWNhdXNlIHdlIHJlbHkgb24gZmVhdHVyZSBiaXRzIGJlaW5nIHNjYW5uZWQgYnkgZXh0ZXJuYWwKICAgICAgICAgICAgICAgICAgICAgICogZGV2aWNlcyBtb3JlIHRoYW4gdGhlIHByb2ZpbGUgdmVyc2lvbiBpdHNlbGYuCkBAIC03NTIsNyArNzUyLDcgQEAKIAogICAgIGlmKHBfc2NiKQogICAgIHsKLSAgICAgICAgcF9zY2ItPmRlcmVnaXN0cmluZyA9IFRSVUU7CisgICAgICAgIHBfc2NiLT5kZXJlZ2lzdHJpbmcgPSB0cnVlOwogICAgICAgICBidGFfYXZfc3NtX2V4ZWN1dGUocF9zY2IsIEJUQV9BVl9BUElfQ0xPU0VfRVZULCBwX2RhdGEpOwogICAgIH0KICAgICBlbHNlCkBAIC03NzUsNyArNzc1LDcgQEAKIHsKICAgICB0QlRBX0FWX1NDQiAqcF9zY2I7CiAgICAgaW50ICAgICBpOwotICAgIFVJTlQ4ICAgY2hubCA9IChVSU5UOClwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYzsKKyAgICB1aW50OF90ICAgY2hubCA9ICh1aW50OF90KXBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljOwogCiAgICAgZm9yKCBpPTA7IGkgPCBCVEFfQVZfTlVNX1NUUlM7IGkrKyApCiAgICAgewpAQCAtODE3LDcgKzgxNyw3IEBACiBzdGF0aWMgdm9pZCBidGFfYXZfYXBpX3RvX3NzbSh0QlRBX0FWX0RBVEEgKnBfZGF0YSkKIHsKICAgICBpbnQgeHg7Ci0gICAgVUlOVDE2IGV2ZW50ID0gcF9kYXRhLT5oZHIuZXZlbnQgLSBCVEFfQVZfRklSU1RfQTJTX0FQSV9FVlQgKyBCVEFfQVZfRklSU1RfQTJTX1NTTV9FVlQ7CisgICAgdWludDE2X3QgZXZlbnQgPSBwX2RhdGEtPmhkci5ldmVudCAtIEJUQV9BVl9GSVJTVF9BMlNfQVBJX0VWVCArIEJUQV9BVl9GSVJTVF9BMlNfU1NNX0VWVDsKIAogICAgIGZvcih4eD0wOyB4eDxCVEFfQVZfTlVNX1NUUlM7IHh4KyspCiAgICAgewpAQCAtODMyLDEyICs4MzIsMTIgQEAKICoqIERlc2NyaXB0aW9uICAgICAgaWYgdGhpcyBpcyBhdWRpbyBjaGFubmVsLCBjaGVjayBpZiBtb3JlIHRoYW4gb25lIGF1ZGlvCiAqKiAgICAgICAgICAgICAgICAgIGNoYW5uZWwgaXMgY29ubmVjdGVkICYgYWxyZWFkeSBzdGFydGVkLgogKioKLSoqIFJldHVybnMgICAgICAgICAgVFJVRSwgaWYgbmVlZCBhcGlfc3RhcnQKKyoqIFJldHVybnMgICAgICAgICAgdHJ1ZSwgaWYgbmVlZCBhcGlfc3RhcnQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfYXZfY2hrX3N0YXJ0KHRCVEFfQVZfU0NCICpwX3NjYikKK2Jvb2wgYnRhX2F2X2Noa19zdGFydCh0QlRBX0FWX1NDQiAqcF9zY2IpCiB7Ci0gICAgQk9PTEVBTiBzdGFydCA9IEZBTFNFOworICAgIGJvb2wgc3RhcnQgPSBmYWxzZTsKICAgICB0QlRBX0FWX1NDQiAqcF9zY2JpOwogICAgIGludCBpOwogCkBAIC04NTQsNyArODU0LDcgQEAKICAgICAgICAgICAgICAgICBwX3NjYmkgPSBidGFfYXZfY2IucF9zY2JbaV07CiAgICAgICAgICAgICAgICAgaWYocF9zY2JpICYmIHBfc2NiaS0+Y2hubCA9PSBCVEFfQVZfQ0hOTF9BVURJTyAmJiBwX3NjYmktPmNvX3N0YXJ0ZWQpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgLyogbWF5IG5lZWQgdG8gdXBkYXRlIHRoZSBmbHVzaCB0aW1lb3V0IG9mIHRoaXMgYWxyZWFkeSBzdGFydGVkIHN0cmVhbSAqLwogICAgICAgICAgICAgICAgICAgICBpZihwX3NjYmktPmNvX3N0YXJ0ZWQgIT0gYnRhX2F2X2NiLmF1ZGlvX29wZW5fY250KQogICAgICAgICAgICAgICAgICAgICB7CkBAIC04ODIsNyArODgyLDcgQEAKIHsKICAgICB0QlRBX0FWX0NCICAgKnBfY2IgPSAmYnRhX2F2X2NiOwogICAgIGludCAgICAgaTsKLSAgICBVSU5UOCAgIG1hc2s7CisgICAgdWludDhfdCAgIG1hc2s7CiAKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJyZWdfYXVkaW86IDB4JXgiLGJ0YV9hdl9jYi5yZWdfYXVkaW8pOwogICAgIGZvcihpPTA7IGk8QlRBX0FWX05VTV9TVFJTOyBpKyspCkBAIC05MDgsMTIgKzkwOCwxMiBAQAogKiogUmV0dXJucyAgICAgICAgICAoQlRBX1NZU19ST0xFX0NIQU5HRSwgbmV3X3JvbGUsIGhjaV9zdGF0dXMsIHBfYmRhKQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfYXZfc3lzX3JzX2NiYWNrICh0QlRBX1NZU19DT05OX1NUQVRVUyBzdGF0dXMsVUlOVDggaWQsIFVJTlQ4IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpCitzdGF0aWMgdm9pZCBidGFfYXZfc3lzX3JzX2NiYWNrICh0QlRBX1NZU19DT05OX1NUQVRVUyBzdGF0dXMsdWludDhfdCBpZCwgdWludDhfdCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKQogewogICAgIGludCAgICAgICAgIGk7CiAgICAgdEJUQV9BVl9TQ0IgKnBfc2NiID0gTlVMTDsKLSAgICBVSU5UOCAgICAgICBjdXJfcm9sZTsKLSAgICBVSU5UOCAgICAgICBwZWVyX2lkeCA9IDA7CisgICAgdWludDhfdCAgICAgICBjdXJfcm9sZTsKKyAgICB1aW50OF90ICAgICAgIHBlZXJfaWR4ID0gMDsKICAgICBVTlVTRUQoc3RhdHVzKTsKIAogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9hdl9zeXNfcnNfY2JhY2s6ICVkIiwgYnRhX2F2X2NiLnJzX2lkeCk7CkBAIC05ODcsNyArOTg3LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfYXZfc2NvX2NoZ19jYmFjayh0QlRBX1NZU19DT05OX1NUQVRVUyBzdGF0dXMsIFVJTlQ4IGlkLCBVSU5UOAorc3RhdGljIHZvaWQgYnRhX2F2X3Njb19jaGdfY2JhY2sodEJUQV9TWVNfQ09OTl9TVEFUVVMgc3RhdHVzLCB1aW50OF90IGlkLCB1aW50OF90CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKQogewogICAgIHRCVEFfQVZfU0NCICpwX3NjYjsKQEAgLTk5OSwyNyArOTk5LDI3IEBACiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2F2X3Njb19jaGdfY2JhY2s6JWQgc3RhdHVzOiVkIiwgaWQsIHN0YXR1cyk7CiAgICAgaWYoaWQpCiAgICAgewotICAgICAgICBidGFfYXZfY2Iuc2NvX29jY3VwaWVkID0gVFJVRTsKKyAgICAgICAgYnRhX2F2X2NiLnNjb19vY2N1cGllZCA9IHRydWU7CiAKICAgICAgICAgLyogZWl0aGVyIEJUQV9TWVNfU0NPX09QRU4gb3IgQlRBX1NZU19TQ09fQ0xPU0Ugd2l0aCByZW1haW5pbmcgYWN0aXZlIFNDTyAqLwogICAgICAgICBmb3IoaT0wOyBpPEJUQV9BVl9OVU1fU1RSUzsgaSsrKQogICAgICAgICB7CiAgICAgICAgICAgICBwX3NjYiA9IGJ0YV9hdl9jYi5wX3NjYltpXTsKIAotICAgICAgICAgICAgaWYoIHBfc2NiICYmIHBfc2NiLT5jb19zdGFydGVkICYmIChwX3NjYi0+c2NvX3N1c3BlbmQgPT0gRkFMU0UpKQorICAgICAgICAgICAgaWYoIHBfc2NiICYmIHBfc2NiLT5jb19zdGFydGVkICYmIChwX3NjYi0+c2NvX3N1c3BlbmQgPT0gZmFsc2UpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoInN1c3BlbmRpbmcgc2NiOiVkIiwgaSk7CiAgICAgICAgICAgICAgICAgLyogc2NiIGlzIHVzZWQgYW5kIHN0YXJ0ZWQsIG5vdCBzdXNwZW5kZWQgYXV0b21hdGljYWxseSAqLwotICAgICAgICAgICAgICAgIHBfc2NiLT5zY29fc3VzcGVuZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgc3RvcC5mbHVzaCAgID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgc3RvcC5zdXNwZW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICBwX3NjYi0+c2NvX3N1c3BlbmQgPSB0cnVlOworICAgICAgICAgICAgICAgIHN0b3AuZmx1c2ggICA9IGZhbHNlOworICAgICAgICAgICAgICAgIHN0b3Auc3VzcGVuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnRhX2F2X3NzbV9leGVjdXRlKHBfc2NiLCBCVEFfQVZfQVBfU1RPUF9FVlQsICh0QlRBX0FWX0RBVEEgKikmc3RvcCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgYnRhX2F2X2NiLnNjb19vY2N1cGllZCA9IEZBTFNFOworICAgICAgICBidGFfYXZfY2Iuc2NvX29jY3VwaWVkID0gZmFsc2U7CiAKICAgICAgICAgZm9yKGk9MDsgaTxCVEFfQVZfTlVNX1NUUlM7IGkrKykKICAgICAgICAgewpAQCAtMTA0MiwxNiArMTA0MiwxNiBAQAogKiogICAgICAgICAgICAgICAgICBjaGFubmVsIHRoYXQgaXMgbG9jYWwgYXMgc2xhdmUgcm9sZS4KICoqICAgICAgICAgICAgICAgICAgSWYgc28sIHJvbGUgc3dpdGNoIGFuZCByZW1vdmUgaXQgZnJvbSBsaW5rIHBvbGljeS4KICoqCi0qKiBSZXR1cm5zICAgICAgICAgIFRSVUUsIGlmIHJvbGUgc3dpdGNoIGlzIGRvbmUKKyoqIFJldHVybnMgICAgICAgICAgdHJ1ZSwgaWYgcm9sZSBzd2l0Y2ggaXMgZG9uZQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9hdl9zd2l0Y2hfaWZfbmVlZGVkKHRCVEFfQVZfU0NCICpwX3NjYikKK2Jvb2wgYnRhX2F2X3N3aXRjaF9pZl9uZWVkZWQodEJUQV9BVl9TQ0IgKnBfc2NiKQogewotICAgIFVJTlQ4IHJvbGU7Ci0gICAgQk9PTEVBTiBuZWVkZWQgPSBGQUxTRTsKKyAgICB1aW50OF90IHJvbGU7CisgICAgYm9vbCBuZWVkZWQgPSBmYWxzZTsKICAgICB0QlRBX0FWX1NDQiAqcF9zY2JpOwogICAgIGludCBpOwotICAgIFVJTlQ4ICAgICAgIG1hc2s7CisgICAgdWludDhfdCAgICAgICBtYXNrOwogCiAgICAgZm9yKGk9MDsgaTxCVEFfQVZfTlVNX1NUUlM7IGkrKykKICAgICB7CkBAIC0xMDc1LDcgKzEwNzUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9BVl9SU19USU1FX1ZBTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfQVZfQVZSQ19USU1FUl9FVlQsIHBfc2NiLT5obmRsKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmVlZGVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICBuZWVkZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIC8qIG1hcmsgdGhlIG9yaWdpbmFsIGNoYW5uZWwgYXMgd2FpdGluZyBmb3IgUlMgcmVzdWx0ICovCiAgICAgICAgICAgICAgICAgYnRhX2F2X2NiLnJzX2lkeCA9IHBfc2NiLT5oZGkgKyAxOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTA5MiwxMyArMTA5MiwxMyBAQAogKiogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgU0NCIGhhcyBleGlzdGluZyBBQ0wgY29ubmVjdGlvbgogKiogICAgICAgICAgICAgICAgICBJZiBzbywgY2hlY2sgaWYgdGhlIGxpbmsgcm9sZSBmaXRzIHRoZSByZXF1aXJlbWVudHMuCiAqKgotKiogUmV0dXJucyAgICAgICAgICBUUlVFLCBpZiByb2xlIGlzIG9rCisqKiBSZXR1cm5zICAgICAgICAgIHRydWUsIGlmIHJvbGUgaXMgb2sKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfYXZfbGlua19yb2xlX29rKHRCVEFfQVZfU0NCICpwX3NjYiwgVUlOVDggYml0cykKK2Jvb2wgYnRhX2F2X2xpbmtfcm9sZV9vayh0QlRBX0FWX1NDQiAqcF9zY2IsIHVpbnQ4X3QgYml0cykKIHsKLSAgICBVSU5UOCByb2xlOwotICAgIEJPT0xFQU4gaXNfb2sgPSBUUlVFOworICAgIHVpbnQ4X3Qgcm9sZTsKKyAgICBib29sIGlzX29rID0gdHJ1ZTsKIAogICAgIGlmIChCVE1fR2V0Um9sZShwX3NjYi0+cGVlcl9hZGRyLCAmcm9sZSkgPT0gQlRNX1NVQ0NFU1MpCiAgICAgewpAQCAtMTExNCw3ICsxMTE0LDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvKiBjYW4gbm90IHN3aXRjaCByb2xlIG9uIFNDQiAtIHN0YXJ0IHRoZSB0aW1lciBvbiBTQ0IgKi8KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlzX29rID0gRkFMU0U7CisgICAgICAgICAgICBpc19vayA9IGZhbHNlOwogICAgICAgICAgICAgcF9zY2ItPndhaXQgfD0gQlRBX0FWX1dBSVRfUk9MRV9TV19SRVNfU1RBUlQ7CiAKICAgICAgICAgfQpAQCAtMTEzMywxMiArMTEzMywxMiBAQAogKiogUmV0dXJucyAgICAgICAgICBUaGUgc21hbGxlc3QgbXR1IG9mIHRoZSBjb25uZWN0ZWQgYXVkaW8gY2hhbm5lbHMKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVUlOVDE2IGJ0YV9hdl9jaGtfbXR1KHRCVEFfQVZfU0NCICpwX3NjYiwgVUlOVDE2IG10dSkKK3VpbnQxNl90IGJ0YV9hdl9jaGtfbXR1KHRCVEFfQVZfU0NCICpwX3NjYiwgdWludDE2X3QgbXR1KQogewotICAgIFVJTlQxNiByZXRfbXR1ID0gQlRBX0FWX01BWF9BMkRQX01UVTsKKyAgICB1aW50MTZfdCByZXRfbXR1ID0gQlRBX0FWX01BWF9BMkRQX01UVTsKICAgICB0QlRBX0FWX1NDQiAqcF9zY2JpOwogICAgIGludCBpOwotICAgIFVJTlQ4ICAgbWFzazsKKyAgICB1aW50OF90ICAgbWFzazsKICAgICBVTlVTRUQobXR1KTsKIAogICAgIC8qIFRPRE9fTVYgbWVzcyB3aXRoIHRoZSBtdHUgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgb2YgRURSL25vbi1FRFIgaGVhZHNldHMgKi8KQEAgLTExODQsNyArMTE4NCw3IEBACiAgICAgaWYgKChwX2J1ZiA9PSBOVUxMKSB8fCAoYnRhX2F2X2NiLmF1ZGlvX29wZW5fY250IDwgMikpCiAgICAgICAgIHJldHVybjsKIAotICAgIFVJTlQxNiBjb3B5X3NpemUgPSBCVF9IRFJfU0laRSArIHBfYnVmLT5sZW4gKyBwX2J1Zi0+b2Zmc2V0OworICAgIHVpbnQxNl90IGNvcHlfc2l6ZSA9IEJUX0hEUl9TSVpFICsgcF9idWYtPmxlbiArIHBfYnVmLT5vZmZzZXQ7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCVEFfQVZfTlVNX1NUUlM7IGkrKykgewogICAgICAgICB0QlRBX0FWX1NDQiAqcF9zY2JpID0gYnRhX2F2X2NiLnBfc2NiW2ldOwogCkBAIC0xMjIwLDEyICsxMjIwLDEyIEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfc21fZXhlY3V0ZSh0QlRBX0FWX0NCICpwX2NiLCBVSU5UMTYgZXZlbnQsIHRCVEFfQVZfREFUQSAqcF9kYXRhKQordm9pZCBidGFfYXZfc21fZXhlY3V0ZSh0QlRBX0FWX0NCICpwX2NiLCB1aW50MTZfdCBldmVudCwgdEJUQV9BVl9EQVRBICpwX2RhdGEpCiB7CiAgICAgdEJUQV9BVl9TVF9UQkwgICAgICBzdGF0ZV90YWJsZTsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGFjdGlvbjsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgYWN0aW9uOwogCi0jaWYgKGRlZmluZWQoQlRBX0FWX0RFQlVHKSAmJiBCVEFfQVZfREVCVUcgPT0gVFJVRSkKKyNpZiAoQlRBX0FWX0RFQlVHID09IFRSVUUpCiAgICAgQVBQTF9UUkFDRV9FVkVOVCgiQVYgZXZlbnQ9MHgleCglcykgc3RhdGU9JWQoJXMpIiwKICAgICAgICAgZXZlbnQsIGJ0YV9hdl9ldnRfY29kZShldmVudCksIHBfY2ItPnN0YXRlLCBidGFfYXZfc3RfY29kZShwX2NiLT5zdGF0ZSkpOwogI2Vsc2UKQEAgLTEyNTUsMjIgKzEyNTUsMjIgQEAKICoqIERlc2NyaXB0aW9uICAgICAgQWR2YW5jZWQgYXVkaW8vdmlkZW8gbWFpbiBldmVudCBoYW5kbGluZyBmdW5jdGlvbi4KICoqCiAqKgotKiogUmV0dXJucyAgICAgICAgICBCT09MRUFOCisqKiBSZXR1cm5zICAgICAgICAgIGJvb2wKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfYXZfaGRsX2V2ZW50KEJUX0hEUiAqcF9tc2cpCitib29sIGJ0YV9hdl9oZGxfZXZlbnQoQlRfSERSICpwX21zZykKIHsKLSAgICBVSU5UMTYgZXZlbnQgPSBwX21zZy0+ZXZlbnQ7Ci0gICAgVUlOVDE2IGZpcnN0X2V2ZW50ID0gQlRBX0FWX0ZJUlNUX05TTV9FVlQ7CisgICAgdWludDE2X3QgZXZlbnQgPSBwX21zZy0+ZXZlbnQ7CisgICAgdWludDE2X3QgZmlyc3RfZXZlbnQgPSBCVEFfQVZfRklSU1RfTlNNX0VWVDsKIAogICAgIGlmIChldmVudCA+IEJUQV9BVl9MQVNUX0VWVCkKICAgICB7Ci0gICAgICAgIHJldHVybiBUUlVFOyAvKiB0byBmcmVlIHBfbXNnICovCisgICAgICAgIHJldHVybiB0cnVlOyAvKiB0byBmcmVlIHBfbXNnICovCiAgICAgfQogCiAgICAgaWYoZXZlbnQgPj0gZmlyc3RfZXZlbnQpCiAgICAgewotI2lmIChkZWZpbmVkKEJUQV9BVl9ERUJVRykgJiYgQlRBX0FWX0RFQlVHID09IFRSVUUpCisjaWYgKEJUQV9BVl9ERUJVRyA9PSBUUlVFKQogICAgICAgICBBUFBMX1RSQUNFX1ZFUkJPU0UoIkFWIG5zbSBldmVudD0weCV4KCVzKSIsIGV2ZW50LCBidGFfYXZfZXZ0X2NvZGUoZXZlbnQpKTsKICNlbHNlCiAgICAgICAgIEFQUExfVFJBQ0VfVkVSQk9TRSgiQVYgbnNtIGV2ZW50PTB4JXgiLCBldmVudCk7CkBAIC0xMjgwLDcgKzEyODAsNyBAQAogICAgIH0KICAgICBlbHNlIGlmIChldmVudCA+PSBCVEFfQVZfRklSU1RfU01fRVZUICYmIGV2ZW50IDw9IEJUQV9BVl9MQVNUX1NNX0VWVCkKICAgICB7Ci0jaWYgKGRlZmluZWQoQlRBX0FWX0RFQlVHKSAmJiBCVEFfQVZfREVCVUcgPT0gVFJVRSkKKyNpZiAoQlRBX0FWX0RFQlVHID09IFRSVUUpCiAgICAgICAgIEFQUExfVFJBQ0VfVkVSQk9TRSgiQVYgc20gZXZlbnQ9MHgleCglcykiLCBldmVudCwgYnRhX2F2X2V2dF9jb2RlKGV2ZW50KSk7CiAjZWxzZQogICAgICAgICBBUFBMX1RSQUNFX1ZFUkJPU0UoIkFWIHNtIGV2ZW50PTB4JXgiLCBldmVudCk7CkBAIC0xMjk1LDEzICsxMjk1LDEzIEBACiAgICAgICAgIGJ0YV9hdl9zc21fZXhlY3V0ZSggYnRhX2F2X2huZGxfdG9fc2NiKHBfbXNnLT5sYXllcl9zcGVjaWZpYyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbXNnLT5ldmVudCwgKHRCVEFfQVZfREFUQSAqKSBwX21zZyk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqICBEZWJ1ZyBGdW5jdGlvbnMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIChkZWZpbmVkKEJUQV9BVl9ERUJVRykgJiYgQlRBX0FWX0RFQlVHID09IFRSVUUpCisjaWYgKEJUQV9BVl9ERUJVRyA9PSBUUlVFKQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCiAqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9zdF9jb2RlCkBAIC0xMzExLDcgKzEzMTEsNyBAQAogKiogUmV0dXJucyAgICAgICAgICBjaGFyICoKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGNoYXIgKmJ0YV9hdl9zdF9jb2RlKFVJTlQ4IHN0YXRlKQorc3RhdGljIGNoYXIgKmJ0YV9hdl9zdF9jb2RlKHVpbnQ4X3Qgc3RhdGUpCiB7CiAgICAgc3dpdGNoKHN0YXRlKQogICAgIHsKQEAgLTEzMjksNyArMTMyOSw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIGNoYXIgKgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jaGFyICpidGFfYXZfZXZ0X2NvZGUoVUlOVDE2IGV2dF9jb2RlKQorY2hhciAqYnRhX2F2X2V2dF9jb2RlKHVpbnQxNl90IGV2dF9jb2RlKQogewogICAgIHN3aXRjaChldnRfY29kZSkKICAgICB7CmRpZmYgLS1naXQgYS9idGEvYXYvYnRhX2F2X3NiYy5jIGIvYnRhL2F2L2J0YV9hdl9zYmMuYwppbmRleCBkZWMyNGRmLi5mZjBmMWVmIDEwMDY0NAotLS0gYS9idGEvYXYvYnRhX2F2X3NiYy5jCisrKyBiL2J0YS9hdi9idGFfYXZfc2JjLmMKQEAgLTI5LDIwICsyOSwyMCBAQAogI2luY2x1ZGUgInV0bC5oIgogCiB0eXBlZGVmIGludCAodEJUQV9BVl9TQkNfQUNUKSh2b2lkICpwX3NyYywgdm9pZCAqcF9kc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIHNyY19zYW1wbGVzLCBVSU5UMzIgZHN0X3NhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyICpwX3JldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NhbXBsZXMsIHVpbnQzMl90IGRzdF9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwX3JldCk7CiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgSU5UMzIgICAgICAgICAgICAgICBjdXJfcG9zOyAgICAvKiBjdXJyZW50IHBvc2l0aW9uICovCi0gICAgVUlOVDMyICAgICAgICAgICAgICBzcmNfc3BzOyAgICAvKiBzYW1wbGVzIHBlciBzZWNvbmQgKHNvdXJjZSBhdWRpbyBkYXRhKSAqLwotICAgIFVJTlQzMiAgICAgICAgICAgICAgZHN0X3NwczsgICAgLyogc2FtcGxlcyBwZXIgc2Vjb25kIChjb252ZXJ0ZWQgYXVkaW8gZGF0YSkgKi8KKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgY3VyX3BvczsgICAgLyogY3VycmVudCBwb3NpdGlvbiAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBzcmNfc3BzOyAgICAvKiBzYW1wbGVzIHBlciBzZWNvbmQgKHNvdXJjZSBhdWRpbyBkYXRhKSAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBkc3Rfc3BzOyAgICAvKiBzYW1wbGVzIHBlciBzZWNvbmQgKGNvbnZlcnRlZCBhdWRpbyBkYXRhKSAqLwogICAgIHRCVEFfQVZfU0JDX0FDVCAgICAgKnBfYWN0OyAgICAgLyogdGhlIGFjdGlvbiBmdW5jdGlvbiB0byBkbyB0aGUgY29udmVyc2lvbiAqLwotICAgIFVJTlQxNiAgICAgICAgICAgICAgYml0czsgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgcGVyIHBjbSBzYW1wbGUgKi8KLSAgICBVSU5UMTYgICAgICAgICAgICAgIG5fY2hhbm5lbHM7IC8qIG51bWJlciBvZiBjaGFubmVscyAoaS5lLiBtb25vKDEpLCBzdGVyZW8oMikuLi4pICovCi0gICAgSU5UMTYgICAgICAgICAgICAgICB3b3JrZXIxOwotICAgIElOVDE2ICAgICAgICAgICAgICAgd29ya2VyMjsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGRpdjsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgYml0czsgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgcGVyIHBjbSBzYW1wbGUgKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgbl9jaGFubmVsczsgLyogbnVtYmVyIG9mIGNoYW5uZWxzIChpLmUuIG1vbm8oMSksIHN0ZXJlbygyKS4uLikgKi8KKyAgICBpbnQxNl90ICAgICAgICAgICAgICAgd29ya2VyMTsKKyAgICBpbnQxNl90ICAgICAgICAgICAgICAgd29ya2VyMjsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgZGl2OwogfSB0QlRBX0FWX1NCQ19VUFNfQ0I7CiAKIHRCVEFfQVZfU0JDX1VQU19DQiBidGFfYXZfc2JjX3Vwc19jYjsKQEAgLTYxLDcgKzYxLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgbm9uZQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9zYmNfaW5pdF91cF9zYW1wbGUgKFVJTlQzMiBzcmNfc3BzLCBVSU5UMzIgZHN0X3NwcywgVUlOVDE2IGJpdHMsIFVJTlQxNiBuX2NoYW5uZWxzKQordm9pZCBidGFfYXZfc2JjX2luaXRfdXBfc2FtcGxlICh1aW50MzJfdCBzcmNfc3BzLCB1aW50MzJfdCBkc3Rfc3BzLCB1aW50MTZfdCBiaXRzLCB1aW50MTZfdCBuX2NoYW5uZWxzKQogewogICAgIGJ0YV9hdl9zYmNfdXBzX2NiLmN1cl9wb3MgICA9IC0xOwogICAgIGJ0YV9hdl9zYmNfdXBzX2NiLnNyY19zcHMgICA9IHNyY19zcHM7CkBAIC0xMjUsMTEgKzEyNSwxMSBAQAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbnQgYnRhX2F2X3NiY191cF9zYW1wbGUgKHZvaWQgKnBfc3JjLCB2b2lkICpwX2RzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgc3JjX3NhbXBsZXMsIFVJTlQzMiBkc3Rfc2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgKnBfcmV0KQorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY19zYW1wbGVzLCB1aW50MzJfdCBkc3Rfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcF9yZXQpCiB7Ci0gICAgVUlOVDMyIHNyYzsKLSAgICBVSU5UMzIgZHN0OworICAgIHVpbnQzMl90IHNyYzsKKyAgICB1aW50MzJfdCBkc3Q7CiAKICAgICBpZihidGFfYXZfc2JjX3Vwc19jYi5wX2FjdCkKICAgICB7CkBAIC0xNjIsMTUgKzE2MiwxNSBAQAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbnQgYnRhX2F2X3NiY191cF9zYW1wbGVfMTZzICh2b2lkICpwX3NyYywgdm9pZCAqcF9kc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIHNyY19zYW1wbGVzLCBVSU5UMzIgZHN0X3NhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyICpwX3JldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc2FtcGxlcywgdWludDMyX3QgZHN0X3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBfcmV0KQogewotICAgIElOVDE2ICAgKnBfc3JjX3RtcCA9IChJTlQxNiAqKXBfc3JjOwotICAgIElOVDE2ICAgKnBfZHN0X3RtcCA9IChJTlQxNiAqKXBfZHN0OwotICAgIElOVDE2ICAgKnBfd29ya2VyMSA9ICZidGFfYXZfc2JjX3Vwc19jYi53b3JrZXIxOwotICAgIElOVDE2ICAgKnBfd29ya2VyMiA9ICZidGFfYXZfc2JjX3Vwc19jYi53b3JrZXIyOwotICAgIFVJTlQzMiAgc3JjX3NwcyA9IGJ0YV9hdl9zYmNfdXBzX2NiLnNyY19zcHM7Ci0gICAgVUlOVDMyICBkc3Rfc3BzID0gYnRhX2F2X3NiY191cHNfY2IuZHN0X3NwczsKKyAgICBpbnQxNl90ICAgKnBfc3JjX3RtcCA9IChpbnQxNl90ICopcF9zcmM7CisgICAgaW50MTZfdCAgICpwX2RzdF90bXAgPSAoaW50MTZfdCAqKXBfZHN0OworICAgIGludDE2X3QgICAqcF93b3JrZXIxID0gJmJ0YV9hdl9zYmNfdXBzX2NiLndvcmtlcjE7CisgICAgaW50MTZfdCAgICpwX3dvcmtlcjIgPSAmYnRhX2F2X3NiY191cHNfY2Iud29ya2VyMjsKKyAgICB1aW50MzJfdCAgc3JjX3NwcyA9IGJ0YV9hdl9zYmNfdXBzX2NiLnNyY19zcHM7CisgICAgdWludDMyX3QgIGRzdF9zcHMgPSBidGFfYXZfc2JjX3Vwc19jYi5kc3Rfc3BzOwogCiAgICAgd2hpbGUgKGJ0YV9hdl9zYmNfdXBzX2NiLmN1cl9wb3MgPiAwICYmIGRzdF9zYW1wbGVzKQogICAgIHsKQEAgLTIwMCw3ICsyMDAsNyBAQAogICAgICAgICBidGFfYXZfc2JjX3Vwc19jYi5jdXJfcG9zICs9IGRzdF9zcHM7CiAgICAgfQogCi0gICAgaWYgKGJ0YV9hdl9zYmNfdXBzX2NiLmN1cl9wb3MgPT0gKElOVDMyKWRzdF9zcHMpCisgICAgaWYgKGJ0YV9hdl9zYmNfdXBzX2NiLmN1cl9wb3MgPT0gKGludDMyX3QpZHN0X3NwcykKICAgICAgICAgYnRhX2F2X3NiY191cHNfY2IuY3VyX3BvcyA9IDA7CiAKICAgICAqcF9yZXQgPSAoKGNoYXIgKilwX3NyY190bXAgLSAoY2hhciAqKXBfc3JjKTsKQEAgLTIyNSwxNCArMjI1LDE0IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGludCBidGFfYXZfc2JjX3VwX3NhbXBsZV8xNm0gKHZvaWQgKnBfc3JjLCB2b2lkICpwX2RzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBzcmNfc2FtcGxlcywgVUlOVDMyIGRzdF9zYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyICpwX3JldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY19zYW1wbGVzLCB1aW50MzJfdCBkc3Rfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwX3JldCkKIHsKLSAgICBJTlQxNiAgICpwX3NyY190bXAgPSAoSU5UMTYgKilwX3NyYzsKLSAgICBJTlQxNiAgICpwX2RzdF90bXAgPSAoSU5UMTYgKilwX2RzdDsKLSAgICBJTlQxNiAgICpwX3dvcmtlciA9ICZidGFfYXZfc2JjX3Vwc19jYi53b3JrZXIxOwotICAgIFVJTlQzMiAgc3JjX3NwcyA9IGJ0YV9hdl9zYmNfdXBzX2NiLnNyY19zcHM7Ci0gICAgVUlOVDMyICBkc3Rfc3BzID0gYnRhX2F2X3NiY191cHNfY2IuZHN0X3NwczsKKyAgICBpbnQxNl90ICAgKnBfc3JjX3RtcCA9IChpbnQxNl90ICopcF9zcmM7CisgICAgaW50MTZfdCAgICpwX2RzdF90bXAgPSAoaW50MTZfdCAqKXBfZHN0OworICAgIGludDE2X3QgICAqcF93b3JrZXIgPSAmYnRhX2F2X3NiY191cHNfY2Iud29ya2VyMTsKKyAgICB1aW50MzJfdCAgc3JjX3NwcyA9IGJ0YV9hdl9zYmNfdXBzX2NiLnNyY19zcHM7CisgICAgdWludDMyX3QgIGRzdF9zcHMgPSBidGFfYXZfc2JjX3Vwc19jYi5kc3Rfc3BzOwogCiAgICAgd2hpbGUgKGJ0YV9hdl9zYmNfdXBzX2NiLmN1cl9wb3MgPiAwICYmIGRzdF9zYW1wbGVzKQogICAgIHsKQEAgLTI2NSw3ICsyNjUsNyBAQAogICAgICAgICBidGFfYXZfc2JjX3Vwc19jYi5jdXJfcG9zICs9IGRzdF9zcHM7CiAgICAgfQogCi0gICAgaWYgKGJ0YV9hdl9zYmNfdXBzX2NiLmN1cl9wb3MgPT0gKElOVDMyKWRzdF9zcHMpCisgICAgaWYgKGJ0YV9hdl9zYmNfdXBzX2NiLmN1cl9wb3MgPT0gKGludDMyX3QpZHN0X3NwcykKICAgICAgICAgYnRhX2F2X3NiY191cHNfY2IuY3VyX3BvcyA9IDA7CiAKICAgICAqcF9yZXQgPSAoKGNoYXIgKilwX3NyY190bXAgLSAoY2hhciAqKXBfc3JjKTsKQEAgLTI5MCwxNSArMjkwLDE1IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGludCBidGFfYXZfc2JjX3VwX3NhbXBsZV84cyAodm9pZCAqcF9zcmMsIHZvaWQgKnBfZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgc3JjX3NhbXBsZXMsIFVJTlQzMiBkc3Rfc2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyICpwX3JldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NhbXBsZXMsIHVpbnQzMl90IGRzdF9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcF9yZXQpCiB7Ci0gICAgVUlOVDggICAqcF9zcmNfdG1wID0gKFVJTlQ4ICopcF9zcmM7Ci0gICAgSU5UMTYgICAqcF9kc3RfdG1wID0gKElOVDE2ICopcF9kc3Q7Ci0gICAgSU5UMTYgICAqcF93b3JrZXIxID0gJmJ0YV9hdl9zYmNfdXBzX2NiLndvcmtlcjE7Ci0gICAgSU5UMTYgICAqcF93b3JrZXIyID0gJmJ0YV9hdl9zYmNfdXBzX2NiLndvcmtlcjI7Ci0gICAgVUlOVDMyICBzcmNfc3BzID0gYnRhX2F2X3NiY191cHNfY2Iuc3JjX3NwczsKLSAgICBVSU5UMzIgIGRzdF9zcHMgPSBidGFfYXZfc2JjX3Vwc19jYi5kc3Rfc3BzOworICAgIHVpbnQ4X3QgICAqcF9zcmNfdG1wID0gKHVpbnQ4X3QgKilwX3NyYzsKKyAgICBpbnQxNl90ICAgKnBfZHN0X3RtcCA9IChpbnQxNl90ICopcF9kc3Q7CisgICAgaW50MTZfdCAgICpwX3dvcmtlcjEgPSAmYnRhX2F2X3NiY191cHNfY2Iud29ya2VyMTsKKyAgICBpbnQxNl90ICAgKnBfd29ya2VyMiA9ICZidGFfYXZfc2JjX3Vwc19jYi53b3JrZXIyOworICAgIHVpbnQzMl90ICBzcmNfc3BzID0gYnRhX2F2X3NiY191cHNfY2Iuc3JjX3NwczsKKyAgICB1aW50MzJfdCAgZHN0X3NwcyA9IGJ0YV9hdl9zYmNfdXBzX2NiLmRzdF9zcHM7CiAKICAgICB3aGlsZSAoYnRhX2F2X3NiY191cHNfY2IuY3VyX3BvcyA+IDAgJiYgZHN0X3NhbXBsZXMpCiAgICAgewpAQCAtMzE0LDEwICszMTQsMTAgQEAKIAogICAgIHdoaWxlIChzcmNfc2FtcGxlcyAtLSAmJiBkc3Rfc2FtcGxlcykKICAgICB7Ci0gICAgICAgICpwX3dvcmtlcjEgPSAqKFVJTlQ4ICopcF9zcmNfdG1wKys7CisgICAgICAgICpwX3dvcmtlcjEgPSAqKHVpbnQ4X3QgKilwX3NyY190bXArKzsKICAgICAgICAgKnBfd29ya2VyMSAtPSAweDgwOwogICAgICAgICAqcF93b3JrZXIxIDw8PSA4OwotICAgICAgICAqcF93b3JrZXIyID0gKihVSU5UOCAqKXBfc3JjX3RtcCsrOworICAgICAgICAqcF93b3JrZXIyID0gKih1aW50OF90ICopcF9zcmNfdG1wKys7CiAgICAgICAgICpwX3dvcmtlcjIgLT0gMHg4MDsKICAgICAgICAgKnBfd29ya2VyMiA8PD0gODsKIApAQCAtMzM0LDcgKzMzNCw3IEBACiAgICAgICAgIGJ0YV9hdl9zYmNfdXBzX2NiLmN1cl9wb3MgKz0gZHN0X3NwczsKICAgICB9CiAKLSAgICBpZiAoYnRhX2F2X3NiY191cHNfY2IuY3VyX3BvcyA9PSAoSU5UMzIpZHN0X3NwcykKKyAgICBpZiAoYnRhX2F2X3NiY191cHNfY2IuY3VyX3BvcyA9PSAoaW50MzJfdClkc3Rfc3BzKQogICAgICAgICBidGFfYXZfc2JjX3Vwc19jYi5jdXJfcG9zID0gMDsKIAogICAgICpwX3JldCA9ICgoY2hhciAqKXBfc3JjX3RtcCAtIChjaGFyICopcF9zcmMpOwpAQCAtMzU5LDE0ICszNTksMTQgQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogaW50IGJ0YV9hdl9zYmNfdXBfc2FtcGxlXzhtICh2b2lkICpwX3NyYywgdm9pZCAqcF9kc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBzcmNfc2FtcGxlcywgVUlOVDMyIGRzdF9zYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgKnBfcmV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc2FtcGxlcywgdWludDMyX3QgZHN0X3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwX3JldCkKIHsKLSAgICBVSU5UOCAgICpwX3NyY190bXAgPSAoVUlOVDggKilwX3NyYzsKLSAgICBJTlQxNiAgICpwX2RzdF90bXAgPSAoSU5UMTYgKilwX2RzdDsKLSAgICBJTlQxNiAgICpwX3dvcmtlciA9ICZidGFfYXZfc2JjX3Vwc19jYi53b3JrZXIxOwotICAgIFVJTlQzMiAgc3JjX3NwcyA9IGJ0YV9hdl9zYmNfdXBzX2NiLnNyY19zcHM7Ci0gICAgVUlOVDMyICBkc3Rfc3BzID0gYnRhX2F2X3NiY191cHNfY2IuZHN0X3NwczsKKyAgICB1aW50OF90ICAgKnBfc3JjX3RtcCA9ICh1aW50OF90ICopcF9zcmM7CisgICAgaW50MTZfdCAgICpwX2RzdF90bXAgPSAoaW50MTZfdCAqKXBfZHN0OworICAgIGludDE2X3QgICAqcF93b3JrZXIgPSAmYnRhX2F2X3NiY191cHNfY2Iud29ya2VyMTsKKyAgICB1aW50MzJfdCAgc3JjX3NwcyA9IGJ0YV9hdl9zYmNfdXBzX2NiLnNyY19zcHM7CisgICAgdWludDMyX3QgIGRzdF9zcHMgPSBidGFfYXZfc2JjX3Vwc19jYi5kc3Rfc3BzOwogCiAgICAgd2hpbGUgKGJ0YV9hdl9zYmNfdXBzX2NiLmN1cl9wb3MgPiAwICYmIGRzdF9zYW1wbGVzKQogICAgIHsKQEAgLTM4Miw3ICszODIsNyBAQAogCiAgICAgd2hpbGUgKHNyY19zYW1wbGVzLS0gJiYgZHN0X3NhbXBsZXMpCiAgICAgewotICAgICAgICAqcF93b3JrZXIgPSAqKFVJTlQ4ICopcF9zcmNfdG1wKys7CisgICAgICAgICpwX3dvcmtlciA9ICoodWludDhfdCAqKXBfc3JjX3RtcCsrOwogICAgICAgICAqcF93b3JrZXIgLT0gMHg4MDsKICAgICAgICAgKnBfd29ya2VyIDw8PSA4OwogCkBAIC0zOTksNyArMzk5LDcgQEAKICAgICAgICAgYnRhX2F2X3NiY191cHNfY2IuY3VyX3BvcyArPSBkc3Rfc3BzOwogICAgIH0KIAotICAgIGlmIChidGFfYXZfc2JjX3Vwc19jYi5jdXJfcG9zID09IChJTlQzMilkc3Rfc3BzKQorICAgIGlmIChidGFfYXZfc2JjX3Vwc19jYi5jdXJfcG9zID09IChpbnQzMl90KWRzdF9zcHMpCiAgICAgICAgIGJ0YV9hdl9zYmNfdXBzX2NiLmN1cl9wb3MgPSAwOwogCiAgICAgKnBfcmV0ID0gKChjaGFyICopcF9zcmNfdG1wIC0gKGNoYXIgKilwX3NyYyk7CkBAIC00MjIsMTQgKzQyMiwxNCBAQAogKiogICAgICAgICAgICAgICAgICBDb2RlYyBjb25maWd1cmF0aW9uIGluIHBfY2FwLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1VSU5UOCBidGFfYXZfc2JjX2NmZ19mb3JfY2FwKFVJTlQ4ICpwX3BlZXIsIHRBMkRfU0JDX0NJRSAqcF9jYXAsIHRBMkRfU0JDX0NJRSAqcF9wcmVmKQordWludDhfdCBidGFfYXZfc2JjX2NmZ19mb3JfY2FwKHVpbnQ4X3QgKnBfcGVlciwgdEEyRF9TQkNfQ0lFICpwX2NhcCwgdEEyRF9TQkNfQ0lFICpwX3ByZWYpCiB7Ci0gICAgVUlOVDggICAgICAgICAgIHN0YXR1cyA9IEEyRF9TVUNDRVNTOworICAgIHVpbnQ4X3QgICAgICAgICAgIHN0YXR1cyA9IEEyRF9TVUNDRVNTOwogICAgIHRBMkRfU0JDX0NJRSAgICBwZWVyX2NpZTsKICAgICBVTlVTRUQocF9jYXApOwogCiAgICAgLyogcGFyc2UgcGVlciBjYXBhYmlsaXRpZXMgKi8KLSAgICBpZiAoKHN0YXR1cyA9IEEyRF9QYXJzU2JjSW5mbygmcGVlcl9jaWUsIHBfcGVlciwgVFJVRSkpICE9IDApCisgICAgaWYgKChzdGF0dXMgPSBBMkRfUGFyc1NiY0luZm8oJnBlZXJfY2llLCBwX3BlZXIsIHRydWUpKSAhPSAwKQogICAgIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CkBAIC01MTksMTMgKzUxOSwxMyBAQAogKiogUmV0dXJucyAgICAgICAgICAwIGlmIG9rLCBub256ZXJvIGlmIGVycm9yLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1VSU5UOCBidGFfYXZfc2JjX2NmZ19tYXRjaGVzX2NhcChVSU5UOCAqcF9jZmcsIHRBMkRfU0JDX0NJRSAqcF9jYXApCit1aW50OF90IGJ0YV9hdl9zYmNfY2ZnX21hdGNoZXNfY2FwKHVpbnQ4X3QgKnBfY2ZnLCB0QTJEX1NCQ19DSUUgKnBfY2FwKQogewotICAgIFVJTlQ4ICAgICAgICAgICBzdGF0dXMgPSAwOworICAgIHVpbnQ4X3QgICAgICAgICAgIHN0YXR1cyA9IDA7CiAgICAgdEEyRF9TQkNfQ0lFICAgIGNmZ19jaWU7CiAKICAgICAvKiBwYXJzZSBjb25maWd1cmF0aW9uICovCi0gICAgaWYgKChzdGF0dXMgPSBBMkRfUGFyc1NiY0luZm8oJmNmZ19jaWUsIHBfY2ZnLCBUUlVFKSkgIT0gMCkKKyAgICBpZiAoKHN0YXR1cyA9IEEyRF9QYXJzU2JjSW5mbygmY2ZnX2NpZSwgcF9jZmcsIHRydWUpKSAhPSAwKQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigiIGJ0YV9hdl9zYmNfY2ZnX21hdGNoZXNfY2FwIFBhcnNpbmcgRmFpbGVkICVkIiwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTU5MSwxMyArNTkxLDEzIEBACiAqKiBSZXR1cm5zICAgICAgICAgIDAgaWYgb2ssIG5vbnplcm8gaWYgZXJyb3IuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVVJTlQ4IGJ0YV9hdl9zYmNfY2ZnX2luX2NhcChVSU5UOCAqcF9jZmcsIHRBMkRfU0JDX0NJRSAqcF9jYXApCit1aW50OF90IGJ0YV9hdl9zYmNfY2ZnX2luX2NhcCh1aW50OF90ICpwX2NmZywgdEEyRF9TQkNfQ0lFICpwX2NhcCkKIHsKLSAgICBVSU5UOCAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICB1aW50OF90ICAgICAgICAgICBzdGF0dXMgPSAwOwogICAgIHRBMkRfU0JDX0NJRSAgICBjZmdfY2llOwogCiAgICAgLyogcGFyc2UgY29uZmlndXJhdGlvbiAqLwotICAgIGlmICgoc3RhdHVzID0gQTJEX1BhcnNTYmNJbmZvKCZjZmdfY2llLCBwX2NmZywgRkFMU0UpKSAhPSAwKQorICAgIGlmICgoc3RhdHVzID0gQTJEX1BhcnNTYmNJbmZvKCZjZmdfY2llLCBwX2NmZywgZmFsc2UpKSAhPSAwKQogICAgIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CkBAIC02NTMsMTMgKzY1MywxMyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X3NiY19ibGRfaGRyKEJUX0hEUiAqcF9idWYsIFVJTlQxNiBmcl9wZXJfcGt0KQordm9pZCBidGFfYXZfc2JjX2JsZF9oZHIoQlRfSERSICpwX2J1ZiwgdWludDE2X3QgZnJfcGVyX3BrdCkKIHsKLSAgICBVSU5UOCAgICpwOworICAgIHVpbnQ4X3QgICAqcDsKIAogICAgIHBfYnVmLT5vZmZzZXQgLT0gQlRBX0FWX1NCQ19IRFJfU0laRTsKLSAgICBwID0gKFVJTlQ4ICopIChwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldDsKKyAgICBwID0gKHVpbnQ4X3QgKikgKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwogICAgIHBfYnVmLT5sZW4gKz0gQlRBX0FWX1NCQ19IRFJfU0laRTsKLSAgICBBMkRfQmxkU2JjTXBsSGRyKHAsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIChVSU5UOCkgZnJfcGVyX3BrdCk7CisgICAgQTJEX0JsZFNiY01wbEhkcihwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAodWludDhfdCkgZnJfcGVyX3BrdCk7CiB9CiAKZGlmZiAtLWdpdCBhL2J0YS9hdi9idGFfYXZfc3NtLmMgYi9idGEvYXYvYnRhX2F2X3NzbS5jCmluZGV4IDFlYjQwOTYuLjgxMjAwNGQgMTAwNjQ0Ci0tLSBhL2J0YS9hdi9idGFfYXZfc3NtLmMKKysrIGIvYnRhL2F2L2J0YV9hdl9zc20uYwpAQCAtMjMsNyArMjMsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2lmIGRlZmluZWQoQlRBX0FWX0lOQ0xVREVEKSAmJiAoQlRBX0FWX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9BVl9JTkNMVURFRCA9PSBUUlVFKQogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAiYnRhX2F2X2NvLmgiCkBAIC0xMTEsNyArMTExLDcgQEAKICNkZWZpbmUgQlRBX0FWX05VTV9DT0xTICAgICAgICAgICAgICAzICAgICAgIC8qIG51bWJlciBvZiBjb2x1bW5zIGluIHN0YXRlIHRhYmxlcyAqLwogCiAvKiBzdGF0ZSB0YWJsZSBmb3IgaW5pdCBzdGF0ZSAqLwotc3RhdGljIGNvbnN0IFVJTlQ4IGJ0YV9hdl9zc3RfaW5pdFtdW0JUQV9BVl9OVU1fQ09MU10gPQorc3RhdGljIGNvbnN0IHVpbnQ4X3QgYnRhX2F2X3NzdF9pbml0W11bQlRBX0FWX05VTV9DT0xTXSA9CiB7CiAvKiBFdmVudCAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAxICAgICAgICAgICAgICAgQWN0aW9uIDIgICAgICAgICAgICAgICBOZXh0IHN0YXRlICovCiAvKiBBUF9PUEVOX0VWVCAqLyAgICAgICAgICAge0JUQV9BVl9ET19ESVNDLCAgICAgICAgQlRBX0FWX1NJR05PUkUsICAgICAgICBCVEFfQVZfT1BFTklOR19TU1QgfSwKQEAgLTE1Myw3ICsxNTMsNyBAQAogfTsKIAogLyogc3RhdGUgdGFibGUgZm9yIGluY29taW5nIHN0YXRlICovCi1zdGF0aWMgY29uc3QgVUlOVDggYnRhX2F2X3NzdF9pbmNvbWluZ1tdW0JUQV9BVl9OVU1fQ09MU10gPQorc3RhdGljIGNvbnN0IHVpbnQ4X3QgYnRhX2F2X3NzdF9pbmNvbWluZ1tdW0JUQV9BVl9OVU1fQ09MU10gPQogewogLyogRXZlbnQgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gMSAgICAgICAgICAgICAgIEFjdGlvbiAyICAgICAgICAgICAgICAgTmV4dCBzdGF0ZSAqLwogLyogQVBfT1BFTl9FVlQgKi8gICAgICAgICAgIHtCVEFfQVZfT1BFTl9BVF9JTkMsICAgIEJUQV9BVl9TSUdOT1JFLCAgICAgICAgQlRBX0FWX0lOQ09NSU5HX1NTVCB9LApAQCAtMTk1LDcgKzE5NSw3IEBACiB9OwogCiAvKiBzdGF0ZSB0YWJsZSBmb3Igb3BlbmluZyBzdGF0ZSAqLwotc3RhdGljIGNvbnN0IFVJTlQ4IGJ0YV9hdl9zc3Rfb3BlbmluZ1tdW0JUQV9BVl9OVU1fQ09MU10gPQorc3RhdGljIGNvbnN0IHVpbnQ4X3QgYnRhX2F2X3NzdF9vcGVuaW5nW11bQlRBX0FWX05VTV9DT0xTXSA9CiB7CiAvKiBFdmVudCAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAxICAgICAgICAgICAgICAgQWN0aW9uIDIgICAgICAgICAgICAgICBOZXh0IHN0YXRlICovCiAvKiBBUF9PUEVOX0VWVCAqLyAgICAgICAgICAge0JUQV9BVl9TSUdOT1JFLCAgICAgICAgQlRBX0FWX1NJR05PUkUsICAgICAgICBCVEFfQVZfT1BFTklOR19TU1QgfSwKQEAgLTIzNyw3ICsyMzcsNyBAQAogfTsKIAogLyogc3RhdGUgdGFibGUgZm9yIG9wZW4gc3RhdGUgKi8KLXN0YXRpYyBjb25zdCBVSU5UOCBidGFfYXZfc3N0X29wZW5bXVtCVEFfQVZfTlVNX0NPTFNdID0KK3N0YXRpYyBjb25zdCB1aW50OF90IGJ0YV9hdl9zc3Rfb3BlbltdW0JUQV9BVl9OVU1fQ09MU10gPQogewogLyogRXZlbnQgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gMSAgICAgICAgICAgICAgIEFjdGlvbiAyICAgICAgICAgICAgICAgTmV4dCBzdGF0ZSAqLwogLyogQVBfT1BFTl9FVlQgKi8gICAgICAgICAgIHtCVEFfQVZfU0lHTk9SRSwgICAgICAgIEJUQV9BVl9TSUdOT1JFLCAgICAgICAgQlRBX0FWX09QRU5fU1NUIH0sCkBAIC0yNzksNyArMjc5LDcgQEAKIH07CiAKIC8qIHN0YXRlIHRhYmxlIGZvciByZWNvbmZpZyBzdGF0ZSAqLwotc3RhdGljIGNvbnN0IFVJTlQ4IGJ0YV9hdl9zc3RfcmNmZ1tdW0JUQV9BVl9OVU1fQ09MU10gPQorc3RhdGljIGNvbnN0IHVpbnQ4X3QgYnRhX2F2X3NzdF9yY2ZnW11bQlRBX0FWX05VTV9DT0xTXSA9CiB7CiAvKiBFdmVudCAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAxICAgICAgICAgICAgICAgQWN0aW9uIDIgICAgICAgICAgICAgICBOZXh0IHN0YXRlICovCiAvKiBBUF9PUEVOX0VWVCAqLyAgICAgICAgICAge0JUQV9BVl9TSUdOT1JFLCAgICAgICAgQlRBX0FWX1NJR05PUkUsICAgICAgICBCVEFfQVZfUkNGR19TU1QgfSwKQEAgLTMyMSw3ICszMjEsNyBAQAogfTsKIAogLyogc3RhdGUgdGFibGUgZm9yIGNsb3Npbmcgc3RhdGUgKi8KLXN0YXRpYyBjb25zdCBVSU5UOCBidGFfYXZfc3N0X2Nsb3NpbmdbXVtCVEFfQVZfTlVNX0NPTFNdID0KK3N0YXRpYyBjb25zdCB1aW50OF90IGJ0YV9hdl9zc3RfY2xvc2luZ1tdW0JUQV9BVl9OVU1fQ09MU10gPQogewogLyogRXZlbnQgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gMSAgICAgICAgICAgICAgIEFjdGlvbiAyICAgICAgICAgICAgICAgTmV4dCBzdGF0ZSAqLwogLyogQVBfT1BFTl9FVlQgKi8gICAgICAgICAgIHtCVEFfQVZfU0lHTk9SRSwgICAgICAgIEJUQV9BVl9TSUdOT1JFLCAgICAgICAgQlRBX0FWX0NMT1NJTkdfU1NUIH0sCkBAIC0zNjMsNyArMzYzLDcgQEAKIH07CiAKIC8qIHR5cGUgZm9yIHN0YXRlIHRhYmxlICovCi10eXBlZGVmIGNvbnN0IFVJTlQ4ICgqdEJUQV9BVl9TU1RfVEJMKVtCVEFfQVZfTlVNX0NPTFNdOwordHlwZWRlZiBjb25zdCB1aW50OF90ICgqdEJUQV9BVl9TU1RfVEJMKVtCVEFfQVZfTlVNX0NPTFNdOwogCiAvKiBzdGF0ZSB0YWJsZSAqLwogc3RhdGljIGNvbnN0IHRCVEFfQVZfU1NUX1RCTCBidGFfYXZfc3N0X3RibFtdID0KQEAgLTM3OCw4ICszNzgsOCBAQAogCiAKIAotI2lmIChkZWZpbmVkKEJUQV9BVl9ERUJVRykgJiYgQlRBX0FWX0RFQlVHID09IFRSVUUpCi1zdGF0aWMgY2hhciAqYnRhX2F2X3NzdF9jb2RlKFVJTlQ4IHN0YXRlKTsKKyNpZiAoQlRBX0FWX0RFQlVHID09IFRSVUUpCitzdGF0aWMgY2hhciAqYnRhX2F2X3NzdF9jb2RlKHVpbnQ4X3Qgc3RhdGUpOwogI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zODksMTcgKzM4OSwxNyBAQAogKiogRGVzY3JpcHRpb24gICAgICBDaGVjayBpZiBzdHJlYW0gc3RhdGUgbWFjaGluZSBpcyBpbiByZWNvbmZpZyBzdGF0ZS4KICoqCiAqKgotKiogUmV0dXJucyAgICAgICAgICBUUlVFIGlmIHN0cmVhbSBzdGF0ZSBtYWNoaW5lIGlzIGluIHJlY29uZmlnIHN0YXRlLgorKiogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHN0cmVhbSBzdGF0ZSBtYWNoaW5lIGlzIGluIHJlY29uZmlnIHN0YXRlLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9hdl9pc19yY2ZnX3NzdCAodEJUQV9BVl9TQ0IgKnBfc2NiKQorYm9vbCBidGFfYXZfaXNfcmNmZ19zc3QgKHRCVEFfQVZfU0NCICpwX3NjYikKIHsKLSAgICBCT09MRUFOIGlzX3JjZmdfc3N0ID0gRkFMU0U7CisgICAgYm9vbCBpc19yY2ZnX3NzdCA9IGZhbHNlOwogCiAgICAgaWYgKHBfc2NiICE9IE5VTEwpCiAgICAgewogICAgICAgICBpZiAocF9zY2ItPnN0YXRlID09IEJUQV9BVl9SQ0ZHX1NTVCkKLSAgICAgICAgICAgIGlzX3JjZmdfc3N0ID0gVFJVRTsKKyAgICAgICAgICAgIGlzX3JjZmdfc3N0ID0gdHJ1ZTsKICAgICB9CiAKICAgICByZXR1cm4gaXNfcmNmZ19zc3Q7CkBAIC00MTUsMTAgKzQxNSwxMCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X3NzbV9leGVjdXRlKHRCVEFfQVZfU0NCICpwX3NjYiwgVUlOVDE2IGV2ZW50LCB0QlRBX0FWX0RBVEEgKnBfZGF0YSkKK3ZvaWQgYnRhX2F2X3NzbV9leGVjdXRlKHRCVEFfQVZfU0NCICpwX3NjYiwgdWludDE2X3QgZXZlbnQsIHRCVEFfQVZfREFUQSAqcF9kYXRhKQogewogICAgIHRCVEFfQVZfU1NUX1RCTCAgICAgc3RhdGVfdGFibGU7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBhY3Rpb247CisgICAgdWludDhfdCAgICAgICAgICAgICBhY3Rpb247CiAgICAgaW50ICAgICAgICAgICAgICAgICBpLCB4eDsKIAogICAgIGlmKHBfc2NiID09IE5VTEwpCkBAIC00NDksNyArNDQ5LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotI2lmIChkZWZpbmVkKEJUQV9BVl9ERUJVRykgJiYgQlRBX0FWX0RFQlVHID09IFRSVUUpCisjaWYgKEJUQV9BVl9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfVkVSQk9TRSgiQVYgU2V2ZW50KDB4JXgpPTB4JXgoJXMpIHN0YXRlPSVkKCVzKSIsCiAgICAgICAgIHBfc2NiLT5obmRsLCBldmVudCwgYnRhX2F2X2V2dF9jb2RlKGV2ZW50KSwgcF9zY2ItPnN0YXRlLCBidGFfYXZfc3N0X2NvZGUocF9zY2ItPnN0YXRlKSk7CiAjZWxzZQpAQCAtNDgxLDIwICs0ODEsMjAgQEAKICoqCiAqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9pc19zY2Jfb3BlbmluZwogKioKLSoqIERlc2NyaXB0aW9uICAgICAgUmV0dXJucyBUUlVFIGlzIHNjYiBpcyBpbiBvcGVuaW5nIHN0YXRlLgorKiogRGVzY3JpcHRpb24gICAgICBSZXR1cm5zIHRydWUgaXMgc2NiIGlzIGluIG9wZW5pbmcgc3RhdGUuCiAqKgogKioKLSoqIFJldHVybnMgICAgICAgICAgVFJVRSBpZiBzY2IgaXMgaW4gb3BlbmluZyBzdGF0ZS4KKyoqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzY2IgaXMgaW4gb3BlbmluZyBzdGF0ZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfYXZfaXNfc2NiX29wZW5pbmcgKHRCVEFfQVZfU0NCICpwX3NjYikKK2Jvb2wgYnRhX2F2X2lzX3NjYl9vcGVuaW5nICh0QlRBX0FWX1NDQiAqcF9zY2IpCiB7Ci0gICAgQk9PTEVBTiBpc19vcGVuaW5nID0gRkFMU0U7CisgICAgYm9vbCBpc19vcGVuaW5nID0gZmFsc2U7CiAKICAgICBpZiAocF9zY2IpCiAgICAgewogICAgICAgICBpZiAocF9zY2ItPnN0YXRlID09IEJUQV9BVl9PUEVOSU5HX1NTVCkKLSAgICAgICAgICAgIGlzX29wZW5pbmcgPSBUUlVFOworICAgICAgICAgICAgaXNfb3BlbmluZyA9IHRydWU7CiAgICAgfQogCiAgICAgcmV0dXJuIGlzX29wZW5pbmc7CkBAIC01MDQsMjAgKzUwNCwyMCBAQAogKioKICoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2lzX3NjYl9pbmNvbWluZwogKioKLSoqIERlc2NyaXB0aW9uICAgICAgUmV0dXJucyBUUlVFIGlzIHNjYiBpcyBpbiBpbmNvbWluZyBzdGF0ZS4KKyoqIERlc2NyaXB0aW9uICAgICAgUmV0dXJucyB0cnVlIGlzIHNjYiBpcyBpbiBpbmNvbWluZyBzdGF0ZS4KICoqCiAqKgotKiogUmV0dXJucyAgICAgICAgICBUUlVFIGlmIHNjYiBpcyBpbiBpbmNvbWluZyBzdGF0ZS4KKyoqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzY2IgaXMgaW4gaW5jb21pbmcgc3RhdGUuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX2F2X2lzX3NjYl9pbmNvbWluZyAodEJUQV9BVl9TQ0IgKnBfc2NiKQorYm9vbCBidGFfYXZfaXNfc2NiX2luY29taW5nICh0QlRBX0FWX1NDQiAqcF9zY2IpCiB7Ci0gICAgQk9PTEVBTiBpc19pbmNvbWluZyA9IEZBTFNFOworICAgIGJvb2wgaXNfaW5jb21pbmcgPSBmYWxzZTsKIAogICAgIGlmIChwX3NjYikKICAgICB7CiAgICAgICAgIGlmIChwX3NjYi0+c3RhdGUgPT0gQlRBX0FWX0lOQ09NSU5HX1NTVCkKLSAgICAgICAgICAgIGlzX2luY29taW5nID0gVFJVRTsKKyAgICAgICAgICAgIGlzX2luY29taW5nID0gdHJ1ZTsKICAgICB9CiAKICAgICByZXR1cm4gaXNfaW5jb21pbmc7CkBAIC01NDUsMjAgKzU0NSwyMCBAQAogKioKICoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2lzX3NjYl9pbml0CiAqKgotKiogRGVzY3JpcHRpb24gICAgICBSZXR1cm5zIFRSVUUgaXMgc2NiIGlzIGluIGluaXQgc3RhdGUuCisqKiBEZXNjcmlwdGlvbiAgICAgIFJldHVybnMgdHJ1ZSBpcyBzY2IgaXMgaW4gaW5pdCBzdGF0ZS4KICoqCiAqKgotKiogUmV0dXJucyAgICAgICAgICBUUlVFIGlmIHNjYiBpcyBpbiBpbmNvbWluZyBzdGF0ZS4KKyoqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzY2IgaXMgaW4gaW5jb21pbmcgc3RhdGUuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX2F2X2lzX3NjYl9pbml0ICh0QlRBX0FWX1NDQiAqcF9zY2IpCitib29sIGJ0YV9hdl9pc19zY2JfaW5pdCAodEJUQV9BVl9TQ0IgKnBfc2NiKQogewotICAgIEJPT0xFQU4gaXNfaW5pdCA9IEZBTFNFOworICAgIGJvb2wgaXNfaW5pdCA9IGZhbHNlOwogCiAgICAgaWYgKHBfc2NiKQogICAgIHsKICAgICAgICAgaWYgKHBfc2NiLT5zdGF0ZSA9PSBCVEFfQVZfSU5JVF9TU1QpCi0gICAgICAgICAgICBpc19pbml0ID0gVFJVRTsKKyAgICAgICAgICAgIGlzX2luaXQgPSB0cnVlOwogICAgIH0KIAogICAgIHJldHVybiBpc19pbml0OwpAQCAtNTg1LDcgKzU4NSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqICBEZWJ1ZyBGdW5jdGlvbnMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIChkZWZpbmVkKEJUQV9BVl9ERUJVRykgJiYgQlRBX0FWX0RFQlVHID09IFRSVUUpCisjaWYgKEJUQV9BVl9ERUJVRyA9PSBUUlVFKQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCiAqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9zc3RfY29kZQpAQCAtNTk1LDcgKzU5NSw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIGNoYXIgKgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgY2hhciAqYnRhX2F2X3NzdF9jb2RlKFVJTlQ4IHN0YXRlKQorc3RhdGljIGNoYXIgKmJ0YV9hdl9zc3RfY29kZSh1aW50OF90IHN0YXRlKQogewogICAgIHN3aXRjaChzdGF0ZSkKICAgICB7CmRpZmYgLS1naXQgYS9idGEvZG0vYnRhX2RtX2FjdC5jYyBiL2J0YS9kbS9idGFfZG1fYWN0LmNjCmluZGV4IDU4ZDQyN2YuLmY3MGFlOTEgMTAwNjQ0Ci0tLSBhL2J0YS9kbS9idGFfZG1fYWN0LmNjCisrKyBiL2J0YS9kbS9idGFfZG1fYWN0LmNjCkBAIC00OSwyNSArNDksMjUgQEAKICNpbmNsdWRlICJnYXBfYXBpLmgiCiAjZW5kaWYKIAotc3RhdGljIHZvaWQgYnRhX2RtX2lucV9yZXN1bHRzX2NiICh0QlRNX0lOUV9SRVNVTFRTICpwX2lucSwgVUlOVDggKnBfZWlyKTsKK3N0YXRpYyB2b2lkIGJ0YV9kbV9pbnFfcmVzdWx0c19jYiAodEJUTV9JTlFfUkVTVUxUUyAqcF9pbnEsIHVpbnQ4X3QgKnBfZWlyKTsKIHN0YXRpYyB2b2lkIGJ0YV9kbV9pbnFfY21wbF9jYiAodm9pZCAqIHBfcmVzdWx0KTsKIHN0YXRpYyB2b2lkIGJ0YV9kbV9zZXJ2aWNlX3NlYXJjaF9yZW1uYW1lX2NiYWNrIChCRF9BRERSIGJkX2FkZHIsIERFVl9DTEFTUyBkYywgQkRfTkFNRSBiZF9uYW1lKTsKIHN0YXRpYyB2b2lkIGJ0YV9kbV9yZW1uYW1lX2NiYWNrICh0QlRNX1JFTU9URV9ERVZfTkFNRSAqcF9yZW1vdGVfbmFtZSk7CiBzdGF0aWMgdm9pZCBidGFfZG1fZmluZF9zZXJ2aWNlcyAoIEJEX0FERFIgYmRfYWRkcik7CiBzdGF0aWMgdm9pZCBidGFfZG1fZGlzY292ZXJfbmV4dF9kZXZpY2Uodm9pZCk7Ci1zdGF0aWMgdm9pZCBidGFfZG1fc2RwX2NhbGxiYWNrIChVSU5UMTYgc2RwX3N0YXR1cyk7Ci1zdGF0aWMgVUlOVDggYnRhX2RtX2F1dGhvcml6ZV9jYmFjayAoQkRfQUREUiBiZF9hZGRyLCBERVZfQ0xBU1MgZGV2X2NsYXNzLCBCRF9OQU1FIGJkX25hbWUsIFVJTlQ4ICpzZXJ2aWNlX25hbWUsIFVJTlQ4IHNlcnZpY2VfaWQsIEJPT0xFQU4gaXNfb3JpZ2luYXRvcik7Ci1zdGF0aWMgVUlOVDggYnRhX2RtX3Bpbl9jYmFjayAoQkRfQUREUiBiZF9hZGRyLCBERVZfQ0xBU1MgZGV2X2NsYXNzLCBCRF9OQU1FIGJkX25hbWUsIEJPT0xFQU4gbWluXzE2X2RpZ2l0KTsKLXN0YXRpYyBVSU5UOCBidGFfZG1fbmV3X2xpbmtfa2V5X2NiYWNrKEJEX0FERFIgYmRfYWRkciwgREVWX0NMQVNTIGRldl9jbGFzcywgQkRfTkFNRSBiZF9uYW1lLCBMSU5LX0tFWSBrZXksIFVJTlQ4IGtleV90eXBlKTsKLXN0YXRpYyBVSU5UOCBidGFfZG1fYXV0aGVudGljYXRpb25fY29tcGxldGVfY2JhY2soQkRfQUREUiBiZF9hZGRyLCBERVZfQ0xBU1MgZGV2X2NsYXNzLEJEX05BTUUgYmRfbmFtZSwgaW50IHJlc3VsdCk7CitzdGF0aWMgdm9pZCBidGFfZG1fc2RwX2NhbGxiYWNrICh1aW50MTZfdCBzZHBfc3RhdHVzKTsKK3N0YXRpYyB1aW50OF90IGJ0YV9kbV9hdXRob3JpemVfY2JhY2sgKEJEX0FERFIgYmRfYWRkciwgREVWX0NMQVNTIGRldl9jbGFzcywgQkRfTkFNRSBiZF9uYW1lLCB1aW50OF90ICpzZXJ2aWNlX25hbWUsIHVpbnQ4X3Qgc2VydmljZV9pZCwgYm9vbCBpc19vcmlnaW5hdG9yKTsKK3N0YXRpYyB1aW50OF90IGJ0YV9kbV9waW5fY2JhY2sgKEJEX0FERFIgYmRfYWRkciwgREVWX0NMQVNTIGRldl9jbGFzcywgQkRfTkFNRSBiZF9uYW1lLCBib29sIG1pbl8xNl9kaWdpdCk7CitzdGF0aWMgdWludDhfdCBidGFfZG1fbmV3X2xpbmtfa2V5X2NiYWNrKEJEX0FERFIgYmRfYWRkciwgREVWX0NMQVNTIGRldl9jbGFzcywgQkRfTkFNRSBiZF9uYW1lLCBMSU5LX0tFWSBrZXksIHVpbnQ4X3Qga2V5X3R5cGUpOworc3RhdGljIHVpbnQ4X3QgYnRhX2RtX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlX2NiYWNrKEJEX0FERFIgYmRfYWRkciwgREVWX0NMQVNTIGRldl9jbGFzcyxCRF9OQU1FIGJkX25hbWUsIGludCByZXN1bHQpOwogc3RhdGljIHZvaWQgYnRhX2RtX2xvY2FsX25hbWVfY2JhY2soQkRfQUREUiBiZF9hZGRyKTsKLXN0YXRpYyBCT09MRUFOIGJ0YV9kbV9jaGVja19hdihVSU5UMTYgZXZlbnQpOworc3RhdGljIGJvb2wgYnRhX2RtX2NoZWNrX2F2KHVpbnQxNl90IGV2ZW50KTsKIHN0YXRpYyB2b2lkIGJ0YV9kbV9ibF9jaGFuZ2VfY2JhY2sgKHRCVE1fQkxfRVZFTlRfREFUQSAqcF9kYXRhKTsKIAotc3RhdGljIHZvaWQgYnRhX2RtX3BvbGljeV9jYmFjayh0QlRBX1NZU19DT05OX1NUQVRVUyBzdGF0dXMsIFVJTlQ4IGlkLCBVSU5UOCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKTsKK3N0YXRpYyB2b2lkIGJ0YV9kbV9wb2xpY3lfY2JhY2sodEJUQV9TWVNfQ09OTl9TVEFUVVMgc3RhdHVzLCB1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpOwogCiAvKiBFeHRlbmRlZCBJbnF1aXJ5IFJlc3BvbnNlICovCi1zdGF0aWMgVUlOVDggYnRhX2RtX3NwX2NiYWNrICh0QlRNX1NQX0VWVCBldmVudCwgdEJUTV9TUF9FVlRfREFUQSAqcF9kYXRhKTsKK3N0YXRpYyB1aW50OF90IGJ0YV9kbV9zcF9jYmFjayAodEJUTV9TUF9FVlQgZXZlbnQsIHRCVE1fU1BfRVZUX0RBVEEgKnBfZGF0YSk7CiAKIHN0YXRpYyB2b2lkIGJ0YV9kbV9zZXRfZWlyIChjaGFyICpsb2NhbF9uYW1lKTsKIApAQCAtNzcsMjMgKzc3LDIzIEBACiAKIHN0YXRpYyB2b2lkIGJ0YV9kbV9zZWFyY2hfdGltZXJfY2JhY2sodm9pZCAqZGF0YSk7CiBzdGF0aWMgdm9pZCBidGFfZG1fZGlzYWJsZV9jb25uX2Rvd25fdGltZXJfY2JhY2sodm9pZCAqZGF0YSk7Ci1zdGF0aWMgdm9pZCBidGFfZG1fcm1fY2JhY2sodEJUQV9TWVNfQ09OTl9TVEFUVVMgc3RhdHVzLCBVSU5UOCBpZCwgVUlOVDggYXBwX2lkLCBCRF9BRERSIHBlZXJfYWRkcik7Ci1zdGF0aWMgdm9pZCBidGFfZG1fYWRqdXN0X3JvbGVzKEJPT0xFQU4gZGVsYXlfcm9sZV9zd2l0Y2gpOworc3RhdGljIHZvaWQgYnRhX2RtX3JtX2NiYWNrKHRCVEFfU1lTX0NPTk5fU1RBVFVTIHN0YXR1cywgdWludDhfdCBpZCwgdWludDhfdCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKTsKK3N0YXRpYyB2b2lkIGJ0YV9kbV9hZGp1c3Rfcm9sZXMoYm9vbCBkZWxheV9yb2xlX3N3aXRjaCk7CiBzdGF0aWMgY2hhciAqYnRhX2RtX2dldF9yZW1uYW1lKHZvaWQpOwogc3RhdGljIHZvaWQgYnRhX2RtX2JvbmRfY2FuY2VsX2NvbXBsZXRlX2NiYWNrKHRCVE1fU1RBVFVTIHJlc3VsdCk7CiAKLXN0YXRpYyBCT09MRUFOIGJ0YV9kbV9yZWFkX3JlbW90ZV9kZXZpY2VfbmFtZSAoQkRfQUREUiBiZF9hZGRyLHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKK3N0YXRpYyBib29sIGJ0YV9kbV9yZWFkX3JlbW90ZV9kZXZpY2VfbmFtZSAoQkRfQUREUiBiZF9hZGRyLHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKIHN0YXRpYyB2b2lkIGJ0YV9kbV9kaXNjb3Zlcl9kZXZpY2UoQkRfQUREUiByZW1vdGVfYmRfYWRkcik7CiAKIHN0YXRpYyB2b2lkIGJ0YV9kbV9zeXNfaHdfY2JhY2soIHRCVEFfU1lTX0hXX0VWVCBzdGF0dXMgKTsKIHN0YXRpYyB2b2lkIGJ0YV9kbV9kaXNhYmxlX3NlYXJjaF9hbmRfZGlzYyh2b2lkKTsKIAotI2lmICgoZGVmaW5lZCBCTEVfSU5DTFVERUQpICYmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkpCi0gICAgI2lmICgoZGVmaW5lZCBTTVBfSU5DTFVERUQpICYmIChTTVBfSU5DTFVERUQgPT0gVFJVRSkpCi1zdGF0aWMgVUlOVDggYnRhX2RtX2JsZV9zbXBfY2JhY2sgKHRCVE1fTEVfRVZUIGV2ZW50LCBCRF9BRERSIGJkYSwgdEJUTV9MRV9FVlRfREFUQSAqcF9kYXRhKTsKLSAgICAjZW5kaWYKLXN0YXRpYyB2b2lkIGJ0YV9kbV9ibGVfaWRfa2V5X2NiYWNrIChVSU5UOCBrZXlfdHlwZSwgdEJUTV9CTEVfTE9DQUxfS0VZUyAqcF9rZXkpOwotICAgICNpZiAoKGRlZmluZWQgQlRBX0dBVFRfSU5DTFVERUQpICYmICAoQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRSkpCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQorICNpZiAoU01QX0lOQ0xVREVEID09IFRSVUUpCitzdGF0aWMgdWludDhfdCBidGFfZG1fYmxlX3NtcF9jYmFjayAodEJUTV9MRV9FVlQgZXZlbnQsIEJEX0FERFIgYmRhLCB0QlRNX0xFX0VWVF9EQVRBICpwX2RhdGEpOworICNlbmRpZgorc3RhdGljIHZvaWQgYnRhX2RtX2JsZV9pZF9rZXlfY2JhY2sgKHVpbnQ4X3Qga2V5X3R5cGUsIHRCVE1fQkxFX0xPQ0FMX0tFWVMgKnBfa2V5KTsKKyAgI2lmIChCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFKQogc3RhdGljIHZvaWQgYnRhX2RtX2dhdHRjX3JlZ2lzdGVyKHZvaWQpOwogc3RhdGljIHZvaWQgYnRtX2RtX3N0YXJ0X2dhdHRfZGlzY292ZXJ5KEJEX0FERFIgYmRfYWRkcik7CiBzdGF0aWMgdm9pZCBidGFfZG1fY2FuY2VsX2dhdHRfZGlzY292ZXJ5KEJEX0FERFIgYmRfYWRkcik7CkBAIC0xMDEsNyArMTAxLDcgQEAKIGV4dGVybiB0QlRBX0RNX0NPTlRSTF9TVEFURSBidGFfZG1fcG1fb2J0YWluX2NvbnRyb2xsZXJfc3RhdGUodm9pZCk7CiAgICAgI2VuZGlmCiAKLSNpZiBCTEVfVk5EX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQkxFX1ZORF9JTkNMVURFRCA9PSBUUlVFKQogc3RhdGljIHZvaWQgYnRhX2RtX2N0cmxfZmVhdHVyZXNfcmRfY21wbF9jYmFjayh0QlRNX1NUQVRVUyByZXN1bHQpOwogI2VuZGlmCiAKQEAgLTEzMiwxNCArMTMyLDE0IEBACiAKIHN0YXRpYyB2b2lkIGJ0YV9kbV9yZXNldF9zZWNfZGV2X3BlbmRpbmcoQkRfQUREUiByZW1vdGVfYmRfYWRkcik7CiBzdGF0aWMgdm9pZCBidGFfZG1fcmVtb3ZlX3NlY19kZXZfZW50cnkoQkRfQUREUiByZW1vdGVfYmRfYWRkcik7Ci1zdGF0aWMgdm9pZCBidGFfZG1fb2JzZXJ2ZV9yZXN1bHRzX2NiKHRCVE1fSU5RX1JFU1VMVFMgKnBfaW5xLCBVSU5UOCAqcF9laXIpOworc3RhdGljIHZvaWQgYnRhX2RtX29ic2VydmVfcmVzdWx0c19jYih0QlRNX0lOUV9SRVNVTFRTICpwX2lucSwgdWludDhfdCAqcF9laXIpOwogc3RhdGljIHZvaWQgYnRhX2RtX29ic2VydmVfY21wbF9jYih2b2lkICogcF9yZXN1bHQpOwogc3RhdGljIHZvaWQgYnRhX2RtX2RlbGF5X3JvbGVfc3dpdGNoX2NiYWNrKHZvaWQgKmRhdGEpOwotZXh0ZXJuICJDIiB2b2lkIHNkcHVfdXVpZDE2X3RvX3V1aWQxMjgoVUlOVDE2IHV1aWQxNiwgVUlOVDgqIHBfdXVpZDEyOCk7CitleHRlcm4gIkMiIHZvaWQgc2RwdV91dWlkMTZfdG9fdXVpZDEyOCh1aW50MTZfdCB1dWlkMTYsIHVpbnQ4X3QqIHBfdXVpZDEyOCk7CiBzdGF0aWMgdm9pZCBidGFfZG1fZGlzYWJsZV90aW1lcl9jYmFjayh2b2lkICpkYXRhKTsKIAogCi1jb25zdCBVSU5UMTYgYnRhX3NlcnZpY2VfaWRfdG9fdXVpZF9sa3VwX3RibCBbQlRBX01BWF9TRVJWSUNFX0lEXSA9Citjb25zdCB1aW50MTZfdCBidGFfc2VydmljZV9pZF90b191dWlkX2xrdXBfdGJsIFtCVEFfTUFYX1NFUlZJQ0VfSURdID0KIHsKICAgICBVVUlEX1NFUlZDTEFTU19QTlBfSU5GT1JNQVRJT04sICAgICAgICAgLyogUmVzZXJ2ZWQgKi8KICAgICBVVUlEX1NFUlZDTEFTU19TRVJJQUxfUE9SVCwgICAgICAgICAgICAgLyogQlRBX1NQUF9TRVJWSUNFX0lEICovCkBAIC0xNzAsNyArMTcwLDcgQEAKICAgICBVVUlEX1NFUlZDTEFTU19NRVNTQUdFX05PVElGSUNBVElPTiwgICAgLyogQlRBX01OX1NFUlZJQ0VfSUQgKi8KICAgICBVVUlEX1NFUlZDTEFTU19IRFBfUFJPRklMRSwgICAgICAgICAgICAgLyogQlRBX0hEUF9TRVJWSUNFX0lEICovCiAgICAgVVVJRF9TRVJWQ0xBU1NfUEJBUF9QQ0UgICAgICAgICAgICAgICAgIC8qIEJUQV9QQ0VfU0VSVklDRV9JRCAqLwotI2lmIEJMRV9JTkNMVURFRCAmJiBCVEFfR0FUVF9JTkNMVURFRAorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSAmJiBCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFKQogICAgICxVVUlEX1BST1RPQ09MX0FUVCAgICAgICAgICAgICAgICAgICAgICAgLyogQlRBX0dBVFRfU0VSVklDRV9JRCAqLwogI2VuZGlmCiB9OwpAQCAtMTgyLDcgKzE4Miw3IEBACiAgKiAgICAgICAgaS5lLiwgSWYgeW91IGFkZCBuZXcgU2VydmljZSBJRCBmb3IgQlRBLCB0aGUgY29ycmVjdCBzZWN1cml0eSBJRCBvZiB0aGUgbmV3IHNlcnZpY2UKICAqICAgICAgICAgICAgICBmcm9tIFNlY3VyaXR5IHNlcnZpY2UgZGVmaW5pdGlvbnMgKGJ0bV9hcGkuaCkgc2hvdWxkIGJlIGFkZGVkIHRvIHRoaXMgbG9va3VwIHRhYmxlLgogICovCi1jb25zdCBVSU5UMzIgYnRhX3NlcnZpY2VfaWRfdG9fYnRtX3Nydl9pZF9sa3VwX3RibCBbQlRBX01BWF9TRVJWSUNFX0lEXSA9Citjb25zdCB1aW50MzJfdCBidGFfc2VydmljZV9pZF90b19idG1fc3J2X2lkX2xrdXBfdGJsIFtCVEFfTUFYX1NFUlZJQ0VfSURdID0KIHsKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzZXJ2ZWQgKi8KICAgICBCVE1fU0VDX1NFUlZJQ0VfU0VSSUFMX1BPUlQsICAgICAgICAgICAgLyogQlRBX1NQUF9TRVJWSUNFX0lEICovCkBAIC0yMTMsNyArMjEzLDcgQEAKICAgICBCVE1fU0VDX1NFUlZJQ0VfTUFQLCAgICAgICAgICAgICAgICAgICAgLyogQlRBX01OX1NFUlZJQ0VfSUQgKi8KICAgICBCVE1fU0VDX1NFUlZJQ0VfSERQX1NOSywgICAgICAgICAgICAgICAgLyogQlRBX0hEUF9TRVJWSUNFX0lEICovCiAgICAgQlRNX1NFQ19TRVJWSUNFX1BCQVAgICAgICAgICAgICAgICAgICAgIC8qIEJUQV9QQ0VfU0VSVklDRV9JRCAqLwotI2lmIEJMRV9JTkNMVURFRCAmJiBCVEFfR0FUVF9JTkNMVURFRAorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSAmJiBCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFKQogICAgICxCVE1fU0VDX1NFUlZJQ0VfQVRUICAgICAgICAgICAgICAgICAgICAvKiBCVEFfR0FUVF9TRVJWSUNFX0lEICovCiAjZW5kaWYKIApAQCAtMjMyLDggKzIzMiw4IEBACiAjZWxzZQogICAgIE5VTEwKICNlbmRpZgotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCi0jaWYgU01QX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKFNNUF9JTkNMVURFRCA9PSBUUlVFKQogICAgICwmYnRhX2RtX2JsZV9zbXBfY2JhY2sKICNlbmRpZgogICAgICwmYnRhX2RtX2JsZV9pZF9rZXlfY2JhY2sKQEAgLTI0Miw3ICsyNDIsNyBAQAogfTsKIAogI2RlZmluZSBNQVhfRElTQ19SQVdfREFUQV9CVUYgICAgICAgKDQwOTYpCi1VSU5UOCBnX2Rpc2NfcmF3X2RhdGFfYnVmW01BWF9ESVNDX1JBV19EQVRBX0JVRl07Cit1aW50OF90IGdfZGlzY19yYXdfZGF0YV9idWZbTUFYX0RJU0NfUkFXX0RBVEFfQlVGXTsKIAogZXh0ZXJuIERFVl9DTEFTUyBsb2NhbF9kZXZpY2VfZGVmYXVsdF9jbGFzczsKIGV4dGVybiBmaXhlZF9xdWV1ZV90ICpidHVfYnRhX2FsYXJtX3F1ZXVlOwpAQCAtMjYyLDcgKzI2Miw3IEBACiAgICAgdEJUQV9ETV9FTkFCTEUgZW5hYmxlX2V2ZW50OwogCiAgICAgLyogaWYgYWxyZWFkeSBpbiB1c2UsIHJldHVybiBhbiBlcnJvciAqLwotICAgIGlmKCBidGFfZG1fY2IuaXNfYnRhX2RtX2FjdGl2ZSA9PSBUUlVFICApCisgICAgaWYoIGJ0YV9kbV9jYi5pc19idGFfZG1fYWN0aXZlID09IHRydWUgICkKICAgICB7CiAgICAgICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXMgRGV2aWNlIGFscmVhZHkgc3RhcnRlZCBieSBhbm90aGVyIGFwcGxpY2F0aW9uIiwgX19mdW5jX18pOwogICAgICAgICBtZW1zZXQoJmVuYWJsZV9ldmVudCwgMCwgc2l6ZW9mKHRCVEFfRE1fRU5BQkxFKSk7CkBAIC0yODAsNyArMjgwLDcgQEAKICAgICBpZiggcF9kYXRhLT5lbmFibGUucF9zZWNfY2JhY2sgIT0gTlVMTCAgKQogICAgIGJ0YV9kbV9jYi5wX3NlY19jYmFjayA9IHBfZGF0YS0+ZW5hYmxlLnBfc2VjX2NiYWNrOwogICAgIC8qIG5vdGlmeSBCVEEgRE0gaXMgbm93IGFjdGl2ZSAqLwotICAgIGJ0YV9kbV9jYi5pc19idGFfZG1fYWN0aXZlID0gVFJVRTsKKyAgICBidGFfZG1fY2IuaXNfYnRhX2RtX2FjdGl2ZSA9IHRydWU7CiAKICAgICAvKiBzZW5kIGEgbWVzc2FnZSB0byBCVEEgU1lTICovCiAgICAgdEJUQV9TWVNfSFdfTVNHICpzeXNfZW5hYmxlX2V2ZW50ID0KQEAgLTMzOCw4ICszMzgsOCBAQAogewogICAgIERFVl9DTEFTUyAgIGRldl9jbGFzczsKICAgICB0QlRBX0RNX1NFQ19DQkFDSyAgICAgICAgICAgKnRlbXBfY2JhY2s7Ci0jaWYgQkxFX0lOQ0xVREVEID09IFRSVUUKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBrZXlfbWFzayA9IDA7CisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQorICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAga2V5X21hc2sgPSAwOwogICAgIEJUX09DVEVUMTYgICAgICAgICAgICAgIGVyOwogICAgIHRCVEFfQkxFX0xPQ0FMX0lEX0tFWVMgIGlkX2tleTsKICNlbmRpZgpAQCAtMzY0LDcgKzM2NCw3IEBACiAgICAgICAgIC8qIHVucmVnaXN0ZXIgZnJvbSBTWVMgKi8KICAgICAgICAgYnRhX3N5c19od191bnJlZ2lzdGVyKCBCVEFfU1lTX0hXX0JMVUVUT09USCApOwogICAgICAgICAvKiBub3RpZnkgQlRBIERNIGlzIG5vdyB1bmFjdGl2ZSAqLwotICAgICAgICBidGFfZG1fY2IuaXNfYnRhX2RtX2FjdGl2ZSA9IEZBTFNFOworICAgICAgICBidGFfZG1fY2IuaXNfYnRhX2RtX2FjdGl2ZSA9IGZhbHNlOwogICAgIH0KICAgICBlbHNlCiAgICAgaWYoIHN0YXR1cyA9PSBCVEFfU1lTX0hXX09OX0VWVCApCkBAIC0zNzksNyArMzc5LDcgQEAKICAgICAgICAgYnRhX2RtX2luaXRfY2IoKTsKICAgICAgICAgLyogYW5kIHJldHJpZXZlIHRoZSBjYWxsYmFjayAqLwogICAgICAgICBidGFfZG1fY2IucF9zZWNfY2JhY2s9dGVtcF9jYmFjazsKLSAgICAgICAgYnRhX2RtX2NiLmlzX2J0YV9kbV9hY3RpdmUgPSBUUlVFOworICAgICAgICBidGFfZG1fY2IuaXNfYnRhX2RtX2FjdGl2ZSA9IHRydWU7CiAKICAgICAgICAgLyogaHcgaXMgcmVhZHksIGdvIG9uIHdpdGggQlRBIERNIGluaXRpYWxpemF0aW9uICovCiAgICAgICAgIGFsYXJtX2ZyZWUoYnRhX2RtX3NlYXJjaF9jYi5zZWFyY2hfdGltZXIpOwpAQCAtNDAwLDcgKzQwMCw3IEBACiAgICAgICAgIG1lbWNweShkZXZfY2xhc3MsIHBfYnRhX2RtX2NmZy0+ZGV2X2NsYXNzLCBzaXplb2YoZGV2X2NsYXNzKSk7CiAgICAgICAgIEJUTV9TZXREZXZpY2VDbGFzcyAoZGV2X2NsYXNzKTsKIAotI2lmIChkZWZpbmVkKEJMRV9JTkNMVURFRCkgJiYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKSkKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUpCiAgICAgICAgIC8qIGxvYWQgQkxFIGxvY2FsIGluZm9ybWF0aW9uOiBJRCBrZXlzLCBFUiBpZiBhdmFpbGFibGUgKi8KICAgICAgICAgYnRhX2RtX2NvX2JsZV9sb2FkX2xvY2FsX2tleXMoJmtleV9tYXNrLCBlciwgJmlkX2tleSk7CiAKQEAgLTQxMiwxMCArNDEyLDEwIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIEJUTV9CbGVMb2FkTG9jYWxLZXlzKEJUQV9CTEVfTE9DQUxfS0VZX1RZUEVfSUQsICh0QlRNX0JMRV9MT0NBTF9LRVlTICopJmlkX2tleSk7CiAgICAgICAgIH0KLSNpZiAoZGVmaW5lZChCVEFfR0FUVF9JTkNMVURFRCkgJiYgKEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpKQorI2lmIChCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFKQogICAgICAgICBidGFfZG1fc2VhcmNoX2NiLmNvbm5faWQgPSBCVEFfR0FUVF9JTlZBTElEX0NPTk5fSUQ7CiAjZW5kaWYgIC8vIChkZWZpbmVkKEJUQV9HQVRUX0lOQ0xVREVEKSAmJiBCVEFfR0FUVF9JTkNMVURFRCkKLSNlbmRpZiAgLy8gKGRlZmluZWQoQkxFX0lOQ0xVREVEKSAmJiAoQkxFX0lOQ0xVREVEID09IFRSVUUpKQorI2VuZGlmICAvLyAoZGVmaW5lZChCTEVfSU5DTFVERUQpICYmIChCTEVfSU5DTFVERUQgPT0gdHJ1ZSkpCiAKICAgICAgICAgQlRNX1NlY1JlZ2lzdGVyKCh0QlRNX0FQUExfSU5GTyopJmJ0YV9zZWN1cml0eSk7CiAgICAgICAgIEJUTV9TZXREZWZhdWx0TGlua1N1cGVyVG91dChwX2J0YV9kbV9jZmctPmxpbmtfdGltZW91dCk7CkBAIC00MjQsNyArNDI0LDcgQEAKICAgICAgICAgQlRNX1NldERlZmF1bHRMaW5rUG9saWN5KGJ0YV9kbV9jYi5jdXJfcG9saWN5KTsKICAgICAgICAgQlRNX1JlZ0J1c3lMZXZlbE5vdGlmIChidGFfZG1fYmxfY2hhbmdlX2NiYWNrLCBOVUxMLCBCVE1fQkxfVVBEQVRFX01BU0t8QlRNX0JMX1JPTEVfQ0hHX01BU0spOwogCi0jaWYgQkxFX1ZORF9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9WTkRfSU5DTFVERUQgPT0gVFJVRSkKICAgICAgICAgQlRNX0JsZVJlYWRDb250cm9sbGVyRmVhdHVyZXMgKGJ0YV9kbV9jdHJsX2ZlYXR1cmVzX3JkX2NtcGxfY2JhY2spOwogI2VuZGlmCiAKQEAgLTQ2OCw4ICs0NjgsOCBAQAogICAgIFVOVVNFRChwX2RhdGEpOwogCiAgICAgLyogU2V0IGwyY2FwIGlkbGUgdGltZW91dCB0byAwIChzbyBCVEUgaW1tZWRpYXRlbHkgZGlzY29ubmVjdHMgQUNMIGxpbmsgYWZ0ZXIgbGFzdCBjaGFubmVsIGlzIGNsb3NlZCkgKi8KLSAgICBMMkNBX1NldElkbGVUaW1lb3V0QnlCZEFkZHIoKFVJTlQ4ICopQlRfQkRfQU5ZLCAwLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLSAgICBMMkNBX1NldElkbGVUaW1lb3V0QnlCZEFkZHIoKFVJTlQ4ICopQlRfQkRfQU5ZLCAwLCBCVF9UUkFOU1BPUlRfTEUpOworICAgIEwyQ0FfU2V0SWRsZVRpbWVvdXRCeUJkQWRkcigodWludDhfdCAqKUJUX0JEX0FOWSwgMCwgQlRfVFJBTlNQT1JUX0JSX0VEUik7CisgICAgTDJDQV9TZXRJZGxlVGltZW91dEJ5QmRBZGRyKCh1aW50OF90ICopQlRfQkRfQU5ZLCAwLCBCVF9UUkFOU1BPUlRfTEUpOwogCiAgICAgLyogZGlzYWJsZSBhbGwgYWN0aXZlIHN1YnN5c3RlbXMgKi8KICAgICBidGFfc3lzX2Rpc2FibGUoQlRBX1NZU19IV19CTFVFVE9PVEgpOwpAQCAtNDc5LDIwICs0NzksMjAgQEAKIAogICAgIGJ0YV9kbV9kaXNhYmxlX3BtKCk7CiAgICAgYnRhX2RtX2Rpc2FibGVfc2VhcmNoX2FuZF9kaXNjKCk7Ci0gICAgYnRhX2RtX2NiLmRpc2FibGluZyA9IFRSVUU7CisgICAgYnRhX2RtX2NiLmRpc2FibGluZyA9IHRydWU7CiAKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRSAmJiBCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFICYmIEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCiAgICAgQlRNX0JsZUNsZWFyQmdDb25uRGV2KCk7CiAjZW5kaWYKIAogICAgIGlmKEJUTV9HZXROdW1BY2xMaW5rcygpPT0wKQogICAgIHsKLSNpZiAoZGVmaW5lZChCVEFfRElTQUJMRV9ERUxBWSkgJiYgQlRBX0RJU0FCTEVfREVMQVkgPiAwKQorI2lmIChCVEFfRElTQUJMRV9ERUxBWSA+IDApCiAgICAgICAgIC8qIElmIEJUQV9ESVNBQkxFX0RFTEFZIGlzIGRlZmluZWQgYW5kIGdyZWF0ZXIgdGhhbiB6ZXJvLCB0aGVuIGRlbGF5IHRoZSBzaHV0ZG93biBieQogICAgICAgICAgKiBCVEFfRElTQUJMRV9ERUxBWSBtaWxsaXNlY29uZHMKICAgICAgICAgICovCiAgICAgICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXMgQlRBX0RJU0FCTEVfREVMQVkgc2V0IHRvICVkIG1zIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIEJUQV9ESVNBQkxFX0RFTEFZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgQlRBX0RJU0FCTEVfREVMQVkpOwogICAgICAgICBhbGFybV9zZXRfb25fcXVldWUoYnRhX2RtX2NiLmRpc2FibGVfdGltZXIsIEJUQV9ESVNBQkxFX0RFTEFZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2RtX2Rpc2FibGVfY29ubl9kb3duX3RpbWVyX2NiYWNrLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnR1X2J0YV9hbGFybV9xdWV1ZSk7CkBAIC01MjIsOSArNTIyLDkgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZCBidGFfZG1fZGlzYWJsZV90aW1lcl9jYmFjayh2b2lkICpkYXRhKQogewotICAgIFVJTlQ4IGk7CisgICAgdWludDhfdCBpOwogICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0ID0gQlRfVFJBTlNQT1JUX0JSX0VEUjsKLSAgICBCT09MRUFOIHRyaWdnZXJfZGlzYyA9IEZBTFNFOworICAgIGJvb2wgdHJpZ2dlcl9kaXNjID0gZmFsc2U7CiAgICAgdWludDMyX3QgcGFyYW0gPSBQVFJfVE9fVUlOVChkYXRhKTsKIAogICAgIEFQUExfVFJBQ0VfRVZFTlQoIiVzIHRyaWFsICV1IiwgX19mdW5jX18sIHBhcmFtKTsKQEAgLTUzNyw3ICs1MzcsNyBAQAogICAgICAgICAgICAgdHJhbnNwb3J0ID0gYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLnRyYW5zcG9ydDsKICNlbmRpZgogICAgICAgICAgICAgYnRtX3JlbW92ZV9hY2woYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLnBlZXJfYmRhZGRyLCB0cmFuc3BvcnQpOwotICAgICAgICAgICAgdHJpZ2dlcl9kaXNjID0gVFJVRTsKKyAgICAgICAgICAgIHRyaWdnZXJfZGlzYyA9IHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBSZXRyaWdnZXIgZGlzYWJsZSB0aW1lciBpbiBjYXNlIEFDTCBkaXNjb25uZWN0IGZhaWxlZCwgRElTQUJMRV9FVlQgc3RpbGwgbmVlZApAQCAtNTUyLDcgKzU1Miw3IEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIGJ0YV9kbV9jYi5kaXNhYmxpbmcgPSBGQUxTRTsKKyAgICAgICAgYnRhX2RtX2NiLmRpc2FibGluZyA9IGZhbHNlOwogCiAgICAgICAgIGJ0YV9zeXNfcmVtb3ZlX3V1aWQoVVVJRF9TRVJWQ0xBU1NfUE5QX0lORk9STUFUSU9OKTsKICAgICAgICAgYnRhX2RtX2NiLnBfc2VjX2NiYWNrKEJUQV9ETV9ESVNBQkxFX0VWVCwgTlVMTCk7CkBAIC01OTEsMjIgKzU5MSwyMiBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2RtX3NldF92aXNpYmlsaXR5KHRCVEFfRE1fTVNHICpwX2RhdGEpCiB7Ci0gICAgVUlOVDE2IHdpbmRvdywgaW50ZXJ2YWw7Ci0jaWYgKGRlZmluZWQoQlRBX0dBVFRfSU5DTFVERUQpICYmIEJUQV9HQVRUX0lOQ0xVREVEKQotICAgIFVJTlQxNiBsZV9kaXNjX21vZGUgPSBCVE1fQmxlUmVhZERpc2NvdmVyYWJpbGl0eSgpOwotICAgIFVJTlQxNiBsZV9jb25uX21vZGUgPSBCVE1fQmxlUmVhZENvbm5lY3RhYmlsaXR5KCk7Ci0jZW5kaWYgIC8vIChkZWZpbmVkKEJUQV9HQVRUX0lOQ0xVREVEKSAmJiBCVEFfR0FUVF9JTkNMVURFRCkKLSAgICBVSU5UMTYgZGlzY19tb2RlID0gQlRNX1JlYWREaXNjb3ZlcmFiaWxpdHkoJndpbmRvdywgJmludGVydmFsKTsKLSAgICBVSU5UMTYgY29ubl9tb2RlID0gQlRNX1JlYWRDb25uZWN0YWJpbGl0eSgmd2luZG93LCAmaW50ZXJ2YWwpOworICAgIHVpbnQxNl90IHdpbmRvdywgaW50ZXJ2YWw7CisjaWYgKEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCisgICAgdWludDE2X3QgbGVfZGlzY19tb2RlID0gQlRNX0JsZVJlYWREaXNjb3ZlcmFiaWxpdHkoKTsKKyAgICB1aW50MTZfdCBsZV9jb25uX21vZGUgPSBCVE1fQmxlUmVhZENvbm5lY3RhYmlsaXR5KCk7CisjZW5kaWYgIC8vIEJUQV9HQVRUX0lOQ0xVREVECisgICAgdWludDE2X3QgZGlzY19tb2RlID0gQlRNX1JlYWREaXNjb3ZlcmFiaWxpdHkoJndpbmRvdywgJmludGVydmFsKTsKKyAgICB1aW50MTZfdCBjb25uX21vZGUgPSBCVE1fUmVhZENvbm5lY3RhYmlsaXR5KCZ3aW5kb3csICZpbnRlcnZhbCk7CiAKICAgICAvKiBzZXQgbW9kZXMgZm9yIERpc2NvdmVyYWJpbGl0eSBhbmQgY29ubmVjdGFiaWxpdHkgaWYgbm90IGlnbm9yZSAqLwogICAgIGlmIChwX2RhdGEtPnNldF92aXNpYmlsaXR5LmRpc2NfbW9kZSAhPSAoQlRBX0RNX0lHTk9SRSB8IEJUQV9ETV9MRV9JR05PUkUpKQogICAgIHsKLSNpZiAoZGVmaW5lZChCVEFfR0FUVF9JTkNMVURFRCkgJiYgQlRBX0dBVFRfSU5DTFVERUQpCisjaWYgKEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCiAgICAgICAgIGlmICgocF9kYXRhLT5zZXRfdmlzaWJpbGl0eS5kaXNjX21vZGUgJiBCVEFfRE1fTEVfSUdOT1JFKSA9PSBCVEFfRE1fTEVfSUdOT1JFKQogICAgICAgICAgICAgcF9kYXRhLT5zZXRfdmlzaWJpbGl0eS5kaXNjX21vZGUgPQogICAgICAgICAgICAgICAgICgocF9kYXRhLT5zZXRfdmlzaWJpbGl0eS5kaXNjX21vZGUgJiB+QlRBX0RNX0xFX0lHTk9SRSkgfCBsZV9kaXNjX21vZGUpOwotI2VuZGlmICAvLyAoZGVmaW5lZChCVEFfR0FUVF9JTkNMVURFRCkgJiYgQlRBX0dBVFRfSU5DTFVERUQpCisjZW5kaWYgIC8vIEJUQV9HQVRUX0lOQ0xVREVECiAgICAgICAgIGlmICgocF9kYXRhLT5zZXRfdmlzaWJpbGl0eS5kaXNjX21vZGUgJiBCVEFfRE1fSUdOT1JFKSA9PSBCVEFfRE1fSUdOT1JFKQogICAgICAgICAgICAgcF9kYXRhLT5zZXRfdmlzaWJpbGl0eS5kaXNjX21vZGUgPQogICAgICAgICAgICAgICAgICgocF9kYXRhLT5zZXRfdmlzaWJpbGl0eS5kaXNjX21vZGUgJiB+QlRBX0RNX0lHTk9SRSkgfCBkaXNjX21vZGUpOwpAQCAtNjE4LDExICs2MTgsMTEgQEAKIAogICAgIGlmIChwX2RhdGEtPnNldF92aXNpYmlsaXR5LmNvbm5fbW9kZSAhPSAoQlRBX0RNX0lHTk9SRSB8IEJUQV9ETV9MRV9JR05PUkUpKQogICAgIHsKLSNpZiAoZGVmaW5lZChCVEFfR0FUVF9JTkNMVURFRCkgJiYgQlRBX0dBVFRfSU5DTFVERUQpCisjaWYgKEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCiAgICAgICAgIGlmICgocF9kYXRhLT5zZXRfdmlzaWJpbGl0eS5jb25uX21vZGUgJiBCVEFfRE1fTEVfSUdOT1JFKSA9PSBCVEFfRE1fTEVfSUdOT1JFKQogICAgICAgICAgICAgcF9kYXRhLT5zZXRfdmlzaWJpbGl0eS5jb25uX21vZGUgPQogICAgICAgICAgICAgICAgICgocF9kYXRhLT5zZXRfdmlzaWJpbGl0eS5jb25uX21vZGUgJiB+QlRBX0RNX0xFX0lHTk9SRSkgfCBsZV9jb25uX21vZGUpOwotI2VuZGlmICAvLyAoZGVmaW5lZChCVEFfR0FUVF9JTkNMVURFRCkgJiYgQlRBX0dBVFRfSU5DTFVERUQpCisjZW5kaWYgIC8vIEJUQV9HQVRUX0lOQ0xVREVECiAgICAgICAgIGlmICgocF9kYXRhLT5zZXRfdmlzaWJpbGl0eS5jb25uX21vZGUgJiBCVEFfRE1fSUdOT1JFKSA9PSBCVEFfRE1fSUdOT1JFKQogICAgICAgICAgICAgcF9kYXRhLT5zZXRfdmlzaWJpbGl0eS5jb25uX21vZGUgPQogICAgICAgICAgICAgICAgICgocF9kYXRhLT5zZXRfdmlzaWJpbGl0eS5jb25uX21vZGUgJiB+QlRBX0RNX0lHTk9SRSkgfCBjb25uX21vZGUpOwpAQCAtNjM3LDkgKzYzNyw5IEBACiAgICAgewogCiAgICAgICAgIGlmIChwX2RhdGEtPnNldF92aXNpYmlsaXR5LnBhaXJfbW9kZSA9PSBCVEFfRE1fTk9OX1BBSVJBQkxFKQotICAgICAgICAgICAgYnRhX2RtX2NiLmRpc2FibGVfcGFpcl9tb2RlID0gVFJVRTsKKyAgICAgICAgICAgIGJ0YV9kbV9jYi5kaXNhYmxlX3BhaXJfbW9kZSA9IHRydWU7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJ0YV9kbV9jYi5kaXNhYmxlX3BhaXJfbW9kZSA9IEZBTFNFOworICAgICAgICAgICAgYnRhX2RtX2NiLmRpc2FibGVfcGFpcl9tb2RlID0gZmFsc2U7CiAKICAgICB9CiAKQEAgLTY0OCwxNSArNjQ4LDE1IEBACiAgICAgewogCiAgICAgICAgIGlmIChwX2RhdGEtPnNldF92aXNpYmlsaXR5LmNvbm5fcGFpcmVkX29ubHkgPT0gQlRBX0RNX0NPTk5fQUxMKQotICAgICAgICAgICAgYnRhX2RtX2NiLmNvbm5fcGFpcmVkX29ubHkgPSBGQUxTRTsKKyAgICAgICAgICAgIGJ0YV9kbV9jYi5jb25uX3BhaXJlZF9vbmx5ID0gZmFsc2U7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJ0YV9kbV9jYi5jb25uX3BhaXJlZF9vbmx5ID0gVFJVRTsKKyAgICAgICAgICAgIGJ0YV9kbV9jYi5jb25uX3BhaXJlZF9vbmx5ID0gdHJ1ZTsKIAogICAgIH0KIAogICAgIC8qIENoYW5nZSBtb2RlIGlmIGVpdGhlciBtb2RlIGlzIG5vdCBpZ25vcmUgKi8KICAgICBpZiAocF9kYXRhLT5zZXRfdmlzaWJpbGl0eS5wYWlyX21vZGUgIT0gQlRBX0RNX0lHTk9SRSB8fCBwX2RhdGEtPnNldF92aXNpYmlsaXR5LmNvbm5fcGFpcmVkX29ubHkgIT0gQlRBX0RNX0lHTk9SRSkKLSAgICAgICAgQlRNX1NldFBhaXJhYmxlTW9kZSgoQk9PTEVBTikoIShidGFfZG1fY2IuZGlzYWJsZV9wYWlyX21vZGUpKSxidGFfZG1fY2IuY29ubl9wYWlyZWRfb25seSk7CisgICAgICAgIEJUTV9TZXRQYWlyYWJsZU1vZGUoKGJvb2wpKCEoYnRhX2RtX2NiLmRpc2FibGVfcGFpcl9tb2RlKSksYnRhX2RtX2NiLmNvbm5fcGFpcmVkX29ubHkpOwogCiB9CiAKQEAgLTY3MSw3ICs2NzEsNyBAQAogewogI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSAmJiBCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFKQogICAgICAvKiBuZWVkIHRvIHJlbW92ZSBhbGwgcGVuZGluZyBiYWNrZ3JvdW5kIGNvbm5lY3Rpb24gYmVmb3JlIHVucGFpciAqLwotICAgICBCVEFfR0FUVENfQ2FuY2VsT3BlbigwLCBiZF9hZGRyLCBGQUxTRSk7CisgICAgIEJUQV9HQVRUQ19DYW5jZWxPcGVuKDAsIGJkX2FkZHIsIGZhbHNlKTsKICNlbmRpZgogCiAgICAgIEJUTV9TZWNEZWxldGVEZXZpY2UoYmRfYWRkcik7CkBAIC03MDEsNyArNzAxLDcgQEAKIHZvaWQgYnRhX2RtX3JlbW92ZV9kZXZpY2UodEJUQV9ETV9NU0cgKnBfZGF0YSkKIHsKICAgICB0QlRBX0RNX0FQSV9SRU1PVkVfREVWSUNFICpwX2RldiA9ICZwX2RhdGEtPnJlbW92ZV9kZXY7Ci0gICAgQk9PTEVBTiBjb250aW51ZV9kZWxldGVfb3RoZXJfZGV2ID0gRkFMU0U7CisgICAgYm9vbCBjb250aW51ZV9kZWxldGVfb3RoZXJfZGV2ID0gZmFsc2U7CiAgICAgaWYgKHBfZGV2ID09IE5VTEwpCiAgICAgICAgIHJldHVybjsKIApAQCAtNzA5LDI4ICs3MDksMjggQEAKICAgICBiZGNweShvdGhlcl9hZGRyZXNzLCBwX2Rldi0+YmRfYWRkcik7CiAKICAgICAvKiBJZiBBQ0wgZXhpc3RzIGZvciB0aGUgZGV2aWNlIGluIHRoZSByZW1vdmVfYm9uZCBtZXNzYWdlKi8KLSAgICBCT09MRUFOIGNvbnRpbnVlX2RlbGV0ZV9kZXYgPSBGQUxTRTsKLSAgICBVSU5UOCBvdGhlcl90cmFuc3BvcnQgPSBCVF9UUkFOU1BPUlRfSU5WQUxJRDsKKyAgICBib29sIGNvbnRpbnVlX2RlbGV0ZV9kZXYgPSBmYWxzZTsKKyAgICB1aW50OF90IG90aGVyX3RyYW5zcG9ydCA9IEJUX1RSQU5TUE9SVF9JTlZBTElEOwogCiAgICAgaWYgKEJUTV9Jc0FjbENvbm5lY3Rpb25VcChwX2Rldi0+YmRfYWRkciwgQlRfVFJBTlNQT1JUX0xFKSB8fAogICAgICAgICBCVE1fSXNBY2xDb25uZWN0aW9uVXAocF9kZXYtPmJkX2FkZHIsIEJUX1RSQU5TUE9SVF9CUl9FRFIpKQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IEFDTCBVcCBjb3VudCAgJWQiLCBfX2Z1bmNfXywgYnRhX2RtX2NiLmRldmljZV9saXN0LmNvdW50KTsKLSAgICAgICAgY29udGludWVfZGVsZXRlX2RldiA9IEZBTFNFOworICAgICAgICBjb250aW51ZV9kZWxldGVfZGV2ID0gZmFsc2U7CiAKICAgICAgICAgLyogVGFrZSB0aGUgbGluayBkb3duIGZpcnN0LCBhbmQgbWFyayB0aGUgZGV2aWNlIGZvciByZW1vdmFsIHdoZW4gZGlzY29ubmVjdGVkICovCiAgICAgICAgIGZvcihpbnQgaT0wOyBpIDwgYnRhX2RtX2NiLmRldmljZV9saXN0LmNvdW50OyBpKyspCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICghYmRjbXAoYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLnBlZXJfYmRhZGRyLCBwX2Rldi0+YmRfYWRkcikpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVUlOVDggdHJhbnNwb3J0ID0gQlRfVFJBTlNQT1JUX0JSX0VEUjsKKyAgICAgICAgICAgICAgICB1aW50OF90IHRyYW5zcG9ydCA9IEJUX1RSQU5TUE9SVF9CUl9FRFI7CiAKLSNpZiAoZGVmaW5lZChCVEFfR0FUVF9JTkNMVURFRCkgJiYgQlRBX0dBVFRfSU5DTFVERUQpCisjaWYgKEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCiAgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLnRyYW5zcG9ydDsKLSNlbmRpZiAgLy8gKGRlZmluZWQoQlRBX0dBVFRfSU5DTFVERUQpICYmIEJUQV9HQVRUX0lOQ0xVREVEKQorI2VuZGlmICAvLyBCVEFfR0FUVF9JTkNMVURFRAogICAgICAgICAgICAgICAgIGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5wZWVyX2RldmljZVtpXS5jb25uX3N0YXRlID0gQlRBX0RNX1VOUEFJUklORzsKICAgICAgICAgICAgICAgICBidG1fcmVtb3ZlX2FjbChwX2Rldi0+YmRfYWRkciwgdHJhbnNwb3J0KTsKLSNpZiAoZGVmaW5lZChCVEFfR0FUVF9JTkNMVURFRCkgJiYgQlRBX0dBVFRfSU5DTFVERUQpCisjaWYgKEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCiAgICAgICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6dHJhbnNwb3J0ID0gJWQiLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfZG1fY2IuZGV2aWNlX2xpc3QucGVlcl9kZXZpY2VbaV0udHJhbnNwb3J0KTsKIApAQCAtNzM5LDcgKzczOSw3IEBACiAgICAgICAgICAgICAgICAgICAgb3RoZXJfdHJhbnNwb3J0ID0gQlRfVFJBTlNQT1JUX0JSX0VEUjsKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgb3RoZXJfdHJhbnNwb3J0ID0gQlRfVFJBTlNQT1JUX0xFOwotI2VuZGlmICAvLyAoZGVmaW5lZChCVEFfR0FUVF9JTkNMVURFRCkgJiYgQlRBX0dBVFRfSU5DTFVERUQpCisjZW5kaWYgIC8vIEJUQV9HQVRUX0lOQ0xVREVECiAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTc0NywxNiArNzQ3LDE2IEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIGNvbnRpbnVlX2RlbGV0ZV9kZXYgPSBUUlVFOworICAgICAgICBjb250aW51ZV9kZWxldGVfZGV2ID0gdHJ1ZTsKICAgICB9Ci0jaWYgKGRlZmluZWQoQlRBX0dBVFRfSU5DTFVERUQpICYmIEJUQV9HQVRUX0lOQ0xVREVEKQorI2lmIChCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFKQogICAgIC8vIElmIGl0IGlzIERVTU8gZGV2aWNlIGFuZCBkZXZpY2UgaXMgcGFpcmVkIGFzIGRpZmZlcmVudCBhZGRyZXNzLCB1bnBhaXIgdGhhdCBkZXZpY2UKICAgICAvLyBpZiBkaWZmZXJlbnQgYWRkcmVzcwogICAgIGlmICgob3RoZXJfdHJhbnNwb3J0ICYmIChCVE1fUmVhZENvbm5lY3RlZFRyYW5zcG9ydEFkZHJlc3Mob3RoZXJfYWRkcmVzcywgb3RoZXJfdHJhbnNwb3J0KSkpIHx8CiAgICAgICAoIW90aGVyX3RyYW5zcG9ydCAmJiAoQlRNX1JlYWRDb25uZWN0ZWRUcmFuc3BvcnRBZGRyZXNzKG90aGVyX2FkZHJlc3MsIEJUX1RSQU5TUE9SVF9CUl9FRFIpIHx8CiAgICAgICAgQlRNX1JlYWRDb25uZWN0ZWRUcmFuc3BvcnRBZGRyZXNzKG90aGVyX2FkZHJlc3MsIEJUX1RSQU5TUE9SVF9MRSkpKSkKICAgICB7Ci0gICAgICAgIGNvbnRpbnVlX2RlbGV0ZV9vdGhlcl9kZXYgPSBGQUxTRTsKKyAgICAgICAgY29udGludWVfZGVsZXRlX290aGVyX2RldiA9IGZhbHNlOwogICAgICAgICAvKiBUYWtlIHRoZSBsaW5rIGRvd24gZmlyc3QsIGFuZCBtYXJrIHRoZSBkZXZpY2UgZm9yIHJlbW92YWwgd2hlbiBkaXNjb25uZWN0ZWQgKi8KICAgICAgICAgZm9yKGludCBpPTA7IGkgPCBidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQ7IGkrKykKICAgICAgICAgewpAQCAtNzcxLDkgKzc3MSw5IEBACiAgICAgZWxzZQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGNvbnRpbnVlIHRvIGRlbGV0ZSB0aGUgb3RoZXIgZGV2ICIsIF9fZnVuY19fKTsKLSAgICAgICAgY29udGludWVfZGVsZXRlX290aGVyX2RldiA9IFRSVUU7CisgICAgICAgIGNvbnRpbnVlX2RlbGV0ZV9vdGhlcl9kZXYgPSB0cnVlOwogICAgIH0KLSNlbmRpZgorI2VuZGlmIC8vIEJUQV9HQVRUX0lOQ0xVREVECiAgICAgLyogRGVsZXRlIHRoZSBkZXZpY2UgbWVudGlvbmVkIGluIHRoZSBtc2cgKi8KICAgICBpZiAoY29udGludWVfZGVsZXRlX2RldikKICAgICAgICAgYnRhX2RtX3Byb2Nlc3NfcmVtb3ZlX2RldmljZShwX2Rldi0+YmRfYWRkcik7CkBAIC03OTYsMzMgKzc5NiwzMyBAQAogdm9pZCBidGFfZG1fYWRkX2RldmljZSAodEJUQV9ETV9NU0cgKnBfZGF0YSkKIHsKICAgICB0QlRBX0RNX0FQSV9BRERfREVWSUNFICpwX2RldiA9ICZwX2RhdGEtPmFkZF9kZXY7Ci0gICAgVUlOVDggICAqcF9kYyA9IE5VTEw7Ci0gICAgVUlOVDggICAqcF9sYyA9IE5VTEw7Ci0gICAgVUlOVDMyICB0cnVzdGVkX3NlcnZpY2VzX21hc2tbQlRNX1NFQ19TRVJWSUNFX0FSUkFZX1NJWkVdOwotICAgIFVJTlQ4ICAgaW5kZXggPSAwOwotICAgIFVJTlQ4ICAgYnRtX21hc2tfaW5kZXggPSAwOworICAgIHVpbnQ4X3QgICAqcF9kYyA9IE5VTEw7CisgICAgdWludDhfdCAgICpwX2xjID0gTlVMTDsKKyAgICB1aW50MzJfdCAgdHJ1c3RlZF9zZXJ2aWNlc19tYXNrW0JUTV9TRUNfU0VSVklDRV9BUlJBWV9TSVpFXTsKKyAgICB1aW50OF90ICAgaW5kZXggPSAwOworICAgIHVpbnQ4X3QgICBidG1fbWFza19pbmRleCA9IDA7CiAKICAgICBtZW1zZXQgKHRydXN0ZWRfc2VydmljZXNfbWFzaywgMCwgc2l6ZW9mKHRydXN0ZWRfc2VydmljZXNfbWFzaykpOwogCiAgICAgLyogSWYgbm90IGFsbCB6ZXJvcywgdGhlIGRldmljZSBjbGFzcyBoYXMgYmVlbiBzcGVjaWZpZWQgKi8KICAgICBpZiAocF9kZXYtPmRjX2tub3duKQotICAgICAgICBwX2RjID0gKFVJTlQ4ICopcF9kZXYtPmRjOworICAgICAgICBwX2RjID0gKHVpbnQ4X3QgKilwX2Rldi0+ZGM7CiAKICAgICBpZiAocF9kZXYtPmxpbmtfa2V5X2tub3duKQotICAgICAgICBwX2xjID0gKFVJTlQ4ICopcF9kZXYtPmxpbmtfa2V5OworICAgICAgICBwX2xjID0gKHVpbnQ4X3QgKilwX2Rldi0+bGlua19rZXk7CiAKICAgICBpZiAocF9kZXYtPmlzX3RydXN0ZWQpCiAgICAgewogICAgICAgICAvKiBjb3ZlcnQgQlRBIHNlcnZpY2UgbWFzayB0byBCVE0gbWFzayAqLwogICAgICAgICB3aGlsZSAocF9kZXYtPnRtICYmIChpbmRleCA8IEJUQV9NQVhfU0VSVklDRV9JRCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwX2Rldi0+dG0gJiAoVUlOVDMyKSgxPDxpbmRleCkpCisgICAgICAgICAgICBpZiAocF9kZXYtPnRtICYgKHVpbnQzMl90KSgxPDxpbmRleCkpCiAgICAgICAgICAgICB7CiAKICAgICAgICAgICAgICAgICBidG1fbWFza19pbmRleCA9ICBidGFfc2VydmljZV9pZF90b19idG1fc3J2X2lkX2xrdXBfdGJsW2luZGV4XSAvIEJUTV9TRUNfQVJSQVlfQklUUzsKLSAgICAgICAgICAgICAgICB0cnVzdGVkX3NlcnZpY2VzX21hc2tbYnRtX21hc2tfaW5kZXhdIHw9IChVSU5UMzIpKDEgPDwgKGJ0YV9zZXJ2aWNlX2lkX3RvX2J0bV9zcnZfaWRfbGt1cF90YmxbaW5kZXhdIC0gKFVJTlQzMikoYnRtX21hc2tfaW5kZXggKiAzMikpKTsKKyAgICAgICAgICAgICAgICB0cnVzdGVkX3NlcnZpY2VzX21hc2tbYnRtX21hc2tfaW5kZXhdIHw9ICh1aW50MzJfdCkoMSA8PCAoYnRhX3NlcnZpY2VfaWRfdG9fYnRtX3Nydl9pZF9sa3VwX3RibFtpbmRleF0gLSAodWludDMyX3QpKGJ0bV9tYXNrX2luZGV4ICogMzIpKSk7CiAKLSAgICAgICAgICAgICAgICBwX2Rldi0+dG0gJj0gKFVJTlQzMikofigxPDxpbmRleCkpOworICAgICAgICAgICAgICAgIHBfZGV2LT50bSAmPSAodWludDMyX3QpKH4oMTw8aW5kZXgpKTsKIAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaW5kZXgrKzsKQEAgLTg1MSw3ICs4NTEsNyBAQAogdm9pZCBidGFfZG1fY2xvc2VfYWNsKHRCVEFfRE1fTVNHICpwX2RhdGEpCiB7CiAgICAgdEJUQV9ETV9BUElfUkVNT1ZFX0FDTCAqcF9yZW1vdmVfYWNsID0gJnBfZGF0YS0+cmVtb3ZlX2FjbDsKLSAgICBVSU5UOCAgIGluZGV4OworICAgIHVpbnQ4X3QgICBpbmRleDsKIAogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9kbV9jbG9zZV9hY2wiKTsKIApAQCAtODY1LDcgKzg2NSw3IEBACiAgICAgICAgIGlmIChpbmRleCAhPSBidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChwX3JlbW92ZV9hY2wtPnJlbW92ZV9kZXYpCi0gICAgICAgICAgICAgICAgYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2luZGV4XS5yZW1vdmVfZGV2X3BlbmRpbmcgPSBUUlVFOworICAgICAgICAgICAgICAgIGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5wZWVyX2RldmljZVtpbmRleF0ucmVtb3ZlX2Rldl9wZW5kaW5nID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKQEAgLTg4Myw3ICs4ODMsNyBAQAogICAgICAgICB9CiAjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFICYmIEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCiAgICAgICAgIC8qIG5lZWQgdG8gcmVtb3ZlIGFsbCBwZW5kaW5nIGJhY2tncm91bmQgY29ubmVjdGlvbiBpZiBhbnkgKi8KLSAgICAgICAgQlRBX0dBVFRDX0NhbmNlbE9wZW4oMCwgcF9yZW1vdmVfYWNsLT5iZF9hZGRyLCBGQUxTRSk7CisgICAgICAgIEJUQV9HQVRUQ19DYW5jZWxPcGVuKDAsIHBfcmVtb3ZlX2FjbC0+YmRfYWRkciwgZmFsc2UpOwogICAgICAgICAvKiByZW1vdmUgYWxsIGNhY2hlZCBHQVRUIGluZm9ybWF0aW9uICovCiAgICAgICAgIEJUQV9HQVRUQ19SZWZyZXNoKHBfcmVtb3ZlX2FjbC0+YmRfYWRkcik7CiAjZW5kaWYKQEAgLTkwNiwxMSArOTA2LDExIEBACiAKICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBsaW5rIHR5cGUgPSAlZCIsIF9fZnVuY19fLCBsaW5rX3R5cGUpOwogCi0gICAgZm9yIChVSU5UOCBpPTA7IGkgPCBidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQ7IGkrKykKKyAgICBmb3IgKHVpbnQ4X3QgaT0wOyBpIDwgYnRhX2RtX2NiLmRldmljZV9saXN0LmNvdW50OyBpKyspCiAgICAgewogICAgICAgICBCRF9BRERSIGFkZHIgPSB7MH07CiAgICAgICAgIGJkY3B5KGFkZHIsIGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5wZWVyX2RldmljZVtpXS5wZWVyX2JkYWRkcik7Ci0jaWYgZGVmaW5lZCAoQkxFX0lOQ0xVREVEKSAmJiAoQkxFX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogICAgICAgICB0cmFuc3BvcnQgPSBidGFfZG1fY2IuZGV2aWNlX2xpc3QucGVlcl9kZXZpY2VbaV0udHJhbnNwb3J0OwogI2VuZGlmCiAgICAgICAgIGlmICgobGlua190eXBlID09IEJUQV9ETV9MSU5LX1RZUEVfQUxMKSB8fApAQCAtOTU5LDEzICs5NTksMTMgQEAKICAgICAgICAgfQogCiAvKiAgICAgIHRha2VuIGNhcmUgb2YgYnkgbWVtc2V0IFthYm92ZV0KLSAgICAgICAgc2VjX2V2ZW50LmF1dGhfY21wbC5rZXlfcHJlc2VudCA9IEZBTFNFOwotICAgICAgICBzZWNfZXZlbnQuYXV0aF9jbXBsLnN1Y2Nlc3MgPSBGQUxTRTsKKyAgICAgICAgc2VjX2V2ZW50LmF1dGhfY21wbC5rZXlfcHJlc2VudCA9IGZhbHNlOworICAgICAgICBzZWNfZXZlbnQuYXV0aF9jbXBsLnN1Y2Nlc3MgPSBmYWxzZTsKICovCiAgICAgICAgIHNlY19ldmVudC5hdXRoX2NtcGwuZmFpbF9yZWFzb24gPSBIQ0lfRVJSX0lMTEVHQUxfQ09NTUFORDsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBCVE1fU1VDQ0VTUykKICAgICAgICAgewotICAgICAgICAgICAgc2VjX2V2ZW50LmF1dGhfY21wbC5zdWNjZXNzID0gVFJVRTsKKyAgICAgICAgICAgIHNlY19ldmVudC5hdXRoX2NtcGwuc3VjY2VzcyA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CkBAIC0xMDE2LDggKzEwMTYsOCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2RtX3Bpbl9yZXBseSAodEJUQV9ETV9NU0cgKnBfZGF0YSkKIHsKLSAgICBVSU5UMzIgIHRydXN0ZWRfbWFza1tCVE1fU0VDX1NFUlZJQ0VfQVJSQVlfU0laRV07Ci0gICAgVUlOVDMyICAqIGN1cnJlbnRfdHJ1c3RlZF9tYXNrOworICAgIHVpbnQzMl90ICB0cnVzdGVkX21hc2tbQlRNX1NFQ19TRVJWSUNFX0FSUkFZX1NJWkVdOworICAgIHVpbnQzMl90ICAqIGN1cnJlbnRfdHJ1c3RlZF9tYXNrOwogCiAgICAgY3VycmVudF90cnVzdGVkX21hc2sgPSBCVE1fUmVhZFRydXN0ZWRNYXNrKHBfZGF0YS0+cGluX3JlcGx5LmJkX2FkZHIpOwogCkBAIC0xMDUxLDExICsxMDUxLDExIEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2RtX3BvbGljeV9jYmFjayh0QlRBX1NZU19DT05OX1NUQVRVUyBzdGF0dXMsIFVJTlQ4IGlkLCBVSU5UOCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKQorc3RhdGljIHZvaWQgYnRhX2RtX3BvbGljeV9jYmFjayh0QlRBX1NZU19DT05OX1NUQVRVUyBzdGF0dXMsIHVpbnQ4X3QgaWQsIHVpbnQ4X3QgYXBwX2lkLCBCRF9BRERSIHBlZXJfYWRkcikKIHsKICAgICB0QlRBX0RNX1BFRVJfREVWSUNFICpwX2RldiA9IE5VTEw7Ci0gICAgVUlOVDE2ICBwb2xpY3kgPSBhcHBfaWQ7Ci0gICAgVUlOVDMyICBtYXNrID0gKFVJTlQzMikoMSA8PCBpZCk7CisgICAgdWludDE2X3QgIHBvbGljeSA9IGFwcF9pZDsKKyAgICB1aW50MzJfdCAgbWFzayA9ICh1aW50MzJfdCkoMSA8PCBpZCk7CiAKICAgICBpZihwZWVyX2FkZHIpCiAgICAgICAgIHBfZGV2ID0gYnRhX2RtX2ZpbmRfcGVlcl9kZXZpY2UocGVlcl9hZGRyKTsKQEAgLTExMjAsNyArMTEyMCw3IEBACiB7CiAgICAgdEJUTV9TVEFUVVMgcmVzID0gQlRNX05PVF9BVVRIT1JJWkVEOwogCi0gICAgaWYocF9kYXRhLT5jb25maXJtLmFjY2VwdCA9PSBUUlVFKQorICAgIGlmKHBfZGF0YS0+Y29uZmlybS5hY2NlcHQgPT0gdHJ1ZSkKICAgICAgICAgcmVzID0gQlRNX1NVQ0NFU1M7CiAgICAgQlRNX0NvbmZpcm1SZXFSZXBseShyZXMsIHBfZGF0YS0+Y29uZmlybS5iZF9hZGRyKTsKIH0KQEAgLTExNzIsNyArMTE3Miw3IEBACiB7CiAgICAgdEJUTV9TVEFUVVMgcmVzID0gQlRNX05PVF9BVVRIT1JJWkVEOwogCi0gICAgaWYocF9kYXRhLT5jaV9ybXRfb29iLmFjY2VwdCA9PSBUUlVFKQorICAgIGlmKHBfZGF0YS0+Y2lfcm10X29vYi5hY2NlcHQgPT0gdHJ1ZSkKICAgICAgICAgcmVzID0gQlRNX1NVQ0NFU1M7CiAgICAgQlRNX1JlbW90ZU9vYkRhdGFSZXBseShyZXMsIHBfZGF0YS0+Y2lfcm10X29vYi5iZF9hZGRyLAogICAgICAgICBwX2RhdGEtPmNpX3JtdF9vb2IuYywgcF9kYXRhLT5jaV9ybXRfb29iLnIgKTsKQEAgLTEyNTgsNyArMTI1OCw3IEBACiAgICAgICAgICAgICBidGFfc3lzX3NlbmRtc2cocF9tc2cpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogZmxhZyBhIHNlYXJjaCBjYW5jZWwgaXMgcGVuZGluZyAqLwotICAgICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5jYW5jZWxfcGVuZGluZyA9IFRSVUU7CisgICAgICAgICAgICBidGFfZG1fc2VhcmNoX2NiLmNhbmNlbF9wZW5kaW5nID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICAvKiBJZiBubyBTZXJ2aWNlIFNlYXJjaCBnb2luZyBvbiB0aGVuIGlzc3VlIGNhbmNlbCByZW1vdGUgbmFtZSBpbiBjYXNlIGl0IGlzIGFjdGl2ZSAqLwpAQCAtMTI3Nyw3ICsxMjc3LDcgQEAKICAgICAgICAgYnRhX3N5c19zZW5kbXNnKHBfbXNnKTsKICAgICB9CiAKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRSAmJiBCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFICYmIEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCiAgICAgaWYgKGJ0YV9kbV9zZWFyY2hfY2IuZ2F0dF9kaXNjX2FjdGl2ZSkKICAgICB7CiAgICAgICAgIGJ0YV9kbV9jYW5jZWxfZ2F0dF9kaXNjb3ZlcnkoYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkcik7CkBAIC0xMjk3LDcgKzEyOTcsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2RtX2Rpc2NvdmVyICh0QlRBX0RNX01TRyAqcF9kYXRhKQogewotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFICYmIEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRSkKICAgICBzaXplX3QgbGVuID0gc2l6ZW9mKHRCVF9VVUlEKSAqIHBfZGF0YS0+ZGlzY292ZXIubnVtX3V1aWQ7CiAjZW5kaWYKICAgICBBUFBMX1RSQUNFX0VWRU5UKCIlcyBzZXJ2aWNlc190b19zZWFyY2g9MHglMDRYLCBzZHBfc2VhcmNoPSVkIiwgX19mdW5jX18sCkBAIC0xMzA2LDcgKzEzMDYsNyBAQAogICAgIC8qIHNhdmUgdGhlIHNlYXJjaCBjb25kaXRpb24gKi8KICAgICBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzID0gcF9kYXRhLT5kaXNjb3Zlci5zZXJ2aWNlczsKIAotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFICYmIEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRSkKICAgICBidGFfZG1fZ2F0dGNfcmVnaXN0ZXIoKTsKICAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQgKiopJmJ0YV9kbV9zZWFyY2hfY2IucF9zcnZjX3V1aWQpOwogICAgIGlmICgoYnRhX2RtX3NlYXJjaF9jYi5udW1fdXVpZCA9IHBfZGF0YS0+ZGlzY292ZXIubnVtX3V1aWQpICE9IDAgJiYKQEAgLTEzMjcsNyArMTMyNyw3IEBACiAgICAgYnRhX2RtX3NlYXJjaF9jYi5wX2J0bV9pbnFfaW5mbyA9IEJUTV9JbnFEYlJlYWQgKHBfZGF0YS0+ZGlzY292ZXIuYmRfYWRkcik7CiAgICAgYnRhX2RtX3NlYXJjaF9jYi50cmFuc3BvcnQgPSBwX2RhdGEtPmRpc2NvdmVyLnRyYW5zcG9ydDsKIAotICAgIGJ0YV9kbV9zZWFyY2hfY2IubmFtZV9kaXNjb3Zlcl9kb25lID0gRkFMU0U7CisgICAgYnRhX2RtX3NlYXJjaF9jYi5uYW1lX2Rpc2NvdmVyX2RvbmUgPSBmYWxzZTsKICAgICBtZW1jcHkoJmJ0YV9kbV9zZWFyY2hfY2IudXVpZCwgJnBfZGF0YS0+ZGlzY292ZXIudXVpZCwgc2l6ZW9mKHRTRFBfVVVJRCkpOwogICAgIGJ0YV9kbV9kaXNjb3Zlcl9kZXZpY2UocF9kYXRhLT5kaXNjb3Zlci5iZF9hZGRyKTsKIH0KQEAgLTEzNzAsNyArMTM3MCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2RtX2RpX2Rpc2NfY2FsbGJhY2soVUlOVDE2IHJlc3VsdCkKK3N0YXRpYyB2b2lkIGJ0YV9kbV9kaV9kaXNjX2NhbGxiYWNrKHVpbnQxNl90IHJlc3VsdCkKIHsKICAgICB0QlRBX0RNX01TRyAqcF9tc2cgPSAodEJUQV9ETV9NU0cgKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0RNX01TRykpOwogCkBAIC0xNDIyLDcgKzE0MjIsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2RtX2RpX2Rpc2MgKHRCVEFfRE1fTVNHICpwX2RhdGEpCiB7Ci0gICAgVUlOVDE2ICByZXN1bHQgPSBCVEFfRkFJTFVSRTsKKyAgICB1aW50MTZfdCAgcmVzdWx0ID0gQlRBX0ZBSUxVUkU7CiAKICAgICBidGFfZG1fc2VhcmNoX2NiLnBfc2VhcmNoX2NiYWNrID0gcF9kYXRhLT5kaV9kaXNjLnBfY2JhY2s7CiAgICAgYmRjcHkoYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkciwgcF9kYXRhLT5kaV9kaXNjLmJkX2FkZHIpOwpAQCAtMTQ1MSwxMCArMTQ1MSwxMCBAQAogKioKICoqIERlc2NyaXB0aW9uICAgICAgSW5pdGlhdGUgdG8gZ2V0IHJlbW90ZSBkZXZpY2UgbmFtZQogKioKLSoqIFJldHVybnMgICAgICAgICAgVFJVRSBpZiBzdGFydGVkIHRvIGdldCByZW1vdGUgbmFtZQorKiogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHN0YXJ0ZWQgdG8gZ2V0IHJlbW90ZSBuYW1lCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBCT09MRUFOIGJ0YV9kbV9yZWFkX3JlbW90ZV9kZXZpY2VfbmFtZSAoQkRfQUREUiBiZF9hZGRyLHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KQorc3RhdGljIGJvb2wgYnRhX2RtX3JlYWRfcmVtb3RlX2RldmljZV9uYW1lIChCRF9BRERSIGJkX2FkZHIsdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpCiB7CiAgICAgdEJUTV9TVEFUVVMgIGJ0bV9zdGF0dXM7CiAKQEAgLTE0NzEsNyArMTQ3MSw3IEBACiAgICAgewogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfZG1fcmVhZF9yZW1vdGVfZGV2aWNlX25hbWU6IEJUTV9SZWFkUmVtb3RlRGV2aWNlTmFtZSBpcyBzdGFydGVkIik7CiAKLSAgICAgICAgcmV0dXJuIChUUlVFKTsKKyAgICAgICAgcmV0dXJuICh0cnVlKTsKICAgICB9CiAgICAgZWxzZSBpZiAoIGJ0bV9zdGF0dXMgPT0gQlRNX0JVU1kgKQogICAgIHsKQEAgLTE0ODEsMTMgKzE0ODEsMTMgQEAKICAgICAgICAgLyogYWRkaW5nIGNhbGxiYWNrIHRvIGdldCBub3RpZmllZCB0aGF0IGN1cnJlbnQgcmVhZGluZyByZW1vcmUgbmFtZSBkb25lICovCiAgICAgICAgIEJUTV9TZWNBZGRSbXROYW1lTm90aWZ5Q2FsbGJhY2soJmJ0YV9kbV9zZXJ2aWNlX3NlYXJjaF9yZW1uYW1lX2NiYWNrKTsKIAotICAgICAgICByZXR1cm4gKFRSVUUpOworICAgICAgICByZXR1cm4gKHRydWUpOwogICAgIH0KICAgICBlbHNlCiAgICAgewogICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoImJ0YV9kbV9yZWFkX3JlbW90ZV9kZXZpY2VfbmFtZTogQlRNX1JlYWRSZW1vdGVEZXZpY2VOYW1lIHJldHVybnMgMHglMDJYIiwgYnRtX3N0YXR1cyk7CiAKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgICAgIHJldHVybiAoZmFsc2UpOwogICAgIH0KIH0KIApAQCAtMTUxMiw3ICsxNTEyLDcgQEAKICAgICBpZigoYnRhX2RtX3NlYXJjaF9jYi5wX2J0bV9pbnFfaW5mbyA9IEJUTV9JbnFEYkZpcnN0KCkpICE9IE5VTEwpCiAgICAgewogICAgICAgICAvKiBzdGFydCBuYW1lIGFuZCBzZXJ2aWNlIGRpc2NvdmVyeSBmcm9tIHRoZSBmaXJzdCBkZXZpY2Ugb24gaW5xdWlyeSByZXN1bHQgKi8KLSAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5uYW1lX2Rpc2NvdmVyX2RvbmUgPSBGQUxTRTsKKyAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5uYW1lX2Rpc2NvdmVyX2RvbmUgPSBmYWxzZTsKICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5wZWVyX25hbWVbMF0gICAgICAgPSAwOwogICAgICAgICBidGFfZG1fZGlzY292ZXJfZGV2aWNlKGJ0YV9kbV9zZWFyY2hfY2IucF9idG1faW5xX2luZm8tPnJlc3VsdHMucmVtb3RlX2JkX2FkZHIpOwogICAgIH0gZWxzZSB7CkBAIC0xNTQyLDcgKzE1NDIsNyBAQAogCiAgICAgaWYoIHBfZGF0YS0+cmVtX25hbWUucmVzdWx0LmRpc2NfcmVzLmJkX25hbWVbMF0gJiYgYnRhX2RtX3NlYXJjaF9jYi5wX2J0bV9pbnFfaW5mbykKICAgICB7Ci0gICAgICAgIGJ0YV9kbV9zZWFyY2hfY2IucF9idG1faW5xX2luZm8tPmFwcGxfa25vd3NfcmVtX25hbWUgPSBUUlVFOworICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnBfYnRtX2lucV9pbmZvLT5hcHBsX2tub3dzX3JlbV9uYW1lID0gdHJ1ZTsKICAgICB9CiAKICAgICBidGFfZG1fZGlzY292ZXJfZGV2aWNlKGJ0YV9kbV9zZWFyY2hfY2IucGVlcl9iZGFkZHIpOwpAQCAtMTU2OSw3ICsxNTY5LDcgQEAKICAgICB7CiAgICAgICAgIGlmKCBwX2RhdGEtPnJlbV9uYW1lLnJlc3VsdC5kaXNjX3Jlcy5iZF9uYW1lWzBdICkKICAgICAgICAgewotICAgICAgICAgICAgcF9idG1faW5xX2luZm8tPmFwcGxfa25vd3NfcmVtX25hbWUgPSBUUlVFOworICAgICAgICAgICAgcF9idG1faW5xX2luZm8tPmFwcGxfa25vd3NfcmVtX25hbWUgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNTkwLDE4ICsxNTkwLDE4IEBACiAKICAgICB0U0RQX0RJU0NfUkVDICAgKnBfc2RwX3JlYyA9IE5VTEw7CiAgICAgdEJUQV9ETV9NU0cgICAgICpwX21zZzsKLSAgICBCT09MRUFOICAgICAgICAgIHNjbl9mb3VuZCA9IEZBTFNFOwotICAgIFVJTlQxNiAgICAgICAgICAgc2VydmljZSA9IDB4RkZGRjsKKyAgICBib29sICAgICAgICAgIHNjbl9mb3VuZCA9IGZhbHNlOworICAgIHVpbnQxNl90ICAgICAgICAgICBzZXJ2aWNlID0gMHhGRkZGOwogICAgIHRTRFBfUFJPVE9DT0xfRUxFTSAgcGU7CiAKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRSAmJiBCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFICYmIEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCiAgICAgdEJUX1VVSUQgICAgICAgICAgICpwX3V1aWQgPSBidGFfZG1fc2VhcmNoX2NiLnBfc3J2Y191dWlkOwogICAgIHRCVEFfRE1fU0VBUkNIICAgICAgcmVzdWx0OwogICAgIHRCVF9VVUlEICAgICAgICAgICAgc2VydmljZV91dWlkOwogI2VuZGlmCiAKLSAgICBVSU5UMzIgbnVtX3V1aWRzID0gMDsKLSAgICBVSU5UOCAgdXVpZF9saXN0WzMyXVtNQVhfVVVJRF9TSVpFXTsgLy8gYXNzdW1pbmcgYSBtYXggb2YgMzIgc2VydmljZXMKKyAgICB1aW50MzJfdCBudW1fdXVpZHMgPSAwOworICAgIHVpbnQ4X3QgIHV1aWRfbGlzdFszMl1bTUFYX1VVSURfU0laRV07IC8vIGFzc3VtaW5nIGEgbWF4IG9mIDMyIHNlcnZpY2VzCiAKICAgICBpZigocF9kYXRhLT5zZHBfZXZlbnQuc2RwX3Jlc3VsdCA9PSBTRFBfU1VDQ0VTUykKICAgICAgICAgfHwgKHBfZGF0YS0+c2RwX2V2ZW50LnNkcF9yZXN1bHQgPT0gU0RQX05PX1JFQ1NfTUFUQ0gpCkBAIC0xNjE4LDggKzE2MTgsOCBAQAogCiAgICAgICAgICAgICAgICAgaWYgKHBfc2RwX3JlYyAmJiBTRFBfRmluZFByb3RvY29sTGlzdEVsZW1JblJlYyhwX3NkcF9yZWMsIFVVSURfUFJPVE9DT0xfUkZDT01NLCAmcGUpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5wZWVyX3NjbiA9IChVSU5UOCkgcGUucGFyYW1zWzBdOwotICAgICAgICAgICAgICAgICAgICBzY25fZm91bmQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnBlZXJfc2NuID0gKHVpbnQ4X3QpIHBlLnBhcmFtc1swXTsKKyAgICAgICAgICAgICAgICAgICAgc2NuX2ZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCkBAIC0xNjI3LDcgKzE2MjcsNyBAQAogICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBidGFfc2VydmljZV9pZF90b191dWlkX2xrdXBfdGJsW2J0YV9kbV9zZWFyY2hfY2Iuc2VydmljZV9pbmRleC0xXTsKICAgICAgICAgICAgICAgICBwX3NkcF9yZWMgPSBTRFBfRmluZFNlcnZpY2VJbkRiKGJ0YV9kbV9zZWFyY2hfY2IucF9zZHBfZGIsIHNlcnZpY2UsIHBfc2RwX3JlYyk7CiAgICAgICAgICAgICB9Ci0jaWYgQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSAmJiBCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFKQogICAgICAgICAgICAgLyogZmluaXNoZWQgd2l0aCBCUi9FRFIgc2VydmljZXMsIG5vdyB3ZSBjaGVjayB0aGUgcmVzdWx0IGZvciBHQVRUIGJhc2VkIHNlcnZpY2UgVVVJRCAqLwogICAgICAgICAgICAgaWYgKGJ0YV9kbV9zZWFyY2hfY2Iuc2VydmljZV9pbmRleCA9PSBCVEFfTUFYX1NFUlZJQ0VfSUQpCiAgICAgICAgICAgICB7CkBAIC0xNjc0LDcgKzE2NzQsNyBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gVVVJRF9TRVJWQ0xBU1NfUE5QX0lORk9STUFUSU9OKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgdG1wX3N2YyA9IDB4RkZGRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHRtcF9zdmMgPSAweEZGRkY7CiAgICAgICAgICAgICAgICAgICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzX2ZvdW5kIHw9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRCVEFfU0VSVklDRV9NQVNLKShCVEFfU0VSVklDRV9JRF9UT19TRVJWSUNFX01BU0soYnRhX2RtX3NlYXJjaF9jYi5zZXJ2aWNlX2luZGV4LTEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9zdmMgPSBidGFfc2VydmljZV9pZF90b191dWlkX2xrdXBfdGJsW2J0YV9kbV9zZWFyY2hfY2Iuc2VydmljZV9pbmRleC0xXTsKQEAgLTE2ODgsNyArMTY4OCw3IEBACiAgICAgICAgICAgICBpZihidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzID09IEJUQV9BTExfU0VSVklDRV9NQVNLICYmCiAgICAgICAgICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5zZXJ2aWNlc190b19zZWFyY2ggPT0gMCkKICAgICAgICAgICAgIHsKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRSAmJiBCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFICYmIEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCiAgICAgICAgICAgICAgICAgaWYgKCBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VfaW5kZXggPT0gQlRBX0JMRV9TRVJWSUNFX0lEICYmCiAgICAgICAgICAgICAgICAgICAgIGJ0YV9kbV9zZWFyY2hfY2IudXVpZF90b19zZWFyY2ggPiAwKQogICAgICAgICAgICAgICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnV1aWRfdG9fc2VhcmNoIC0tOwpAQCAtMTcwMyw3ICsxNzAzLDcgQEAKIAogICAgICAgICB9IHdoaWxlIChidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VfaW5kZXggPD0gQlRBX01BWF9TRVJWSUNFX0lEKTsKIAotICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBzZXJ2aWNlc19mb3VuZCA9ICUwNHgiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIHNlcnZpY2VzX2ZvdW5kID0gJTA0eCIsIF9fZnVuY19fLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9kbV9zZWFyY2hfY2Iuc2VydmljZXNfZm91bmQpOwogCiAgICAgICAgIC8qIENvbGxlY3QgdGhlIDEyOC1iaXQgc2VydmljZXMgaGVyZSBhbmQgcHV0IHRoZW0gaW50byB0aGUgbGlzdCAqLwpAQCAtMTc0OCw3ICsxNzQ4LDcgQEAKICAgICAgICAgICAgIHBfbXNnLT5kaXNjX3Jlc3VsdC5yZXN1bHQuZGlzY19yZXMucF91dWlkX2xpc3QgPSBOVUxMOwogICAgICAgICAgICAgaWYgKG51bV91dWlkcyA+IDApIHsKICAgICAgICAgICAgICAgICBwX21zZy0+ZGlzY19yZXN1bHQucmVzdWx0LmRpc2NfcmVzLnBfdXVpZF9saXN0ID0KLSAgICAgICAgICAgICAgICAgICAgKFVJTlQ4ICopb3NpX21hbGxvYyhudW1fdXVpZHMgKiBNQVhfVVVJRF9TSVpFKTsKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKilvc2lfbWFsbG9jKG51bV91dWlkcyAqIE1BWF9VVUlEX1NJWkUpOwogICAgICAgICAgICAgICAgIG1lbWNweShwX21zZy0+ZGlzY19yZXN1bHQucmVzdWx0LmRpc2NfcmVzLnBfdXVpZF9saXN0LAogICAgICAgICAgICAgICAgICAgICAgICB1dWlkX2xpc3QsIG51bV91dWlkcyAqIE1BWF9VVUlEX1NJWkUpOwogICAgICAgICAgICAgfQpAQCAtMTgwMCw3ICsxODAwLDcgQEAKICAgICAgICAgLyogY29ubiBmYWlsZWQuIE5vIG5lZWQgZm9yIHRpbWVyICovCiAgICAgICAgIGlmKHBfZGF0YS0+c2RwX2V2ZW50LnNkcF9yZXN1bHQgPT0gU0RQX0NPTk5fRkFJTEVEIHx8IHBfZGF0YS0+c2RwX2V2ZW50LnNkcF9yZXN1bHQgPT0gU0RQX0NPTk5fUkVKRUNURUQKICAgICAgICAgICAgfHwgcF9kYXRhLT5zZHBfZXZlbnQuc2RwX3Jlc3VsdCA9PSBTRFBfU0VDVVJJVFlfRVJSKQotICAgICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi53YWl0X2Rpc2MgPSBGQUxTRTsKKyAgICAgICAgICAgIGJ0YV9kbV9zZWFyY2hfY2Iud2FpdF9kaXNjID0gZmFsc2U7CiAKICAgICAgICAgLyogbm90IGFibGUgdG8gY29ubmVjdCBnbyB0byBuZXh0IGRldmljZSAqLwogICAgICAgICBpZiAoYnRhX2RtX3NlYXJjaF9jYi5wX3NkcF9kYikKQEAgLTE4NTcsNyArMTg1Nyw3IEBACiB7CiAgICAgQVBQTF9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7CiAKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRSAmJiBCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFICYmIEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCiAgICAgLyogaWYgYW55IEJSL0VEUiBzZXJ2aWNlIGRpc2NvdmVyeSBoYXMgYmVlbiBkb25lLCByZXBvcnQgdGhlIGV2ZW50ICovCiAgICAgaWYgKChidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzICYgKChCVEFfQUxMX1NFUlZJQ0VfTUFTSyB8IEJUQV9VU0VSX1NFUlZJQ0VfTUFTSyApICYgfkJUQV9CTEVfU0VSVklDRV9NQVNLKSkpCiAjZW5kaWYKQEAgLTE5MDMsNyArMTkwMyw3IEBACiAgICAgZWxzZQogICAgIHsKICAgICAgICAgLyogd2FpdCB1bnRpbCBsaW5rIGlzIGRpc2Nvbm5lY3RlZCBvciB0aW1lb3V0ICovCi0gICAgICAgIGJ0YV9kbV9zZWFyY2hfY2Iuc2RwX3Jlc3VsdHMgPSBUUlVFOworICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnNkcF9yZXN1bHRzID0gdHJ1ZTsKICAgICAgICAgYWxhcm1fc2V0X29uX3F1ZXVlKGJ0YV9kbV9zZWFyY2hfY2Iuc2VhcmNoX3RpbWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCAqIChMMkNBUF9MSU5LX0lOQUNUSVZJVFlfVE9VVCArIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2RtX3NlYXJjaF90aW1lcl9jYmFjaywgTlVMTCwKQEAgLTE5MjQsNyArMTkyNCw3IEBACiBzdGF0aWMgdm9pZCBidGFfZG1fc2VhcmNoX3RpbWVyX2NiYWNrKFVOVVNFRF9BVFRSIHZvaWQgKmRhdGEpCiB7CiAgICAgQVBQTF9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0gICAgYnRhX2RtX3NlYXJjaF9jYi53YWl0X2Rpc2MgPSBGQUxTRTsKKyAgICBidGFfZG1fc2VhcmNoX2NiLndhaXRfZGlzYyA9IGZhbHNlOwogCiAgICAgLyogcHJvY2VlZCB3aXRoIG5leHQgZGV2aWNlICovCiAgICAgYnRhX2RtX2Rpc2NvdmVyX25leHRfZGV2aWNlKCk7CkBAIC0yMTAxLDcgKzIxMDEsNyBAQAogICAgICAgICAgICAgICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzX3RvX3NlYXJjaCA9IDA7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRSAmJiBCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFICYmIEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCiAgICAgICAgICAgICAgICAgLyogZm9yIExFIG9ubHkgcHJvZmlsZSAqLwogICAgICAgICAgICAgICAgIGlmIChidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VfaW5kZXggPT0gQlRBX0JMRV9TRVJWSUNFX0lEKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChidGFfZG1fc2VhcmNoX2NiLnV1aWRfdG9fc2VhcmNoID4gMCAmJgpAQCAtMjE1OCw3ICsyMTU4LDcgQEAKICAgICAgICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5zZXJ2aWNlX2luZGV4ID0gQlRBX01BWF9TRVJWSUNFX0lEOwogCiAgICAgICAgICAgICB9IGVsc2UgewotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFICYmIEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRSkKICAgICAgICAgICAgICAgICBpZiAoKGJ0YV9kbV9zZWFyY2hfY2Iuc2VydmljZV9pbmRleCA9PSBCVEFfQkxFX1NFUlZJQ0VfSUQgJiYKICAgICAgICAgICAgICAgICAgICAgIGJ0YV9kbV9zZWFyY2hfY2IudXVpZF90b19zZWFyY2ggPT0gMCkgfHwKICAgICAgICAgICAgICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5zZXJ2aWNlX2luZGV4ICE9IEJUQV9CTEVfU0VSVklDRV9JRCkKQEAgLTIxOTksNyArMjE5OSw3IEBACiAKICAgICAvKiBzZWFyY2hpbmcgbmV4dCBkZXZpY2Ugb24gaW5xdWlyeSByZXN1bHQgKi8KICAgICBpZigoYnRhX2RtX3NlYXJjaF9jYi5wX2J0bV9pbnFfaW5mbyA9IEJUTV9JbnFEYk5leHQoYnRhX2RtX3NlYXJjaF9jYi5wX2J0bV9pbnFfaW5mbykpICE9IE5VTEwpIHsKLSAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5uYW1lX2Rpc2NvdmVyX2RvbmUgPSBGQUxTRTsKKyAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5uYW1lX2Rpc2NvdmVyX2RvbmUgPSBmYWxzZTsKICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5wZWVyX25hbWVbMF0gICAgICAgPSAwOwogICAgICAgICBidGFfZG1fZGlzY292ZXJfZGV2aWNlKGJ0YV9kbV9zZWFyY2hfY2IucF9idG1faW5xX2luZm8tPnJlc3VsdHMucmVtb3RlX2JkX2FkZHIpOwogICAgIH0gZWxzZSB7CkBAIC0yMjI4LDggKzIyMjgsNyBAQAogc3RhdGljIHZvaWQgYnRhX2RtX2Rpc2NvdmVyX2RldmljZShCRF9BRERSIHJlbW90ZV9iZF9hZGRyKQogewogICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0ID0gQlRfVFJBTlNQT1JUX0JSX0VEUjsKLQotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogICAgIGlmIChidGFfZG1fc2VhcmNoX2NiLnRyYW5zcG9ydCA9PSBCVEFfVFJBTlNQT1JUX1VOS05PV04pCiAgICAgewogICAgICAgICB0QlRfREVWSUNFX1RZUEUgZGV2X3R5cGU7CkBAIC0yMjY1LDEzICsyMjY0LDEzIEBACiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIGFwcGxfa25vd3NfcmVtX25hbWUgJWQiLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnBfYnRtX2lucV9pbmZvLT5hcHBsX2tub3dzX3JlbV9uYW1lKTsKICAgICB9Ci0jaWYgKGRlZmluZWQoQkxFX0lOQ0xVREVEKSAmJiBCTEVfSU5DTFVERUQgPT0gVFJVRSkKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUpCiAgICAgaWYoKGJ0YV9kbV9zZWFyY2hfY2IucF9idG1faW5xX2luZm8pCiAgICAgICAgJiYgKGJ0YV9kbV9zZWFyY2hfY2IucF9idG1faW5xX2luZm8tPnJlc3VsdHMuZGV2aWNlX3R5cGUgPT0gQlRfREVWSUNFX1RZUEVfQkxFKQogICAgICAgICYmIChidGFfZG1fc2VhcmNoX2NiLnN0YXRlID09IEJUQV9ETV9TRUFSQ0hfQUNUSVZFKSkKICAgICB7CiAgICAgICAgIC8qIERvIG5vdCBwZXJmb3JtIFJOUiBmb3IgTEUgZGV2aWNlcyBhdCBpbnF1aXJ5IGNvbXBsZXRlKi8KLSAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5uYW1lX2Rpc2NvdmVyX2RvbmUgPSBUUlVFOworICAgICAgICBidGFfZG1fc2VhcmNoX2NiLm5hbWVfZGlzY292ZXJfZG9uZSA9IHRydWU7CiAgICAgfQogI2VuZGlmCiAgICAgLyogaWYgbmFtZSBkaXNjb3ZlcnkgaXMgbm90IGRvbmUgYW5kIGFwcGxpY2F0aW9uIG5lZWRzIHJlbW90ZSBuYW1lICovCkBAIC0yMjc5LDExICsyMjc4LDExIEBACiAgICAgICAgJiYgKCggYnRhX2RtX3NlYXJjaF9jYi5wX2J0bV9pbnFfaW5mbyA9PSBOVUxMICkKICAgICAgICAgICAgIHx8KGJ0YV9kbV9zZWFyY2hfY2IucF9idG1faW5xX2luZm8gJiYgKCFidGFfZG1fc2VhcmNoX2NiLnBfYnRtX2lucV9pbmZvLT5hcHBsX2tub3dzX3JlbV9uYW1lKSkpKQogICAgIHsKLSAgICAgICAgaWYgKGJ0YV9kbV9yZWFkX3JlbW90ZV9kZXZpY2VfbmFtZShidGFfZG1fc2VhcmNoX2NiLnBlZXJfYmRhZGRyLCB0cmFuc3BvcnQpID09IFRSVUUpCisgICAgICAgIGlmIChidGFfZG1fcmVhZF9yZW1vdGVfZGV2aWNlX25hbWUoYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkciwgdHJhbnNwb3J0KSA9PSB0cnVlKQogICAgICAgICAgICAgcmV0dXJuOwogCiAgICAgICAgIC8qIHN0YXJ0aW5nIG5hbWUgZGlzY292ZXJ5IGZhaWxlZCAqLwotICAgICAgICBidGFfZG1fc2VhcmNoX2NiLm5hbWVfZGlzY292ZXJfZG9uZSA9IFRSVUU7CisgICAgICAgIGJ0YV9kbV9zZWFyY2hfY2IubmFtZV9kaXNjb3Zlcl9kb25lID0gdHJ1ZTsKICAgICB9CiAKICAgICAvKiBpZiBhcHBsaWNhdGlvbiB3YW50cyB0byBkaXNjb3ZlciBzZXJ2aWNlICovCkBAIC0yMjkzLDEyICsyMjkyLDEyIEBACiAgICAgICAgIGJ0YV9kbV9zZWFyY2hfY2Iuc2VydmljZV9pbmRleCAgICAgID0gMDsKICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5zZXJ2aWNlc19mb3VuZCAgICAgPSAwOwogICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzX3RvX3NlYXJjaCA9IGJ0YV9kbV9zZWFyY2hfY2Iuc2VydmljZXM7Ci0jaWYgQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSAmJiBCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFKQogICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnV1aWRfdG9fc2VhcmNoICAgICA9IGJ0YV9kbV9zZWFyY2hfY2IubnVtX3V1aWQ7CiAjZW5kaWYKICAgICAgICAgaWYgKChidGFfZG1fc2VhcmNoX2NiLnBfYnRtX2lucV9pbmZvICE9IE5VTEwpICYmCiAgICAgICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzICE9IEJUQV9VU0VSX1NFUlZJQ0VfTUFTSwotICAgICAgICAgICAgJiYoYnRhX2RtX3NlYXJjaF9jYi5zZHBfc2VhcmNoID09IEZBTFNFKSkKKyAgICAgICAgICAgICYmKGJ0YV9kbV9zZWFyY2hfY2Iuc2RwX3NlYXJjaCA9PSBmYWxzZSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIC8qIGNoZWNrIGlmIEVJUiBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygc3VwcG9ydGVkIHNlcnZpY2VzICovCiAgICAgICAgICAgICBidGFfZG1fZWlyX3NlYXJjaF9zZXJ2aWNlcyggJmJ0YV9kbV9zZWFyY2hfY2IucF9idG1faW5xX2luZm8tPnJlc3VsdHMsCkBAIC0yMzEzLDExICsyMzEyLDExIEBACiAgICAgICAgICAgICAgICBpZiBjb25uZWN0aW9uIGV4aXN0cywgd2UgZG9uJ3QgaGF2ZSB0byB3YWl0IGZvciBBQ0wKICAgICAgICAgICAgICAgIGxpbmsgdG8gZ28gZG93biB0byBzdGFydCBzZWFyY2ggb24gbmV4dCBkZXZpY2UgKi8KICAgICAgICAgICAgIGlmIChCVE1fSXNBY2xDb25uZWN0aW9uVXAoYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkciwgQlRfVFJBTlNQT1JUX0JSX0VEUikpCi0gICAgICAgICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi53YWl0X2Rpc2MgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBidGFfZG1fc2VhcmNoX2NiLndhaXRfZGlzYyA9IGZhbHNlOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGJ0YV9kbV9zZWFyY2hfY2Iud2FpdF9kaXNjID0gVFJVRTsKKyAgICAgICAgICAgICAgICBidGFfZG1fc2VhcmNoX2NiLndhaXRfZGlzYyA9IHRydWU7CiAKLSNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgKGRlZmluZWQgQlRBX0dBVFRfSU5DTFVERUQpICYmIChCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFKSkKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRSkKICAgICAgICAgICAgIGlmICggYnRhX2RtX3NlYXJjaF9jYi5wX2J0bV9pbnFfaW5mbyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgcF9idG1faW5xX2luZm8gMHgleCByZXN1bHRzLmRldmljZV90eXBlIDB4JXggc2VydmljZXNfdG9fc2VhcmNoIDB4JXgiLApAQCAtMjM0Niw3ICsyMzQ1LDcgQEAKICAgICAgICAgICAgIGVsc2UKICNlbmRpZgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ0YV9kbV9zZWFyY2hfY2Iuc2RwX3Jlc3VsdHMgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnNkcF9yZXN1bHRzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgYnRhX2RtX2ZpbmRfc2VydmljZXMoYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkcik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQpAQCAtMjM3Niw3ICsyMzc1LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZG1fc2RwX2NhbGxiYWNrIChVSU5UMTYgc2RwX3N0YXR1cykKK3N0YXRpYyB2b2lkIGJ0YV9kbV9zZHBfY2FsbGJhY2sgKHVpbnQxNl90IHNkcF9zdGF0dXMpCiB7CiAKICAgICB0QlRBX0RNX1NEUF9SRVNVTFQgKnBfbXNnID0KQEAgLTIzOTcsMTcgKzIzOTYsMTcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZG1faW5xX3Jlc3VsdHNfY2IgKHRCVE1fSU5RX1JFU1VMVFMgKnBfaW5xLCBVSU5UOCAqcF9laXIpCitzdGF0aWMgdm9pZCBidGFfZG1faW5xX3Jlc3VsdHNfY2IgKHRCVE1fSU5RX1JFU1VMVFMgKnBfaW5xLCB1aW50OF90ICpwX2VpcikKIHsKIAogICAgIHRCVEFfRE1fU0VBUkNIICAgICByZXN1bHQ7CiAgICAgdEJUTV9JTlFfSU5GTyAgICAgICpwX2lucV9pbmZvOwotICAgIFVJTlQxNiAgICAgICAgICAgICBzZXJ2aWNlX2NsYXNzOworICAgIHVpbnQxNl90ICAgICAgICAgICAgIHNlcnZpY2VfY2xhc3M7CiAKICAgICBiZGNweShyZXN1bHQuaW5xX3Jlcy5iZF9hZGRyLCBwX2lucS0+cmVtb3RlX2JkX2FkZHIpOwogICAgIG1lbWNweShyZXN1bHQuaW5xX3Jlcy5kZXZfY2xhc3MsIHBfaW5xLT5kZXZfY2xhc3MsIERFVl9DTEFTU19MRU4pOwogICAgIEJUTV9DT0RfU0VSVklDRV9DTEFTUyhzZXJ2aWNlX2NsYXNzLCBwX2lucS0+ZGV2X2NsYXNzKTsKLSAgICByZXN1bHQuaW5xX3Jlcy5pc19saW1pdGVkID0gKHNlcnZpY2VfY2xhc3MgJiBCVE1fQ09EX1NFUlZJQ0VfTE1URF9ESVNDT1ZFUik/VFJVRTpGQUxTRTsKKyAgICByZXN1bHQuaW5xX3Jlcy5pc19saW1pdGVkID0gKHNlcnZpY2VfY2xhc3MgJiBCVE1fQ09EX1NFUlZJQ0VfTE1URF9ESVNDT1ZFUik/dHJ1ZTpmYWxzZTsKICAgICByZXN1bHQuaW5xX3Jlcy5yc3NpID0gcF9pbnEtPnJzc2k7CiAKICNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUpCkBAIC0yNDIyLDggKzI0MjEsOCBAQAogCiAgICAgaWYoKHBfaW5xX2luZm8gPSBCVE1fSW5xRGJSZWFkKHBfaW5xLT5yZW1vdGVfYmRfYWRkcikpICE9IE5VTEwpCiAgICAgewotICAgICAgICAvKiBpbml0aWFsaXplIHJlbXRfbmFtZV9ub3RfcmVxdWlyZWQgdG8gRkFMU0Ugc28gdGhhdCB3ZSBnZXQgdGhlIG5hbWUgYnkgZGVmYXVsdCAqLwotICAgICAgICByZXN1bHQuaW5xX3Jlcy5yZW10X25hbWVfbm90X3JlcXVpcmVkID0gRkFMU0U7CisgICAgICAgIC8qIGluaXRpYWxpemUgcmVtdF9uYW1lX25vdF9yZXF1aXJlZCB0byBmYWxzZSBzbyB0aGF0IHdlIGdldCB0aGUgbmFtZSBieSBkZWZhdWx0ICovCisgICAgICAgIHJlc3VsdC5pbnFfcmVzLnJlbXRfbmFtZV9ub3RfcmVxdWlyZWQgPSBmYWxzZTsKIAogICAgIH0KIApAQCAtMjQzNSw3ICsyNDM0LDcgQEAKICAgICAgICAgLyogYXBwbGljYXRpb24gaW5kaWNhdGVzIGlmIGl0IGtub3dzIHRoZSByZW1vdGUgbmFtZSwgaW5zaWRlIHRoZSBjYWxsYmFjawogICAgICAgICAgY29weSB0aGF0IHRvIHRoZSBpbnF1aXJ5IGRhdGEgYmFzZSovCiAgICAgICAgIGlmKHJlc3VsdC5pbnFfcmVzLnJlbXRfbmFtZV9ub3RfcmVxdWlyZWQpCi0gICAgICAgICAgICBwX2lucV9pbmZvLT5hcHBsX2tub3dzX3JlbV9uYW1lID0gVFJVRTsKKyAgICAgICAgICAgIHBfaW5xX2luZm8tPmFwcGxfa25vd3NfcmVtX25hbWUgPSB0cnVlOwogCiAgICAgfQogCkBAIC0yNDU4LDExICsyNDU3LDExIEBACiAKICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKIAotICAgIGlmIChidGFfZG1fc2VhcmNoX2NiLmNhbmNlbF9wZW5kaW5nID09IEZBTFNFKSB7CisgICAgaWYgKGJ0YV9kbV9zZWFyY2hfY2IuY2FuY2VsX3BlbmRpbmcgPT0gZmFsc2UpIHsKICAgICAgICAgcF9tc2ctPmlucV9jbXBsLmhkci5ldmVudCA9IEJUQV9ETV9JTlFVSVJZX0NNUExfRVZUOwogICAgICAgICBwX21zZy0+aW5xX2NtcGwubnVtID0gKCh0QlRNX0lOUVVJUllfQ01QTCAqKXBfcmVzdWx0KS0+bnVtX3Jlc3A7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5jYW5jZWxfcGVuZGluZyA9IEZBTFNFOworICAgICAgICBidGFfZG1fc2VhcmNoX2NiLmNhbmNlbF9wZW5kaW5nID0gZmFsc2U7CiAgICAgICAgIGJ0YV9kbV9zZWFyY2hfY2FuY2VsX25vdGlmeShOVUxMKTsKICAgICAgICAgcF9tc2ctPmhkci5ldmVudCA9IEJUQV9ETV9TRUFSQ0hfQ01QTF9FVlQ7CiAgICAgICAgIHBfbXNnLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSBCVEFfRE1fQVBJX0RJU0NPVkVSX0VWVDsKQEAgLTI1NDIsMTMgKzI1NDEsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICBwX3JlbW90ZV9uYW1lLT5yZW1vdGVfYmRfbmFtZSk7CiAKICAgICAvKiByZW1vdGUgbmFtZSBkaXNjb3ZlcnkgaXMgZG9uZSBidXQgaXQgY291bGQgYmUgZmFpbGVkICovCi0gICAgYnRhX2RtX3NlYXJjaF9jYi5uYW1lX2Rpc2NvdmVyX2RvbmUgPSBUUlVFOworICAgIGJ0YV9kbV9zZWFyY2hfY2IubmFtZV9kaXNjb3Zlcl9kb25lID0gdHJ1ZTsKICAgICBzdHJsY3B5KChjaGFyKilidGFfZG1fc2VhcmNoX2NiLnBlZXJfbmFtZSwKICAgICAgICAgICAgIChjaGFyKilwX3JlbW90ZV9uYW1lLT5yZW1vdGVfYmRfbmFtZSwgQkRfTkFNRV9MRU4pOwogCiAgICAgQlRNX1NlY0RlbGV0ZVJtdE5hbWVOb3RpZnlDYWxsYmFjaygmYnRhX2RtX3NlcnZpY2Vfc2VhcmNoX3JlbW5hbWVfY2JhY2spOwogCi0jaWYgQkxFX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUpCiAgICAgaWYgKGJ0YV9kbV9zZWFyY2hfY2IudHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSApCiAgICAgewogICAgICAgICBHQVBfQmxlUmVhZFBlZXJQcmVmQ29ublBhcmFtcyAoYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkcik7CkBAIC0yNTc0LDExICsyNTczLDExIEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFVJTlQ4IGJ0YV9kbV9hdXRob3JpemVfY2JhY2sgKEJEX0FERFIgYmRfYWRkciwgREVWX0NMQVNTIGRldl9jbGFzcywgQkRfTkFNRSBiZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4ICpzZXJ2aWNlX25hbWUsIFVJTlQ4IHNlcnZpY2VfaWQsIEJPT0xFQU4gaXNfb3JpZ2luYXRvcikKK3N0YXRpYyB1aW50OF90IGJ0YV9kbV9hdXRob3JpemVfY2JhY2sgKEJEX0FERFIgYmRfYWRkciwgREVWX0NMQVNTIGRldl9jbGFzcywgQkRfTkFNRSBiZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNlcnZpY2VfbmFtZSwgdWludDhfdCBzZXJ2aWNlX2lkLCBib29sIGlzX29yaWdpbmF0b3IpCiB7CiAgICAgdEJUQV9ETV9TRUMgc2VjX2V2ZW50OwotICAgIFVJTlQ4ICAgICAgIGluZGV4ID0gMTsKKyAgICB1aW50OF90ICAgICAgIGluZGV4ID0gMTsKICAgICBVTlVTRUQoc2VydmljZV9uYW1lKTsKICAgICBVTlVTRUQoaXNfb3JpZ2luYXRvcik7CiAKQEAgLTI1ODYsNyArMjU4NSw3IEBACiAgICAgbWVtY3B5KHNlY19ldmVudC5hdXRob3JpemUuZGV2X2NsYXNzLCBkZXZfY2xhc3MsIERFVl9DTEFTU19MRU4pOwogICAgIHN0cmxjcHkoKGNoYXIqKXNlY19ldmVudC5hdXRob3JpemUuYmRfbmFtZSwgKGNoYXIqKWJkX25hbWUsIEJEX05BTUVfTEVOKTsKIAotI2lmICggZGVmaW5lZChCVEFfSlZfSU5DTFVERUQpICYmIEJUQV9KVl9JTkNMVURFRCA9PSBUUlVFICkKKyNpZiAoQlRBX0pWX0lOQ0xVREVEID09IFRSVUUpCiAgICAgc2VjX2V2ZW50LmF1dGhvcml6ZS5zZXJ2aWNlID0gc2VydmljZV9pZDsKICNlbmRpZgogCkBAIC0yNjA0LDcgKzI2MDMsNyBAQAogCiAgICAgLyogaWYgc3VwcG9ydGVkIHNlcnZpY2UgY2FsbGJhY2sgb3RoZXJ3aXNlIG5vdCBhdXRob3JpemVkICovCiAgICAgaWYoYnRhX2RtX2NiLnBfc2VjX2NiYWNrICYmIChpbmRleCA8IEJUQV9NQVhfU0VSVklDRV9JRAotI2lmICggZGVmaW5lZChCVEFfSlZfSU5DTFVERUQpICYmIEJUQV9KVl9JTkNMVURFRCA9PSBUUlVFICkKKyNpZiAoQlRBX0pWX0lOQ0xVREVEID09IFRSVUUpCiAgICAgICAgIC8qIHBhc3MgdGhyb3VnaCBKViBzZXJ2aWNlIElEICovCiAgICAgICAgIHx8IChzZXJ2aWNlX2lkID49IEJUQV9GSVJTVF9KVl9TRVJWSUNFX0lEICYmIHNlcnZpY2VfaWQgPD0gQlRBX0xBU1RfSlZfU0VSVklDRV9JRCkKICNlbmRpZgpAQCAtMjYzNiw3ICsyNjM1LDcgQEAKIHsKICAgICB0QlRNX1JFTU9URV9ERVZfTkFNRSAqcF9yZXN1bHQgPSAodEJUTV9SRU1PVEVfREVWX05BTUUgKilwX2RhdGE7CiAgICAgdEJUQV9ETV9TRUMgICAgICAgICAgIHNlY19ldmVudDsKLSAgICBVSU5UMzIgICAgICAgICAgICAgICAgYnl0ZXNfdG9fY29weTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBieXRlc190b19jb3B5OwogICAgIHRCVEFfRE1fU0VDX0VWVCAgICAgICBldmVudCA9IGJ0YV9kbV9jYi5waW5fZXZ0OwogCiAgICAgaWYgKEJUQV9ETV9TUF9DRk1fUkVRX0VWVCA9PSBldmVudCkKQEAgLTI2OTMsOCArMjY5Miw4IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFVJTlQ4IGJ0YV9kbV9waW5fY2JhY2sgKEJEX0FERFIgYmRfYWRkciwgREVWX0NMQVNTIGRldl9jbGFzcywgQkRfTkFNRSBiZF9uYW1lLAotICAgICAgICBCT09MRUFOIG1pbl8xNl9kaWdpdCkKK3N0YXRpYyB1aW50OF90IGJ0YV9kbV9waW5fY2JhY2sgKEJEX0FERFIgYmRfYWRkciwgREVWX0NMQVNTIGRldl9jbGFzcywgQkRfTkFNRSBiZF9uYW1lLAorICAgICAgICBib29sIG1pbl8xNl9kaWdpdCkKIHsKICAgICB0QlRBX0RNX1NFQyBzZWNfZXZlbnQ7CiAKQEAgLTI3MzEsMTIgKzI3MzAsMTIgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgVUlOVDggIGJ0YV9kbV9uZXdfbGlua19rZXlfY2JhY2soQkRfQUREUiBiZF9hZGRyLCBERVZfQ0xBU1MgZGV2X2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEX05BTUUgYmRfbmFtZSwgTElOS19LRVkga2V5LCBVSU5UOCBrZXlfdHlwZSkKK3N0YXRpYyB1aW50OF90ICBidGFfZG1fbmV3X2xpbmtfa2V5X2NiYWNrKEJEX0FERFIgYmRfYWRkciwgREVWX0NMQVNTIGRldl9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRF9OQU1FIGJkX25hbWUsIExJTktfS0VZIGtleSwgdWludDhfdCBrZXlfdHlwZSkKIHsKICAgICB0QlRBX0RNX1NFQyBzZWNfZXZlbnQ7CiAgICAgdEJUQV9ETV9BVVRIX0NNUEwgKnBfYXV0aF9jbXBsOwotICAgIFVJTlQ4ICAgICAgICAgICAgIGV2ZW50OworICAgIHVpbnQ4X3QgICAgICAgICAgICAgZXZlbnQ7CiAgICAgVU5VU0VEKGRldl9jbGFzcyk7CiAKICAgICBtZW1zZXQgKCZzZWNfZXZlbnQsIDAsIHNpemVvZih0QlRBX0RNX1NFQykpOwpAQCAtMjc1MiwyMSArMjc1MSwyMSBAQAogICAgICAgICBtZW1jcHkocF9hdXRoX2NtcGwtPmJkX25hbWUsIGJkX25hbWUsIChCRF9OQU1FX0xFTi0xKSk7CiAgICAgICAgIHBfYXV0aF9jbXBsLT5iZF9uYW1lW0JEX05BTUVfTEVOLTFdID0gMDsKIAotICAgICAgICBwX2F1dGhfY21wbC0+a2V5X3ByZXNlbnQgPSBUUlVFOworICAgICAgICBwX2F1dGhfY21wbC0+a2V5X3ByZXNlbnQgPSB0cnVlOwogICAgICAgICBwX2F1dGhfY21wbC0+a2V5X3R5cGUgPSBrZXlfdHlwZTsKLSAgICAgICAgcF9hdXRoX2NtcGwtPnN1Y2Nlc3MgPSBUUlVFOworICAgICAgICBwX2F1dGhfY21wbC0+c3VjY2VzcyA9IHRydWU7CiAKICAgICAgICAgbWVtY3B5KHBfYXV0aF9jbXBsLT5rZXksIGtleSwgTElOS19LRVlfTEVOKTsKICAgICAgICAgc2VjX2V2ZW50LmF1dGhfY21wbC5mYWlsX3JlYXNvbiA9IEhDSV9TVUNDRVNTOwogCi0jaWYgQkxFX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUpCiAgICAgICAgIC8vIFJlcG9ydCB0aGUgQlIgbGluayBrZXkgYmFzZWQgb24gdGhlIEJSL0VEUiBhZGRyZXNzIGFuZCB0eXBlCiAgICAgICAgIEJUTV9SZWFkRGV2SW5mbyhiZF9hZGRyLCAmc2VjX2V2ZW50LmF1dGhfY21wbC5kZXZfdHlwZSwgJnNlY19ldmVudC5hdXRoX2NtcGwuYWRkcl90eXBlKTsKICNlbmRpZgogICAgICAgICBpZihidGFfZG1fY2IucF9zZWNfY2JhY2spCiAgICAgICAgICAgICBidGFfZG1fY2IucF9zZWNfY2JhY2soZXZlbnQsICZzZWNfZXZlbnQpOwogCi0gICAgICAgIC8vIFNldHRpbmcgcmVtb3ZlX2Rldl9wZW5kaW5nIGZsYWcgdG8gRkFMU0UsIHdoZXJlIGl0IHdpbGwgYXZvaWQgZGVsZXRpbmcgdGhlCisgICAgICAgIC8vIFNldHRpbmcgcmVtb3ZlX2Rldl9wZW5kaW5nIGZsYWcgdG8gZmFsc2UsIHdoZXJlIGl0IHdpbGwgYXZvaWQgZGVsZXRpbmcgdGhlCiAgICAgICAgIC8vIHNlY3VyaXR5IGRldmljZSByZWNvcmQgd2hlbiB0aGUgQUNMIGNvbm5lY3Rpb24gbGluayBnb2VzIGRvd24gaW4gY2FzZSBvZgogICAgICAgICAvLyByZWNvbm5lY3Rpb24uCiAgICAgICAgIGlmIChidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQpCkBAIC0yNzkwLDcgKzI3ODksNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBVSU5UOCBidGFfZG1fYXV0aGVudGljYXRpb25fY29tcGxldGVfY2JhY2soQkRfQUREUiBiZF9hZGRyLCBERVZfQ0xBU1MgZGV2X2NsYXNzLEJEX05BTUUgYmRfbmFtZSwgaW50IHJlc3VsdCkKK3N0YXRpYyB1aW50OF90IGJ0YV9kbV9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZV9jYmFjayhCRF9BRERSIGJkX2FkZHIsIERFVl9DTEFTUyBkZXZfY2xhc3MsQkRfTkFNRSBiZF9uYW1lLCBpbnQgcmVzdWx0KQogewogICAgIHRCVEFfRE1fU0VDIHNlY19ldmVudDsKICAgICBVTlVTRUQoZGV2X2NsYXNzKTsKQEAgLTI4MDMsMTEgKzI4MDIsMTEgQEAKICAgICAgICAgbWVtY3B5KHNlY19ldmVudC5hdXRoX2NtcGwuYmRfbmFtZSwgYmRfbmFtZSwgKEJEX05BTUVfTEVOLTEpKTsKICAgICAgICAgc2VjX2V2ZW50LmF1dGhfY21wbC5iZF9uYW1lW0JEX05BTUVfTEVOLTFdID0gMDsKIAotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogICAgICAgICAvLyBSZXBvcnQgdGhlIEJSIGxpbmsga2V5IGJhc2VkIG9uIHRoZSBCUi9FRFIgYWRkcmVzcyBhbmQgdHlwZQogICAgICAgICBCVE1fUmVhZERldkluZm8oYmRfYWRkciwgJnNlY19ldmVudC5hdXRoX2NtcGwuZGV2X3R5cGUsICZzZWNfZXZlbnQuYXV0aF9jbXBsLmFkZHJfdHlwZSk7CiAjZW5kaWYKLSAgICAgICAgc2VjX2V2ZW50LmF1dGhfY21wbC5mYWlsX3JlYXNvbiA9IChVSU5UOClyZXN1bHQ7CisgICAgICAgIHNlY19ldmVudC5hdXRoX2NtcGwuZmFpbF9yZWFzb24gPSAodWludDhfdClyZXN1bHQ7CiAKICAgICAgICAgaWYoYnRhX2RtX2NiLnBfc2VjX2NiYWNrKQogICAgICAgICAgICAgYnRhX2RtX2NiLnBfc2VjX2NiYWNrKEJUQV9ETV9BVVRIX0NNUExfRVZULCAmc2VjX2V2ZW50KTsKQEAgLTI4MjcsNyArMjgyNiw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFVJTlQ4IGJ0YV9kbV9zcF9jYmFjayAodEJUTV9TUF9FVlQgZXZlbnQsIHRCVE1fU1BfRVZUX0RBVEEgKnBfZGF0YSkKK3N0YXRpYyB1aW50OF90IGJ0YV9kbV9zcF9jYmFjayAodEJUTV9TUF9FVlQgZXZlbnQsIHRCVE1fU1BfRVZUX0RBVEEgKnBfZGF0YSkKIHsKICAgICB0QlRNX1NUQVRVUyBzdGF0dXMgPSBCVE1fQ01EX1NUQVJURUQ7CiAgICAgdEJUQV9ETV9TRUMgc2VjX2V2ZW50OwpAQCAtMjkyNSw3ICsyOTI0LDcgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEJUTV9TUF9MT0NfT09CX0VWVDoKLSAgICAgICAgYnRhX2RtX2NvX2xvY19vb2IoKEJPT0xFQU4pKHBfZGF0YS0+bG9jX29vYi5zdGF0dXMgPT0gQlRNX1NVQ0NFU1MpLAorICAgICAgICBidGFfZG1fY29fbG9jX29vYigoYm9vbCkocF9kYXRhLT5sb2Nfb29iLnN0YXR1cyA9PSBCVE1fU1VDQ0VTUyksCiAgICAgICAgICAgICBwX2RhdGEtPmxvY19vb2IuYywgcF9kYXRhLT5sb2Nfb29iLnIpOwogICAgICAgICBicmVhazsKIApAQCAtMjk4Miw3ICsyOTgxLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZG1fbG9jYWxfbmFtZV9jYmFjayhVSU5UOCAqcF9uYW1lKQorc3RhdGljIHZvaWQgYnRhX2RtX2xvY2FsX25hbWVfY2JhY2sodWludDhfdCAqcF9uYW1lKQogewogICAgIHRCVEFfRE1fU0VDIHNlY19ldmVudDsKICAgICBVTlVTRUQocF9uYW1lKTsKQEAgLTMwMTAsMjAgKzMwMDksMjAgQEAKICAgICAgICAgKHRCVEFfRE1fQUNMX0NIQU5HRSAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfRE1fQUNMX0NIQU5HRSkpOwogCiAgICAgcF9tc2ctPmV2ZW50ID0gcF9kYXRhLT5ldmVudDsKLSAgICBwX21zZy0+aXNfbmV3ID0gRkFMU0U7CisgICAgcF9tc2ctPmlzX25ldyA9IGZhbHNlOwogCiAgICAgc3dpdGNoIChwX21zZy0+ZXZlbnQpIHsKICAgICBjYXNlIEJUTV9CTF9DT05OX0VWVDoKLSAgICAgICAgcF9tc2ctPmlzX25ldyA9IFRSVUU7CisgICAgICAgIHBfbXNnLT5pc19uZXcgPSB0cnVlOwogICAgICAgICBiZGNweShwX21zZy0+YmRfYWRkciwgcF9kYXRhLT5jb25uLnBfYmRhKTsKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKICAgICAgICAgcF9tc2ctPnRyYW5zcG9ydCA9IHBfZGF0YS0+Y29ubi50cmFuc3BvcnQ7CiAgICAgICAgIHBfbXNnLT5oYW5kbGUgPSBwX2RhdGEtPmNvbm4uaGFuZGxlOwogI2VuZGlmCiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQlRNX0JMX0RJU0NOX0VWVDoKICAgICAgICAgYmRjcHkocF9tc2ctPmJkX2FkZHIsIHBfZGF0YS0+ZGlzY24ucF9iZGEpOwotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogICAgICAgICBwX21zZy0+dHJhbnNwb3J0ID0gcF9kYXRhLT5kaXNjbi50cmFuc3BvcnQ7CiAgICAgICAgIHBfbXNnLT5oYW5kbGUgPSBwX2RhdGEtPmRpc2NuLmhhbmRsZTsKICNlbmRpZgpAQCAtMzA3NCwyMyArMzA3MywyMyBAQAogKiogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiBBViBpcyBhY3RpdmUKICoqICAgICAgICAgICAgICAgICAgaWYgeWVzLCBtYWtlIHN1cmUgdGhlIEFWIGxpbmsgaXMgbWFzdGVyCiAqKgotKiogUmV0dXJucyAgICAgICAgICBCT09MRUFOIC0gVFJVRSwgaWYgc3dpdGNoIGlzIGluIHByb2dyZXNzCisqKiBSZXR1cm5zICAgICAgICAgIGJvb2wgLSB0cnVlLCBpZiBzd2l0Y2ggaXMgaW4gcHJvZ3Jlc3MKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIEJPT0xFQU4gYnRhX2RtX2NoZWNrX2F2KFVJTlQxNiBldmVudCkKK3N0YXRpYyBib29sIGJ0YV9kbV9jaGVja19hdih1aW50MTZfdCBldmVudCkKIHsKLSAgICBCT09MRUFOIGF2b2lkX3JvbGVzd2l0Y2ggPSBGQUxTRTsKLSAgICBCT09MRUFOIHN3aXRjaGluZyA9IEZBTFNFOwotICAgIFVJTlQ4IGk7CisgICAgYm9vbCBhdm9pZF9yb2xlc3dpdGNoID0gZmFsc2U7CisgICAgYm9vbCBzd2l0Y2hpbmcgPSBmYWxzZTsKKyAgICB1aW50OF90IGk7CiAgICAgdEJUQV9ETV9QRUVSX0RFVklDRSAqcF9kZXY7CiAKLSNpZiBkZWZpbmVkKEJUQV9ETV9BVk9JRF9BMkRQX1JPTEVTV0lUQ0hfT05fSU5RVUlSWSkgJiYgKEJUQV9ETV9BVk9JRF9BMkRQX1JPTEVTV0lUQ0hfT05fSU5RVUlSWSA9PSBUUlVFKQorI2lmIChCVEFfRE1fQVZPSURfQTJEUF9ST0xFU1dJVENIX09OX0lOUVVJUlkgPT0gVFJVRSkKIAogICAgIC8qIGF2b2lkIHJvbGUgc3dpdGNoIHVwb24gaW5xdWlyeSBpZiBhMmRwIGlzIGFjdGl2ZWx5IHN0cmVhbWluZyBhcyBpdAogICAgICAgIGludHJvZHVjZXMgYW4gYXVkaW9nbGl0Y2ggZHVlIHRvIEZXIHNjaGVkdWxpbmcgZGVsYXlzICh1bmF2b2lkYWJsZSkgKi8KICAgICBpZiAoZXZlbnQgPT0gQlRBX0RNX0FQSV9TRUFSQ0hfRVZUKQogICAgIHsKLSAgICAgICAgYXZvaWRfcm9sZXN3aXRjaCA9IFRSVUU7CisgICAgICAgIGF2b2lkX3JvbGVzd2l0Y2ggPSB0cnVlOwogICAgIH0KICNlbmRpZgogCkBAIC0zMTAzLDE0ICszMTAyLDE0IEBACiAgICAgICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIlslZF06IHN0YXRlOiVkLCBpbmZvOngleCwgYXZvaWRfcnMgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBwX2Rldi0+Y29ubl9zdGF0ZSwgcF9kZXYtPmluZm8sIGF2b2lkX3JvbGVzd2l0Y2gpOwogICAgICAgICAgICAgaWYoKHBfZGV2LT5jb25uX3N0YXRlID09IEJUQV9ETV9DT05ORUNURUQpICYmIChwX2Rldi0+aW5mbyAmIEJUQV9ETV9ESV9BVl9BQ1RJVkUpICYmCi0gICAgICAgICAgICAgICAoYXZvaWRfcm9sZXN3aXRjaCA9PSBGQUxTRSkpCisgICAgICAgICAgICAgICAoYXZvaWRfcm9sZXN3aXRjaCA9PSBmYWxzZSkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLyogbWFrZSBtYXN0ZXIgYW5kIHRha2UgYXdheSB0aGUgcm9sZSBzd2l0Y2ggcG9saWN5ICovCiAgICAgICAgICAgICAgICAgaWYoQlRNX0NNRF9TVEFSVEVEID09IEJUTV9Td2l0Y2hSb2xlIChwX2Rldi0+cGVlcl9iZGFkZHIsIEhDSV9ST0xFX01BU1RFUiwgKHRCVE1fQ01QTF9DQiAqKWJ0YV9kbV9yc19jYmFjaykpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvKiB0aGUgcm9sZSBzd2l0Y2ggY29tbWFuZCBpcyBhY3R1YWxseSBzZW50ICovCiAgICAgICAgICAgICAgICAgICAgIGJ0YV9kbV9jYi5yc19ldmVudCA9IGV2ZW50OwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2hpbmcgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2hpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvKiBlbHNlIGVpdGhlciBhbHJlYWR5IG1hc3RlciBvciBjYW4gbm90IHN3aXRjaCBmb3Igc29tZSByZWFzb25zICovCiAgICAgICAgICAgICAgICAgYnRhX2RtX3BvbGljeV9jYmFjayhCVEFfU1lTX1BMQ1lfQ0xSLCAwLCBIQ0lfRU5BQkxFX01BU1RFUl9TTEFWRV9TV0lUQ0gsIHBfZGV2LT5wZWVyX2JkYWRkcik7CkBAIC0zMTM0LDEzICszMTMzLDEzIEBACiB2b2lkIGJ0YV9kbV9hY2xfY2hhbmdlKHRCVEFfRE1fTVNHICpwX2RhdGEpCiB7CiAKLSAgICBVSU5UOCBpOwotICAgIFVJTlQ4ICpwOworICAgIHVpbnQ4X3QgaTsKKyAgICB1aW50OF90ICpwOwogICAgIHRCVEFfRE1fU0VDIGNvbm47Ci0gICAgQk9PTEVBTiBpc19uZXcgPSBwX2RhdGEtPmFjbF9jaGFuZ2UuaXNfbmV3OworICAgIGJvb2wgaXNfbmV3ID0gcF9kYXRhLT5hY2xfY2hhbmdlLmlzX25ldzsKICAgICBCRF9BRERSX1BUUiAgICAgcF9iZGEgPSBwX2RhdGEtPmFjbF9jaGFuZ2UuYmRfYWRkcjsKLSAgICBCT09MRUFOICAgICAgICAgbmVlZF9wb2xpY3lfY2hhbmdlID0gRkFMU0U7Ci0gICAgQk9PTEVBTiAgICAgICAgIGlzc3VlX3VucGFpcl9jYiA9IEZBTFNFOworICAgIGJvb2wgICAgICAgICBuZWVkX3BvbGljeV9jaGFuZ2UgPSBmYWxzZTsKKyAgICBib29sICAgICAgICAgaXNzdWVfdW5wYWlyX2NiID0gZmFsc2U7CiAKICAgICB0QlRBX0RNX1BFRVJfREVWSUNFICpwX2RldjsKICAgICBtZW1zZXQoJmNvbm4sIDAsIHNpemVvZih0QlRBX0RNX1NFQykpOwpAQCAtMzE3MSwxMiArMzE3MCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAvKiBtb3JlIHRoYW4gb25lIGNvbm5lY3Rpb25zIGFuZCB0aGUgQVYgY29ubmVjdGlvbiBpcyByb2xlIHN3aXRjaGVkIHRvIHNsYXZlCiAgICAgICAgICAgICAgICAgICAgICAqIHN3aXRjaCBpdCBiYWNrIHRvIG1hc3RlciBhbmQgcmVtb3ZlIHRoZSBzd2l0Y2ggcG9saWN5ICovCiAgICAgICAgICAgICAgICAgICAgIEJUTV9Td2l0Y2hSb2xlKHBfYmRhLCBCVE1fUk9MRV9NQVNURVIsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICBuZWVkX3BvbGljeV9jaGFuZ2UgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBuZWVkX3BvbGljeV9jaGFuZ2UgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIGlmIChwX2J0YV9kbV9jZmctPmF2b2lkX3NjYXR0ZXIgJiYgKHBfZGF0YS0+YWNsX2NoYW5nZS5uZXdfcm9sZSA9PSBIQ0lfUk9MRV9NQVNURVIpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgLyogaWYgdGhlIGxpbmsgdXBkYXRlZCB0byBiZSBtYXN0ZXIgaW5jbHVkZSBBViBhY3Rpdml0aWVzLCByZW1vdmUgdGhlIHN3aXRjaCBwb2xpY3kgKi8KLSAgICAgICAgICAgICAgICAgICAgbmVlZF9wb2xpY3lfY2hhbmdlID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgbmVlZF9wb2xpY3lfY2hhbmdlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZihuZWVkX3BvbGljeV9jaGFuZ2UpCkBAIC0zMTkzLDcgKzMxOTIsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnRhX3N5c19ub3RpZnlfcm9sZV9jaGcocF9kYXRhLT5hY2xfY2hhbmdlLmJkX2FkZHIsIHBfZGF0YS0+YWNsX2NoYW5nZS5uZXdfcm9sZSwgcF9kYXRhLT5hY2xfY2hhbmdlLmhjaV9zdGF0dXMpOwogICAgICAgICAgICAgYmRjcHkoY29ubi5yb2xlX2NoZy5iZF9hZGRyLCBwX2JkYSk7Ci0gICAgICAgICAgICBjb25uLnJvbGVfY2hnLm5ld19yb2xlID0gKFVJTlQ4KSBwX2RhdGEtPmFjbF9jaGFuZ2UubmV3X3JvbGU7CisgICAgICAgICAgICBjb25uLnJvbGVfY2hnLm5ld19yb2xlID0gKHVpbnQ4X3QpIHBfZGF0YS0+YWNsX2NoYW5nZS5uZXdfcm9sZTsKICAgICAgICAgICAgIGlmKCBidGFfZG1fY2IucF9zZWNfY2JhY2sgKQogICAgICAgICAgICAgICAgIGJ0YV9kbV9jYi5wX3NlY19jYmFjayhCVEFfRE1fUk9MRV9DSEdfRVZULCAodEJUQV9ETV9TRUMgKikmY29ubik7CiAgICAgICAgIH0KQEAgLTMyMTIsNyArMzIxMSw3IEBACiAgICAgICAgIGZvcihpPTA7IGk8YnRhX2RtX2NiLmRldmljZV9saXN0LmNvdW50OyBpKyspCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICghYmRjbXAoIGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5wZWVyX2RldmljZVtpXS5wZWVyX2JkYWRkciwgcF9iZGEpCi0jaWYgQkxFX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUpCiAgICAgICAgICAgICAgICAgICYmIGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5wZWVyX2RldmljZVtpXS5jb25uX2hhbmRsZSA9PSBwX2RhdGEtPmFjbF9jaGFuZ2UuaGFuZGxlCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgKQpAQCAtMzIyNyw3ICszMjI2LDcgQEAKICAgICAgICAgICAgICAgICBiZGNweShidGFfZG1fY2IuZGV2aWNlX2xpc3QucGVlcl9kZXZpY2VbYnRhX2RtX2NiLmRldmljZV9saXN0LmNvdW50XS5wZWVyX2JkYWRkciwgcF9iZGEpOwogICAgICAgICAgICAgICAgIGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5wZWVyX2RldmljZVtidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnRdLmxpbmtfcG9saWN5ID0gYnRhX2RtX2NiLmN1cl9wb2xpY3k7CiAgICAgICAgICAgICAgICAgYnRhX2RtX2NiLmRldmljZV9saXN0LmNvdW50Kys7Ci0jaWYgQkxFX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUpCiAgICAgICAgICAgICAgICAgYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLmNvbm5faGFuZGxlID0gcF9kYXRhLT5hY2xfY2hhbmdlLmhhbmRsZTsKICAgICAgICAgICAgICAgICBpZiAocF9kYXRhLT5hY2xfY2hhbmdlLnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpCiAgICAgICAgICAgICAgICAgICAgIGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5sZV9jb3VudCsrOwpAQCAtMzI0Miw3ICszMjQxLDcgQEAKICAgICAgICAgYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLnByZWZfcm9sZSA9IEJUQV9BTllfUk9MRTsKICAgICAgICAgYmRjcHkoY29ubi5saW5rX3VwLmJkX2FkZHIsIHBfYmRhKTsKICAgICAgICAgYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLmluZm8gPSBCVEFfRE1fRElfTk9ORTsKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKICAgICAgICAgY29ubi5saW5rX3VwLmxpbmtfdHlwZSA9IHBfZGF0YS0+YWNsX2NoYW5nZS50cmFuc3BvcnQ7CiAgICAgICAgIGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5wZWVyX2RldmljZVtpXS50cmFuc3BvcnQgPSBwX2RhdGEtPmFjbF9jaGFuZ2UudHJhbnNwb3J0OwogI2VuZGlmCkBAIC0zMjYxLDcgKzMyNjAsNyBAQAogICAgICAgICBmb3IoaT0wOyBpPGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5jb3VudDsgaSsrKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoYmRjbXAoIGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5wZWVyX2RldmljZVtpXS5wZWVyX2JkYWRkciwgcF9iZGEpCi0jaWYgQkxFX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUpCiAgICAgICAgICAgICAgICAgIHx8YnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLnRyYW5zcG9ydCAhPSBwX2RhdGEtPmFjbF9jaGFuZ2UudHJhbnNwb3J0CiAjZW5kaWYKICAgICAgICAgICAgICAgICkKQEAgLTMyNzAsOSArMzI2OSw5IEBACiAgICAgICAgICAgICBpZiggYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLmNvbm5fc3RhdGUgPT0gQlRBX0RNX1VOUEFJUklORyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKEJUTV9TZWNEZWxldGVEZXZpY2UoYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLnBlZXJfYmRhZGRyKSkKLSAgICAgICAgICAgICAgICAgICAgaXNzdWVfdW5wYWlyX2NiID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgaXNzdWVfdW5wYWlyX2NiID0gdHJ1ZTsKIAotICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBVbnBhaXJpbmc6IGlzc3VlIHVucGFpciBDQiA9ICVkICIsX19GVU5DVElPTl9fLCBpc3N1ZV91bnBhaXJfY2IpOworICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBVbnBhaXJpbmc6IGlzc3VlIHVucGFpciBDQiA9ICVkICIsX19mdW5jX18sIGlzc3VlX3VucGFpcl9jYik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGNvbm4ubGlua19kb3duLmlzX3JlbW92ZWQgPSBidGFfZG1fY2IuZGV2aWNlX2xpc3QucGVlcl9kZXZpY2VbaV0ucmVtb3ZlX2Rldl9wZW5kaW5nOwpAQCAtMzI4NSw3ICszMjg0LDcgQEAKICAgICAgICAgfQogICAgICAgICBpZihidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQpCiAgICAgICAgICAgICBidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQtLTsKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKICAgICAgICAgaWYgKChwX2RhdGEtPmFjbF9jaGFuZ2UudHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkgJiYKICAgICAgICAgICAgICAoYnRhX2RtX2NiLmRldmljZV9saXN0LmxlX2NvdW50KSkKICAgICAgICAgICAgIGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5sZV9jb3VudC0tOwpAQCAtMzI5NCw3ICszMjkzLDcgQEAKIAogICAgICAgICBpZihidGFfZG1fc2VhcmNoX2NiLndhaXRfZGlzYyAmJiAhYmRjbXAoYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkciwgcF9iZGEpKQogICAgICAgICB7Ci0gICAgICAgICAgICBidGFfZG1fc2VhcmNoX2NiLndhaXRfZGlzYyA9IEZBTFNFOworICAgICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi53YWl0X2Rpc2MgPSBmYWxzZTsKIAogICAgICAgICAgICAgaWYoYnRhX2RtX3NlYXJjaF9jYi5zZHBfcmVzdWx0cykKICAgICAgICAgICAgIHsKQEAgLTMzMjQsMTQgKzMzMjMsMTQgQEAKICAgICAgICAgICAgIEJUTV9TZWNEZWxldGVEZXZpY2UocF9iZGEpOwogI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSAmJiBCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFKQogICAgICAgICAgICAgLyogbmVlZCB0byByZW1vdmUgYWxsIHBlbmRpbmcgYmFja2dyb3VuZCBjb25uZWN0aW9uICovCi0gICAgICAgICAgICBCVEFfR0FUVENfQ2FuY2VsT3BlbigwLCBwX2JkYSwgRkFMU0UpOworICAgICAgICAgICAgQlRBX0dBVFRDX0NhbmNlbE9wZW4oMCwgcF9iZGEsIGZhbHNlKTsKICAgICAgICAgICAgIC8qIHJlbW92ZSBhbGwgY2FjaGVkIEdBVFQgaW5mb3JtYXRpb24gKi8KICAgICAgICAgICAgIEJUQV9HQVRUQ19SZWZyZXNoKHBfYmRhKTsKICNlbmRpZgogICAgICAgICAgfQogCiAgICAgICAgIGJkY3B5KGNvbm4ubGlua19kb3duLmJkX2FkZHIsIHBfYmRhKTsKLSAgICAgICAgY29ubi5saW5rX2Rvd24uc3RhdHVzID0gKFVJTlQ4KSBidG1fZ2V0X2FjbF9kaXNjX3JlYXNvbl9jb2RlKCk7CisgICAgICAgIGNvbm4ubGlua19kb3duLnN0YXR1cyA9ICh1aW50OF90KSBidG1fZ2V0X2FjbF9kaXNjX3JlYXNvbl9jb2RlKCk7CiAgICAgICAgIGlmKCBidGFfZG1fY2IucF9zZWNfY2JhY2sgKQogICAgICAgICB7CiAgICAgICAgICAgICBidGFfZG1fY2IucF9zZWNfY2JhY2soQlRBX0RNX0xJTktfRE9XTl9FVlQsICZjb25uKTsKQEAgLTMzNDAsNyArMzMzOSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBidGFfZG1fYWRqdXN0X3JvbGVzKFRSVUUpOworICAgIGJ0YV9kbV9hZGp1c3Rfcm9sZXModHJ1ZSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMzY5LDcgKzMzNjgsNyBAQAogICAgIHN5c19lbmFibGVfZXZlbnQtPmh3X21vZHVsZSA9IEJUQV9TWVNfSFdfQkxVRVRPT1RIOwogICAgIGJ0YV9zeXNfc2VuZG1zZyhzeXNfZW5hYmxlX2V2ZW50KTsKIAotICAgIGJ0YV9kbV9jYi5kaXNhYmxpbmcgPSBGQUxTRTsKKyAgICBidGFfZG1fY2IuZGlzYWJsaW5nID0gZmFsc2U7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMzgyLDkgKzMzODEsOSBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9kbV9ybV9jYmFjayh0QlRBX1NZU19DT05OX1NUQVRVUyBzdGF0dXMsIFVJTlQ4IGlkLCBVSU5UOCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKQorc3RhdGljIHZvaWQgYnRhX2RtX3JtX2NiYWNrKHRCVEFfU1lTX0NPTk5fU1RBVFVTIHN0YXR1cywgdWludDhfdCBpZCwgdWludDhfdCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKQogewotICAgIFVJTlQ4IGo7CisgICAgdWludDhfdCBqOwogICAgIHRCVEFfUFJFRl9ST0xFUyByb2xlOwogICAgIHRCVEFfRE1fUEVFUl9ERVZJQ0UgKnBfZGV2OwogCkBAIC0zNDQxLDcgKzM0NDAsNyBAQAogICAgICAgIGV4Y2Vzc2l2ZSBzd2l0Y2ggcmVxdWVzdHMgd2hlbiBpbmRpdmlkdWFsIHByb2ZpbGUgYnVzeS9pZGxlIHN0YXR1cwogICAgICAgIGNoYW5nZXMgKi8KICAgICBpZiAoKHN0YXR1cyAhPSBCVEFfU1lTX0NPTk5fQlVTWSkgJiYgKHN0YXR1cyAhPSBCVEFfU1lTX0NPTk5fSURMRSkpCi0gICAgICAgIGJ0YV9kbV9hZGp1c3Rfcm9sZXMoRkFMU0UpOworICAgICAgICBidGFfZG1fYWRqdXN0X3JvbGVzKGZhbHNlKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM0NTYsMTQgKzM0NTUsMTQgQEAKIHN0YXRpYyB2b2lkIGJ0YV9kbV9kZWxheV9yb2xlX3N3aXRjaF9jYmFjayhVTlVTRURfQVRUUiB2b2lkICpkYXRhKQogewogICAgIEFQUExfVFJBQ0VfRVZFTlQoIiVzOiBpbml0aWF0aW5nIERlbGF5ZWQgUlMiLCBfX2Z1bmNfXyk7Ci0gICAgYnRhX2RtX2FkanVzdF9yb2xlcyhGQUxTRSk7CisgICAgYnRhX2RtX2FkanVzdF9yb2xlcyhmYWxzZSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgogKiogRnVuY3Rpb24gICAgICAgICBidGFfZG1fcmVzZXRfc2VjX2Rldl9wZW5kaW5nCiAqKgotKiogRGVzY3JpcHRpb24gICAgICBTZXR0aW5nIHRoZSByZW1vdmUgZGV2aWNlIHBlbmRpbmcgc3RhdHVzIHRvIEZBTFNFIGZyb20KKyoqIERlc2NyaXB0aW9uICAgICAgU2V0dGluZyB0aGUgcmVtb3ZlIGRldmljZSBwZW5kaW5nIHN0YXR1cyB0byBmYWxzZSBmcm9tCiAqKiAgICAgICAgICAgICAgICAgIHNlY3VyaXR5IGRldmljZSBEQiwgd2hlbiB0aGUgbGluayBrZXkgbm90aWZpY2F0aW9uCiAqKiAgICAgICAgICAgICAgICAgIGV2ZW50IGNvbWVzLgogKioKQEAgLTM0NzYsNyArMzQ3NSw3IEBACiAgICAgewogICAgICAgICBpZiAoYmRjbXAoYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLnBlZXJfYmRhZGRyLCByZW1vdGVfYmRfYWRkcikgPT0gMCkKICAgICAgICAgewotICAgICAgICAgICAgYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLnJlbW92ZV9kZXZfcGVuZGluZyA9IEZBTFNFOworICAgICAgICAgICAgYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLnJlbW92ZV9kZXZfcGVuZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQpAQCAtMzQ5NSwxMiArMzQ5NCwxMiBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkIGJ0YV9kbV9yZW1vdmVfc2VjX2Rldl9lbnRyeShCRF9BRERSIHJlbW90ZV9iZF9hZGRyKQogewotICAgIFVJTlQxNiBpbmRleCA9IDA7CisgICAgdWludDE2X3QgaW5kZXggPSAwOwogICAgIGlmICggQlRNX0lzQWNsQ29ubmVjdGlvblVwKHJlbW90ZV9iZF9hZGRyLCBCVF9UUkFOU1BPUlRfTEUpIHx8CiAgICAgICAgICBCVE1fSXNBY2xDb25uZWN0aW9uVXAocmVtb3RlX2JkX2FkZHIsIEJUX1RSQU5TUE9SVF9CUl9FRFIpKQogICAgIHsKICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIEFDTCBpcyBub3QgZG93bi4gU2NoZWR1bGUgZm9yICBEZXYgUmVtb3ZhbCB3aGVuIEFDTCBjbG9zZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwogICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQ7IGluZGV4ICsrKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIWJkY21wKCBidGFfZG1fY2IuZGV2aWNlX2xpc3QucGVlcl9kZXZpY2VbaW5kZXhdLnBlZXJfYmRhZGRyLCByZW1vdGVfYmRfYWRkcikpCkBAIC0zNTA4LDExICszNTA3LDExIEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGluZGV4ICE9IGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5jb3VudCkKICAgICAgICAgewotICAgICAgICAgICAgYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2luZGV4XS5yZW1vdmVfZGV2X3BlbmRpbmcgPSBUUlVFOworICAgICAgICAgICAgYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2luZGV4XS5yZW1vdmVfZGV2X3BlbmRpbmcgPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigiICVzIERldmljZSBkb2VzIG5vdCBleGlzdCBpbiBEQiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKCIgJXMgRGV2aWNlIGRvZXMgbm90IGV4aXN0IGluIERCIiwgX19mdW5jX18pOwogICAgICAgICB9CiAgICAgfQogICAgIGVsc2UKQEAgLTM1MjAsNyArMzUxOSw3IEBACiAgICAgICAgIEJUTV9TZWNEZWxldGVEZXZpY2UgKHJlbW90ZV9iZF9hZGRyKTsKICNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRSkKICAgICAgICAgLyogbmVlZCB0byByZW1vdmUgYWxsIHBlbmRpbmcgYmFja2dyb3VuZCBjb25uZWN0aW9uICovCi0gICAgICAgIEJUQV9HQVRUQ19DYW5jZWxPcGVuKDAsIHJlbW90ZV9iZF9hZGRyLCBGQUxTRSk7CisgICAgICAgIEJUQV9HQVRUQ19DYW5jZWxPcGVuKDAsIHJlbW90ZV9iZF9hZGRyLCBmYWxzZSk7CiAgICAgICAgIC8qIHJlbW92ZSBhbGwgY2FjaGVkIEdBVFQgaW5mb3JtYXRpb24gKi8KICAgICAgICAgQlRBX0dBVFRDX1JlZnJlc2gocmVtb3RlX2JkX2FkZHIpOwogI2VuZGlmCkBAIC0zNTM4LDE1ICszNTM3LDE1IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2RtX2FkanVzdF9yb2xlcyhCT09MRUFOIGRlbGF5X3JvbGVfc3dpdGNoKQorc3RhdGljIHZvaWQgYnRhX2RtX2FkanVzdF9yb2xlcyhib29sIGRlbGF5X3JvbGVfc3dpdGNoKQogewogCi0gICAgVUlOVDggaTsKLSAgICBCT09MRUFOIHNldF9tYXN0ZXJfcm9sZSA9IEZBTFNFOwotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCi0gICAgVUlOVDggYnJfY291bnQgPSBidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQgLSBidGFfZG1fY2IuZGV2aWNlX2xpc3QubGVfY291bnQ7CisgICAgdWludDhfdCBpOworICAgIGJvb2wgc2V0X21hc3Rlcl9yb2xlID0gZmFsc2U7CisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQorICAgIHVpbnQ4X3QgYnJfY291bnQgPSBidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQgLSBidGFfZG1fY2IuZGV2aWNlX2xpc3QubGVfY291bnQ7CiAjZWxzZQotICAgIFVJTlQ4IGJyX2NvdW50ID0gYnRhX2RtX2NiLmRldmljZV9saXN0LmNvdW50OworICAgIHVpbnQ4X3QgYnJfY291bnQgPSBidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQ7CiAjZW5kaWYKICAgICBpZiAoYnJfY291bnQpCiAgICAgewpAQCAtMzU1OCwxNCArMzU1NywxNCBAQAogICAgICAgICB7CiAKICAgICAgICAgICAgIEwyQ0FfU2V0RGVzaXJlUm9sZSAoSENJX1JPTEVfTUFTVEVSKTsKLSAgICAgICAgICAgIHNldF9tYXN0ZXJfcm9sZSA9IFRSVUU7CisgICAgICAgICAgICBzZXRfbWFzdGVyX3JvbGUgPSB0cnVlOwogCiAgICAgICAgIH0KIAogICAgICAgICBmb3IoaT0wOyBpPGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5jb3VudDsgaSsrKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLmNvbm5fc3RhdGUgPT0gQlRBX0RNX0NPTk5FQ1RFRAotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogICAgICAgICAgICAgICAgICYmIGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5wZWVyX2RldmljZVtpXS50cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0JSX0VEUgogI2VuZGlmCiAgICAgICAgICAgICAgICAgKQpAQCAtMzU3NCw3ICszNTczLDcgQEAKICAgICAgICAgICAgICAgICAgICAgJiYgKHBfYnRhX2RtX3JtX2NmZ1swXS5jZmcgPT0gQlRBX0RNX1BBUlRJQUxfU0NBVFRFUk5FVCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBMMkNBX1NldERlc2lyZVJvbGUgKEhDSV9ST0xFX01BU1RFUik7Ci0gICAgICAgICAgICAgICAgICAgIHNldF9tYXN0ZXJfcm9sZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHNldF9tYXN0ZXJfcm9sZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYoKGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5wZWVyX2RldmljZVtpXS5wcmVmX3JvbGUgPT0gQlRBX01BU1RFUl9ST0xFX09OTFkpCkBAIC0zNTg4LDcgKzM1ODcsNyBAQAogICAgICAgICAgICAgICAgICAgZGVsYXllZCB0byBhdm9pZCB0aGUgY29sbGlzaW9uIHdpdGggbGluayBlbmNyeXB0aW9uIHNldHVwICovCiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5wZWVyX2RldmljZVtpXS5wcmVmX3JvbGUgIT0gQlRBX1NMQVZFX1JPTEVfT05MWSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X3JvbGVfc3dpdGNoID09IEZBTFNFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X3JvbGVfc3dpdGNoID09IGZhbHNlKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBCVE1fU3dpdGNoUm9sZSAoYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLnBlZXJfYmRhZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDSV9ST0xFX01BU1RFUiwgTlVMTCk7CkBAIC0zNzA3LDI5ICszNzA2LDI5IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgYnRhX2RtX3NldF9laXIgKGNoYXIgKmxvY2FsX25hbWUpCiB7Ci0gICAgVUlOVDggICAgKnA7Ci0gICAgVUlOVDggICAgKnBfbGVuZ3RoOworICAgIHVpbnQ4X3QgICAgKnA7CisgICAgdWludDhfdCAgICAqcF9sZW5ndGg7CiAjaWYgKEJUQV9FSVJfQ0FOTkVEX1VVSURfTElTVCAhPSBUUlVFKQotICAgIFVJTlQ4ICAgICpwX3R5cGU7Ci0gICAgVUlOVDggICAgbWF4X251bV91dWlkOworICAgIHVpbnQ4X3QgICAgKnBfdHlwZTsKKyAgICB1aW50OF90ICAgIG1heF9udW1fdXVpZDsKICNpZiAoQlRBX0VJUl9TRVJWRVJfTlVNX0NVU1RPTV9VVUlEID4gMCkKLSAgICBVSU5UOCAgICBjdXN0b21fdXVpZF9pZHg7CisgICAgdWludDhfdCAgICBjdXN0b21fdXVpZF9pZHg7CiAjZW5kaWYgIC8vIEJUQV9FSVJfU0VSVkVSX05VTV9DVVNUT01fVVVJRAogI2VuZGlmICAvLyBCVEFfRUlSX0NBTk5FRF9VVUlEX0xJU1QKICNpZiAoQlRNX0VJUl9ERUZBVUxUX0ZFQ19SRVFVSVJFRCA9PSBGQUxTRSkKLSAgICBVSU5UOCAgICBmcmVlX2Vpcl9sZW5ndGggPSBIQ0lfRVhUX0lOUV9SRVNQT05TRV9MRU47CisgICAgdWludDhfdCAgICBmcmVlX2Vpcl9sZW5ndGggPSBIQ0lfRVhUX0lOUV9SRVNQT05TRV9MRU47CiAjZWxzZSAgLy8gQlRNX0VJUl9ERUZBVUxUX0ZFQ19SRVFVSVJFRAotICAgIFVJTlQ4ICAgIGZyZWVfZWlyX2xlbmd0aCA9IEhDSV9ETTVfUEFDS0VUX1NJWkU7CisgICAgdWludDhfdCAgICBmcmVlX2Vpcl9sZW5ndGggPSBIQ0lfRE01X1BBQ0tFVF9TSVpFOwogI2VuZGlmICAvLyBCVE1fRUlSX0RFRkFVTFRfRkVDX1JFUVVJUkVECi0gICAgVUlOVDggICAgbnVtX3V1aWQ7Ci0gICAgVUlOVDggICAgZGF0YV90eXBlOwotICAgIFVJTlQ4ICAgIGxvY2FsX25hbWVfbGVuOworICAgIHVpbnQ4X3QgICAgbnVtX3V1aWQ7CisgICAgdWludDhfdCAgICBkYXRhX3R5cGU7CisgICAgdWludDhfdCAgICBsb2NhbF9uYW1lX2xlbjsKIAogICAgIC8qIHdhaXQgdW50aWwgY29tcGxldGUgdG8gZGlzYWJsZSAqLwogICAgIGlmIChhbGFybV9pc19zY2hlZHVsZWQoYnRhX2RtX2NiLmRpc2FibGVfdGltZXIpKQogICAgICAgICByZXR1cm47CiAKLSNpZiAoIEJUQV9FSVJfQ0FOTkVEX1VVSURfTElTVCAhPSBUUlVFICkKKyNpZiAoQlRBX0VJUl9DQU5ORURfVVVJRF9MSVNUICE9IFRSVUUpCiAgICAgLyogaWYgbG9jYWwgbmFtZSBpcyBub3QgcHJvdmlkZWQsIGdldCBpdCBmcm9tIGNvbnRyb2xsZXIgKi8KICAgICBpZiggbG9jYWxfbmFtZSA9PSBOVUxMICkKICAgICB7CkBAIC0zNzQyLDcgKzM3NDEsNyBAQAogCiAgICAgLyogQWxsb2NhdGUgYSBidWZmZXIgdG8gaG9sZCBIQ0kgY29tbWFuZCAqLwogICAgIEJUX0hEUiAqcF9idWYgPSAoQlRfSERSICopb3NpX21hbGxvYyhCVE1fQ01EX0JVRl9TSVpFKTsKLSAgICBwID0gKFVJTlQ4ICopcF9idWYgKyBCVE1fSENJX0VJUl9PRkZTRVQ7CisgICAgcCA9ICh1aW50OF90ICopcF9idWYgKyBCVE1fSENJX0VJUl9PRkZTRVQ7CiAKICAgICBtZW1zZXQocCwgMHgwMCwgSENJX0VYVF9JTlFfUkVTUE9OU0VfTEVOICk7CiAKQEAgLTM3NjUsNyArMzc2NCw3IEBACiAgICAgICAgIG1heF9udW1fdXVpZCA9IChmcmVlX2Vpcl9sZW5ndGggLSAyKS9MRU5fVVVJRF8xNjsKICAgICAgICAgZGF0YV90eXBlID0gQlRNX0dldEVpclN1cHBvcnRlZFNlcnZpY2VzKCBidGFfZG1fY2IuZWlyX3V1aWQsICZwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9udW1fdXVpZCwgJm51bV91dWlkICk7Ci0gICAgICAgIHAgPSAoVUlOVDggKilwX2J1ZiArIEJUTV9IQ0lfRUlSX09GRlNFVDsgLyogcmVzZXQgcCAqLworICAgICAgICBwID0gKHVpbnQ4X3QgKilwX2J1ZiArIEJUTV9IQ0lfRUlSX09GRlNFVDsgLyogcmVzZXQgcCAqLwogI2VuZGlmICAvLyBCVEFfRUlSX0NBTk5FRF9VVUlEX0xJU1QKIAogICAgICAgICAvKiBpZiBVVUlEIGRvZXNuJ3QgZml0IHJlbWFpbmcgc3BhY2UsIHNob3J0ZW4gbG9jYWwgbmFtZSAqLwpAQCAtMzgxNyw3ICszODE2LDcgQEAKICAgICAgICAgICAgIGZyZWVfZWlyX2xlbmd0aCAtPSBudW1fdXVpZCAqIExFTl9VVUlEXzE2OwogICAgICAgICB9CiAgICAgfQotI2Vsc2UgLyogKEJUQV9FSVJfQ0FOTkVEX1VVSURfTElTVCA9PSBUUlVFKSAqLworI2Vsc2UgLyogKEJUQV9FSVJfQ0FOTkVEX1VVSURfTElTVCA9PSB0cnVlKSAqLwogICAgIC8qIGlmIFVVSUQgbGlzdCBpcyBkeW5hbWljICovCiAgICAgaWYgKCBmcmVlX2Vpcl9sZW5ndGggPj0gMikKICAgICB7CkBAIC0zODU5LDkgKzM4NTgsOSBAQAogICAgICAgICBVSU5UOF9UT19TVFJFQU0ocF90eXBlLCBkYXRhX3R5cGUpOwogICAgICAgICBmcmVlX2Vpcl9sZW5ndGggLT0gbnVtX3V1aWQgKiBMRU5fVVVJRF8xNiArIDI7CiAgICAgfQotI2VuZGlmIC8qIChCVEFfRUlSX0NBTk5FRF9VVUlEX0xJU1QgPT0gVFJVRSkgKi8KKyNlbmRpZiAvKiAoQlRBX0VJUl9DQU5ORURfVVVJRF9MSVNUID09IHRydWUpICovCiAKLSNpZiAoIEJUQV9FSVJfQ0FOTkVEX1VVSURfTElTVCAhPSBUUlVFICkmJihCVEFfRUlSX1NFUlZFUl9OVU1fQ1VTVE9NX1VVSUQgPiAwKQorI2lmIChCVEFfRUlSX0NBTk5FRF9VVUlEX0xJU1QgIT0gVFJVRSAmJiBCVEFfRUlSX1NFUlZFUl9OVU1fQ1VTVE9NX1VVSUQgPiAwKQogICAgIC8qIEFkZGluZyAzMi1iaXQgVVVJRCBsaXN0ICovCiAgICAgaWYgKCBmcmVlX2Vpcl9sZW5ndGggPj0gMikKICAgICB7CkBAIC0zOTI3LDcgKzM5MjYsNyBAQAogICAgICAgICBVSU5UOF9UT19TVFJFQU0ocF90eXBlLCBkYXRhX3R5cGUpOwogICAgICAgICBmcmVlX2Vpcl9sZW5ndGggLT0gbnVtX3V1aWQgKiBMRU5fVVVJRF8xMjggKyAyOwogICAgIH0KLSNlbmRpZiAvKiAoIEJUQV9FSVJfQ0FOTkVEX1VVSURfTElTVCAhPSBUUlVFICkmJihCVEFfRUlSX1NFUlZFUl9OVU1fQ1VTVE9NX1VVSUQgPiAwKSAqLworI2VuZGlmIC8qICggQlRBX0VJUl9DQU5ORURfVVVJRF9MSVNUICE9IHRydWUgKSYmKEJUQV9FSVJfU0VSVkVSX05VTV9DVVNUT01fVVVJRCA+IDApICovCiAKICAgICAvKiBpZiBGbGFncyBhcmUgcHJvdmlkZWQgaW4gY29uZmlndXJhdGlvbiAqLwogICAgIGlmKCggcF9idGFfZG1fZWlyX2NmZy0+YnRhX2RtX2Vpcl9mbGFnX2xlbiA+IDAgKQpAQCAtNDAwMiw3ICs0MDAxLDcgQEAKIAogICAgIEFQUExfVFJBQ0VfREVCVUcoIiAgICB3aXRoIHNlcnZpY2VzX3RvX3NlYXJjaD0weCUwOFgiLCAqcF9zZXJ2aWNlc190b19zZWFyY2gpOwogCi0jaWYgQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSAmJiBCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFKQogICAgIC8qIGFsd2F5cyBkbyBHQVRUIGJhc2VkIHNlcnZpY2UgZGlzY292ZXJ5IGJ5IFNEUCBpbnN0ZWFkIG9mIGZyb20gRUlSICAgICovCiAgICAgLyogaWYgR0FUVCBiYXNlZCBzZXJ2aWNlIGlzIGFsc28gdG8gYmUgcHV0IGluIEVJUiwgbmVlZCB0byBtb2RpZnkgdGhpcyAgKi8KICAgICB3aGlsZSAoc2VydmljZV9pbmRleCA8IChCVEFfTUFYX1NFUlZJQ0VfSUQgLSAxKSkKQEAgLTQwNjMsNyArNDA2Miw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIE5vbmUKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZG1fZWlyX3VwZGF0ZV91dWlkKFVJTlQxNiB1dWlkMTYsIEJPT0xFQU4gYWRkaW5nKQordm9pZCBidGFfZG1fZWlyX3VwZGF0ZV91dWlkKHVpbnQxNl90IHV1aWQxNiwgYm9vbCBhZGRpbmcpCiB7CiAgICAgLyogaWYgdGhpcyBVVUlEIGlzIG5vdCBhZHZlcnRpc2VkIGluIEVJUiAqLwogICAgIGlmKCAhQlRNX0hhc0VpclNlcnZpY2UoIHBfYnRhX2RtX2Vpcl9jZmctPnV1aWRfbWFzaywgdXVpZDE2ICkpCkBAIC00MTU1LDcgKzQxNTQsNyBAQAogewogICAgIHRCVEFfU1RBVFVTICAgYnRhX3N0YXR1cyA9IEJUQV9TVUNDRVNTOwogICAgIHRCVEFfRE1fRU5DUllQVF9DQkFDSyAqcF9jYWxsYmFjayA9IE5VTEw7Ci0gICAgVUlOVDggICBpIDsKKyAgICB1aW50OF90ICAgaSA7CiAgICAgVU5VU0VEKHBfcmVmX2RhdGEpOwogCiAgICAgZm9yIChpPTA7IGk8YnRhX2RtX2NiLmRldmljZV9saXN0LmNvdW50OyBpKyspCkBAIC00MjA4LDcgKzQyMDcsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2RtX3NldF9lbmNyeXB0aW9uICh0QlRBX0RNX01TRyAqcF9kYXRhKQogewotICAgIFVJTlQ4IGkgOworICAgIHVpbnQ4X3QgaSA7CiAKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfZG1fc2V0X2VuY3J5cHRpb24iKTsgLy90b2RvCiAgICAgaWYgKCFwX2RhdGEtPnNldF9lbmNyeXB0aW9uLnBfY2FsbGJhY2spCkBAIC00MjUzLDcgKzQyNTIsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9kbV9vYnNlcnZlX3Jlc3VsdHNfY2IgKHRCVE1fSU5RX1JFU1VMVFMgKnBfaW5xLCBVSU5UOCAqcF9laXIpCitzdGF0aWMgdm9pZCBidGFfZG1fb2JzZXJ2ZV9yZXN1bHRzX2NiICh0QlRNX0lOUV9SRVNVTFRTICpwX2lucSwgdWludDhfdCAqcF9laXIpCiB7CiA7CiAgICAgdEJUQV9ETV9TRUFSQ0ggICAgIHJlc3VsdDsKQEAgLTQyNzIsOCArNDI3MSw4IEBACiAKICAgICBpZigocF9pbnFfaW5mbyA9IEJUTV9JbnFEYlJlYWQocF9pbnEtPnJlbW90ZV9iZF9hZGRyKSkgIT0gTlVMTCkKICAgICB7Ci0gICAgICAgIC8qIGluaXRpYWxpemUgcmVtdF9uYW1lX25vdF9yZXF1aXJlZCB0byBGQUxTRSBzbyB0aGF0IHdlIGdldCB0aGUgbmFtZSBieSBkZWZhdWx0ICovCi0gICAgICAgIHJlc3VsdC5pbnFfcmVzLnJlbXRfbmFtZV9ub3RfcmVxdWlyZWQgPSBGQUxTRTsKKyAgICAgICAgLyogaW5pdGlhbGl6ZSByZW10X25hbWVfbm90X3JlcXVpcmVkIHRvIGZhbHNlIHNvIHRoYXQgd2UgZ2V0IHRoZSBuYW1lIGJ5IGRlZmF1bHQgKi8KKyAgICAgICAgcmVzdWx0LmlucV9yZXMucmVtdF9uYW1lX25vdF9yZXF1aXJlZCA9IGZhbHNlOwogICAgIH0KIAogICAgIGlmKGJ0YV9kbV9zZWFyY2hfY2IucF9zY2FuX2NiYWNrKQpAQCAtNDI4NCw3ICs0MjgzLDcgQEAKICAgICAgICAgLyogYXBwbGljYXRpb24gaW5kaWNhdGVzIGlmIGl0IGtub3dzIHRoZSByZW1vdGUgbmFtZSwgaW5zaWRlIHRoZSBjYWxsYmFjawogICAgICAgICAgY29weSB0aGF0IHRvIHRoZSBpbnF1aXJ5IGRhdGEgYmFzZSovCiAgICAgICAgIGlmKHJlc3VsdC5pbnFfcmVzLnJlbXRfbmFtZV9ub3RfcmVxdWlyZWQpCi0gICAgICAgICAgICBwX2lucV9pbmZvLT5hcHBsX2tub3dzX3JlbV9uYW1lID0gVFJVRTsKKyAgICAgICAgICAgIHBfaW5xX2luZm8tPmFwcGxfa25vd3NfcmVtX25hbWUgPSB0cnVlOwogICAgIH0KIH0KIApAQCAtNDMyMiw3ICs0MzIxLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgVUlOVDggYnRhX2RtX2JsZV9zbXBfY2JhY2sgKHRCVE1fTEVfRVZUIGV2ZW50LCBCRF9BRERSIGJkYSwgdEJUTV9MRV9FVlRfREFUQSAqcF9kYXRhKQorc3RhdGljIHVpbnQ4X3QgYnRhX2RtX2JsZV9zbXBfY2JhY2sgKHRCVE1fTEVfRVZUIGV2ZW50LCBCRF9BRERSIGJkYSwgdEJUTV9MRV9FVlRfREFUQSAqcF9kYXRhKQogewogICAgIHRCVE1fU1RBVFVTIHN0YXR1cyA9IEJUTV9TVUNDRVNTOwogICAgIHRCVEFfRE1fU0VDIHNlY19ldmVudDsKQEAgLTQzOTYsNyArNDM5NSw3IEBACiAKICAgICAgICAgY2FzZSBCVE1fTEVfQ09NUExUX0VWVDoKICAgICAgICAgICAgIGJkY3B5KHNlY19ldmVudC5hdXRoX2NtcGwuYmRfYWRkciwgYmRhKTsKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKICAgICAgICAgICAgIEJUTV9SZWFkRGV2SW5mbyhiZGEsICZzZWNfZXZlbnQuYXV0aF9jbXBsLmRldl90eXBlLCAmc2VjX2V2ZW50LmF1dGhfY21wbC5hZGRyX3R5cGUpOwogI2VuZGlmCiAgICAgICAgICAgICBwX25hbWUgPSBCVE1fU2VjUmVhZERldk5hbWUoYmRhKTsKQEAgLTQ0MDcsMTYgKzQ0MDYsMTYgQEAKIAogICAgICAgICAgICAgaWYgKHBfZGF0YS0+Y29tcGx0LnJlYXNvbiAhPSAwKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNlY19ldmVudC5hdXRoX2NtcGwuZmFpbF9yZWFzb24gPSBCVEFfRE1fQVVUSF9DT05WRVJUX1NNUF9DT0RFKCgoVUlOVDgpcF9kYXRhLT5jb21wbHQucmVhc29uKSk7CisgICAgICAgICAgICAgICAgc2VjX2V2ZW50LmF1dGhfY21wbC5mYWlsX3JlYXNvbiA9IEJUQV9ETV9BVVRIX0NPTlZFUlRfU01QX0NPREUoKCh1aW50OF90KXBfZGF0YS0+Y29tcGx0LnJlYXNvbikpOwogICAgICAgICAgICAgICAgIC8qIGRlbGV0ZSB0aGlzIGRldmljZSBlbnRyeSBmcm9tIFNlYyBEZXYgREIgKi8KICAgICAgICAgICAgICAgICBidGFfZG1fcmVtb3ZlX3NlY19kZXZfZW50cnkgKGJkYSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VjX2V2ZW50LmF1dGhfY21wbC5zdWNjZXNzID0gVFJVRTsKKyAgICAgICAgICAgICAgICBzZWNfZXZlbnQuYXV0aF9jbXBsLnN1Y2Nlc3MgPSB0cnVlOwogICAgICAgICAgICAgICAgIC8qIFdlIGFsc28gcmVnaXN0ZXIgZm9yIFNlcnZpY2UgQ2hhbmdlZCByaWdodCBhZnRlciBjb25uZWN0LiAqLwogICAgICAgICAgICAgICAgIGlmICghcF9kYXRhLT5jb21wbHQuc21wX292ZXJfYnIpCi0gICAgICAgICAgICAgICAgICAgIEdBVFRfQ29uZmlnU2VydmljZUNoYW5nZUNDQyhiZGEsIFRSVUUsIEJUX1RSQU5TUE9SVF9MRSk7CisgICAgICAgICAgICAgICAgICAgIEdBVFRfQ29uZmlnU2VydmljZUNoYW5nZUNDQyhiZGEsIHRydWUsIEJUX1RSQU5TUE9SVF9MRSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChidGFfZG1fY2IucF9zZWNfY2JhY2spCkBAIC00NDMyLDcgKzQ0MzEsNyBAQAogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQotI2VuZGlmICAvKiBTTVBfSU5DTFVERUQgPT0gVFJVRSAqLworI2VuZGlmICAvKiBTTVBfSU5DTFVERUQgPT0gdHJ1ZSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTQ0NDQsOSArNDQ0Myw5IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2RtX2JsZV9pZF9rZXlfY2JhY2sgKFVJTlQ4IGtleV90eXBlLCB0QlRNX0JMRV9MT0NBTF9LRVlTICpwX2tleSkKK3N0YXRpYyB2b2lkIGJ0YV9kbV9ibGVfaWRfa2V5X2NiYWNrICh1aW50OF90IGtleV90eXBlLCB0QlRNX0JMRV9MT0NBTF9LRVlTICpwX2tleSkKIHsKLSAgICBVSU5UOCAgIGV2dDsKKyAgICB1aW50OF90ICAgZXZ0OwogICAgIHRCVEFfRE1fU0VDIGRtX2tleTsKIAogICAgIHN3aXRjaCAoa2V5X3R5cGUpCkBAIC00NjY2LDcgKzQ2NjUsNyBAQAogICAgIH0KIH0KIAotI2lmIEJMRV9QUklWQUNZX1NQVCA9PSBUUlVFCisjaWYgKEJMRV9QUklWQUNZX1NQVCA9PSBUUlVFKQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCiAqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9ibGVfY29uZmlnX2xvY2FsX3ByaXZhY3kKQEAgLTQ2OTgsMTEgKzQ2OTcsMTEgQEAKICAgICB7CiAgICAgICAgIC8qU2F2ZSB0aGUgIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgc2NhbiByZXN1bHRzIGFyZSBhdmFpbGFibGUgKi8KICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5wX3NjYW5fY2JhY2sgPSBwX2RhdGEtPmJsZV9vYnNlcnZlLnBfY2JhY2s7Ci0gICAgICAgIGlmICgoc3RhdHVzID0gQlRNX0JsZU9ic2VydmUoVFJVRSwgcF9kYXRhLT5ibGVfb2JzZXJ2ZS5kdXJhdGlvbiwKKyAgICAgICAgaWYgKChzdGF0dXMgPSBCVE1fQmxlT2JzZXJ2ZSh0cnVlLCBwX2RhdGEtPmJsZV9vYnNlcnZlLmR1cmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9kbV9vYnNlcnZlX3Jlc3VsdHNfY2IsIGJ0YV9kbV9vYnNlcnZlX2NtcGxfY2IpKSE9IEJUTV9DTURfU1RBUlRFRCkKICAgICAgICAgewogICAgICAgICAgICAgdEJUQV9ETV9TRUFSQ0ggIGRhdGE7Ci0gICAgICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiAlcyBCVE1fQmxlT2JzZXJ2ZSAgZmFpbGVkLiBzdGF0dXMgJWQiLF9fRlVOQ1RJT05fXyxzdGF0dXMpOworICAgICAgICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIgJXMgQlRNX0JsZU9ic2VydmUgIGZhaWxlZC4gc3RhdHVzICVkIixfX2Z1bmNfXyxzdGF0dXMpOwogICAgICAgICAgICAgZGF0YS5pbnFfY21wbC5udW1fcmVzcHMgPSAwOwogICAgICAgICAgICAgaWYgKGJ0YV9kbV9zZWFyY2hfY2IucF9zY2FuX2NiYWNrKQogICAgICAgICAgICAgewpAQCAtNDcxMyw3ICs0NzEyLDcgQEAKICAgICBlbHNlCiAgICAgewogICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnBfc2Nhbl9jYmFjayA9IE5VTEw7Ci0gICAgICAgIEJUTV9CbGVPYnNlcnZlKEZBTFNFLCAwLCBOVUxMLE5VTEwgKTsKKyAgICAgICAgQlRNX0JsZU9ic2VydmUoZmFsc2UsIDAsIE5VTEwsTlVMTCApOwogICAgIH0KIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00NzkzLDcgKzQ3OTIsNyBAQAogICAgIGlmIChCVE1fU2V0QmxlRGF0YUxlbmd0aChwX2RhdGEtPmJsZV9zZXRfZGF0YV9sZW5ndGgucmVtb3RlX2JkYSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+YmxlX3NldF9kYXRhX2xlbmd0aC50eF9kYXRhX2xlbmd0aCkgIT0gQlRNX1NVQ0NFU1MpCiAgICAgewotICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKCIlcyBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKCIlcyBmYWlsZWQiLCBfX2Z1bmNfXyk7CiAgICAgfQogfQogCkBAIC01MDc0LDcgKzUwNzMsNyBAQAogICAgIHsKICAgICAgICAgbWVtc2V0KCZ0cmFja19hZHZfZGF0YSwgMCwgc2l6ZW9mKHRCVEFfRE1fQkxFX1RSQUNLX0FEVl9EQVRBKSk7CiAgICAgICAgIHRyYWNrX2Fkdl9kYXRhLmFkdmVydGlzZXJfaW5mb19wcmVzZW50ID0gTk9fQURWX0lORk9fUFJFU0VOVDsgLyogSW5kaWNhdGVzIGZhaWx1cmUgKi8KLSAgICAgICAgdHJhY2tfYWR2X2RhdGEuY2xpZW50X2lmID0gKFVJTlQ4KXBfZGF0YS0+YmxlX3RyYWNrX2FkdmVydC5yZWZfdmFsdWU7CisgICAgICAgIHRyYWNrX2Fkdl9kYXRhLmNsaWVudF9pZiA9ICh1aW50OF90KXBfZGF0YS0+YmxlX3RyYWNrX2FkdmVydC5yZWZfdmFsdWU7CiAgICAgICAgIHBfZGF0YS0+YmxlX3RyYWNrX2FkdmVydC5wX3RyYWNrX2Fkdl9jYmFjaygmdHJhY2tfYWR2X2RhdGEpOwogICAgIH0KIH0KQEAgLTUxMTksNyArNTExOCw3IEBACiB9CiAKIAotI2lmIEJMRV9BTkRST0lEX0NPTlRST0xMRVJfU0NBTl9GSUxURVIgPT0gVFJVRQorI2lmIChCTEVfQU5EUk9JRF9DT05UUk9MTEVSX1NDQU5fRklMVEVSID09IFRSVUUpCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKICoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2JsZV9zY2FuX3BmX2NtcGwKQEAgLTUxMjcsNyArNTEyNiw3IEBACiAqKiBEZXNjcmlwdGlvbiAgICAgIEFEViBwYXlsb2FkIGZpbHRlcmluZyBvcGVyYXRpb24gY29tcGxldGUgY2FsbGJhY2sKICoqCiAqKgotKiogUmV0dXJucyAgICAgICAgIFRSVUUgaWYgaGFuZGxlZCwgb3RoZXJ3aXNlIEZBTFNFLgorKiogUmV0dXJucyAgICAgICAgIHRydWUgaWYgaGFuZGxlZCwgb3RoZXJ3aXNlIGZhbHNlLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZCBidGFfYmxlX3NjYW5fY2ZnX2NtcGwodEJUTV9CTEVfUEZfQUNUSU9OIGFjdGlvbiwgdEJUTV9CTEVfU0NBTl9DT05EX09QIGNmZ19vcCwKQEAgLTUyOTksNyArNTI5OCw3IEBACiAgICAgICAgIGJ0YV9ibGVfZW5lcmd5X2luZm9fY21wbCgwLCAwLCAwLCAwLCBidG1fc3RhdHVzKTsKIH0KIAotI2lmICgoZGVmaW5lZCBCVEFfR0FUVF9JTkNMVURFRCkgJiYgIChCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFKSkKKyNpZiAoQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRSkKICNpZm5kZWYgQlRBX0RNX0dBVFRfQ0xPU0VfREVMQVlfVE9VVAogI2RlZmluZSBCVEFfRE1fR0FUVF9DTE9TRV9ERUxBWV9UT1VUICAgIDEwMDAKICNlbmRpZgpAQCAtNTMzNCw3ICs1MzMzLDcgQEAKICoqIFBhcmFtZXRlcnM6CiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0bV9kbV9zdGFydF9kaXNjX2dhdHRfc2VydmljZXMgKFVJTlQxNiBjb25uX2lkKQorc3RhdGljIHZvaWQgYnRtX2RtX3N0YXJ0X2Rpc2NfZ2F0dF9zZXJ2aWNlcyAodWludDE2X3QgY29ubl9pZCkKIHsKICAgICB0QlRfVVVJRCAgICAqcF91dWlkID0gYnRhX2RtX3NlYXJjaF9jYi5wX3NydmNfdXVpZCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9kbV9zZWFyY2hfY2IubnVtX3V1aWQgLSBidGFfZG1fc2VhcmNoX2NiLnV1aWRfdG9fc2VhcmNoOwpAQCAtNTM4NSw3ICs1Mzg0LDcgQEAKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigiJXMgb3V0IG9mIHJvb20gdG8gYWNjb21vZGF0ZSBtb3JlIHNlcnZpY2UgaWRzIGJsZV9yYXdfc2l6ZSA9ICVkIGJsZV9yYXdfdXNlZCA9ICVkIiwgX19GVU5DVElPTl9fLGJ0YV9kbV9zZWFyY2hfY2IuYmxlX3Jhd19zaXplLCBidGFfZG1fc2VhcmNoX2NiLmJsZV9yYXdfdXNlZCApOworICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKCIlcyBvdXQgb2Ygcm9vbSB0byBhY2NvbW9kYXRlIG1vcmUgc2VydmljZSBpZHMgYmxlX3Jhd19zaXplID0gJWQgYmxlX3Jhd191c2VkID0gJWQiLCBfX2Z1bmNfXyxidGFfZG1fc2VhcmNoX2NiLmJsZV9yYXdfc2l6ZSwgYnRhX2RtX3NlYXJjaF9jYi5ibGVfcmF3X3VzZWQgKTsKICAgICB9CiAKICAgICBMT0dfSU5GTyhMT0dfVEFHLCAiJXMgc2VydmljZV9pZF91dWlkX2xlbj0lZCAiLCBfX2Z1bmNfXywgc2VydmljZV9pZC51dWlkLmxlbik7CkBAIC01NDEwLDcgKzU0MDksNyBAQAogKiogUGFyYW1ldGVyczoKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2RtX2dhdHRfZGlzY19jb21wbGV0ZShVSU5UMTYgY29ubl9pZCwgdEJUQV9HQVRUX1NUQVRVUyBzdGF0dXMpCitzdGF0aWMgdm9pZCBidGFfZG1fZ2F0dF9kaXNjX2NvbXBsZXRlKHVpbnQxNl90IGNvbm5faWQsIHRCVEFfR0FUVF9TVEFUVVMgc3RhdHVzKQogewogICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIGNvbm5faWQgPSAlZCIsIF9fZnVuY19fLCBjb25uX2lkKTsKIApAQCAtNTQ2NCw3ICs1NDYzLDcgQEAKICAgICAgICAgICAgIGJkY3B5KGJ0YV9kbV9zZWFyY2hfY2IucGVuZGluZ19jbG9zZV9iZGEsCiAgICAgICAgICAgICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnBlZXJfYmRhZGRyKTsKICAgICAgICAgfQotICAgICAgICBidGFfZG1fc2VhcmNoX2NiLmdhdHRfZGlzY19hY3RpdmUgPSBGQUxTRTsKKyAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5nYXR0X2Rpc2NfYWN0aXZlID0gZmFsc2U7CiAgICAgfQogfQogCkBAIC01NDk5LDcgKzU0OTgsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRtX2RtX3N0YXJ0X2dhdHRfZGlzY292ZXJ5IChCRF9BRERSIGJkX2FkZHIpCiB7Ci0gICAgYnRhX2RtX3NlYXJjaF9jYi5nYXR0X2Rpc2NfYWN0aXZlID0gVFJVRTsKKyAgICBidGFfZG1fc2VhcmNoX2NiLmdhdHRfZGlzY19hY3RpdmUgPSB0cnVlOwogCiAgICAgLyogY29ubmVjdGlvbiBpcyBhbHJlYWR5IG9wZW4gKi8KICAgICBpZiAoYmRjbXAoYnRhX2RtX3NlYXJjaF9jYi5wZW5kaW5nX2Nsb3NlX2JkYSwgYmRfYWRkcikgPT0gMCAmJgpAQCAtNTUxMCw3ICs1NTA5LDcgQEAKICAgICAgICAgYnRtX2RtX3N0YXJ0X2Rpc2NfZ2F0dF9zZXJ2aWNlcyhidGFfZG1fc2VhcmNoX2NiLmNvbm5faWQpOwogICAgIH0KICAgICBlbHNlCi0gICAgICAgIEJUQV9HQVRUQ19PcGVuKGJ0YV9kbV9zZWFyY2hfY2IuY2xpZW50X2lmLCBiZF9hZGRyLCBUUlVFLCBCVEFfR0FUVF9UUkFOU1BPUlRfTEUpOworICAgICAgICBCVEFfR0FUVENfT3BlbihidGFfZG1fc2VhcmNoX2NiLmNsaWVudF9pZiwgYmRfYWRkciwgdHJ1ZSwgQlRBX0dBVFRfVFJBTlNQT1JUX0xFKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU1MjYsNyArNTUyNSw3IEBACiB7CiAgICAgaWYgKGJ0YV9kbV9zZWFyY2hfY2IuY29ubl9pZCA9PSBCVEFfR0FUVF9JTlZBTElEX0NPTk5fSUQpCiAgICAgewotICAgICAgICBCVEFfR0FUVENfQ2FuY2VsT3BlbihidGFfZG1fc2VhcmNoX2NiLmNsaWVudF9pZiwgYmRfYWRkciwgVFJVRSk7CisgICAgICAgIEJUQV9HQVRUQ19DYW5jZWxPcGVuKGJ0YV9kbV9zZWFyY2hfY2IuY2xpZW50X2lmLCBiZF9hZGRyLCB0cnVlKTsKICAgICB9CiAKICAgICBidGFfZG1fZ2F0dF9kaXNjX2NvbXBsZXRlKGJ0YV9kbV9zZWFyY2hfY2IuY29ubl9pZCwgKHRCVEFfR0FUVF9TVEFUVVMpIEJUQV9HQVRUX0VSUk9SKTsKQEAgLTU1NDMsOCArNTU0Miw4IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfZG1fcHJvY19vcGVuX2V2dCh0QlRBX0dBVFRDX09QRU4gKnBfZGF0YSkKIHsKLSAgICBVSU5UOCAgICAgICAgICAgKnAxOwotICAgIFVJTlQ4ICAgICAgICAgICAqcDI7CisgICAgdWludDhfdCAgICAgICAgICAgKnAxOworICAgIHVpbnQ4X3QgICAgICAgICAgICpwMjsKIAogICAgIHAxID0gYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkcjsKICAgICBwMiA9IHBfZGF0YS0+cmVtb3RlX2JkYTsKQEAgLTU2MTYsNyArNTYxNSw3IEBACiAgICAgICAgICAgICAgICAgIChidGFfZG1fc2VhcmNoX2NiLnN0YXRlICE9IEJUQV9ETV9TRUFSQ0hfQUNUSVZFKSAmJgogICAgICAgICAgICAgICAgICAhbWVtY21wKHBfZGF0YS0+Y2xvc2UucmVtb3RlX2JkYSwgYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkciwgQkRfQUREUl9MRU4pKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ0YV9kbV9nYXR0X2Rpc2NfY29tcGxldGUoKFVJTlQxNilCVEFfR0FUVF9JTlZBTElEX0NPTk5fSUQsICAodEJUQV9HQVRUX1NUQVRVUykgQlRBX0dBVFRfRVJST1IpOworICAgICAgICAgICAgICAgIGJ0YV9kbV9nYXR0X2Rpc2NfY29tcGxldGUoKHVpbnQxNl90KUJUQV9HQVRUX0lOVkFMSURfQ09OTl9JRCwgICh0QlRBX0dBVFRfU1RBVFVTKSBCVEFfR0FUVF9FUlJPUik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKIApAQCAtNTYyNyw3ICs1NjI2LDcgQEAKIAogI2VuZGlmIC8qIEJUQV9HQVRUX0lOQ0xVREVEICovCiAKLSNpZiBCTEVfVk5EX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQkxFX1ZORF9JTkNMVURFRCA9PSBUUlVFKQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCiAqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9jdHJsX2ZlYXR1cmVzX3JkX2NtcGxfY2JhY2sKQEAgLTU2MzksNyArNTYzOCw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgYnRhX2RtX2N0cmxfZmVhdHVyZXNfcmRfY21wbF9jYmFjayh0QlRNX1NUQVRVUyByZXN1bHQpCiB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgIHN0YXR1cyA9ICVkICIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAgc3RhdHVzID0gJWQgIiwgX19mdW5jX18sIHJlc3VsdCk7CiAgICAgaWYgKHJlc3VsdCA9PSBCVE1fU1VDQ0VTUykKICAgICB7CiAgICAgICAgIGlmKGJ0YV9kbV9jYi5wX3NlY19jYmFjaykKQEAgLTU2NDcsNyArNTY0Niw3IEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzIEN0cmwgQkxFIGZlYXR1cmUgcmVhZCBmYWlsZWQ6IHN0YXR1cyA6JWQiLF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKyAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigiJXMgQ3RybCBCTEUgZmVhdHVyZSByZWFkIGZhaWxlZDogc3RhdHVzIDolZCIsX19mdW5jX18sIHJlc3VsdCk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9idGEvZG0vYnRhX2RtX2FwaS5jYyBiL2J0YS9kbS9idGFfZG1fYXBpLmNjCmluZGV4IDliOWRjNWQuLjg5ZWRjZmQgMTAwNjQ0Ci0tLSBhL2J0YS9kbS9idGFfZG1fYXBpLmNjCisrKyBiL2J0YS9kbS9idGFfZG1fYXBpLmNjCkBAIC0xNzgsNyArMTc4LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9EbVNldFZpc2liaWxpdHkodEJUQV9ETV9ESVNDIGRpc2NfbW9kZSwgdEJUQV9ETV9DT05OIGNvbm5fbW9kZSwgVUlOVDggcGFpcmFibGVfbW9kZSwgVUlOVDggY29ubl9maWx0ZXIgKQordm9pZCBCVEFfRG1TZXRWaXNpYmlsaXR5KHRCVEFfRE1fRElTQyBkaXNjX21vZGUsIHRCVEFfRE1fQ09OTiBjb25uX21vZGUsIHVpbnQ4X3QgcGFpcmFibGVfbW9kZSwgdWludDhfdCBjb25uX2ZpbHRlciApCiB7CiAgICAgdEJUQV9ETV9BUElfU0VUX1ZJU0lCSUxJVFkgKnBfbXNnID0KICAgICAgICAgKHRCVEFfRE1fQVBJX1NFVF9WSVNJQklMSVRZICopb3NpX21hbGxvYyhzaXplb2YodEJUQV9ETV9NU0cpKTsKQEAgLTI0OCw3ICsyNDgsNyBAQAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIEJUQV9EbURpc2NvdmVyKEJEX0FERFIgYmRfYWRkciwgdEJUQV9TRVJWSUNFX01BU0sgc2VydmljZXMsCi0gICAgICAgICAgICAgICAgICAgIHRCVEFfRE1fU0VBUkNIX0NCQUNLICpwX2NiYWNrLCBCT09MRUFOIHNkcF9zZWFyY2gpCisgICAgICAgICAgICAgICAgICAgIHRCVEFfRE1fU0VBUkNIX0NCQUNLICpwX2NiYWNrLCBib29sIHNkcF9zZWFyY2gpCiB7CiAgICAgdEJUQV9ETV9BUElfRElTQ09WRVIgKnBfbXNnID0KICAgICAgICAgKHRCVEFfRE1fQVBJX0RJU0NPVkVSICopb3NpX2NhbGxvYyhzaXplb2YodEJUQV9ETV9BUElfRElTQ09WRVIpKTsKQEAgLTI3NCw3ICsyNzQsNyBAQAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIEJUQV9EbURpc2NvdmVyVVVJRChCRF9BRERSIGJkX2FkZHIsIHRTRFBfVVVJRCAqdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sgKnBfY2JhY2ssIEJPT0xFQU4gc2RwX3NlYXJjaCkKKyAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sgKnBfY2JhY2ssIGJvb2wgc2RwX3NlYXJjaCkKIHsKICAgICB0QlRBX0RNX0FQSV9ESVNDT1ZFUiAqcF9tc2cgPQogICAgICAgICAodEJUQV9ETV9BUElfRElTQ09WRVIgKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0RNX0FQSV9ESVNDT1ZFUikpOwpAQCAtMjg1LDcgKzI4NSw3IEBACiAgICAgcF9tc2ctPnBfY2JhY2sgPSBwX2NiYWNrOwogICAgIHBfbXNnLT5zZHBfc2VhcmNoID0gc2RwX3NlYXJjaDsKIAotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFICYmIEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRSkKICAgICBwX21zZy0+bnVtX3V1aWQgPSAwOwogICAgIHBfbXNnLT5wX3V1aWQgPSBOVUxMOwogI2VuZGlmCkBAIC0zNzMsNyArMzczLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9EbVBpblJlcGx5KEJEX0FERFIgYmRfYWRkciwgQk9PTEVBTiBhY2NlcHQsIFVJTlQ4IHBpbl9sZW4sIFVJTlQ4ICpwX3BpbikKK3ZvaWQgQlRBX0RtUGluUmVwbHkoQkRfQUREUiBiZF9hZGRyLCBib29sIGFjY2VwdCwgdWludDhfdCBwaW5fbGVuLCB1aW50OF90ICpwX3BpbikKIAogewogICAgIHRCVEFfRE1fQVBJX1BJTl9SRVBMWSAqcF9tc2cgPQpAQCAtNDIyLDcgKzQyMiw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfRG1Db25maXJtKEJEX0FERFIgYmRfYWRkciwgQk9PTEVBTiBhY2NlcHQpCit2b2lkIEJUQV9EbUNvbmZpcm0oQkRfQUREUiBiZF9hZGRyLCBib29sIGFjY2VwdCkKIHsKICAgICB0QlRBX0RNX0FQSV9DT05GSVJNICpwX21zZyA9CiAgICAgICAgICh0QlRBX0RNX0FQSV9DT05GSVJNICopb3NpX21hbGxvYyhzaXplb2YodEJUQV9ETV9BUElfQ09ORklSTSkpOwpAQCAtNDQ2LDggKzQ0Niw4IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgQlRBX0RtQWRkRGV2aWNlKEJEX0FERFIgYmRfYWRkciwgREVWX0NMQVNTIGRldl9jbGFzcywgTElOS19LRVkgbGlua19rZXksCi0gICAgICAgICAgICAgICAgICAgICB0QlRBX1NFUlZJQ0VfTUFTSyB0cnVzdGVkX21hc2ssIEJPT0xFQU4gaXNfdHJ1c3RlZCwKLSAgICAgICAgICAgICAgICAgICAgIFVJTlQ4IGtleV90eXBlLCB0QlRBX0lPX0NBUCBpb19jYXAsIFVJTlQ4IHBpbl9sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICB0QlRBX1NFUlZJQ0VfTUFTSyB0cnVzdGVkX21hc2ssIGJvb2wgaXNfdHJ1c3RlZCwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X3R5cGUsIHRCVEFfSU9fQ0FQIGlvX2NhcCwgdWludDhfdCBwaW5fbGVuZ3RoKQogewogICAgIHRCVEFfRE1fQVBJX0FERF9ERVZJQ0UgKnBfbXNnID0KICAgICAgICAgKHRCVEFfRE1fQVBJX0FERF9ERVZJQ0UgKilvc2lfY2FsbG9jKHNpemVvZih0QlRBX0RNX0FQSV9BRERfREVWSUNFKSk7CkBAIC00NTksMTQgKzQ1OSwxNCBAQAogICAgIHBfbXNnLT5pb19jYXAgPSBpb19jYXA7CiAKICAgICBpZiAobGlua19rZXkpIHsKLSAgICAgICAgcF9tc2ctPmxpbmtfa2V5X2tub3duID0gVFJVRTsKKyAgICAgICAgcF9tc2ctPmxpbmtfa2V5X2tub3duID0gdHJ1ZTsKICAgICAgICAgcF9tc2ctPmtleV90eXBlID0ga2V5X3R5cGU7CiAgICAgICAgIG1lbWNweShwX21zZy0+bGlua19rZXksIGxpbmtfa2V5LCBMSU5LX0tFWV9MRU4pOwogICAgIH0KIAogICAgIC8qIExvYWQgZGV2aWNlIGNsYXNzIGlmIHNwZWNpZmllZCAqLwogICAgIGlmIChkZXZfY2xhc3MpIHsKLSAgICAgICAgcF9tc2ctPmRjX2tub3duID0gVFJVRTsKKyAgICAgICAgcF9tc2ctPmRjX2tub3duID0gdHJ1ZTsKICAgICAgICAgbWVtY3B5KHBfbXNnLT5kYywgZGV2X2NsYXNzLCBERVZfQ0xBU1NfTEVOKTsKICAgICB9CiAKQEAgLTUxMywxMyArNTEzLDEzIEBACiAqKiBSZXR1cm5zICAgICAgICAgIE5vbmUKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGNvbnN0IFVJTlQxNiBidGFfc2VydmljZV9pZF90b191dWlkX2xrdXBfdGJsIFtdOwotdm9pZCBCVEFfR2V0RWlyU2VydmljZSggVUlOVDggKnBfZWlyLCB0QlRBX1NFUlZJQ0VfTUFTSyAqcF9zZXJ2aWNlcyApCitleHRlcm4gY29uc3QgdWludDE2X3QgYnRhX3NlcnZpY2VfaWRfdG9fdXVpZF9sa3VwX3RibCBbXTsKK3ZvaWQgQlRBX0dldEVpclNlcnZpY2UoIHVpbnQ4X3QgKnBfZWlyLCB0QlRBX1NFUlZJQ0VfTUFTSyAqcF9zZXJ2aWNlcyApCiB7Ci0gICAgVUlOVDggeHgsIHl5OwotICAgIFVJTlQ4IG51bV91dWlkLCBtYXhfbnVtX3V1aWQgPSAzMjsKLSAgICBVSU5UOCB1dWlkX2xpc3RbMzIqTEVOX1VVSURfMTZdOwotICAgIFVJTlQxNiAqcF91dWlkMTYgPSAoVUlOVDE2ICopdXVpZF9saXN0OworICAgIHVpbnQ4X3QgeHgsIHl5OworICAgIHVpbnQ4X3QgbnVtX3V1aWQsIG1heF9udW1fdXVpZCA9IDMyOworICAgIHVpbnQ4X3QgdXVpZF9saXN0WzMyKkxFTl9VVUlEXzE2XTsKKyAgICB1aW50MTZfdCAqcF91dWlkMTYgPSAodWludDE2X3QgKil1dWlkX2xpc3Q7CiAgICAgdEJUQV9TRVJWSUNFX01BU0sgbWFzazsKIAogICAgIEJUTV9HZXRFaXJVdWlkTGlzdCggcF9laXIsIExFTl9VVUlEXzE2LCAmbnVtX3V1aWQsIHV1aWRfbGlzdCwgbWF4X251bV91dWlkKTsKQEAgLTU1Nyw3ICs1NTcsNyBAQAogKiogUmV0dXJucyAgICAgICAgICAwIGlmIHRoZSBkZXZpY2UgaXMgTk9UIGNvbm5lY3RlZC4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVUlOVDE2IEJUQV9EbUdldENvbm5lY3Rpb25TdGF0ZShjb25zdCBCRF9BRERSIGJkX2FkZHIgKQordWludDE2X3QgQlRBX0RtR2V0Q29ubmVjdGlvblN0YXRlKGNvbnN0IEJEX0FERFIgYmRfYWRkciApCiB7CiAgICAgdEJUQV9ETV9QRUVSX0RFVklDRSAqIHBfZGV2ID0gYnRhX2RtX2ZpbmRfcGVlcl9kZXZpY2UoYmRfYWRkcik7CiAgICAgcmV0dXJuIChwX2RldiAmJiBwX2Rldi0+Y29ubl9zdGF0ZSA9PSBCVEFfRE1fQ09OTkVDVEVEKTsKQEAgLTU3Nyw3ICs1NzcsNyBAQAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB0QlRBX1NUQVRVUyBCVEFfRG1TZXRMb2NhbERpUmVjb3JkKCB0QlRBX0RJX1JFQ09SRCAqcF9kZXZpY2VfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiAqcF9oYW5kbGUgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBfaGFuZGxlICkKIHsKICAgICB0QlRBX1NUQVRVUyAgc3RhdHVzID0gQlRBX0ZBSUxVUkU7CiAKQEAgLTY0MCw3ICs2NDAsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgQlRBX0RtQWRkQmxlS2V5IChCRF9BRERSIGJkX2FkZHIsIHRCVEFfTEVfS0VZX1ZBTFVFICpwX2xlX2tleSwgdEJUQV9MRV9LRVlfVFlQRSBrZXlfdHlwZSkKIHsKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKIAogICAgIHRCVEFfRE1fQVBJX0FERF9CTEVLRVkgKnBfbXNnID0KICAgICAgICAgKHRCVEFfRE1fQVBJX0FERF9CTEVLRVkgKilvc2lfY2FsbG9jKHNpemVvZih0QlRBX0RNX0FQSV9BRERfQkxFS0VZKSk7CkBAIC02NzEsNyArNjcxLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIEJUQV9EbUFkZEJsZURldmljZShCRF9BRERSIGJkX2FkZHIsIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSwgdEJUX0RFVklDRV9UWVBFIGRldl90eXBlKQogewotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogICAgIHRCVEFfRE1fQVBJX0FERF9CTEVfREVWSUNFICpwX21zZyA9CiAgICAgICAgICh0QlRBX0RNX0FQSV9BRERfQkxFX0RFVklDRSAqKW9zaV9jYWxsb2Moc2l6ZW9mKHRCVEFfRE1fQVBJX0FERF9CTEVfREVWSUNFKSk7CiAKQEAgLTY5OCw5ICs2OTgsOSBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0RtQmxlUGFzc2tleVJlcGx5KEJEX0FERFIgYmRfYWRkciwgQk9PTEVBTiBhY2NlcHQsIFVJTlQzMiBwYXNza2V5KQordm9pZCBCVEFfRG1CbGVQYXNza2V5UmVwbHkoQkRfQUREUiBiZF9hZGRyLCBib29sIGFjY2VwdCwgdWludDMyX3QgcGFzc2tleSkKIHsKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKICAgICB0QlRBX0RNX0FQSV9QQVNTS0VZX1JFUExZICpwX21zZyA9CiAgICAgICAgICh0QlRBX0RNX0FQSV9QQVNTS0VZX1JFUExZICopb3NpX2NhbGxvYyhzaXplb2YodEJUQV9ETV9BUElfUEFTU0tFWV9SRVBMWSkpOwogCkBAIC03MjcsOSArNzI3LDkgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9EbUJsZUNvbmZpcm1SZXBseShCRF9BRERSIGJkX2FkZHIsIEJPT0xFQU4gYWNjZXB0KQordm9pZCBCVEFfRG1CbGVDb25maXJtUmVwbHkoQkRfQUREUiBiZF9hZGRyLCBib29sIGFjY2VwdCkKIHsKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKICAgICB0QlRBX0RNX0FQSV9DT05GSVJNICpwX21zZyA9CiAgICAgICAgICh0QlRBX0RNX0FQSV9DT05GSVJNICopb3NpX2NhbGxvYyhzaXplb2YodEJUQV9ETV9BUElfQ09ORklSTSkpOwogCkBAIC03NTUsNyArNzU1LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIEJUQV9EbUJsZVNlY3VyaXR5R3JhbnQoQkRfQUREUiBiZF9hZGRyLCB0QlRBX0RNX0JMRV9TRUNfR1JBTlQgcmVzKQogewotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogICAgIHRCVEFfRE1fQVBJX0JMRV9TRUNfR1JBTlQgKnBfbXNnID0KICAgICAgICAgKHRCVEFfRE1fQVBJX0JMRV9TRUNfR1JBTlQgKilvc2lfY2FsbG9jKHNpemVvZih0QlRBX0RNX0FQSV9CTEVfU0VDX0dSQU5UKSk7CiAKQEAgLTc4NywxMCArNzg3LDEwIEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgQlRBX0RtU2V0QmxlUHJlZkNvbm5QYXJhbXMoY29uc3QgQkRfQUREUiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBtaW5fY29ubl9pbnQsIFVJTlQxNiBtYXhfY29ubl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IHNsYXZlX2xhdGVuY3ksIFVJTlQxNiBzdXBlcnZpc2lvbl90b3V0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5fY29ubl9pbnQsIHVpbnQxNl90IG1heF9jb25uX2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzbGF2ZV9sYXRlbmN5LCB1aW50MTZfdCBzdXBlcnZpc2lvbl90b3V0ICkKIHsKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKICAgICB0QlRBX0RNX0FQSV9CTEVfQ09OTl9QQVJBTVMgKnBfbXNnID0KICAgICAgICAgKHRCVEFfRE1fQVBJX0JMRV9DT05OX1BBUkFNUyAqKW9zaV9jYWxsb2Moc2l6ZW9mKHRCVEFfRE1fQVBJX0JMRV9DT05OX1BBUkFNUykpOwogCkBAIC04MTgsOSArODE4LDkgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9EbVNldEJsZUNvbm5TY2FuUGFyYW1zKFVJTlQzMiBzY2FuX2ludGVydmFsLCBVSU5UMzIgc2Nhbl93aW5kb3cpCit2b2lkIEJUQV9EbVNldEJsZUNvbm5TY2FuUGFyYW1zKHVpbnQzMl90IHNjYW5faW50ZXJ2YWwsIHVpbnQzMl90IHNjYW5fd2luZG93KQogewotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogICAgIHRCVEFfRE1fQVBJX0JMRV9TQ0FOX1BBUkFNUyAqcF9tc2cgPQogICAgICAgICAodEJUQV9ETV9BUElfQkxFX1NDQU5fUEFSQU1TICopb3NpX2NhbGxvYyhzaXplb2YodEJUQV9ETV9BUElfQkxFX1NDQU5fUEFSQU1TKSk7CiAKQEAgLTgyOSw3ICs4MjksNyBAQAogICAgIHBfbXNnLT5zY2FuX3dpbmRvdyA9IHNjYW5fd2luZG93OwogCiAgICAgYnRhX3N5c19zZW5kbXNnKHBfbXNnKTsKLSNlbmRpZiAgLy8gQkxFX0lOQ0xVREVEID09IFRSVUUKKyNlbmRpZiAgLy8gQkxFX0lOQ0xVREVEID09IHRydWUKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTg0OCw5ICs4NDgsOSBAQAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRQotdm9pZCBCVEFfRG1TZXRCbGVTY2FuUGFyYW1zKHRHQVRUX0lGIGNsaWVudF9pZiwgVUlOVDMyIHNjYW5faW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIHNjYW5fd2luZG93LCB0QkxFX1NDQU5fTU9ERSBzY2FuX21vZGUsCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQordm9pZCBCVEFfRG1TZXRCbGVTY2FuUGFyYW1zKHRHQVRUX0lGIGNsaWVudF9pZiwgdWludDMyX3Qgc2Nhbl9pbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzY2FuX3dpbmRvdywgdEJMRV9TQ0FOX01PREUgc2Nhbl9tb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfU0NBTl9QQVJBTV9TRVRVUF9DQkFDSyBzY2FuX3BhcmFtX3NldHVwX2NiYWNrKQogewogICAgIHRCVEFfRE1fQVBJX0JMRV9TQ0FOX1BBUkFNUyAqcF9tc2cgPQpAQCAtODY1LDcgKzg2NSw3IEBACiAKICAgICBidGFfc3lzX3NlbmRtc2cocF9tc2cpOwogfQotI2VuZGlmICAvLyBCTEVfSU5DTFVERUQgPT0gVFJVRQorI2VuZGlmICAvLyBCTEVfSU5DTFVERUQgPT0gdHJ1ZQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTg3OSwxMCArODc5LDEwIEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfRG1TZXRCbGVBZHZQYXJhbXMgKFVJTlQxNiBhZHZfaW50X21pbiwgVUlOVDE2IGFkdl9pbnRfbWF4LAordm9pZCBCVEFfRG1TZXRCbGVBZHZQYXJhbXMgKHVpbnQxNl90IGFkdl9pbnRfbWluLCB1aW50MTZfdCBhZHZfaW50X21heCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQkRfQUREUiAqcF9kaXJfYmRhKQogewotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogICAgIHRCVEFfRE1fQVBJX0JMRV9BRFZfUEFSQU1TICpwX21zZyA9CiAgICAgICAgICh0QlRBX0RNX0FQSV9CTEVfQURWX1BBUkFNUyAqKW9zaV9jYWxsb2Moc2l6ZW9mKHRCVEFfRE1fQVBJX0JMRV9BRFZfUEFSQU1TKSk7CiAKQEAgLTkwNSw3ICs5MDUsNyBAQAogKiogICAgICAgICAgICAgICAgICAgICAgQkxFIEFEViBkYXRhIG1hbmFnZW1lbnQgQVBJCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCiAqKiBGdW5jdGlvbiAgICAgICAgIEJUQV9EbUJsZVNldEFkdkNvbmZpZwpAQCAtOTc1LDkgKzk3NSw5IEBACiAqKiBSZXR1cm5zICAgICAgICAgIE5vbmUKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0RtQmxlU2V0U3RvcmFnZVBhcmFtcyhVSU5UOCBiYXRjaF9zY2FuX2Z1bGxfbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBiYXRjaF9zY2FuX3RydW5jX21heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggYmF0Y2hfc2Nhbl9ub3RpZnlfdGhyZXNob2xkLAorZXh0ZXJuIHZvaWQgQlRBX0RtQmxlU2V0U3RvcmFnZVBhcmFtcyh1aW50OF90IGJhdGNoX3NjYW5fZnVsbF9tYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmF0Y2hfc2Nhbl90cnVuY19tYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmF0Y2hfc2Nhbl9ub3RpZnlfdGhyZXNob2xkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0JMRV9TQ0FOX1NFVFVQX0NCQUNLICpwX3NldHVwX2NiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0JMRV9TQ0FOX1RIUkVTSE9MRF9DQkFDSyAqcF90aHJlc19jYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9CTEVfU0NBTl9SRVBfQ0JBQ0sqIHBfcmVwX2NiYWNrLApAQCAtMTAxNyw3ICsxMDE3LDcgQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogZXh0ZXJuIHZvaWQgQlRBX0RtQmxlRW5hYmxlQmF0Y2hTY2FuKHRCVEFfQkxFX0JBVENIX1NDQU5fTU9ERSBzY2FuX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBzY2FuX2ludGVydmFsLCBVSU5UMzIgc2Nhbl93aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNjYW5faW50ZXJ2YWwsIHVpbnQzMl90IHNjYW5fd2luZG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0JMRV9ESVNDQVJEX1JVTEUgZGlzY2FyZF9ydWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSAgICAgICAgYWRkcl90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX0JMRV9SRUZfVkFMVUUgcmVmX3ZhbHVlKQpAQCAtMTExMyw3ICsxMTEzLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKiAgICAgICAgICAgICAgICAgICAgICBCTEUgQURWIGRhdGEgbWFuYWdlbWVudCBBUEkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTExMjYsNyArMTEyNiw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIE5vbmUKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0RtQmxlQnJvYWRjYXN0IChCT09MRUFOIHN0YXJ0KQorZXh0ZXJuIHZvaWQgQlRBX0RtQmxlQnJvYWRjYXN0IChib29sIHN0YXJ0KQogewogICAgIHRCVEFfRE1fQVBJX0JMRV9PQlNFUlZFICpwX21zZyA9CiAgICAgICAgICh0QlRBX0RNX0FQSV9CTEVfT0JTRVJWRSAqKW9zaV9jYWxsb2Moc2l6ZW9mKHRCVEFfRE1fQVBJX0JMRV9PQlNFUlZFKSk7CkBAIC0xMTU2LDcgKzExNTYsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgQlRBX0RtQmxlU2V0QmdDb25uVHlwZSh0QlRBX0RNX0JMRV9DT05OX1RZUEUgYmdfY29ubl90eXBlLCB0QlRBX0RNX0JMRV9TRUxfQ0JBQ0sgKnBfc2VsZWN0X2NiYWNrKQogewotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogICAgIHRCVEFfRE1fQVBJX0JMRV9TRVRfQkdfQ09OTl9UWVBFICpwX21zZyA9CiAgICAgICAgICh0QlRBX0RNX0FQSV9CTEVfU0VUX0JHX0NPTk5fVFlQRSAqKW9zaV9jYWxsb2Moc2l6ZW9mKHRCVEFfRE1fQVBJX0JMRV9TRVRfQkdfQ09OTl9UWVBFKSk7CiAKQEAgLTExNzcsOSArMTE3Nyw5IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFICYmIEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRSkKIHN0YXRpYyB2b2lkIGJ0YV9kbV9kaXNjb3Zlcl9zZW5kX21zZyhCRF9BRERSIGJkX2FkZHIsIHRCVEFfU0VSVklDRV9NQVNLX0VYVCAqcF9zZXJ2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sgKnBfY2JhY2ssIEJPT0xFQU4gc2RwX3NlYXJjaCwKKyAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sgKnBfY2JhY2ssIGJvb2wgc2RwX3NlYXJjaCwKICAgICAgICAgICAgICAgICAgICAgdEJUQV9UUkFOU1BPUlQgdHJhbnNwb3J0KQogewogICAgIGNvbnN0IHNpemVfdCBsZW4gPSBwX3NlcnZpY2VzID8KQEAgLTExOTQsNyArMTE5NCw3IEBACiAgICAgcF9tc2ctPnRyYW5zcG9ydCAgICA9IHRyYW5zcG9ydDsKIAogICAgIGlmIChwX3NlcnZpY2VzICE9IE5VTEwpIHsKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRSAmJiBCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFICYmIEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCiAgICAgICAgIHBfbXNnLT5zZXJ2aWNlcyA9IHBfc2VydmljZXMtPnNydmNfbWFzazsKICAgICAgICAgcF9tc2ctPm51bV91dWlkID0gcF9zZXJ2aWNlcy0+bnVtX3V1aWQ7CiAgICAgICAgIGlmIChwX3NlcnZpY2VzLT5udW1fdXVpZCAhPSAwKSB7CkBAIC0xMjI2LDEwICsxMjI2LDEwIEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgQlRBX0RtRGlzY292ZXJCeVRyYW5zcG9ydChCRF9BRERSIGJkX2FkZHIsIHRCVEFfU0VSVklDRV9NQVNLX0VYVCAqcF9zZXJ2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sgKnBfY2JhY2ssIEJPT0xFQU4gc2RwX3NlYXJjaCwKKyAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sgKnBfY2JhY2ssIGJvb2wgc2RwX3NlYXJjaCwKICAgICAgICAgICAgICAgICAgICAgdEJUQV9UUkFOU1BPUlQgdHJhbnNwb3J0KQogewotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFICYmIEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRSkKICAgICBidGFfZG1fZGlzY292ZXJfc2VuZF9tc2coYmRfYWRkciwgcF9zZXJ2aWNlcywgcF9jYmFjaywgc2RwX3NlYXJjaCwgdHJhbnNwb3J0KTsKICNlbmRpZgogfQpAQCAtMTI1MSw5ICsxMjUxLDkgQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBCVEFfRG1EaXNjb3ZlckV4dChCRF9BRERSIGJkX2FkZHIsIHRCVEFfU0VSVklDRV9NQVNLX0VYVCAqcF9zZXJ2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sgKnBfY2JhY2ssIEJPT0xFQU4gc2RwX3NlYXJjaCkKKyAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sgKnBfY2JhY2ssIGJvb2wgc2RwX3NlYXJjaCkKIHsKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRSAmJiBCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFICYmIEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCiAgICAgYnRhX2RtX2Rpc2NvdmVyX3NlbmRfbXNnKGJkX2FkZHIsIHBfc2VydmljZXMsIHBfY2JhY2ssIHNkcF9zZWFyY2gsIEJUQV9UUkFOU1BPUlRfVU5LTk9XTik7CiAjZW5kaWYKIApAQCAtMTI4MCw3ICsxMjgwLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIEJUQV9EbVNlYXJjaEV4dCh0QlRBX0RNX0lOUSAqcF9kbV9pbnEsIHRCVEFfU0VSVklDRV9NQVNLX0VYVCAqcF9zZXJ2aWNlcywgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sgKnBfY2JhY2spCiB7Ci0jaWYgQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSAmJiBCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFKQogICAgIGNvbnN0IHNpemVfdCBsZW4gPSBwX3NlcnZpY2VzID8KICAgICAgICAgKHNpemVvZih0QlRBX0RNX0FQSV9TRUFSQ0gpICsgc2l6ZW9mKHRCVF9VVUlEKSAqIHBfc2VydmljZXMtPm51bV91dWlkKQogICAgICAgICA6IHNpemVvZih0QlRBX0RNX0FQSV9TRUFSQ0gpOwpAQCAtMTMyNiwxMSArMTMyNiwxMSBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0RtQmxlVXBkYXRlQ29ubmVjdGlvblBhcmFtKEJEX0FERFIgYmRfYWRkciwgVUlOVDE2IG1pbl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgbWF4X2ludCwgVUlOVDE2IGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgdGltZW91dCkKK3ZvaWQgQlRBX0RtQmxlVXBkYXRlQ29ubmVjdGlvblBhcmFtKEJEX0FERFIgYmRfYWRkciwgdWludDE2X3QgbWluX2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9pbnQsIHVpbnQxNl90IGxhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB0aW1lb3V0KQogewotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogICAgIHRCVEFfRE1fQVBJX1VQREFURV9DT05OX1BBUkFNICpwX21zZyA9CiAgICAgICAgICh0QlRBX0RNX0FQSV9VUERBVEVfQ09OTl9QQVJBTSAqKW9zaV9jYWxsb2Moc2l6ZW9mKHRCVEFfRE1fQVBJX1VQREFURV9DT05OX1BBUkFNKSk7CiAKQEAgLTEzNTYsOSArMTM1Niw5IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfRG1CbGVDb25maWdMb2NhbFByaXZhY3koQk9PTEVBTiBwcml2YWN5X2VuYWJsZSkKK3ZvaWQgQlRBX0RtQmxlQ29uZmlnTG9jYWxQcml2YWN5KGJvb2wgcHJpdmFjeV9lbmFibGUpCiB7Ci0jaWYgQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgQkxFX1BSSVZBQ1lfU1BUID09IFRSVUUKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgQkxFX1BSSVZBQ1lfU1BUID09IFRSVUUpCiAgICAgdEJUQV9ETV9BUElfTE9DQUxfUFJJVkFDWSAqcF9tc2cgPQogICAgICAgICAodEJUQV9ETV9BUElfTE9DQUxfUFJJVkFDWSAqKW9zaV9jYWxsb2Moc2l6ZW9mKHRCVEFfRE1fQVBJX0VOQUJMRV9QUklWQUNZKSk7CiAKQEAgLTEzNzEsNyArMTM3MSw3IEBACiAjZW5kaWYKIH0KIAotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCiAqKiBGdW5jdGlvbiAgICAgICAgIEJUQV9CbGVFbmFibGVBZHZJbnN0YW5jZQpAQCAtMTQyMSw3ICsxNDIxLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgQlRBX1NVQ0NFU1MgaWYgY29tbWFuZCBzdGFydGVkIHN1Y2Vzc2Z1bGx5OyBvdGhlcndpc2UgZmFpbHVyZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQmxlVXBkYXRlQWR2SW5zdFBhcmFtIChVSU5UOCBpbnN0X2lkLCB0QlRBX0JMRV9BRFZfUEFSQU1TICpwX3BhcmFtcykKK3ZvaWQgQlRBX0JsZVVwZGF0ZUFkdkluc3RQYXJhbSAodWludDhfdCBpbnN0X2lkLCB0QlRBX0JMRV9BRFZfUEFSQU1TICpwX3BhcmFtcykKIHsKICAgICBjb25zdCBzaXplX3QgbGVuID0gc2l6ZW9mKHRCVEFfQkxFX0FEVl9QQVJBTVMpICsKICAgICAgICAgc2l6ZW9mKHRCVEFfRE1fQVBJX0JMRV9NVUxUSV9BRFZfUEFSQU0pOwpAQCAtMTQ1NSw3ICsxNDU1LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgQlRBX1NVQ0NFU1MgaWYgY29tbWFuZCBzdGFydGVkIHN1Y2Vzc2Z1bGx5OyBvdGhlcndpc2UgZmFpbHVyZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQmxlQ2ZnQWR2SW5zdERhdGEgKFVJTlQ4IGluc3RfaWQsIEJPT0xFQU4gaXNfc2Nhbl9yc3AsCit2b2lkIEJUQV9CbGVDZmdBZHZJbnN0RGF0YSAodWludDhfdCBpbnN0X2lkLCBib29sIGlzX3NjYW5fcnNwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQkxFX0FEX01BU0sgZGF0YV9tYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQkxFX0FEVl9EQVRBICpwX2RhdGEpCiB7CkBAIC0xNDgyLDcgKzE0ODIsNyBAQAogKiogUmV0dXJucyAgICAgICAgICBCVEFfU1VDQ0VTUyBpZiBjb21tYW5kIHN0YXJ0ZWQgc3VjZXNzZnVsbHk7IG90aGVyd2lzZSBmYWlsdXJlLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9CbGVEaXNhYmxlQWR2SW5zdGFuY2UoVUlOVDggaW5zdF9pZCkKK3ZvaWQgQlRBX0JsZURpc2FibGVBZHZJbnN0YW5jZSh1aW50OF90IGluc3RfaWQpCiB7CiAgICAgdEJUQV9ETV9BUElfQkxFX01VTFRJX0FEVl9ESVNBQkxFICpwX21zZyA9CiAgICAgICAgICh0QlRBX0RNX0FQSV9CTEVfTVVMVElfQURWX0RJU0FCTEUgKilvc2lfY2FsbG9jKHNpemVvZih0QlRBX0RNX0FQSV9CTEVfTVVMVElfQURWX0RJU0FCTEUpKTsKQEAgLTE1MTksMTMgKzE1MTksMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfRE1fQkxFX1BGX0NGR19DQkFDSyAqcF9jbXBsX2NiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9CTEVfUkVGX1ZBTFVFIHJlZl92YWx1ZSkKIHsKLSNpZiBCTEVfQU5EUk9JRF9DT05UUk9MTEVSX1NDQU5fRklMVEVSID09IFRSVUUKKyNpZiAoQkxFX0FORFJPSURfQ09OVFJPTExFUl9TQ0FOX0ZJTFRFUiA9PSBUUlVFKQogICAgIHRCVEFfRE1fQVBJX0NGR19GSUxURVJfQ09ORCAqcF9tc2c7CiAgICAgQVBQTF9UUkFDRV9BUEkgKCJCVEFfRG1CbGVDZmdGaWx0ZXJDb25kaXRpb246ICVkLCAlZCIsIGFjdGlvbiwgY29uZF90eXBlKTsKIAotICAgIFVJTlQxNiAgbGVuID0gc2l6ZW9mKHRCVEFfRE1fQVBJX0NGR19GSUxURVJfQ09ORCkgKworICAgIHVpbnQxNl90ICBsZW4gPSBzaXplb2YodEJUQV9ETV9BUElfQ0ZHX0ZJTFRFUl9DT05EKSArCiAgICAgICAgICAgICAgICAgICBzaXplb2YodEJUQV9ETV9CTEVfUEZfQ09ORF9QQVJBTSk7Ci0gICAgVUlOVDggKnA7CisgICAgdWludDhfdCAqcDsKIAogICAgIGlmIChOVUxMICE9IHBfY29uZCkKICAgICB7CkBAIC0xNTM2LDExICsxNTM2LDExIEBACiAgICAgICAgICAgICAgICAgLyogTGVuZ3RoIG9mIHBhdHRlcm4gYW5kIHBhdHRlcm4gbWFzayBhbmQgb3RoZXIgZWxlbWVudHMgaW4gKi8KICAgICAgICAgICAgICAgICAvKiB0QlRBX0RNX0JMRV9QRl9NQU5VX0NPTkQgKi8KICAgICAgICAgICAgICAgICBsZW4gKz0gKChwX2NvbmQtPm1hbnVfZGF0YS5kYXRhX2xlbikgKiAyKSArCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoVUlOVDE2KSArIHNpemVvZihVSU5UMTYpICsgc2l6ZW9mKFVJTlQ4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1aW50MTZfdCkgKyBzaXplb2YodWludDE2X3QpICsgc2l6ZW9mKHVpbnQ4X3QpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlIEJUQV9ETV9CTEVfUEZfTE9DQUxfTkFNRToKLSAgICAgICAgICAgICAgICBsZW4gKz0gKChwX2NvbmQtPmxvY2FsX25hbWUuZGF0YV9sZW4pICsgc2l6ZW9mKFVJTlQ4KSk7CisgICAgICAgICAgICAgICAgbGVuICs9ICgocF9jb25kLT5sb2NhbF9uYW1lLmRhdGFfbGVuKSArIHNpemVvZih1aW50OF90KSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgQlRNX0JMRV9QRl9TUlZDX1VVSUQ6CkBAIC0xNTY0LDcgKzE1NjQsNyBAQAogICAgICAgICBwX21zZy0+cF9jb25kX3BhcmFtID0gKHRCVEFfRE1fQkxFX1BGX0NPTkRfUEFSQU0gKikocF9tc2cgKyAxKTsKICAgICAgICAgbWVtY3B5KHBfbXNnLT5wX2NvbmRfcGFyYW0sIHBfY29uZCwgc2l6ZW9mKHRCVEFfRE1fQkxFX1BGX0NPTkRfUEFSQU0pKTsKIAotICAgICAgICBwID0gKFVJTlQ4ICopKHBfbXNnLT5wX2NvbmRfcGFyYW0gKyAxKTsKKyAgICAgICAgcCA9ICh1aW50OF90ICopKHBfbXNnLT5wX2NvbmRfcGFyYW0gKyAxKTsKIAogICAgICAgICBpZiAoY29uZF90eXBlID09IEJUQV9ETV9CTEVfUEZfU1JWQ19EQVRBX1BBVFRFUk4gfHwKICAgICAgICAgICAgIGNvbmRfdHlwZSA9PSBCVEFfRE1fQkxFX1BGX01BTlVfREFUQSkgewpAQCAtMTU5OCw3ICsxNTk4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcF9jb25kLT5zcnZjX3V1aWQucF90YXJnZXRfYWRkci0+dHlwZTsKICAgICAgICAgICAgICAgICBtZW1jcHkocF9tc2ctPnBfY29uZF9wYXJhbS0+c3J2Y191dWlkLnBfdGFyZ2V0X2FkZHItPmJkYSwKICAgICAgICAgICAgICAgICAgICAgICAgcF9jb25kLT5zcnZjX3V1aWQucF90YXJnZXRfYWRkci0+YmRhLCBCRF9BRERSX0xFTik7Ci0gICAgICAgICAgICAgICAgcCA9IChVSU5UOCAqKShwX21zZy0+cF9jb25kX3BhcmFtLT5zcnZjX3V1aWQucF90YXJnZXRfYWRkciArIDEpOworICAgICAgICAgICAgICAgIHAgPSAodWludDhfdCAqKShwX21zZy0+cF9jb25kX3BhcmFtLT5zcnZjX3V1aWQucF90YXJnZXRfYWRkciArIDEpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHBfY29uZC0+c3J2Y191dWlkLnBfdXVpZF9tYXNrKSB7CiAgICAgICAgICAgICAgICAgcF9tc2ctPnBfY29uZF9wYXJhbS0+c3J2Y191dWlkLnBfdXVpZF9tYXNrID0gKHRCVEFfRE1fQkxFX1BGX0NPTkRfTUFTSyAqKXA7CkBAIC0xNjM3LDE0ICsxNjM3LDE0IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfRG1CbGVTY2FuRmlsdGVyU2V0dXAoVUlOVDggYWN0aW9uLAordm9pZCBCVEFfRG1CbGVTY2FuRmlsdGVyU2V0dXAodWludDhfdCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX0JMRV9QRl9GSUxUX0lOREVYIGZpbHRfaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX0JMRV9QRl9GSUxUX1BBUkFNUyAqcF9maWx0X3BhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQkRfQUREUiAqcF90YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX0JMRV9QRl9QQVJBTV9DQkFDSyAqcF9jbXBsX2NiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9CTEVfUkVGX1ZBTFVFIHJlZl92YWx1ZSkKIHsKLSNpZiBCTEVfQU5EUk9JRF9DT05UUk9MTEVSX1NDQU5fRklMVEVSID09IFRSVUUKKyNpZiAoQkxFX0FORFJPSURfQ09OVFJPTExFUl9TQ0FOX0ZJTFRFUiA9PSBUUlVFKQogICAgIGNvbnN0IHNpemVfdCBsZW4gPSBzaXplb2YodEJUQV9ETV9BUElfU0NBTl9GSUxURVJfUEFSQU1fU0VUVVApICsKICAgICAgICAgc2l6ZW9mKHRCTEVfQkRfQUREUik7CiAgICAgdEJUQV9ETV9BUElfU0NBTl9GSUxURVJfUEFSQU1fU0VUVVAgKnBfbXNnID0KQEAgLTE3MTYsMTAgKzE3MTYsMTAgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9EbUVuYWJsZVNjYW5GaWx0ZXIoVUlOVDggYWN0aW9uLCB0QlRBX0RNX0JMRV9QRl9TVEFUVVNfQ0JBQ0sgKnBfY21wbF9jYmFjaywKK3ZvaWQgQlRBX0RtRW5hYmxlU2NhbkZpbHRlcih1aW50OF90IGFjdGlvbiwgdEJUQV9ETV9CTEVfUEZfU1RBVFVTX0NCQUNLICpwX2NtcGxfY2JhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX0JMRV9SRUZfVkFMVUUgcmVmX3ZhbHVlKQogewotI2lmIEJMRV9BTkRST0lEX0NPTlRST0xMRVJfU0NBTl9GSUxURVIgPT0gVFJVRQorI2lmIChCTEVfQU5EUk9JRF9DT05UUk9MTEVSX1NDQU5fRklMVEVSID09IFRSVUUpCiAgICAgY29uc3Qgc2l6ZV90IGxlbiA9IHNpemVvZih0QlRBX0RNX0FQSV9FTkFCTEVfU0NBTl9GSUxURVIpICsKICAgICAgICAgc2l6ZW9mKHRCTEVfQkRfQUREUik7CiAgICAgdEJUQV9ETV9BUElfRU5BQkxFX1NDQU5fRklMVEVSICpwX21zZyA9CkBAIC0xNzU2LDggKzE3NTYsOCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0RtQmxlVXBkYXRlQ29ubmVjdGlvblBhcmFtcyhjb25zdCBCRF9BRERSIGJkX2FkZHIsIFVJTlQxNiBtaW5faW50LCBVSU5UMTYgbWF4X2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBsYXRlbmN5LCBVSU5UMTYgdGltZW91dCkKK3ZvaWQgQlRBX0RtQmxlVXBkYXRlQ29ubmVjdGlvblBhcmFtcyhjb25zdCBCRF9BRERSIGJkX2FkZHIsIHVpbnQxNl90IG1pbl9pbnQsIHVpbnQxNl90IG1heF9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsYXRlbmN5LCB1aW50MTZfdCB0aW1lb3V0KQogewogICAgIHRCVEFfRE1fQVBJX1VQREFURV9DT05OX1BBUkFNICpwX21zZyA9CiAgICAgICAgICh0QlRBX0RNX0FQSV9VUERBVEVfQ09OTl9QQVJBTSAqKW9zaV9jYWxsb2Moc2l6ZW9mKHRCVEFfRE1fQVBJX1VQREFURV9DT05OX1BBUkFNKSk7CkBAIC0xNzgyLDcgKzE3ODIsNyBAQAogKioKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfRG1CbGVTZXREYXRhTGVuZ3RoKEJEX0FERFIgcmVtb3RlX2RldmljZSwgVUlOVDE2IHR4X2RhdGFfbGVuZ3RoKQordm9pZCBCVEFfRG1CbGVTZXREYXRhTGVuZ3RoKEJEX0FERFIgcmVtb3RlX2RldmljZSwgdWludDE2X3QgdHhfZGF0YV9sZW5ndGgpCiB7CiAgICAgdEJUQV9ETV9BUElfQkxFX1NFVF9EQVRBX0xFTkdUSCAqcF9tc2cgPQogICAgICAgICAodEJUQV9ETV9BUElfQkxFX1NFVF9EQVRBX0xFTkdUSCAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfRE1fQVBJX0JMRV9TRVRfREFUQV9MRU5HVEgpKTsKQEAgLTE4NDcsNyArMTg0Nyw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfRG1DbG9zZUFDTChCRF9BRERSIGJkX2FkZHIsIEJPT0xFQU4gcmVtb3ZlX2RldiwgdEJUQV9UUkFOU1BPUlQgdHJhbnNwb3J0KQordm9pZCBCVEFfRG1DbG9zZUFDTChCRF9BRERSIGJkX2FkZHIsIGJvb2wgcmVtb3ZlX2RldiwgdEJUQV9UUkFOU1BPUlQgdHJhbnNwb3J0KQogewogICAgIHRCVEFfRE1fQVBJX1JFTU9WRV9BQ0wgKnBfbXNnID0KICAgICAgICAgKHRCVEFfRE1fQVBJX1JFTU9WRV9BQ0wgKilvc2lfY2FsbG9jKHNpemVvZih0QlRBX0RNX0FQSV9SRU1PVkVfQUNMKSk7CkBAIC0xODYyLDcgKzE4NjIsNyBAQAogICAgIGJ0YV9zeXNfc2VuZG1zZyhwX21zZyk7CiB9CiAKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgogKiogRnVuY3Rpb24gICAgICAgICBCVEFfRG1CbGVPYnNlcnZlCkBAIC0xODc4LDcgKzE4NzgsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfRG1CbGVPYnNlcnZlKEJPT0xFQU4gc3RhcnQsIFVJTlQ4IGR1cmF0aW9uLAorZXh0ZXJuIHZvaWQgQlRBX0RtQmxlT2JzZXJ2ZShib29sIHN0YXJ0LCB1aW50OF90IGR1cmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX1NFQVJDSF9DQkFDSyAqcF9yZXN1bHRzX2NiKQogewogICAgIHRCVEFfRE1fQVBJX0JMRV9PQlNFUlZFICpwX21zZyA9CkBAIC0xOTI2LDcgKzE5MjYsNyBAQAogICAgIGlmIChjbW5fYmxlX3ZzY19jYi5tYXhfZmlsdGVyID4gMCkKICAgICB7CiAgICAgICAgIGJ0bV9ibGVfYWR2X2ZpbHRlcl9jbGVhbnVwKCk7Ci0jaWYgQkxFX1BSSVZBQ1lfU1BUID09IFRSVUUKKyNpZiAoQkxFX1BSSVZBQ1lfU1BUID09IFRSVUUpCiAgICAgICAgIGJ0bV9ibGVfcmVzb2x2aW5nX2xpc3RfY2xlYW51cCAoKTsKICNlbmRpZgogICAgIH0KZGlmZiAtLWdpdCBhL2J0YS9kbS9idGFfZG1fY2ZnLmNjIGIvYnRhL2RtL2J0YV9kbV9jZmcuY2MKaW5kZXggNzQ0YTZmYy4uZjY5MGQxZSAxMDA2NDQKLS0tIGEvYnRhL2RtL2J0YV9kbV9jZmcuY2MKKysrIGIvYnRhL2RtL2J0YV9kbV9jZmcuY2MKQEAgLTQ0LDcgKzQ0LDcgQEAKICNkZWZpbmUgQlRBX0RNX0xJTktfVElNRU9VVCAgICA4MDAwCiAjZW5kaWYKIAotLyogVFJVRSB0byBhdm9pZCBzY2F0dGVybmV0IHdoZW4gYXYgaXMgc3RyZWFtaW5nIChiZSB0aGUgbWFzdGVyKSAqLworLyogdHJ1ZSB0byBhdm9pZCBzY2F0dGVybmV0IHdoZW4gYXYgaXMgc3RyZWFtaW5nIChiZSB0aGUgbWFzdGVyKSAqLwogI2lmbmRlZiBCVEFfRE1fQVZPSURfU0NBVFRFUl9BMkRQCiAjZGVmaW5lIEJUQV9ETV9BVk9JRF9TQ0FUVEVSX0EyRFAgICAgVFJVRQogI2VuZGlmCkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgQlRBX0RNX1BBR0VfVElNRU9VVCwKICAgICAvKiBsaW5rIHN1cGVydmlzaW9uIHRpbWVvdXQgaW4gNjI1dVMqLwogICAgIEJUQV9ETV9MSU5LX1RJTUVPVVQsCi0gICAgLyogVFJVRSB0byBhdm9pZCBzY2F0dGVybmV0IHdoZW4gYXYgaXMgc3RyZWFtaW5nIChiZSB0aGUgbWFzdGVyKSAqLworICAgIC8qIHRydWUgdG8gYXZvaWQgc2NhdHRlcm5ldCB3aGVuIGF2IGlzIHN0cmVhbWluZyAoYmUgdGhlIG1hc3RlcikgKi8KICAgICBCVEFfRE1fQVZPSURfU0NBVFRFUl9BMkRQCiB9OwogCkBAIC0xMTcsNyArMTE3LDcgQEAKIAogdEJUQV9ETV9STSAqcF9idGFfZG1fcm1fY2ZnID0gKHRCVEFfRE1fUk0gKikmYnRhX2RtX3JtX2NmZzsKIAotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogIyAgZGVmaW5lIEJUQV9ETV9OVU1fUE1fRU5UUlkgICAgICAgICAyMyAgLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gYnRhX2RtX3BtX2NmZyBleGNlcHQgdGhlIGZpcnN0ICovCiAjICBkZWZpbmUgQlRBX0RNX05VTV9QTV9TUEVDICAgICAgICAgIDE1ICAvKiBudW1iZXIgb2YgZW50cmllcyBpbiBidGFfZG1fcG1fc3BlYyAqLwogI2Vsc2UKQEAgLTE0OSw3ICsxNDksNyBAQAogICB7QlRBX0lEX1BBTiwgQlRVSV9QQU5fSURfUEFOVSwgICAgOX0sICAvKiBQQU5VIHNwZWMgdGFibGUgKi8KICAge0JUQV9JRF9QQU4sIEJUVUlfUEFOX0lEX05BUCwgICAgMTB9LCAgLyogTkFQIHNwZWMgdGFibGUgKi8KICAge0JUQV9JRF9IUywgIEJUQV9BTExfQVBQX0lELCAgICAgMTF9ICAgLyogSFMgc3BlYyB0YWJsZSAqLwotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogICAse0JUQV9JRF9HQVRUQywgIEJUQV9BTExfQVBQX0lELCAgMTN9ICAvKiBnYXR0YyBzcGVjIHRhYmxlICovCiAgICx7QlRBX0lEX0dBVFRTLCAgQlRBX0FMTF9BUFBfSUQsICAxNH0gIC8qIGdhdHRzIHNwZWMgdGFibGUgKi8KICNlbmRpZgpAQCAtNDA1LDcgKzQwNSw3IEBACiAgIH0KICB9CiAKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKICAgICAvKiBHQVRUQyA6IDEzICovCiAgLHsKICAgKEJUQV9ETV9QTV9TTklGRiB8IEJUQV9ETV9QTV9QQVJLKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGxvdyBwYXJrICYgc25pZmYgKi8KQEAgLTUzNSw3ICs1MzUsNyBAQAogCiAvKiBUaGUgcGVyZm9ybWFuY2UgaW1wYWN0IG9mIEVJUiBwYWNrZXQgc2l6ZQogKioKLSoqIFdoZW4gQlRNX0VJUl9ERUZBVUxUX0ZFQ19SRVFVSVJFRCBpcyBUUlVFLAorKiogV2hlbiBCVE1fRUlSX0RFRkFVTFRfRkVDX1JFUVVJUkVEIGlzIHRydWUsCiAqKiAxIHRvIDE3IGJ5dGVzLCAgICBETTEgaXMgdXNlZCBhbmQgbW9zdCByb2J1c3QuCiAqKiAxOCB0byAxMjEgYnl0ZXMsICBETTMgaXMgdXNlZCBidXQgaW1wYWN0cyBpbnF1aXJ5IHNjYW4gdGltZSB3aXRoIGxhcmdlIG51bWJlcgogKiogICAgICAgICAgICAgICAgICAgIG9mIGRldmljZXMuKGFsbW9zdCBkb3VibGUgd2l0aCAxNTAgdXNlcnMpCkBAIC01NDQsNyArNTQ0LDcgQEAKICoqIDIyNSB0byAyNDAgYnl0ZXMsIERINSBpcyB1c2VkIHdpdGhvdXQgRkVDIGJ1dCBpdCBub3QgcmVjb21tZW5kZWQuCiAqKiAgICAgICAgICAgICAgICAgICAgKHNhbWUgcmVhc29uIG9mIERNNSkKICoqCi0qKiBXaGVuIEJUTV9FSVJfREVGQVVMVF9GRUNfUkVRVUlSRUQgaXMgRkFMU0UsCisqKiBXaGVuIEJUTV9FSVJfREVGQVVMVF9GRUNfUkVRVUlSRUQgaXMgZmFsc2UsCiAqKiAxIHRvIDI3IGJ5dGVzLCAgICBESDEgaXMgdXNlZCBidXQgb25seSByb2J1c3QgYXQgc2hvcnQgcmFuZ2UuCiAqKiAyOCB0byAxODMgYnl0ZXMsICBESDMgaXMgdXNlZCBidXQgb25seSByb2J1c3QgYXQgc2hvcnQgcmFuZ2UgYW5kIGltcGFjdHMgaW5xdWlyeQogKiogICAgICAgICAgICAgICAgICAgIHNjYW4gdGltZSB3aXRoIGxhcmdlIG51bWJlciBvZiBkZXZpY2VzLgpAQCAtNTUzLDcgKzU1Myw3IEBACiAKICNpZiAoQlRBX0VJUl9DQU5ORURfVVVJRF9MSVNUID09IFRSVUUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBleGFtcGxlICovCi1jb25zdCBVSU5UOCBidGFfZG1fZWlyX3V1aWQxNl9saXN0W10gPSB7ICAgIDB4MDgsIDB4MTEsIC8qIEhlYWRzZXQgKi8KK2NvbnN0IHVpbnQ4X3QgYnRhX2RtX2Vpcl91dWlkMTZfbGlzdFtdID0geyAgICAweDA4LCAweDExLCAvKiBIZWFkc2V0ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUsIDB4MTEsIC8qIEhhbmRzZnJlZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBFLCAweDExLCAvKiBBViBSZW1vdGUgQ29udHJvbCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCLCAweDExLCAvKiBBdWRpbyBTaW5rICovCkBAIC01NjgsNyArNTY4LDcgQEAKICAgICAgICAgICAgLyogcm9vbSBmb3IgYWxsIFVVSUQgbGlzdCB0aGVuIGxvY2FsIG5hbWUgaXMgc2hvcnRlbmVkIHRvIHRoaXMgbGVuZ3RoICovCiAjaWYgKEJUQV9FSVJfQ0FOTkVEX1VVSURfTElTVCA9PSBUUlVFKQogICAgIDgsCi0gICAgKFVJTlQ4ICopYnRhX2RtX2Vpcl91dWlkMTZfbGlzdCwKKyAgICAodWludDhfdCAqKWJ0YV9kbV9laXJfdXVpZDE2X2xpc3QsCiAjZWxzZSAvLyBCVEFfRUlSX0NBTk5FRF9VVUlEX0xJU1QKICAgICB7ICAgLyogbWFzayBvZiBVVUlEIGxpc3QgaW4gRUlSICovCiAgICAgICAgIDB4RkZGRkZGRkYsIC8qIExTQiBpcyB0aGUgZmlyc3QgVVVJRCBvZiB0aGUgZmlyc3QgMzIgVVVJRHMgaW4gQlRNX0VJUl9VVUlEX0xLVVBfVEJMICovCmRpZmYgLS1naXQgYS9idGEvZG0vYnRhX2RtX2NpLmNjIGIvYnRhL2RtL2J0YV9kbV9jaS5jYwppbmRleCAwNGE5MzI4Li44N2U0YjRjIDEwMDY0NAotLS0gYS9idGEvZG0vYnRhX2RtX2NpLmNjCisrKyBiL2J0YS9kbS9idGFfZG1fY2kuY2MKQEAgLTY4LDcgKzY4LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9kbV9jaV9ybXRfb29iKEJPT0xFQU4gYWNjZXB0LCBCRF9BRERSIGJkX2FkZHIsIEJUX09DVEVUMTYgYywgQlRfT0NURVQxNiByKQordm9pZCBidGFfZG1fY2lfcm10X29vYihib29sIGFjY2VwdCwgQkRfQUREUiBiZF9hZGRyLCBCVF9PQ1RFVDE2IGMsIEJUX09DVEVUMTYgcikKIHsKICAgICB0QlRBX0RNX0NJX1JNVF9PT0IgKnBfbXNnID0KICAgICAgICAgKHRCVEFfRE1fQ0lfUk1UX09PQiAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfRE1fQ0lfUk1UX09PQikpOwpAQCAtOTgsNyArOTgsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2RtX3Njb19jaV9kYXRhX3JlYWR5KFVJTlQxNiBldmVudCwgVUlOVDE2IHNjb19oYW5kbGUpCit2b2lkIGJ0YV9kbV9zY29fY2lfZGF0YV9yZWFkeSh1aW50MTZfdCBldmVudCwgdWludDE2X3Qgc2NvX2hhbmRsZSkKIHsKICAgICBCVF9IRFIgKnBfYnVmID0gKEJUX0hEUiAqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUikpOwogCmRpZmYgLS1naXQgYS9idGEvZG0vYnRhX2RtX2ludC5oIGIvYnRhL2RtL2J0YV9kbV9pbnQuaAppbmRleCBkZmFjMTZhLi40MjY4YTFmIDEwMDY0NAotLS0gYS9idGEvZG0vYnRhX2RtX2ludC5oCisrKyBiL2J0YS9kbS9idGFfZG1faW50LmgKQEAgLTI2LDggKzI2LDggQEAKIAogI2luY2x1ZGUgImJ0X3RhcmdldC5oIgogCi0jaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFICYmIChkZWZpbmVkIEJUQV9HQVRUX0lOQ0xVREVEKSAmJiAoQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRSkpCi0gICAgI2luY2x1ZGUgImJ0YV9nYXR0X2FwaS5oIgorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSAmJiBCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFKQorI2luY2x1ZGUgImJ0YV9nYXR0X2FwaS5oIgogI2VuZGlmCiAKIApAQCAtMzcsOSArMzcsOSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAotI2RlZmluZSBCVEFfQ09QWV9ERVZJQ0VfQ0xBU1MoY29kZHN0LCBjb2RzcmMpICAgeygoVUlOVDggKikoY29kZHN0KSlbMF0gPSAoKFVJTlQ4ICopKGNvZHNyYykpWzBdOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChVSU5UOCAqKShjb2Rkc3QpKVsxXSA9ICgoVUlOVDggKikoY29kc3JjKSlbMV07ICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChVSU5UOCAqKShjb2Rkc3QpKVsyXSA9ICgoVUlOVDggKikoY29kc3JjKSlbMl07fQorI2RlZmluZSBCVEFfQ09QWV9ERVZJQ0VfQ0xBU1MoY29kZHN0LCBjb2RzcmMpICAgeygodWludDhfdCAqKShjb2Rkc3QpKVswXSA9ICgodWludDhfdCAqKShjb2RzcmMpKVswXTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCAqKShjb2Rkc3QpKVsxXSA9ICgodWludDhfdCAqKShjb2RzcmMpKVsxXTsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QgKikoY29kZHN0KSlbMl0gPSAoKHVpbnQ4X3QgKikoY29kc3JjKSlbMl07fQogCiAKICNkZWZpbmUgQlRBX0RNX01TR19MRU4gNTAKQEAgLTc4LDcgKzc4LDcgQEAKICAgICBCVEFfRE1fQ0lfUk1UX09PQl9FVlQsCiAKIAotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogICAgIEJUQV9ETV9BUElfQUREX0JMRUtFWV9FVlQsCiAgICAgQlRBX0RNX0FQSV9BRERfQkxFREVWSUNFX0VWVCwKICAgICBCVEFfRE1fQVBJX0JMRV9QQVNTS0VZX1JFUExZX0VWVCwKQEAgLTkwLDcgKzkwLDcgQEAKICAgICBCVEFfRE1fQVBJX0JMRV9TQ0FOX1BBUkFNX0VWVCwKICAgICBCVEFfRE1fQVBJX0JMRV9PQlNFUlZFX0VWVCwKICAgICBCVEFfRE1fQVBJX1VQREFURV9DT05OX1BBUkFNX0VWVCwKLSNpZiBCTEVfUFJJVkFDWV9TUFQgPT0gVFJVRQorI2lmIChCTEVfUFJJVkFDWV9TUFQgPT0gVFJVRSkKICAgICBCVEFfRE1fQVBJX0xPQ0FMX1BSSVZBQ1lfRVZULAogI2VuZGlmCiAgICAgQlRBX0RNX0FQSV9CTEVfQURWX1BBUkFNX0VWVCwKQEAgLTk5LDcgKzk5LDcgQEAKICAgICBCVEFfRE1fQVBJX0JMRV9CUk9BRENBU1RfRVZULAogICAgIEJUQV9ETV9BUElfU0VUX0RBVEFfTEVOR1RIX0VWVCwKIAotI2lmIEJMRV9BTkRST0lEX0NPTlRST0xMRVJfU0NBTl9GSUxURVIgPT0gVFJVRQorI2lmIChCTEVfQU5EUk9JRF9DT05UUk9MTEVSX1NDQU5fRklMVEVSID09IFRSVUUpCiAgICAgQlRBX0RNX0FQSV9DRkdfRklMVEVSX0NPTkRfRVZULAogICAgIEJUQV9ETV9BUElfU0NBTl9GSUxURVJfU0VUVVBfRVZULAogICAgIEJUQV9ETV9BUElfU0NBTl9GSUxURVJfRU5BQkxFX0VWVCwKQEAgLTE2Myw4ICsxNjMsOCBAQAogICAgIEJUX0hEUiAgICAgICAgICAgICAgaGRyOwogICAgIHRCVEFfRE1fRElTQyAgICBkaXNjX21vZGU7CiAgICAgdEJUQV9ETV9DT05OICAgIGNvbm5fbW9kZTsKLSAgICBVSU5UOCAgICAgICAgICAgcGFpcl9tb2RlOwotICAgIFVJTlQ4ICAgICAgICAgICBjb25uX3BhaXJlZF9vbmx5OworICAgIHVpbnQ4X3QgICAgICAgICAgIHBhaXJfbW9kZTsKKyAgICB1aW50OF90ICAgICAgICAgICBjb25uX3BhaXJlZF9vbmx5OwogfSB0QlRBX0RNX0FQSV9TRVRfVklTSUJJTElUWTsKIAogZW51bQpAQCAtMTczLDcgKzE3Myw3IEBACiAgICAgQlRBX0RNX1JTX09LLCAgICAgICAvKiB0aGUgcm9sZSBzd2l0Y2ggcmVzdWx0IC0gc3VjY2Vzc2Z1bCAqLwogICAgIEJUQV9ETV9SU19GQUlMICAgICAgLyogdGhlIHJvbGUgc3dpdGNoIHJlc3VsdCAtIGZhaWxlZCAqLwogfTsKLXR5cGVkZWYgVUlOVDggdEJUQV9ETV9SU19SRVM7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9ETV9SU19SRVM7CiAKIC8qIGRhdGEgdHlwZSBmb3IgQlRBX0RNX0FQSV9TRUFSQ0hfRVZUICovCiB0eXBlZGVmIHN0cnVjdApAQCAtMTgzLDggKzE4Myw4IEBACiAgICAgdEJUQV9TRVJWSUNFX01BU0sgc2VydmljZXM7CiAgICAgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sgKiBwX2NiYWNrOwogICAgIHRCVEFfRE1fUlNfUkVTICByc19yZXM7Ci0jaWYgQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRQotICAgIFVJTlQ4ICAgICAgICAgICBudW1fdXVpZDsKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRSkKKyAgICB1aW50OF90ICAgICAgICAgICBudW1fdXVpZDsKICAgICB0QlRfVVVJRCAgICAgICAgKnBfdXVpZDsKICNlbmRpZgogfSB0QlRBX0RNX0FQSV9TRUFSQ0g7CkBAIC0xOTYsMTAgKzE5NiwxMCBAQAogICAgIEJEX0FERFIgYmRfYWRkcjsKICAgICB0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlczsKICAgICB0QlRBX0RNX1NFQVJDSF9DQkFDSyAqIHBfY2JhY2s7Ci0gICAgQk9PTEVBTiAgICAgICAgIHNkcF9zZWFyY2g7CisgICAgYm9vbCAgICAgICAgIHNkcF9zZWFyY2g7CiAgICAgdEJUQV9UUkFOU1BPUlQgIHRyYW5zcG9ydDsKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRSAmJiBCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFCi0gICAgVUlOVDggICAgICAgICAgIG51bV91dWlkOworI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSAmJiBCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFKQorICAgIHVpbnQ4X3QgICAgICAgICAgIG51bV91dWlkOwogICAgIHRCVF9VVUlEICAgICAgICAqcF91dWlkOwogI2VuZGlmCiAgICAgdFNEUF9VVUlEICAgIHV1aWQ7CkBAIC0yMTEsNyArMjExLDcgQEAKICAgICBCVF9IRFIgICAgICAgICAgICAgIGhkcjsKICAgICBCRF9BRERSICAgICAgICAgICAgIGJkX2FkZHI7CiAgICAgdEJUQV9ESVNDT1ZFUllfREIgICAqcF9zZHBfZGI7Ci0gICAgVUlOVDMyICAgICAgICAgICAgICBsZW47CisgICAgdWludDMyX3QgICAgICAgICAgICAgIGxlbjsKICAgICB0QlRBX0RNX1NFQVJDSF9DQkFDSyAqIHBfY2JhY2s7CiB9dEJUQV9ETV9BUElfRElfRElTQzsKIApAQCAtMjM2LDkgKzIzNiw5IEBACiB7CiAgICAgQlRfSERSICAgICAgaGRyOwogICAgIEJEX0FERFIgYmRfYWRkcjsKLSAgICBCT09MRUFOIGFjY2VwdDsKLSAgICBVSU5UOCBwaW5fbGVuOwotICAgIFVJTlQ4IHBfcGluW1BJTl9DT0RFX0xFTl07CisgICAgYm9vbCBhY2NlcHQ7CisgICAgdWludDhfdCBwaW5fbGVuOworICAgIHVpbnQ4X3QgcF9waW5bUElOX0NPREVfTEVOXTsKIH0gdEJUQV9ETV9BUElfUElOX1JFUExZOwogCiAvKiBkYXRhIHR5cGUgZm9yIEJUQV9ETV9BUElfTE9DX09PQl9FVlQgKi8KQEAgLTI1Miw3ICsyNTIsNyBAQAogewogICAgIEJUX0hEUiAgICAgIGhkcjsKICAgICBCRF9BRERSICAgICBiZF9hZGRyOwotICAgIEJPT0xFQU4gICAgIGFjY2VwdDsKKyAgICBib29sICAgICBhY2NlcHQ7CiB9IHRCVEFfRE1fQVBJX0NPTkZJUk07CiAKIC8qIGRhdGEgdHlwZSBmb3IgQlRBX0RNX0NJX0lPX1JFUV9FVlQgKi8KQEAgLTI3Miw3ICsyNzIsNyBAQAogICAgIEJEX0FERFIgICAgIGJkX2FkZHI7CiAgICAgQlRfT0NURVQxNiAgYzsKICAgICBCVF9PQ1RFVDE2ICByOwotICAgIEJPT0xFQU4gICAgIGFjY2VwdDsKKyAgICBib29sICAgICBhY2NlcHQ7CiB9IHRCVEFfRE1fQ0lfUk1UX09PQjsKIAogLyogZGF0YSB0eXBlIGZvciBCVEFfRE1fUkVNVF9OQU1FX0VWVCAqLwpAQCAtMjk0LDE0ICsyOTQsMTQgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgQlRfSERSICAgICAgaGRyOwotICAgIFVJTlQ4ICAgICAgIG51bTsKKyAgICB1aW50OF90ICAgICAgIG51bTsKIH0gdEJUQV9ETV9JTlFVSVJZX0NNUEw7CiAKIC8qIGRhdGEgdHlwZSBmb3IgQlRBX0RNX1NEUF9SRVNVTFRfRVZUICovCiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJUX0hEUiAgICAgIGhkcjsKLSAgICBVSU5UMTYgc2RwX3Jlc3VsdDsKKyAgICB1aW50MTZfdCBzZHBfcmVzdWx0OwogfSB0QlRBX0RNX1NEUF9SRVNVTFQ7CiAKIC8qIGRhdGEgdHlwZSBmb3IgQlRBX0RNX0FDTF9DSEFOR0VfRVZUICovCkBAIC0zMDksMTQgKzMwOSwxNCBAQAogewogICAgIEJUX0hEUiAgICAgICAgICBoZHI7CiAgICAgdEJUTV9CTF9FVkVOVCAgIGV2ZW50OwotICAgIFVJTlQ4ICAgICAgICAgICBidXN5X2xldmVsOwotICAgIFVJTlQ4ICAgICAgICAgICBidXN5X2xldmVsX2ZsYWdzOwotICAgIEJPT0xFQU4gICAgICAgICBpc19uZXc7Ci0gICAgVUlOVDggICAgICAgICAgIG5ld19yb2xlOworICAgIHVpbnQ4X3QgICAgICAgICAgIGJ1c3lfbGV2ZWw7CisgICAgdWludDhfdCAgICAgICAgICAgYnVzeV9sZXZlbF9mbGFnczsKKyAgICBib29sICAgICAgICAgaXNfbmV3OworICAgIHVpbnQ4X3QgICAgICAgICAgIG5ld19yb2xlOwogICAgIEJEX0FERFIgICAgICAgICBiZF9hZGRyOwotICAgIFVJTlQ4ICAgICAgICAgICBoY2lfc3RhdHVzOwotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCi0gICAgVUlOVDE2ICAgICAgICAgIGhhbmRsZTsKKyAgICB1aW50OF90ICAgICAgICAgICBoY2lfc3RhdHVzOworI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKKyAgICB1aW50MTZfdCAgICAgICAgICBoYW5kbGU7CiAgICAgdEJUX1RSQU5TUE9SVCAgIHRyYW5zcG9ydDsKICNlbmRpZgogfSB0QlRBX0RNX0FDTF9DSEFOR0U7CkBAIC0zMjgsOCArMzI4LDggQEAKICAgICBCVF9IRFIgICAgICAgICAgaGRyOwogICAgIEJEX0FERFIgICAgICAgICBiZF9hZGRyOwogICAgIHRCVE1fUE1fU1RBVFVTICBzdGF0dXM7Ci0gICAgVUlOVDE2ICAgICAgICAgIHZhbHVlOwotICAgIFVJTlQ4ICAgICAgICAgICBoY2lfc3RhdHVzOworICAgIHVpbnQxNl90ICAgICAgICAgIHZhbHVlOworICAgIHVpbnQ4X3QgICAgICAgICAgIGhjaV9zdGF0dXM7CiAKIH0gdEJUQV9ETV9QTV9CVE1fU1RBVFVTOwogCkBAIC0zNTAsMTQgKzM1MCwxNCBAQAogICAgIERFVl9DTEFTUyAgICAgICAgICAgZGM7CiAgICAgTElOS19LRVkgICAgICAgICAgICBsaW5rX2tleTsKICAgICB0QlRBX1NFUlZJQ0VfTUFTSyAgIHRtOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgaXNfdHJ1c3RlZDsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGtleV90eXBlOworICAgIGJvb2wgICAgICAgICAgICAgaXNfdHJ1c3RlZDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAga2V5X3R5cGU7CiAgICAgdEJUQV9JT19DQVAgICAgICAgICBpb19jYXA7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBsaW5rX2tleV9rbm93bjsKLSAgICBCT09MRUFOICAgICAgICAgICAgIGRjX2tub3duOworICAgIGJvb2wgICAgICAgICAgICAgbGlua19rZXlfa25vd247CisgICAgYm9vbCAgICAgICAgICAgICBkY19rbm93bjsKICAgICBCRF9OQU1FICAgICAgICAgICAgIGJkX25hbWU7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBmZWF0dXJlc1tCVEFfRkVBVFVSRV9CWVRFU19QRVJfUEFHRSAqIChCVEFfRVhUX0ZFQVRVUkVTX1BBR0VfTUFYICsgMSldOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgcGluX2xlbmd0aDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgZmVhdHVyZXNbQlRBX0ZFQVRVUkVfQllURVNfUEVSX1BBR0UgKiAoQlRBX0VYVF9GRUFUVVJFU19QQUdFX01BWCArIDEpXTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgcGluX2xlbmd0aDsKIH0gdEJUQV9ETV9BUElfQUREX0RFVklDRTsKIAogLyogZGF0YSB0eXBlIGZvciBCVEFfRE1fQVBJX1JFTU9WRV9BQ0xfRVZUICovCkBAIC0zODUsNyArMzg1LDcgQEAKICAgICBCRF9BRERSICAgICAgICAgICAgICAgICAgIGJkX2FkZHI7CiB9IHRCVEFfRE1fQVBJX1NFVF9FTkNSWVBUSU9OOwogCi0jaWYgQkxFX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUpCiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJUX0hEUiAgICAgICAgICAgICAgICAgIGhkcjsKQEAgLTQwOCw4ICs0MDgsOCBAQAogewogICAgIEJUX0hEUiAgICAgICAgICAgICAgICAgIGhkcjsKICAgICBCRF9BRERSICAgICAgICAgICAgICAgICBiZF9hZGRyOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgIGFjY2VwdDsKLSAgICBVSU5UMzIgICAgICAgICAgICAgICAgICBwYXNza2V5OworICAgIGJvb2wgICAgICAgICAgICAgICAgIGFjY2VwdDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgIHBhc3NrZXk7CiB9dEJUQV9ETV9BUElfUEFTU0tFWV9SRVBMWTsKIAogdHlwZWRlZiBzdHJ1Y3QKQEAgLTQzMiwxMCArNDMyLDEwIEBACiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICAgICAgaGRyOwogICAgIEJEX0FERFIgICAgICAgICAgICAgICAgIHBlZXJfYmRhOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIGNvbm5faW50X21pbjsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBjb25uX2ludF9tYXg7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgc3VwZXJ2aXNpb25fdG91dDsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBzbGF2ZV9sYXRlbmN5OworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgY29ubl9pbnRfbWluOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgY29ubl9pbnRfbWF4OworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgc3VwZXJ2aXNpb25fdG91dDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIHNsYXZlX2xhdGVuY3k7CiAKIH10QlRBX0RNX0FQSV9CTEVfQ09OTl9QQVJBTVM7CiAKQEAgLTQ0MywxNCArNDQzLDE0IEBACiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICAgICAgaGRyOwogICAgIEJEX0FERFIgICAgICAgICAgICAgICAgIHBlZXJfYmRhOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgIHByaXZhY3lfZW5hYmxlOworICAgIGJvb2wgICAgICAgICAgICAgICAgIHByaXZhY3lfZW5hYmxlOwogCiB9dEJUQV9ETV9BUElfRU5BQkxFX1BSSVZBQ1k7CiAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICAgICAgaGRyOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgIHByaXZhY3lfZW5hYmxlOworICAgIGJvb2wgICAgICAgICAgICAgICAgIHByaXZhY3lfZW5hYmxlOwogfXRCVEFfRE1fQVBJX0xPQ0FMX1BSSVZBQ1k7CiAKIC8qIHNldCBzY2FuIHBhcmFtZXRlciBmb3IgQkxFIGNvbm5lY3Rpb25zICovCkBAIC00NTgsOCArNDU4LDggQEAKIHsKICAgICBCVF9IRFIgaGRyOwogICAgIHRCVEFfR0FUVENfSUYgY2xpZW50X2lmOwotICAgIFVJTlQzMiBzY2FuX2ludDsKLSAgICBVSU5UMzIgc2Nhbl93aW5kb3c7CisgICAgdWludDMyX3Qgc2Nhbl9pbnQ7CisgICAgdWludDMyX3Qgc2Nhbl93aW5kb3c7CiAgICAgdEJMRV9TQ0FOX01PREUgc2Nhbl9tb2RlOwogICAgIHRCTEVfU0NBTl9QQVJBTV9TRVRVUF9DQkFDSyBzY2FuX3BhcmFtX3NldHVwX2NiYWNrOwogfXRCVEFfRE1fQVBJX0JMRV9TQ0FOX1BBUkFNUzsKQEAgLTQ2OCwxNiArNDY4LDE2IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJUX0hEUiAgICAgICAgICAgICAgICAgIGhkcjsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBzY2FuX2ludDsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBzY2FuX3dpbmRvdzsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIHNjYW5faW50OworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgc2Nhbl93aW5kb3c7CiB9IHRCVEFfRE1fQVBJX0JMRV9DT05OX1NDQU5fUEFSQU1TOwogCiAvKiBEYXRhIHR5cGUgZm9yIHN0YXJ0L3N0b3Agb2JzZXJ2ZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICAgICAgICAgICAgICBoZHI7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgc3RhcnQ7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgZHVyYXRpb247CisgICAgYm9vbCAgICAgICAgICAgICAgICAgc3RhcnQ7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICBkdXJhdGlvbjsKICAgICB0QlRBX0RNX1NFQVJDSF9DQkFDSyAqIHBfY2JhY2s7CiB9dEJUQV9ETV9BUElfQkxFX09CU0VSVkU7CiAKQEAgLTQ4NSwyMiArNDg1LDIyIEBACiB7CiAgICAgQlRfSERSICAgICAgaGRyOwogICAgIEJEX0FERFIgICAgIHJlbW90ZV9iZGE7Ci0gICAgVUlOVDE2ICAgICAgdHhfZGF0YV9sZW5ndGg7CisgICAgdWludDE2X3QgICAgICB0eF9kYXRhX2xlbmd0aDsKIH10QlRBX0RNX0FQSV9CTEVfU0VUX0RBVEFfTEVOR1RIOwogCiAvKiBzZXQgYWR2IHBhcmFtZXRlciBmb3IgQkxFIGFkdmVydGlzaW5nICovCiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJUX0hEUiAgICAgICAgICAgICAgICAgIGhkcjsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBhZHZfaW50X21pbjsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBhZHZfaW50X21heDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIGFkdl9pbnRfbWluOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgYWR2X2ludF9tYXg7CiAgICAgdEJMRV9CRF9BRERSICAgICAgICAgICAgKnBfZGlyX2JkYTsKIH10QlRBX0RNX0FQSV9CTEVfQURWX1BBUkFNUzsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICAgICAgICAgICAgICBoZHI7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgZW5hYmxlOworICAgIGJvb2wgICAgICAgICAgICAgICAgIGVuYWJsZTsKIAogfXRCVEFfRE1fQVBJX0JMRV9GRUFUVVJFOwogCkBAIC01MTYsMTUgKzUxNiwxNSBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICAgICAgICAgICAgICAgICAgaGRyOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgaW5zdF9pZDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAgaW5zdF9pZDsKICAgICB0QlRBX0JMRV9BRFZfUEFSQU1TICAgICAgICAgKnBfcGFyYW1zOwogfXRCVEFfRE1fQVBJX0JMRV9NVUxUSV9BRFZfUEFSQU07CiAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICAgICAgaGRyOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIGluc3RfaWQ7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgaXNfc2Nhbl9yc3A7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBpbnN0X2lkOworICAgIGJvb2wgICAgICAgICAgICAgICAgIGlzX3NjYW5fcnNwOwogICAgIHRCVEFfQkxFX0FEX01BU0sgICAgICAgIGRhdGFfbWFzazsKICAgICB0QlRBX0JMRV9BRFZfREFUQSAgICAgICBkYXRhOwogfXRCVEFfRE1fQVBJX0JMRV9NVUxUSV9BRFZfREFUQTsKQEAgLTUzMiwxMyArNTMyLDEzIEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJUX0hEUiAgICAgICAgICAgICAgICAgIGhkcjsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBpbnN0X2lkOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgaW5zdF9pZDsKIH10QlRBX0RNX0FQSV9CTEVfTVVMVElfQURWX0RJU0FCTEU7CiAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICAgICAgaGRyOwotICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgIGRhdGFfbWFzazsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgIGRhdGFfbWFzazsKICAgICB0QlRBX0JMRV9BRFZfREFUQSAgICAgICBhZHZfY2ZnOwogICAgIHRCVEFfU0VUX0FEVl9EQVRBX0NNUExfQ0JBQ0sgICAgKnBfYWR2X2RhdGFfY2JhY2s7CiB9dEJUQV9ETV9BUElfU0VUX0FEVl9DT05GSUc7CkBAIC01NDYsOSArNTQ2LDkgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICAgICAgaGRyOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIGJhdGNoX3NjYW5fZnVsbF9tYXg7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgYmF0Y2hfc2Nhbl90cnVuY19tYXg7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgYmF0Y2hfc2Nhbl9ub3RpZnlfdGhyZXNob2xkOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgYmF0Y2hfc2Nhbl9mdWxsX21heDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIGJhdGNoX3NjYW5fdHJ1bmNfbWF4OworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgYmF0Y2hfc2Nhbl9ub3RpZnlfdGhyZXNob2xkOwogICAgIHRCVEFfQkxFX1NDQU5fU0VUVVBfQ0JBQ0sgKnBfc2V0dXBfY2JhY2s7CiAgICAgdEJUQV9CTEVfU0NBTl9USFJFU0hPTERfQ0JBQ0sgKnBfdGhyZXNfY2JhY2s7CiAgICAgdEJUQV9CTEVfU0NBTl9SRVBfQ0JBQ0sgKnBfcmVhZF9yZXBfY2JhY2s7CkBAIC01NTksOCArNTU5LDggQEAKIHsKICAgICBCVF9IRFIgICAgICAgICAgICAgICAgICBoZHI7CiAgICAgdEJUQV9CTEVfQkFUQ0hfU0NBTl9NT0RFICBzY2FuX21vZGU7Ci0gICAgVUlOVDMyICAgICAgICAgICAgICAgICAgc2Nhbl9pbnQ7Ci0gICAgVUlOVDMyICAgICAgICAgICAgICAgICAgc2Nhbl93aW5kb3c7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICBzY2FuX2ludDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgIHNjYW5fd2luZG93OwogICAgIHRCVEFfQkxFX0RJU0NBUkRfUlVMRSAgIGRpc2NhcmRfcnVsZTsKICAgICB0QkxFX0FERFJfVFlQRSAgICAgICAgICBhZGRyX3R5cGU7CiAgICAgdEJUQV9ETV9CTEVfUkVGX1ZBTFVFICAgcmVmX3ZhbHVlOwpAQCAtNTk5LDcgKzU5OSw3IEBACiB7CiAgICAgQlRfSERSICAgICAgaGRyOwogICAgIEJEX0FERFIgICAgIGJkX2FkZHI7Ci0gICAgQk9PTEVBTiAgICAgcmVtb3ZlX2RldjsKKyAgICBib29sICAgICByZW1vdmVfZGV2OwogICAgIHRCVEFfVFJBTlNQT1JUIHRyYW5zcG9ydDsKIAogfXRCVEFfRE1fQVBJX1JFTU9WRV9BQ0w7CkBAIC02MTUsMTMgKzYxNSwxMyBAQAogewogICAgIEJUX0hEUiAgICAgIGhkcjsKICAgICBCRF9BRERSICAgICBiZF9hZGRyOwotICAgIFVJTlQxNiAgICAgIG1pbl9pbnQ7Ci0gICAgVUlOVDE2ICAgICAgbWF4X2ludDsKLSAgICBVSU5UMTYgICAgICBsYXRlbmN5OwotICAgIFVJTlQxNiAgICAgIHRpbWVvdXQ7CisgICAgdWludDE2X3QgICAgICBtaW5faW50OworICAgIHVpbnQxNl90ICAgICAgbWF4X2ludDsKKyAgICB1aW50MTZfdCAgICAgIGxhdGVuY3k7CisgICAgdWludDE2X3QgICAgICB0aW1lb3V0OwogfXRCVEFfRE1fQVBJX1VQREFURV9DT05OX1BBUkFNOwogCi0jaWYgQkxFX0FORFJPSURfQ09OVFJPTExFUl9TQ0FOX0ZJTFRFUiA9PSBUUlVFCisjaWYgKEJMRV9BTkRST0lEX0NPTlRST0xMRVJfU0NBTl9GSUxURVIgPT0gVFJVRSkKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICAgICAgICAgICAgICBoZHI7CkBAIC02MzYsNyArNjM2LDcgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICAgICAgICAgICAgICBoZHI7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb247CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjsKICAgICB0QlRBX0RNX0JMRV9QRl9TVEFUVVNfQ0JBQ0sgICAgKnBfZmlsdF9zdGF0dXNfY2JhY2s7CiAgICAgdEJUQV9ETV9CTEVfUkVGX1ZBTFVFICAgICAgICAgICAgcmVmX3ZhbHVlOwogfXRCVEFfRE1fQVBJX0VOQUJMRV9TQ0FOX0ZJTFRFUjsKQEAgLTY0NCw3ICs2NDQsNyBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICAgICAgICAgICAgICAgICAgICAgIGhkcjsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOwogICAgIHRCVEFfRE1fQkxFX1BGX0ZJTFRfSU5ERVggICAgICAgZmlsdF9pbmRleDsKICAgICB0QlRBX0RNX0JMRV9QRl9GSUxUX1BBUkFNUyAgICAgIGZpbHRfcGFyYW1zOwogICAgIHRCTEVfQkRfQUREUiAgICAgICAgICAgICAgICAgICAgKnBfdGFyZ2V0OwpAQCAtNzAzLDcgKzcwMyw3IEBACiAKICAgICB0QlRBX0RNX0FQSV9TRVRfRU5DUllQVElPTiAgICAgc2V0X2VuY3J5cHRpb247CiAKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKICAgICB0QlRBX0RNX0FQSV9BRERfQkxFS0VZICAgICAgICAgICAgICBhZGRfYmxlX2tleTsKICAgICB0QlRBX0RNX0FQSV9BRERfQkxFX0RFVklDRSAgICAgICAgICBhZGRfYmxlX2RldmljZTsKICAgICB0QlRBX0RNX0FQSV9QQVNTS0VZX1JFUExZICAgICAgICAgICBibGVfcGFzc2tleV9yZXBseTsKQEAgLTcxNyw3ICs3MTcsNyBAQAogICAgIHRCVEFfRE1fQVBJX0xPQ0FMX1BSSVZBQ1kgICAgICAgICAgIGJsZV9sb2NhbF9wcml2YWN5OwogICAgIHRCVEFfRE1fQVBJX0JMRV9BRFZfUEFSQU1TICAgICAgICAgIGJsZV9zZXRfYWR2X3BhcmFtczsKICAgICB0QlRBX0RNX0FQSV9TRVRfQURWX0NPTkZJRyAgICAgICAgICBibGVfc2V0X2Fkdl9kYXRhOwotI2lmIEJMRV9BTkRST0lEX0NPTlRST0xMRVJfU0NBTl9GSUxURVIgPT0gVFJVRQorI2lmIChCTEVfQU5EUk9JRF9DT05UUk9MTEVSX1NDQU5fRklMVEVSID09IFRSVUUpCiAgICAgdEJUQV9ETV9BUElfU0NBTl9GSUxURVJfUEFSQU1fU0VUVVAgYmxlX3NjYW5fZmlsdF9wYXJhbV9zZXR1cDsKICAgICB0QlRBX0RNX0FQSV9DRkdfRklMVEVSX0NPTkQgICAgICAgICBibGVfY2ZnX2ZpbHRlcl9jb25kOwogICAgIHRCVEFfRE1fQVBJX0VOQUJMRV9TQ0FOX0ZJTFRFUiAgICAgIGJsZV9lbmFibGVfc2Nhbl9maWx0OwpAQCAtNzQ5LDcgKzc0OSw3IEBACiAjZGVmaW5lIEJUQV9ETV9OT1RfQ09OTkVDVEVEICAwCiAjZGVmaW5lIEJUQV9ETV9DT05ORUNURUQgICAgICAxCiAjZGVmaW5lIEJUQV9ETV9VTlBBSVJJTkcgICAgICAyCi10eXBlZGVmIFVJTlQ4IHRCVEFfRE1fQ09OTl9TVEFURTsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0RNX0NPTk5fU1RBVEU7CiAKIAogI2RlZmluZSBCVEFfRE1fRElfTk9ORSAgICAgICAgICAweDAwICAgICAgIC8qIG5vdGhpbmcgc3BlY2lhbCAqLwpAQCAtNzU4LDIxICs3NTgsMjEgQEAKICNkZWZpbmUgQlRBX0RNX0RJX1NFVF9TTklGRiAgICAgMHgwMSAgICAgICAvKiBzZXQgdGhpcyBiaXQgaWYgY2FsbCBCVE1fU2V0UG93ZXJNb2RlKHNuaWZmKSAqLwogI2RlZmluZSBCVEFfRE1fRElfSU5UX1NOSUZGICAgICAweDAyICAgICAgIC8qIHNldCB0aGlzIGJpdCBpZiBjYWxsIEJUTV9TZXRQb3dlck1vZGUoc25pZmYpICYgZW50ZXIgc25pZmYgbW9kZSAqLwogI2RlZmluZSBCVEFfRE1fRElfQUNQX1NOSUZGICAgICAweDA0ICAgICAgIC8qIHNldCB0aGlzIGJpdCBpZiBwZWVyIGluaXQgc25pZmYgKi8KLXR5cGVkZWYgVUlOVDggdEJUQV9ETV9ERVZfSU5GTzsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0RNX0RFVl9JTkZPOwogCiAvKiBzZXQgcG93ZXIgbW9kZSByZXF1ZXN0IHR5cGUgKi8KICNkZWZpbmUgQlRBX0RNX1BNX1JFU1RBUlQgICAgICAgMQogI2RlZmluZSBCVEFfRE1fUE1fTkVXX1JFUSAgICAgICAyCiAjZGVmaW5lIEJUQV9ETV9QTV9FWEVDVVRFICAgICAgIDMKLXR5cGVkZWYgVUlOVDggICB0QlRBX0RNX1BNX1JFUTsKK3R5cGVkZWYgdWludDhfdCAgIHRCVEFfRE1fUE1fUkVROwogCiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJEX0FERFIgICAgICAgICAgICAgICAgICAgICBwZWVyX2JkYWRkcjsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgbGlua19wb2xpY3k7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgbGlua19wb2xpY3k7CiAgICAgdEJUQV9ETV9DT05OX1NUQVRFICAgICAgICAgIGNvbm5fc3RhdGU7CiAgICAgdEJUQV9QUkVGX1JPTEVTICAgICAgICAgICAgIHByZWZfcm9sZTsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgaW5fdXNlOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICBpbl91c2U7CiAgICAgdEJUQV9ETV9ERVZfSU5GTyAgICAgICAgICAgIGluZm87CiAgICAgdEJUQV9ETV9FTkNSWVBUX0NCQUNLICAgICAgKnBfZW5jcnlwdF9jYmFjazsKICNpZiAoQlRNX1NTUl9JTkNMVURFRCA9PSBUUlVFKQpAQCAtNzgwLDkgKzc4MCw5IEBACiAjZW5kaWYKICAgICB0QlRBX0RNX1BNX0FDVElPTiAgICAgICAgICAgcG1fbW9kZV9hdHRlbXB0ZWQ7CiAgICAgdEJUQV9ETV9QTV9BQ1RJT04gICAgICAgICAgIHBtX21vZGVfZmFpbGVkOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICByZW1vdmVfZGV2X3BlbmRpbmc7Ci0jaWYgQkxFX0lOQ0xVREVEID09IFRSVUUKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgY29ubl9oYW5kbGU7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9kZXZfcGVuZGluZzsKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUpCisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgY29ubl9oYW5kbGU7CiAgICAgdEJUX1RSQU5TUE9SVCAgICAgICAgICAgICAgIHRyYW5zcG9ydDsKICNlbmRpZgogfSB0QlRBX0RNX1BFRVJfREVWSUNFOwpAQCAtNzk0LDkgKzc5NCw5IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIHRCVEFfRE1fUEVFUl9ERVZJQ0UgICAgcGVlcl9kZXZpY2VbQlRBX0RNX05VTV9QRUVSX0RFVklDRV07Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICBjb3VudDsKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRQotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgbGVfY291bnQ7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgIGNvdW50OworI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgbGVfY291bnQ7CiAjZW5kaWYKIH0gdEJUQV9ETV9BQ1RJVkVfTElOSzsKIApAQCAtODA1LDkgKzgwNSw5IEBACiB7CiAgICAgQkRfQUREUiAgICAgICAgICAgICAgICAgcGVlcl9iZGFkZHI7CiAgICAgdEJUQV9TWVNfSUQgICAgICAgICAgICAgaWQ7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgYXBwX2lkOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgYXBwX2lkOwogICAgIHRCVEFfU1lTX0NPTk5fU1RBVFVTICAgIHN0YXRlOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgIG5ld19yZXF1ZXN0OworICAgIGJvb2wgICAgICAgICAgICAgICAgIG5ld19yZXF1ZXN0OwogCiB9IHRCVEFfRE1fU1JWQ1M7CiAKQEAgLTgxOCw3ICs4MTgsNyBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKIAotICAgIFVJTlQ4IGNvdW50OworICAgIHVpbnQ4X3QgY291bnQ7CiAgICAgdEJUQV9ETV9TUlZDUyAgY29ubl9zcnZjW0JUQV9ETV9OVU1fQ09OTl9TUlZTXTsKIAogfSAgdEJUQV9ETV9DT05ORUNURURfU1JWQ1M7CkBAIC04MzUsMTIgKzgzNSwxMiBAQAogICAgICAqLwogICAgIGFsYXJtX3QgKiAgICAgICAgICAgICAgIHRpbWVyW0JUQV9ETV9QTV9NT0RFX1RJTUVSX01BWF07CiAKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBzcnZjX2lkW0JUQV9ETV9QTV9NT0RFX1RJTUVSX01BWF07Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgcG1fYWN0aW9uW0JUQV9ETV9QTV9NT0RFX1RJTUVSX01BWF07Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgYWN0aXZlOyAgICAgLyogbnVtYmVyIG9mIGFjdGl2ZSB0aW1lciAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgc3J2Y19pZFtCVEFfRE1fUE1fTU9ERV9USU1FUl9NQVhdOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgcG1fYWN0aW9uW0JUQV9ETV9QTV9NT0RFX1RJTUVSX01BWF07CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBhY3RpdmU7ICAgICAvKiBudW1iZXIgb2YgYWN0aXZlIHRpbWVyICovCiAKICAgICBCRF9BRERSICAgICAgICAgICAgICAgICBwZWVyX2JkYWRkcjsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICBpbl91c2U7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgaW5fdXNlOwogfSB0QlRBX1BNX1RJTUVSOwogCiBleHRlcm4gdEJUQV9ETV9DT05ORUNURURfU1JWQ1MgYnRhX2RtX2Nvbm5fc3J2Y3M7CkBAIC04NTAsMTAgKzg1MCwxMCBAQAogLyogRE0gY29udHJvbCBibG9jayAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgaXNfYnRhX2RtX2FjdGl2ZTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgaXNfYnRhX2RtX2FjdGl2ZTsKICAgICB0QlRBX0RNX0FDVElWRV9MSU5LICAgICAgICAgZGV2aWNlX2xpc3Q7CiAgICAgdEJUQV9ETV9TRUNfQ0JBQ0sgICAgICAgICAgICpwX3NlY19jYmFjazsKLSNpZiAoKGRlZmluZWQgQkxFX0lOQ0xVREVEKSAmJiAoQkxFX0lOQ0xVREVEID09IFRSVUUpKQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKICAgICB0QlRBX0JMRV9TQ0FOX1NFVFVQX0NCQUNLICAgKnBfc2V0dXBfY2JhY2s7CiAgICAgdEJUQV9ETV9CTEVfUEZfQ0ZHX0NCQUNLICAgICAqcF9zY2FuX2ZpbHRfY2ZnX2NiYWNrOwogICAgIHRCVEFfRE1fQkxFX1BGX1NUQVRVU19DQkFDSyAgKnBfc2Nhbl9maWx0X3N0YXR1c19jYmFjazsKQEAgLTg2MSwzNSArODYxLDM1IEBACiAgICAgdEJUQV9CTEVfTVVMVElfQURWX0NCQUNLICAgICAqcF9tdWx0aV9hZHZfY2JhY2s7CiAgICAgdEJUQV9CTEVfRU5FUkdZX0lORk9fQ0JBQ0sgICAqcF9lbmVyZ3lfaW5mb19jYmFjazsKICNlbmRpZgotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgZGlzYWJsaW5nOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICBkaXNhYmxpbmc7CiAgICAgYWxhcm1fdCAgICAgICAgICAgICAgICAgICAgICpkaXNhYmxlX3RpbWVyOwotICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICB3YnRfc2RwX2hhbmRsZTsgICAgICAgICAgLyogV0lEQ09NTSBFeHRlbnNpb25zIFNEUCByZWNvcmQgaGFuZGxlICovCi0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgIHdidF9zY247ICAgICAgICAgICAgICAgICAvKiBXSURDT01NIEV4dGVuc2lvbnMgU0NOICovCi0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgIG51bV9tYXN0ZXJfb25seTsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgcG1faWQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgd2J0X3NkcF9oYW5kbGU7ICAgICAgICAgIC8qIFdJRENPTU0gRXh0ZW5zaW9ucyBTRFAgcmVjb3JkIGhhbmRsZSAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgIHdidF9zY247ICAgICAgICAgICAgICAgICAvKiBXSURDT01NIEV4dGVuc2lvbnMgU0NOICovCisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgbnVtX21hc3Rlcl9vbmx5OworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgIHBtX2lkOwogICAgIHRCVEFfUE1fVElNRVIgICAgICAgICAgICAgICBwbV90aW1lcltCVEFfRE1fTlVNX1BNX1RJTUVSXTsKLSAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgcm9sZV9wb2xpY3lfbWFzazsgICAvKiB0aGUgYml0cyBzZXQgaW5kaWNhdGVzIHRoZSBtb2R1bGVzIHRoYXQgd2FudHMgdG8gcmVtb3ZlIHJvbGUgc3dpdGNoIGZyb20gdGhlIGRlZmF1bHQgbGluayBwb2xpY3kgKi8KLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgY3VyX3BvbGljeTsgICAgICAgICAvKiBjdXJyZW50IGRlZmF1bHQgbGluayBwb2xpY3kgKi8KLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgcnNfZXZlbnQ7ICAgICAgICAgICAvKiB0aGUgZXZlbnQgd2FpdGluZyBmb3Igcm9sZSBzd2l0Y2ggKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgY3VyX2F2X2NvdW50OyAgICAgICAvKiBjdXJyZW50IEFWIGNvbm5lY2lvbnMgKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZV9wYWlyX21vZGU7ICAgICAgICAgIC8qIGRpc2FibGUgcGFpciBtb2RlIG9yIG5vdCAqLwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICBjb25uX3BhaXJlZF9vbmx5OyAgIC8qIGFsbG93IGNvbm5lY3RhYmxlIHRvIHBhaXJlZCBkZXZpY2Ugb25seSBvciBub3QgKi8KKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICByb2xlX3BvbGljeV9tYXNrOyAgIC8qIHRoZSBiaXRzIHNldCBpbmRpY2F0ZXMgdGhlIG1vZHVsZXMgdGhhdCB3YW50cyB0byByZW1vdmUgcm9sZSBzd2l0Y2ggZnJvbSB0aGUgZGVmYXVsdCBsaW5rIHBvbGljeSAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgIGN1cl9wb2xpY3k7ICAgICAgICAgLyogY3VycmVudCBkZWZhdWx0IGxpbmsgcG9saWN5ICovCisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgcnNfZXZlbnQ7ICAgICAgICAgICAvKiB0aGUgZXZlbnQgd2FpdGluZyBmb3Igcm9sZSBzd2l0Y2ggKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICBjdXJfYXZfY291bnQ7ICAgICAgIC8qIGN1cnJlbnQgQVYgY29ubmVjaW9ucyAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlX3BhaXJfbW9kZTsgICAgICAgICAgLyogZGlzYWJsZSBwYWlyIG1vZGUgb3Igbm90ICovCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgIGNvbm5fcGFpcmVkX29ubHk7ICAgLyogYWxsb3cgY29ubmVjdGFibGUgdG8gcGFpcmVkIGRldmljZSBvbmx5IG9yIG5vdCAqLwogICAgIHRCVEFfRE1fQVBJX1NFQVJDSCAgICAgICAgICBzZWFyY2hfbXNnOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICBwYWdlX3NjYW5faW50ZXJ2YWw7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgIHBhZ2Vfc2Nhbl93aW5kb3c7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgIGlucXVpcnlfc2Nhbl9pbnRlcnZhbDsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgaW5xdWlyeV9zY2FuX3dpbmRvdzsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICBwYWdlX3NjYW5faW50ZXJ2YWw7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgcGFnZV9zY2FuX3dpbmRvdzsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICBpbnF1aXJ5X3NjYW5faW50ZXJ2YWw7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgaW5xdWlyeV9zY2FuX3dpbmRvdzsKIAogICAgIC8qIFN0b3JhZ2UgZm9yIHBpbiBjb2RlIHJlcXVlc3QgcGFyYW1ldGVycyAqLwogICAgIEJEX0FERFIgICAgICAgICAgICAgICAgICAgICBwaW5fYmRfYWRkcjsKICAgICBERVZfQ0xBU1MgICAgICAgICAgICAgICAgICAgcGluX2Rldl9jbGFzczsKICAgICB0QlRBX0RNX1NFQ19FVlQgICAgICAgICAgICAgcGluX2V2dDsKLSAgICBVSU5UMzIgICAgICAgICAgbnVtX3ZhbDsgICAgICAgIC8qIHRoZSBudW1lcmljIHZhbHVlIGZvciBjb21wYXJpc29uLiBJZiBqdXN0X3dvcmtzLCBkbyBub3Qgc2hvdyB0aGlzIG51bWJlciB0byBVSSAqLwotICAgIEJPT0xFQU4gICAgICAgICBqdXN0X3dvcmtzOyAgICAgLyogVFJVRSwgaWYgIkp1c3QgV29ya3MiIGFzc29jaWF0aW9uIG1vZGVsICovCi0jaWYgKCBCVEFfRUlSX0NBTk5FRF9VVUlEX0xJU1QgIT0gVFJVRSApCisgICAgdWludDMyX3QgICAgICAgICAgbnVtX3ZhbDsgICAgICAgIC8qIHRoZSBudW1lcmljIHZhbHVlIGZvciBjb21wYXJpc29uLiBJZiBqdXN0X3dvcmtzLCBkbyBub3Qgc2hvdyB0aGlzIG51bWJlciB0byBVSSAqLworICAgIGJvb2wgICAgICAgICBqdXN0X3dvcmtzOyAgICAgLyogdHJ1ZSwgaWYgIkp1c3QgV29ya3MiIGFzc29jaWF0aW9uIG1vZGVsICovCisjaWYgKEJUQV9FSVJfQ0FOTkVEX1VVSURfTElTVCAhPSBUUlVFKQogICAgIC8qIHN0b3JlIFVVSUQgbGlzdCBmb3IgRUlSICovCi0gICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgIGVpcl91dWlkW0JUTV9FSVJfU0VSVklDRV9BUlJBWV9TSVpFXTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICBlaXJfdXVpZFtCVE1fRUlSX1NFUlZJQ0VfQVJSQVlfU0laRV07CiAjaWYgKEJUQV9FSVJfU0VSVkVSX05VTV9DVVNUT01fVVVJRCA+IDApCiAgICAgdEJUX1VVSUQgICAgICAgICAgICAgICAgICAgIGN1c3RvbV91dWlkW0JUQV9FSVJfU0VSVkVSX05VTV9DVVNUT01fVVVJRF07CiAjZW5kaWYKQEAgLTkxMiwzMiArOTEyLDMyIEBACiAgICAgdEJUQV9TRVJWSUNFX01BU0sgICAgICBzZXJ2aWNlc190b19zZWFyY2g7CiAgICAgdEJUQV9TRVJWSUNFX01BU0sgICAgICBzZXJ2aWNlc19mb3VuZDsKICAgICB0U0RQX0RJU0NPVkVSWV9EQiAgICAqIHBfc2RwX2RiOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgc3RhdGU7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgIHN0YXRlOwogICAgIEJEX0FERFIgICAgICAgICAgICAgICAgcGVlcl9iZGFkZHI7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICBuYW1lX2Rpc2NvdmVyX2RvbmU7CisgICAgYm9vbCAgICAgICAgICAgICAgICBuYW1lX2Rpc2NvdmVyX2RvbmU7CiAgICAgQkRfTkFNRSAgICAgICAgICAgICAgICBwZWVyX25hbWU7CiAgICAgYWxhcm1fdCAgICAgICAgICAgICAgKiBzZWFyY2hfdGltZXI7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICBzZXJ2aWNlX2luZGV4OworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICBzZXJ2aWNlX2luZGV4OwogICAgIHRCVEFfRE1fTVNHICAgICAgICAgICogcF9zZWFyY2hfcXVldWU7ICAgLyogc2VhcmNoIG9yIGRpc2NvdmVyIGNvbW1hbmRzIGR1cmluZyBzZWFyY2ggY2FuY2VsIHN0b3JlZCBoZXJlICovCi0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICB3YWl0X2Rpc2M7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICBzZHBfcmVzdWx0czsKKyAgICBib29sICAgICAgICAgICAgICAgIHdhaXRfZGlzYzsKKyAgICBib29sICAgICAgICAgICAgICAgIHNkcF9yZXN1bHRzOwogICAgIHRTRFBfVVVJRCAgICAgICAgICAgICAgdXVpZDsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgIHBlZXJfc2NuOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgc2RwX3NlYXJjaDsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgIGNhbmNlbF9wZW5kaW5nOyAvKiBpbnF1aXJ5IGNhbmNlbCBpcyBwZW5kaW5nICovCisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgIHBlZXJfc2NuOworICAgIGJvb2wgICAgICAgICAgICAgICAgc2RwX3NlYXJjaDsKKyAgICBib29sICAgICAgICAgICAgICAgIGNhbmNlbF9wZW5kaW5nOyAvKiBpbnF1aXJ5IGNhbmNlbCBpcyBwZW5kaW5nICovCiAgICAgdEJUQV9UUkFOU1BPUlQgICAgICAgICB0cmFuc3BvcnQ7Ci0jaWYgKChkZWZpbmVkIEJMRV9JTkNMVURFRCkgJiYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKSkKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUpCiAgICAgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sgKiBwX3NjYW5fY2JhY2s7Ci0jaWYgKChkZWZpbmVkIEJUQV9HQVRUX0lOQ0xVREVEKSAmJiAoQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRSkpCisjaWYgKEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCiAgICAgdEJUQV9HQVRUQ19JRiAgICAgICAgICBjbGllbnRfaWY7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICBudW1fdXVpZDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgbnVtX3V1aWQ7CiAgICAgdEJUX1VVSUQgICAgICAgICAgICAgICAqcF9zcnZjX3V1aWQ7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICB1dWlkX3RvX3NlYXJjaDsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgIGdhdHRfZGlzY19hY3RpdmU7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICBjb25uX2lkOwotICAgIFVJTlQ4ICogICAgICAgICAgICAgICAgIHBfYmxlX3Jhd2RhdGE7Ci0gICAgVUlOVDMyICAgICAgICAgICAgICAgICBibGVfcmF3X3NpemU7Ci0gICAgVUlOVDMyICAgICAgICAgICAgICAgICBibGVfcmF3X3VzZWQ7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgIHV1aWRfdG9fc2VhcmNoOworICAgIGJvb2wgICAgICAgICAgICAgICAgZ2F0dF9kaXNjX2FjdGl2ZTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgY29ubl9pZDsKKyAgICB1aW50OF90ICogICAgICAgICAgICAgICAgIHBfYmxlX3Jhd2RhdGE7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgIGJsZV9yYXdfc2l6ZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgYmxlX3Jhd191c2VkOwogICAgIGFsYXJtX3QgICAgICAgICAgICAgICogZ2F0dF9jbG9zZV90aW1lcjsgLyogR0FUVCBjaGFubmVsIGNsb3NlIGRlbGF5IHRpbWVyICovCiAgICAgQkRfQUREUiAgICAgICAgICAgICAgICBwZW5kaW5nX2Nsb3NlX2JkYTsgLyogcGVuZGluZyBHQVRUIGNoYW5uZWwgcmVtb3RlIGRldmljZSBhZGRyZXNzICovCiAjZW5kaWYKQEAgLTk1MCw4ICs5NTAsOCBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICB0U0RQX0RJU0NPVkVSWV9EQiAgICAqIHBfZGlfZGI7ICAgICAvKiBwb2ludGVyIHRvIHRoZSBESSBkaXNjb3ZlcnkgZGF0YWJhc2UgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIGRpX251bTsgICAgICAgICAvKiB0b3RhbCBsb2NhbCBESSByZWNvcmQgbnVtYmVyICovCi0gICAgVUlOVDMyICAgICAgICAgICAgICBkaV9oYW5kbGVbQlRBX0RJX05VTV9NQVhdOyAgLyogbG9jYWwgREkgcmVjb3JkIGhhbmRsZSwgdGhlIGZpcnN0IG9uZSBpcyBwcmltYXJ5IHJlY29yZCAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBkaV9udW07ICAgICAgICAgLyogdG90YWwgbG9jYWwgREkgcmVjb3JkIG51bWJlciAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBkaV9oYW5kbGVbQlRBX0RJX05VTV9NQVhdOyAgLyogbG9jYWwgREkgcmVjb3JkIGhhbmRsZSwgdGhlIGZpcnN0IG9uZSBpcyBwcmltYXJ5IHJlY29yZCAqLwogfXRCVEFfRE1fRElfQ0I7CiAKIC8qIERNIHNlYXJjaCBzdGF0ZSAqLwpAQCAtOTcwLDIxICs5NzAsMjEgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgREVWX0NMQVNTICAgICAgZGV2X2NsYXNzOyAgICAgICAgICAvKiBsb2NhbCBkZXZpY2UgY2xhc3MgKi8KLSAgICBVSU5UMTYgICAgICAgICBwb2xpY3lfc2V0dGluZ3M7ICAgIC8qIGxpbmsgcG9saWN5IHNldHRpbmcgaG9sZCwgc25pZmYsIHBhcmssIE1TIHN3aXRjaCAqLwotICAgIFVJTlQxNiAgICAgICAgIHBhZ2VfdGltZW91dDsgICAgICAgLyogdGltZW91dCBmb3IgcGFnZSBpbiBzbG90cyAqLwotICAgIFVJTlQxNiAgICAgICAgIGxpbmtfdGltZW91dDsgICAgICAgLyogbGluayBzdXBlcnZpc2lvbiB0aW1lb3V0IGluIHNsb3RzICovCi0gICAgQk9PTEVBTiAgICAgICAgYXZvaWRfc2NhdHRlcjsgICAgICAvKiBUUlVFIHRvIGF2b2lkIHNjYXR0ZXJuZXQgd2hlbiBhdiBpcyBzdHJlYW1pbmcgKGJlIHRoZSBtYXN0ZXIpICovCisgICAgdWludDE2X3QgICAgICAgICBwb2xpY3lfc2V0dGluZ3M7ICAgIC8qIGxpbmsgcG9saWN5IHNldHRpbmcgaG9sZCwgc25pZmYsIHBhcmssIE1TIHN3aXRjaCAqLworICAgIHVpbnQxNl90ICAgICAgICAgcGFnZV90aW1lb3V0OyAgICAgICAvKiB0aW1lb3V0IGZvciBwYWdlIGluIHNsb3RzICovCisgICAgdWludDE2X3QgICAgICAgICBsaW5rX3RpbWVvdXQ7ICAgICAgIC8qIGxpbmsgc3VwZXJ2aXNpb24gdGltZW91dCBpbiBzbG90cyAqLworICAgIGJvb2wgICAgICAgIGF2b2lkX3NjYXR0ZXI7ICAgICAgLyogdHJ1ZSB0byBhdm9pZCBzY2F0dGVybmV0IHdoZW4gYXYgaXMgc3RyZWFtaW5nIChiZSB0aGUgbWFzdGVyKSAqLwogCiB9IHRCVEFfRE1fQ0ZHOwogCi1leHRlcm4gY29uc3QgVUlOVDMyIGJ0YV9zZXJ2aWNlX2lkX3RvX2J0bV9zcnZfaWRfbGt1cF90YmxbXTsKK2V4dGVybiBjb25zdCB1aW50MzJfdCBidGFfc2VydmljZV9pZF90b19idG1fc3J2X2lkX2xrdXBfdGJsW107CiAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UOCAgIGlkOwotICAgIFVJTlQ4ICAgYXBwX2lkOwotICAgIFVJTlQ4ICAgY2ZnOworICAgIHVpbnQ4X3QgICBpZDsKKyAgICB1aW50OF90ICAgYXBwX2lkOworICAgIHVpbnQ4X3QgICBjZmc7CiAKIH0gdEJUQV9ETV9STSA7CiAKQEAgLTk5NCw5ICs5OTQsOSBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKIAotICBVSU5UOCAgaWQ7Ci0gIFVJTlQ4ICBhcHBfaWQ7Ci0gIFVJTlQ4ICBzcGVjX2lkeDsgIC8qIGluZGV4IG9mIHNwZWMgdGFibGUgdG8gdXNlICovCisgIHVpbnQ4X3QgIGlkOworICB1aW50OF90ICBhcHBfaWQ7CisgIHVpbnQ4X3QgIHNwZWNfaWR4OyAgLyogaW5kZXggb2Ygc3BlYyB0YWJsZSB0byB1c2UgKi8KIAogfSB0QlRBX0RNX1BNX0NGRzsKIApAQCAtMTAwNSwxNiArMTAwNSwxNiBAQAogewogCiAgIHRCVEFfRE1fUE1fQUNUSU9OICAgcG93ZXJfbW9kZTsKLSAgVUlOVDE2ICAgICAgICAgICAgICB0aW1lb3V0OworICB1aW50MTZfdCAgICAgICAgICAgICAgdGltZW91dDsKIAogfSB0QlRBX0RNX1BNX0FDVE47CiAKIHR5cGVkZWYgc3RydWN0CiB7CiAKLSAgVUlOVDggIGFsbG93X21hc2s7ICAgICAgICAgLyogbWFzayBvZiBzbmlmZi9ob2xkL3BhcmsgbW9kZXMgdG8gYWxsb3cgKi8KKyAgdWludDhfdCAgYWxsb3dfbWFzazsgICAgICAgICAvKiBtYXNrIG9mIHNuaWZmL2hvbGQvcGFyayBtb2RlcyB0byBhbGxvdyAqLwogI2lmIChCVE1fU1NSX0lOQ0xVREVEID09IFRSVUUpCi0gIFVJTlQ4ICBzc3I7ICAgICAgICAgICAgICAgIC8qIHNldCBTU1Igb24gY29ubiBvcGVuL3VucGFyayAqLworICB1aW50OF90ICBzc3I7ICAgICAgICAgICAgICAgIC8qIHNldCBTU1Igb24gY29ubiBvcGVuL3VucGFyayAqLwogI2VuZGlmCiAgIHRCVEFfRE1fUE1fQUNUTiBhY3RuX3RibCBbQlRBX0RNX1BNX05VTV9FVlRTXVsyXTsKIApAQCAtMTAyMiwxOSArMTAyMiwxOSBAQAogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQxNiAgICAgIG1heF9sYXQ7Ci0gICAgVUlOVDE2ICAgICAgbWluX3JtdF90bzsKLSAgICBVSU5UMTYgICAgICBtaW5fbG9jX3RvOworICAgIHVpbnQxNl90ICAgICAgbWF4X2xhdDsKKyAgICB1aW50MTZfdCAgICAgIG1pbl9ybXRfdG87CisgICAgdWludDE2X3QgICAgICBtaW5fbG9jX3RvOwogfSB0QlRBX0RNX1NTUl9TUEVDOwogCiB0eXBlZGVmIHN0cnVjdAogewotICAgVUlOVDE2IG1hbnVmYWN0dXJlcjsKLSAgIFVJTlQxNiBsbXBfc3ViX3ZlcnNpb247Ci0gICBVSU5UOCBsbXBfdmVyc2lvbjsKKyAgIHVpbnQxNl90IG1hbnVmYWN0dXJlcjsKKyAgIHVpbnQxNl90IGxtcF9zdWJfdmVyc2lvbjsKKyAgIHVpbnQ4X3QgbG1wX3ZlcnNpb247CiB9dEJUQV9ETV9MTVBfVkVSX0lORk87CiAKLWV4dGVybiBjb25zdCBVSU5UMTYgYnRhX3NlcnZpY2VfaWRfdG9fdXVpZF9sa3VwX3RibCBbXTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBidGFfc2VydmljZV9pZF90b191dWlkX2xrdXBfdGJsIFtdOwogCiBleHRlcm4gdEJUQV9ETV9QTV9DRkcgKnBfYnRhX2RtX3BtX2NmZzsKIGV4dGVybiB0QlRBX0RNX1BNX1NQRUMgKnBfYnRhX2RtX3BtX3NwZWM7CkBAIC0xMDQ4LDcgKzEwNDgsNyBAQAogZXh0ZXJuIHRCVEFfRE1fRUlSX0NPTkYgKnBfYnRhX2RtX2Vpcl9jZmc7CiAKIC8qIERNIGNvbnRyb2wgYmxvY2sgKi8KLSNpZiBCVEFfRFlOQU1JQ19NRU1PUlkgPT0gRkFMU0UKKyNpZiAoQlRBX0RZTkFNSUNfTUVNT1JZID09IEZBTFNFKQogZXh0ZXJuIHRCVEFfRE1fQ0IgIGJ0YV9kbV9jYjsKICNlbHNlCiBleHRlcm4gdEJUQV9ETV9DQiAqYnRhX2RtX2NiX3B0cjsKQEAgLTEwNTYsNyArMTA1Niw3IEBACiAjZW5kaWYKIAogLyogRE0gc2VhcmNoIGNvbnRyb2wgYmxvY2sgKi8KLSNpZiBCVEFfRFlOQU1JQ19NRU1PUlkgPT0gRkFMU0UKKyNpZiAoQlRBX0RZTkFNSUNfTUVNT1JZID09IEZBTFNFKQogZXh0ZXJuIHRCVEFfRE1fU0VBUkNIX0NCICBidGFfZG1fc2VhcmNoX2NiOwogI2Vsc2UKIGV4dGVybiB0QlRBX0RNX1NFQVJDSF9DQiAqYnRhX2RtX3NlYXJjaF9jYl9wdHI7CkBAIC0xMDY0LDE2ICsxMDY0LDE2IEBACiAjZW5kaWYKIAogLyogREkgY29udHJvbCBibG9jayAqLwotI2lmIEJUQV9EWU5BTUlDX01FTU9SWSA9PSBGQUxTRQorI2lmIChCVEFfRFlOQU1JQ19NRU1PUlkgPT0gRkFMU0UpCiBleHRlcm4gdEJUQV9ETV9ESV9DQiAgYnRhX2RtX2RpX2NiOwogI2Vsc2UKIGV4dGVybiB0QlRBX0RNX0RJX0NCICpidGFfZG1fZGlfY2JfcHRyOwogI2RlZmluZSBidGFfZG1fZGlfY2IgKCpidGFfZG1fZGlfY2JfcHRyKQogI2VuZGlmCiAKLWV4dGVybiBCT09MRUFOIGJ0YV9kbV9zbV9leGVjdXRlKEJUX0hEUiAqcF9tc2cpOworZXh0ZXJuIGJvb2wgYnRhX2RtX3NtX2V4ZWN1dGUoQlRfSERSICpwX21zZyk7CiBleHRlcm4gdm9pZCBidGFfZG1fc21fZGlzYWJsZSggdm9pZCApOwotZXh0ZXJuIEJPT0xFQU4gYnRhX2RtX3NlYXJjaF9zbV9leGVjdXRlKEJUX0hEUiAqcF9tc2cpOworZXh0ZXJuIGJvb2wgYnRhX2RtX3NlYXJjaF9zbV9leGVjdXRlKEJUX0hEUiAqcF9tc2cpOwogZXh0ZXJuIHZvaWQgYnRhX2RtX3NlYXJjaF9zbV9kaXNhYmxlKCB2b2lkICk7CiAKIApAQCAtMTA5OCw3ICsxMDk4LDcgQEAKIGV4dGVybiB2b2lkIGJ0YV9kbV9wbV90aW1lcih0QlRBX0RNX01TRyAqcF9kYXRhKTsKIGV4dGVybiB2b2lkIGJ0YV9kbV9hZGRfYW1wa2V5ICh0QlRBX0RNX01TRyAqcF9kYXRhKTsKIAotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogZXh0ZXJuIHZvaWQgYnRhX2RtX2FkZF9ibGVrZXkgKHRCVEFfRE1fTVNHICpwX2RhdGEpOwogZXh0ZXJuIHZvaWQgYnRhX2RtX2FkZF9ibGVfZGV2aWNlICh0QlRBX0RNX01TRyAqcF9kYXRhKTsKIGV4dGVybiB2b2lkIGJ0YV9kbV9ibGVfcGFzc2tleV9yZXBseSAodEJUQV9ETV9NU0cgKnBfZGF0YSk7CkBAIC0xMTE4LDcgKzExMTgsNyBAQAogZXh0ZXJuIHZvaWQgYnRhX2RtX2JsZV9icm9hZGNhc3QgKHRCVEFfRE1fTVNHICpwX2RhdGEpOwogZXh0ZXJuIHZvaWQgYnRhX2RtX2JsZV9zZXRfZGF0YV9sZW5ndGgodEJUQV9ETV9NU0cgKnBfZGF0YSk7CiAKLSNpZiBCTEVfQU5EUk9JRF9DT05UUk9MTEVSX1NDQU5fRklMVEVSID09IFRSVUUKKyNpZiAoQkxFX0FORFJPSURfQ09OVFJPTExFUl9TQ0FOX0ZJTFRFUiA9PSBUUlVFKQogZXh0ZXJuIHZvaWQgYnRhX2RtX2NmZ19maWx0ZXJfY29uZCAodEJUQV9ETV9NU0cgKnBfZGF0YSk7CiBleHRlcm4gdm9pZCBidGFfZG1fc2Nhbl9maWx0ZXJfcGFyYW1fc2V0dXAgKHRCVEFfRE1fTVNHICpwX2RhdGEpOwogZXh0ZXJuIHZvaWQgYnRhX2RtX2VuYWJsZV9zY2FuX2ZpbHRlcih0QlRBX0RNX01TRyAqcF9kYXRhKTsKQEAgLTExNDUsNyArMTE0NSw3IEBACiBleHRlcm4gdm9pZCBidGFfZG1faW5pdF9wbSh2b2lkKTsKIGV4dGVybiB2b2lkIGJ0YV9kbV9kaXNhYmxlX3BtKHZvaWQpOwogCi1leHRlcm4gVUlOVDggYnRhX2RtX2dldF9hdl9jb3VudCh2b2lkKTsKK2V4dGVybiB1aW50OF90IGJ0YV9kbV9nZXRfYXZfY291bnQodm9pZCk7CiBleHRlcm4gdm9pZCBidGFfZG1fc2VhcmNoX3N0YXJ0ICh0QlRBX0RNX01TRyAqcF9kYXRhKTsKIGV4dGVybiB2b2lkIGJ0YV9kbV9zZWFyY2hfY2FuY2VsICh0QlRBX0RNX01TRyAqcF9kYXRhKTsKIGV4dGVybiB2b2lkIGJ0YV9kbV9kaXNjb3ZlciAodEJUQV9ETV9NU0cgKnBfZGF0YSk7CkBAIC0xMTY5LDcgKzExNjksNyBAQAogCiBleHRlcm4gIkMiIHZvaWQgYnRhX2RtX3BtX2FjdGl2ZShCRF9BRERSIHBlZXJfYWRkcik7CiAKLXZvaWQgYnRhX2RtX2Vpcl91cGRhdGVfdXVpZChVSU5UMTYgdXVpZDE2LCBCT09MRUFOIGFkZGluZyk7Cit2b2lkIGJ0YV9kbV9laXJfdXBkYXRlX3V1aWQodWludDE2X3QgdXVpZDE2LCBib29sIGFkZGluZyk7CiAKIGV4dGVybiB2b2lkIGJ0YV9kbV9lbmFibGVfdGVzdF9tb2RlKHRCVEFfRE1fTVNHICpwX2RhdGEpOwogZXh0ZXJuIHZvaWQgYnRhX2RtX2Rpc2FibGVfdGVzdF9tb2RlKHRCVEFfRE1fTVNHICpwX2RhdGEpOwpkaWZmIC0tZ2l0IGEvYnRhL2RtL2J0YV9kbV9tYWluLmNjIGIvYnRhL2RtL2J0YV9kbV9tYWluLmNjCmluZGV4IGU2ZDc5MWEuLjUwYzYyMmMgMTAwNjQ0Ci0tLSBhL2J0YS9kbS9idGFfZG1fbWFpbi5jYworKysgYi9idGEvZG0vYnRhX2RtX21haW4uY2MKQEAgLTMxLDcgKzMxLDcgQEAKICoqIENvbnN0YW50cyBhbmQgdHlwZXMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWYgQlRBX0RZTkFNSUNfTUVNT1JZID09IEZBTFNFCisjaWYgKEJUQV9EWU5BTUlDX01FTU9SWSA9PSBGQUxTRSkKIHRCVEFfRE1fQ0IgIGJ0YV9kbV9jYjsKIHRCVEFfRE1fU0VBUkNIX0NCIGJ0YV9kbV9zZWFyY2hfY2I7CiB0QlRBX0RNX0RJX0NCICAgICAgIGJ0YV9kbV9kaV9jYjsKQEAgLTc2LDcgKzc2LDcgQEAKICAgICBidGFfZG1fY2lfcm10X29vYl9hY3QsICAgIC8qIDIyIEJUQV9ETV9DSV9STVRfT09CX0VWVCAqLwogCiAKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKICAgICBidGFfZG1fYWRkX2JsZWtleSwgICAgICAgICAgLyogIEJUQV9ETV9BUElfQUREX0JMRUtFWV9FVlQgICAgICAgICAgICovCiAgICAgYnRhX2RtX2FkZF9ibGVfZGV2aWNlLCAgICAgIC8qICBCVEFfRE1fQVBJX0FERF9CTEVERVZJQ0VfRVZUICAgICAgICAqLwogICAgIGJ0YV9kbV9ibGVfcGFzc2tleV9yZXBseSwgICAvKiAgQlRBX0RNX0FQSV9CTEVfUEFTU0tFWV9SRVBMWV9FVlQgICAgKi8KQEAgLTg4LDcgKzg4LDcgQEAKICAgICBidGFfZG1fYmxlX3NldF9zY2FuX3BhcmFtcywgIC8qIEJUQV9ETV9BUElfQkxFX1NDQU5fUEFSQU1fRVZUICovCiAgICAgYnRhX2RtX2JsZV9vYnNlcnZlLAogICAgIGJ0YV9kbV9ibGVfdXBkYXRlX2Nvbm5fcGFyYW1zLCAgIC8qIEJUQV9ETV9BUElfVVBEQVRFX0NPTk5fUEFSQU1fRVZUICovCi0jaWYgQkxFX1BSSVZBQ1lfU1BUID09IFRSVUUKKyNpZiAoQkxFX1BSSVZBQ1lfU1BUID09IFRSVUUpCiAgICAgYnRhX2RtX2JsZV9jb25maWdfbG9jYWxfcHJpdmFjeSwgICAvKiBCVEFfRE1fQVBJX0xPQ0FMX1BSSVZBQ1lfRVZUICovCiAjZW5kaWYKICAgICBidGFfZG1fYmxlX3NldF9hZHZfcGFyYW1zLCAgICAgLyogQlRBX0RNX0FQSV9CTEVfQURWX1BBUkFNX0VWVCAqLwpAQCAtOTYsNyArOTYsNyBAQAogICAgIGJ0YV9kbV9ibGVfc2V0X3NjYW5fcnNwLCAgICAgICAvKiBCVEFfRE1fQVBJX0JMRV9TRVRfU0NBTl9SU1BUICovCiAgICAgYnRhX2RtX2JsZV9icm9hZGNhc3QsICAgICAgICAgIC8qIEJUQV9ETV9BUElfQkxFX0JST0FEQ0FTVF9FVlQgKi8KICAgICBidGFfZG1fYmxlX3NldF9kYXRhX2xlbmd0aCwgICAgLyogQlRBX0RNX0FQSV9TRVRfREFUQV9MRU5HVEhfRVZUICovCi0jaWYgQkxFX0FORFJPSURfQ09OVFJPTExFUl9TQ0FOX0ZJTFRFUiA9PSBUUlVFCisjaWYgKEJMRV9BTkRST0lEX0NPTlRST0xMRVJfU0NBTl9GSUxURVIgPT0gVFJVRSkKICAgICBidGFfZG1fY2ZnX2ZpbHRlcl9jb25kLCAgICAgICAgIC8qIEJUQV9ETV9BUElfQ0ZHX0ZJTFRFUl9DT05EX0VWVCAqLwogICAgIGJ0YV9kbV9zY2FuX2ZpbHRlcl9wYXJhbV9zZXR1cCwgLyogQlRBX0RNX0FQSV9TQ0FOX0ZJTFRFUl9TRVRVUF9FVlQgKi8KICAgICBidGFfZG1fZW5hYmxlX3NjYW5fZmlsdGVyLCAgICAgIC8qIEJUQV9ETV9BUElfU0NBTl9GSUxURVJfRU5BQkxFX0VWVCAqLwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAgICAgQlRBX0RNX1NFQVJDSF9DQU5DRUxfVFJBTlNBQ19DTVBMLCAgLyogMTUgYnRhX2RtX3NlYXJjaF9jYW5jZWxfdHJhbnNhY19jbXBsICovCiAgICAgQlRBX0RNX0RJU0NfUk1UX05BTUUsICAgICAgICAgICAgICAgLyogMTYgYnRhX2RtX2Rpc2Nfcm10X25hbWUgKi8KICAgICBCVEFfRE1fQVBJX0RJX0RJU0NPVkVSLCAgICAgICAgICAgICAvKiAxNyBidGFfZG1fZGlfZGlzYyAqLwotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogICAgIEJUQV9ETV9DTE9TRV9HQVRUX0NPTk4sICAgICAgICAgICAgIC8qIDE4IGJ0YV9kbV9jbG9zZV9nYXR0X2Nvbm4gKi8KICNlbmRpZgogICAgIEJUQV9ETV9TRUFSQ0hfTlVNX0FDVElPTlMgICAgICAgICAgIC8qIDE5ICovCkBAIC0xNzMsNyArMTczLDcgQEAKICAgYnRhX2RtX3NlYXJjaF9jYW5jZWxfdHJhbnNhY19jbXBsLCAvKiAxNSBCVEFfRE1fU0VBUkNIX0NBTkNFTF9UUkFOU0FDX0NNUEwgKi8KICAgYnRhX2RtX2Rpc2Nfcm10X25hbWUsICAgICAgICAgICAgIC8qIDE2IEJUQV9ETV9ESVNDX1JNVF9OQU1FICovCiAgIGJ0YV9kbV9kaV9kaXNjICAgICAgICAgICAgICAgICAgICAvKiAxNyBCVEFfRE1fQVBJX0RJX0RJU0NPVkVSICovCi0jaWYgQkxFX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUpCiAgICxidGFfZG1fY2xvc2VfZ2F0dF9jb25uCiAjZW5kaWYKIH07CkBAIC0xODcsNyArMTg3LDcgQEAKIAogCiAvKiBzdGF0ZSB0YWJsZSBmb3IgbGlzdGVuIHN0YXRlICovCi1jb25zdCBVSU5UOCBidGFfZG1fc2VhcmNoX2lkbGVfc3RfdGFibGVbXVtCVEFfRE1fU0VBUkNIX05VTV9DT0xTXSA9Citjb25zdCB1aW50OF90IGJ0YV9kbV9zZWFyY2hfaWRsZV9zdF90YWJsZVtdW0JUQV9ETV9TRUFSQ0hfTlVNX0NPTFNdID0KIHsKIAogLyogRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gMiAgICAgICAgICAgICAgICAgICAgTmV4dCBTdGF0ZSAqLwpAQCAtMjAwLDExICsyMDAsMTEgQEAKIC8qIFNFQVJDSF9DTVBMX0VWVCAqLyAgICAgICB7QlRBX0RNX1NFQVJDSF9JR05PUkUsICAgICAgICAgICAgIEJUQV9ETV9TRUFSQ0hfSUdOT1JFLCAgICAgICAgICBCVEFfRE1fU0VBUkNIX0lETEV9LAogLyogRElTQ1ZfUkVTX0VWVCAqLyAgICAgICAgIHtCVEFfRE1fU0VBUkNIX0lHTk9SRSwgICAgICAgICAgICAgQlRBX0RNX1NFQVJDSF9JR05PUkUsICAgICAgICAgIEJUQV9ETV9TRUFSQ0hfSURMRX0sCiAvKiBBUElfRElfRElTQ09WRVJfRVZUICovICAge0JUQV9ETV9BUElfRElfRElTQ09WRVIsICAgICAgICAgICBCVEFfRE1fU0VBUkNIX0lHTk9SRSwgICAgICAgICAgQlRBX0RNX1NFQVJDSF9BQ1RJVkV9Ci0jaWYgQkxFX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUpCiAvKiBESVNDX0NMT1NFX1RPVVRfRVZUICovICAgLHtCVEFfRE1fQ0xPU0VfR0FUVF9DT05OLCAgICAgICAgICAgQlRBX0RNX1NFQVJDSF9JR05PUkUsICAgICAgICAgIEJUQV9ETV9TRUFSQ0hfSURMRX0KICNlbmRpZgogfTsKLWNvbnN0IFVJTlQ4IGJ0YV9kbV9zZWFyY2hfc2VhcmNoX2FjdGl2ZV9zdF90YWJsZVtdW0JUQV9ETV9TRUFSQ0hfTlVNX0NPTFNdID0KK2NvbnN0IHVpbnQ4X3QgYnRhX2RtX3NlYXJjaF9zZWFyY2hfYWN0aXZlX3N0X3RhYmxlW11bQlRBX0RNX1NFQVJDSF9OVU1fQ09MU10gPQogewogCiAvKiBFdmVudCAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAyICAgICAgICAgICAgICAgICAgICBOZXh0IFN0YXRlICovCkBAIC0yMTcsMTMgKzIxNywxMyBAQAogLyogU0VBUkNIX0NNUExfRVZUICovICAgICAgIHtCVEFfRE1fU0VBUkNIX0NNUEwsICAgICAgICAgICAgICAgQlRBX0RNX1NFQVJDSF9JR05PUkUsICAgICAgICAgIEJUQV9ETV9TRUFSQ0hfSURMRX0sCiAvKiBESVNDVl9SRVNfRVZUICovICAgICAgICAge0JUQV9ETV9TRUFSQ0hfUkVTVUxULCAgICAgICAgICAgICBCVEFfRE1fU0VBUkNIX0lHTk9SRSwgICAgICAgICAgQlRBX0RNX1NFQVJDSF9BQ1RJVkV9LAogLyogQVBJX0RJX0RJU0NPVkVSX0VWVCAqLyAgIHtCVEFfRE1fU0VBUkNIX0lHTk9SRSwgICAgICAgICAgICAgQlRBX0RNX1NFQVJDSF9JR05PUkUsICAgICAgICAgIEJUQV9ETV9TRUFSQ0hfQUNUSVZFfQotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogLyogRElTQ19DTE9TRV9UT1VUX0VWVCAqLyAgICx7QlRBX0RNX0NMT1NFX0dBVFRfQ09OTiwgICAgICAgICAgQlRBX0RNX1NFQVJDSF9JR05PUkUsICAgICAgICAgIEJUQV9ETV9TRUFSQ0hfQUNUSVZFfQogI2VuZGlmCiAKIH07CiAKLWNvbnN0IFVJTlQ4IGJ0YV9kbV9zZWFyY2hfc2VhcmNoX2NhbmNlbGxpbmdfc3RfdGFibGVbXVtCVEFfRE1fU0VBUkNIX05VTV9DT0xTXSA9Citjb25zdCB1aW50OF90IGJ0YV9kbV9zZWFyY2hfc2VhcmNoX2NhbmNlbGxpbmdfc3RfdGFibGVbXVtCVEFfRE1fU0VBUkNIX05VTV9DT0xTXSA9CiB7CiAKIC8qIEV2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uIDIgICAgICAgICAgICAgICAgICAgIE5leHQgU3RhdGUgKi8KQEAgLTIzNiwxMyArMjM2LDEzIEBACiAvKiBTRUFSQ0hfQ01QTF9FVlQgKi8gICAgICAge0JUQV9ETV9TRUFSQ0hfQ0FOQ0VMX1RSQU5TQUNfQ01QTCwgQlRBX0RNX1NFQVJDSF9DQU5DRUxfQ01QTCwgICAgIEJUQV9ETV9TRUFSQ0hfSURMRX0sCiAvKiBESVNDVl9SRVNfRVZUICovICAgICAgICAge0JUQV9ETV9TRUFSQ0hfQ0FOQ0VMX1RSQU5TQUNfQ01QTCwgQlRBX0RNX1NFQVJDSF9DQU5DRUxfQ01QTCwgICAgIEJUQV9ETV9TRUFSQ0hfSURMRX0sCiAvKiBBUElfRElfRElTQ09WRVJfRVZUICovICAge0JUQV9ETV9TRUFSQ0hfSUdOT1JFLCAgICAgICAgICAgICAgQlRBX0RNX1NFQVJDSF9JR05PUkUsICAgICAgICAgIEJUQV9ETV9TRUFSQ0hfQ0FOQ0VMTElOR30KLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKIC8qIERJU0NfQ0xPU0VfVE9VVF9FVlQgKi8gICAse0JUQV9ETV9TRUFSQ0hfSUdOT1JFLCAgICAgICAgICAgICAgQlRBX0RNX1NFQVJDSF9JR05PUkUsICAgICAgICAgIEJUQV9ETV9TRUFSQ0hfQ0FOQ0VMTElOR30KICNlbmRpZgogCiB9OwogCi1jb25zdCBVSU5UOCBidGFfZG1fc2VhcmNoX2Rpc2NfYWN0aXZlX3N0X3RhYmxlW11bQlRBX0RNX1NFQVJDSF9OVU1fQ09MU10gPQorY29uc3QgdWludDhfdCBidGFfZG1fc2VhcmNoX2Rpc2NfYWN0aXZlX3N0X3RhYmxlW11bQlRBX0RNX1NFQVJDSF9OVU1fQ09MU10gPQogewogCiAvKiBFdmVudCAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAyICAgICAgICAgICAgICAgICAgICBOZXh0IFN0YXRlICovCkBAIC0yNTYsMTIgKzI1NiwxMiBAQAogLyogRElTQ1ZfUkVTX0VWVCAqLyAgICAgICAgIHtCVEFfRE1fRElTQ19SRVNVTFQsICAgICAgICAgICAgICAgQlRBX0RNX1NFQVJDSF9JR05PUkUsICAgICAgICAgIEJUQV9ETV9ESVNDT1ZFUl9BQ1RJVkV9LAogLyogQVBJX0RJX0RJU0NPVkVSX0VWVCAqLyAgIHtCVEFfRE1fU0VBUkNIX0lHTk9SRSwgICAgICAgICAgICAgQlRBX0RNX1NFQVJDSF9JR05PUkUsICAgICAgICAgIEJUQV9ETV9ESVNDT1ZFUl9BQ1RJVkV9CiAKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKIC8qIERJU0NfQ0xPU0VfVE9VVF9FVlQgKi8gICAse0JUQV9ETV9TRUFSQ0hfSUdOT1JFLCAgICAgICAgICAgICBCVEFfRE1fU0VBUkNIX0lHTk9SRSwgICAgICAgICAgQlRBX0RNX0RJU0NPVkVSX0FDVElWRX0KICNlbmRpZgogfTsKIAotdHlwZWRlZiBjb25zdCBVSU5UOCAoKnRCVEFfRE1fU1RfVEJMKVtCVEFfRE1fU0VBUkNIX05VTV9DT0xTXTsKK3R5cGVkZWYgY29uc3QgdWludDhfdCAoKnRCVEFfRE1fU1RfVEJMKVtCVEFfRE1fU0VBUkNIX05VTV9DT0xTXTsKIAogLyogc3RhdGUgdGFibGUgKi8KIGNvbnN0IHRCVEFfRE1fU1RfVEJMIGJ0YV9kbV9zZWFyY2hfc3RfdGJsW10gPSB7CkBAIC0yOTgsOSArMjk4LDkgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9kbV9zbV9leGVjdXRlKEJUX0hEUiAqcF9tc2cpCitib29sIGJ0YV9kbV9zbV9leGVjdXRlKEJUX0hEUiAqcF9tc2cpCiB7Ci0gICAgVUlOVDE2ICBldmVudCA9IHBfbXNnLT5ldmVudCAmIDB4MDBmZjsKKyAgICB1aW50MTZfdCAgZXZlbnQgPSBwX21zZy0+ZXZlbnQgJiAweDAwZmY7CiAKICAgICBBUFBMX1RSQUNFX0VWRU5UKCJidGFfZG1fc21fZXhlY3V0ZSBldmVudDoweCV4IiwgZXZlbnQpOwogCkBAIC0zMTAsNyArMzEwLDcgQEAKICAgICAgICAgKCpidGFfZG1fYWN0aW9uW2V2ZW50XSkoICh0QlRBX0RNX01TRyopIHBfbXNnKTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM0MCwxMCArMzQwLDEwIEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfZG1fc2VhcmNoX3NtX2V4ZWN1dGUoQlRfSERSICpwX21zZykKK2Jvb2wgYnRhX2RtX3NlYXJjaF9zbV9leGVjdXRlKEJUX0hEUiAqcF9tc2cpCiB7CiAgICAgdEJUQV9ETV9TVF9UQkwgICAgICBzdGF0ZV90YWJsZTsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGFjdGlvbjsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgYWN0aW9uOwogICAgIGludCAgICAgICAgICAgICAgICAgaTsKIAogICAgIEFQUExfVFJBQ0VfRVZFTlQoImJ0YV9kbV9zZWFyY2hfc21fZXhlY3V0ZSBzdGF0ZTolZCwgZXZlbnQ6MHgleCIsCkBAIC0zNjcsNiArMzY3LDYgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9idGEvZG0vYnRhX2RtX3BtLmNjIGIvYnRhL2RtL2J0YV9kbV9wbS5jYwppbmRleCBkYmM1NmVkLi43ZDU1ZmExIDEwMDY0NAotLS0gYS9idGEvZG0vYnRhX2RtX3BtLmNjCisrKyBiL2J0YS9kbS9idGFfZG1fcG0uY2MKQEAgLTM1LDIyICszNSwyMiBAQAogCiBleHRlcm4gZml4ZWRfcXVldWVfdCAqYnR1X2J0YV9hbGFybV9xdWV1ZTsKIAotc3RhdGljIHZvaWQgYnRhX2RtX3BtX2NiYWNrKHRCVEFfU1lTX0NPTk5fU1RBVFVTIHN0YXR1cywgVUlOVDggaWQsIFVJTlQ4IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpOworc3RhdGljIHZvaWQgYnRhX2RtX3BtX2NiYWNrKHRCVEFfU1lTX0NPTk5fU1RBVFVTIHN0YXR1cywgdWludDhfdCBpZCwgdWludDhfdCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKTsKIHN0YXRpYyB2b2lkIGJ0YV9kbV9wbV9zZXRfbW9kZShCRF9BRERSIHBlZXJfYWRkciwgdEJUQV9ETV9QTV9BQ1RJT04gcG1fbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX1BNX1JFUSBwbV9yZXEpOwogc3RhdGljIHZvaWQgYnRhX2RtX3BtX3RpbWVyX2NiYWNrKHZvaWQgKmRhdGEpOwotc3RhdGljIHZvaWQgYnRhX2RtX3BtX2J0bV9jYmFjayhCRF9BRERSIGJkX2FkZHIsIHRCVE1fUE1fU1RBVFVTIHN0YXR1cywgVUlOVDE2IHZhbHVlLCBVSU5UOCBoY2lfc3RhdHVzKTsKLXN0YXRpYyBCT09MRUFOIGJ0YV9kbV9wbV9wYXJrKEJEX0FERFIgcGVlcl9hZGRyKTsKLXN0YXRpYyBCT09MRUFOIGJ0YV9kbV9wbV9zbmlmZih0QlRBX0RNX1BFRVJfREVWSUNFICpwX3BlZXJfZGV2LCBVSU5UOCBpbmRleCk7Ci1zdGF0aWMgQk9PTEVBTiBidGFfZG1fcG1faXNfc2NvX2FjdGl2ZSAoKTsKK3N0YXRpYyB2b2lkIGJ0YV9kbV9wbV9idG1fY2JhY2soQkRfQUREUiBiZF9hZGRyLCB0QlRNX1BNX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IHZhbHVlLCB1aW50OF90IGhjaV9zdGF0dXMpOworc3RhdGljIGJvb2wgYnRhX2RtX3BtX3BhcmsoQkRfQUREUiBwZWVyX2FkZHIpOworc3RhdGljIGJvb2wgYnRhX2RtX3BtX3NuaWZmKHRCVEFfRE1fUEVFUl9ERVZJQ0UgKnBfcGVlcl9kZXYsIHVpbnQ4X3QgaW5kZXgpOworc3RhdGljIGJvb2wgYnRhX2RtX3BtX2lzX3Njb19hY3RpdmUgKCk7CiBzdGF0aWMgaW50IGJ0YV9kbV9nZXRfc2NvX2luZGV4KCk7Ci1zdGF0aWMgdm9pZCBidGFfZG1fcG1faGlkX2NoZWNrKEJPT0xFQU4gYlNjb0FjdGl2ZSk7Ci1zdGF0aWMgdm9pZCBidGFfZG1fcG1fc2V0X3NuaWZmX3BvbGljeSh0QlRBX0RNX1BFRVJfREVWSUNFICpwX2RldiwgQk9PTEVBTiBiRGlzYWJsZSk7CitzdGF0aWMgdm9pZCBidGFfZG1fcG1faGlkX2NoZWNrKGJvb2wgYlNjb0FjdGl2ZSk7CitzdGF0aWMgdm9pZCBidGFfZG1fcG1fc2V0X3NuaWZmX3BvbGljeSh0QlRBX0RNX1BFRVJfREVWSUNFICpwX2RldiwgYm9vbCBiRGlzYWJsZSk7CiBzdGF0aWMgdm9pZCBidGFfZG1fcG1fc3RvcF90aW1lcl9ieV9pbmRleCh0QlRBX1BNX1RJTUVSICpwX3RpbWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggdGltZXJfaWR4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdGltZXJfaWR4KTsKIAogI2lmIChCVE1fU1NSX0lOQ0xVREVEID09IFRSVUUpCi0jaWYgKGRlZmluZWQgQlRBX0hIX0lOQ0xVREVEICYmIEJUQV9ISF9JTkNMVURFRCA9PSBUUlVFKQorI2lmIChCVEFfSEhfSU5DTFVERUQgPT0gVFJVRSkKICNpbmNsdWRlICIuLi9oaC9idGFfaGhfaW50LmgiCiAvKiBCVEFfRE1fUE1fU1NSMSB3aWxsIGJlIGRlZGljYXRlZCBmb3IgSEggU1NSIHNldHRpbmcgZW50cnksIG5vIG90aGVyIHByb2ZpbGUgY2FuIHVzZSBpdCAqLwogI2RlZmluZSBCVEFfRE1fUE1fU1NSX0hIICAgICAgQlRBX0RNX1BNX1NTUjEKQEAgLTEzNCw5ICsxMzQsOSBAQAogKiogUmV0dXJucyAgICAgICAgICBudW1iZXIgb2YgYXYgY29ubmVjdGlvbnMKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVUlOVDggYnRhX2RtX2dldF9hdl9jb3VudCh2b2lkKQordWludDhfdCBidGFfZG1fZ2V0X2F2X2NvdW50KHZvaWQpCiB7Ci0gICAgVUlOVDggY291bnQgPSAwOworICAgIHVpbnQ4X3QgY291bnQgPSAwOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnRhX2RtX2Nvbm5fc3J2Y3MuY291bnQ7IGkrKykKICAgICB7CiAgICAgICAgIGlmIChidGFfZG1fY29ubl9zcnZjcy5jb25uX3NydmNbaV0uaWQgPT0gQlRBX0lEX0FWKQpAQCAtMTkyLDcgKzE5Miw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIGluZGV4IG9mIHRoZSBwb3dlciBtb2RlIGRlbGF5IHRpbWVyCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBVSU5UOCBidGFfcG1fYWN0aW9uX3RvX3RpbWVyX2lkeChVSU5UOCBwbV9hY3Rpb24pCitzdGF0aWMgdWludDhfdCBidGFfcG1fYWN0aW9uX3RvX3RpbWVyX2lkeCh1aW50OF90IHBtX2FjdGlvbikKIHsKICAgICBpZiAocG1fYWN0aW9uID09IEJUQV9ETV9QTV9TVVNQRU5EKQogICAgICAgICByZXR1cm4gQlRBX0RNX1BNX1NVU1BFTkRfVElNRVJfSURYOwpAQCAtMjE1LDkgKzIxNSw5IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2RtX3BtX3N0b3BfdGltZXJfYnlfbW9kZShCRF9BRERSIHBlZXJfYWRkciwgVUlOVDggcG93ZXJfbW9kZSkKK3N0YXRpYyB2b2lkIGJ0YV9kbV9wbV9zdG9wX3RpbWVyX2J5X21vZGUoQkRfQUREUiBwZWVyX2FkZHIsIHVpbnQ4X3QgcG93ZXJfbW9kZSkKIHsKLSAgICBjb25zdCBVSU5UOCB0aW1lcl9pZHggPSBidGFfcG1fYWN0aW9uX3RvX3RpbWVyX2lkeChwb3dlcl9tb2RlKTsKKyAgICBjb25zdCB1aW50OF90IHRpbWVyX2lkeCA9IGJ0YV9wbV9hY3Rpb25fdG9fdGltZXJfaWR4KHBvd2VyX21vZGUpOwogICAgIGlmICh0aW1lcl9pZHggPT0gQlRBX0RNX1BNX01PREVfVElNRVJfTUFYKQogICAgICAgICByZXR1cm47CiAKQEAgLTI1MSw3ICsyNTEsNyBAQAogKiogUmV0dXJucyAgICAgICAgICBpbmRleCBvZiB0aGUgcG93ZXIgbW9kZSBkZWxheSB0aW1lcgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZG1fcG1fc3RvcF90aW1lcl9ieV9zcnZjX2lkKEJEX0FERFIgcGVlcl9hZGRyLCBVSU5UOCBzcnZjX2lkKQorc3RhdGljIHZvaWQgYnRhX2RtX3BtX3N0b3BfdGltZXJfYnlfc3J2Y19pZChCRF9BRERSIHBlZXJfYWRkciwgdWludDhfdCBzcnZjX2lkKQogewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQlRBX0RNX05VTV9QTV9USU1FUjsgaSsrKQogICAgIHsKQEAgLTI4MCwxMSArMjgwLDExIEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2RtX3BtX3N0YXJ0X3RpbWVyKHRCVEFfUE1fVElNRVIgKnBfdGltZXIsIFVJTlQ4IHRpbWVyX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2RfbXNfdCB0aW1lb3V0X21zLCBVSU5UOCBzcnZjX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4IHBtX2FjdGlvbikKK3N0YXRpYyB2b2lkIGJ0YV9kbV9wbV9zdGFydF90aW1lcih0QlRBX1BNX1RJTUVSICpwX3RpbWVyLCB1aW50OF90IHRpbWVyX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2RfbXNfdCB0aW1lb3V0X21zLCB1aW50OF90IHNydmNfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwbV9hY3Rpb24pCiB7Ci0gICAgcF90aW1lci0+aW5fdXNlID0gVFJVRTsKKyAgICBwX3RpbWVyLT5pbl91c2UgPSB0cnVlOwogCiAgICAgaWYgKHBfdGltZXItPnNydmNfaWRbdGltZXJfaWR4XSA9PSBCVEFfSURfTUFYKQogICAgICAgICBwX3RpbWVyLT5hY3RpdmUrKzsKQEAgLTMxMCw3ICszMTAsNyBAQAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZCBidGFfZG1fcG1fc3RvcF90aW1lcl9ieV9pbmRleCh0QlRBX1BNX1RJTUVSICpwX3RpbWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggdGltZXJfaWR4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB0aW1lcl9pZHgpCiB7CiAgICAgaWYgKChwX3RpbWVyID09IE5VTEwpIHx8ICh0aW1lcl9pZHggPj0gQlRBX0RNX1BNX01PREVfVElNRVJfTUFYKSkKICAgICAgICAgcmV0dXJuOwpAQCAtMzI2LDcgKzMyNiw3IEBACiAKICAgICBwX3RpbWVyLT5hY3RpdmUtLTsKICAgICBpZiAocF90aW1lci0+YWN0aXZlID09IDApCi0gICAgICAgIHBfdGltZXItPmluX3VzZSA9IEZBTFNFOworICAgICAgICBwX3RpbWVyLT5pbl91c2UgPSBmYWxzZTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTMzOSwxMSArMzM5LDExIEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2RtX3BtX2NiYWNrKHRCVEFfU1lTX0NPTk5fU1RBVFVTIHN0YXR1cywgVUlOVDggaWQsIFVJTlQ4IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpCitzdGF0aWMgdm9pZCBidGFfZG1fcG1fY2JhY2sodEJUQV9TWVNfQ09OTl9TVEFUVVMgc3RhdHVzLCB1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpCiB7CiAKLSAgICBVSU5UOCBpLGo7Ci0gICAgVUlOVDggKnAgPSBOVUxMOworICAgIHVpbnQ4X3QgaSxqOworICAgIHVpbnQ4X3QgKnAgPSBOVUxMOwogICAgIHRCVEFfRE1fUEVFUl9ERVZJQ0UgKnBfZGV2OwogICAgIHRCVEFfRE1fUE1fUkVRICBwbV9yZXEgPSBCVEFfRE1fUE1fTkVXX1JFUTsKIApAQCAtMzk2LDcgKzM5Niw3IEBACiAgICAgICAgICAgICAmJiAoYnRhX2RtX2Nvbm5fc3J2Y3MuY29ubl9zcnZjW2pdLmFwcF9pZCA9PSBhcHBfaWQgKQogICAgICAgICAgICAgJiYgIWJkY21wKGJ0YV9kbV9jb25uX3NydmNzLmNvbm5fc3J2Y1tqXS5wZWVyX2JkYWRkciwgcGVlcl9hZGRyKSkKICAgICAgICAgewotICAgICAgICAgICAgYnRhX2RtX2Nvbm5fc3J2Y3MuY29ubl9zcnZjW2pdLm5ld19yZXF1ZXN0ID0gVFJVRTsKKyAgICAgICAgICAgIGJ0YV9kbV9jb25uX3NydmNzLmNvbm5fc3J2Y1tqXS5uZXdfcmVxdWVzdCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC00MzUsNyArNDM1LDcgQEAKICAgICAgICAgLyogZmlsbCBpbiBhIG5ldyBjYiAqLwogICAgICAgICBidGFfZG1fY29ubl9zcnZjcy5jb25uX3NydmNbal0uaWQgPSBpZDsKICAgICAgICAgYnRhX2RtX2Nvbm5fc3J2Y3MuY29ubl9zcnZjW2pdLmFwcF9pZCA9IGFwcF9pZDsKLSAgICAgICAgYnRhX2RtX2Nvbm5fc3J2Y3MuY29ubl9zcnZjW2pdLm5ld19yZXF1ZXN0ID0gVFJVRTsKKyAgICAgICAgYnRhX2RtX2Nvbm5fc3J2Y3MuY29ubl9zcnZjW2pdLm5ld19yZXF1ZXN0ID0gdHJ1ZTsKICAgICAgICAgYmRjcHkoYnRhX2RtX2Nvbm5fc3J2Y3MuY29ubl9zcnZjW2pdLnBlZXJfYmRhZGRyLCBwZWVyX2FkZHIpOwogCiAgICAgICAgIEFQUExfVFJBQ0VfV0FSTklORygibmV3IGNvbm5fc3J2YyBpZDolZCwgYXBwX2lkOiVkIiwgaWQsIGFwcF9pZCk7CkBAIC00NjUsNyArNDY1LDcgQEAKIAogI2lmIChCVE1fU1NSX0lOQ0xVREVEID09IFRSVUUpCiAgICAgaWYocF9idGFfZG1fc3NyX3NwZWNbaW5kZXhdLm1heF9sYXQKLSNpZiAoZGVmaW5lZCBCVEFfSEhfSU5DTFVERUQgJiYgQlRBX0hIX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9ISF9JTkNMVURFRCA9PSBUUlVFKQogICAgICAgIHx8IGluZGV4ID09IEJUQV9ETV9QTV9TU1JfSEgKICNlbmRpZgogICAgICAgICkKQEAgLTUwMyw5ICs1MDMsOSBAQAogICAgICAgICAgKCAoKHN0YXR1cyA9PSBCVEFfU1lTX1NDT19PUEVOKSB8fCAoc3RhdHVzID09IEJUQV9TWVNfU0NPX0NMT1NFKSkgfHwKICAgICAgICAgICAgKChzdGF0dXMgPT0gQlRBX1NZU19DT05OX09QRU4pICYmIChpZCA9PSBCVEFfSURfSEgpICYmIGJ0YV9kbV9wbV9pc19zY29fYWN0aXZlKCkpICkgKQogICAgIHsKLSAgICAgICAgQk9PTEVBTiBiU2NvQWN0aXZlOworICAgICAgICBib29sIGJTY29BY3RpdmU7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gQlRBX1NZU19DT05OX09QRU4pCi0gICAgICAgICAgICBiU2NvQWN0aXZlID0gVFJVRTsKKyAgICAgICAgICAgIGJTY29BY3RpdmUgPSB0cnVlOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBiU2NvQWN0aXZlID0gKHN0YXR1cyA9PSBCVEFfU1lTX1NDT19PUEVOKTsKIApAQCAtNTMyLDcgKzUzMiw3IEBACiAKICAgICB0QlRBX0RNX1BNX0FDVElPTiAgIHBtX2FjdGlvbiA9IEJUQV9ETV9QTV9OT19BQ1RJT047CiAgICAgcGVyaW9kX21zX3QgICAgICAgICB0aW1lb3V0X21zID0gMDsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGksajsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgaSxqOwogICAgIHRCVEFfRE1fUE1fQUNUSU9OICAgZmFpbGVkX3BtID0gMDsKICAgICB0QlRBX0RNX1BFRVJfREVWSUNFICpwX3BlZXJfZGV2aWNlID0gTlVMTDsKICAgICB0QlRBX0RNX1BNX0FDVElPTiAgICBhbGxvd2VkX21vZGVzID0gMDsKQEAgLTU0MSw4ICs1NDEsOCBAQAogICAgIHRCVEFfRE1fUE1fU1BFQyAgICAgKnBfcG1fc3BlYzsKICAgICB0QlRBX0RNX1BNX0FDVE4gICAgICpwX2FjdDAsICpwX2FjdDE7CiAgICAgdEJUQV9ETV9TUlZDUyAgICAgICAqcF9zcnZjcyA9IE5VTEw7Ci0gICAgQk9PTEVBTiB0aW1lcl9zdGFydGVkID0gRkFMU0U7Ci0gICAgVUlOVDggICB0aW1lcl9pZHgsIGF2YWlsYWJsZV90aW1lciA9IEJUQV9ETV9QTV9NT0RFX1RJTUVSX01BWDsKKyAgICBib29sIHRpbWVyX3N0YXJ0ZWQgPSBmYWxzZTsKKyAgICB1aW50OF90ICAgdGltZXJfaWR4LCBhdmFpbGFibGVfdGltZXIgPSBCVEFfRE1fUE1fTU9ERV9USU1FUl9NQVg7CiAgICAgcGVyaW9kX21zX3QgIHJlbWFpbmluZ19tcyA9IDA7CiAKICAgICBpZighYnRhX2RtX2NiLmRldmljZV9saXN0LmNvdW50KQpAQCAtNTkzLDcgKzU5Myw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKHBtX3JlcSAhPSBCVEFfRE1fUE1fTkVXX1JFUSB8fCBwX3NydmNzLT5uZXdfcmVxdWVzdCkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcF9zcnZjcy0+bmV3X3JlcXVlc3QgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfc3J2Y3MtPm5ld19yZXF1ZXN0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21zID0gIHBfYWN0MC0+dGltZW91dDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTY1NSw3ICs2NTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyX2lkeCwgdGltZW91dF9tcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NydmNzLT5pZCwgcG1fYWN0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0aW1lcl9zdGFydGVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgdGltZXJfc3RhcnRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNjc4LDcgKzY3OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJ0YV9kbV9wbV9zdGFydF90aW1lcigmYnRhX2RtX2NiLnBtX3RpbWVyW2F2YWlsYWJsZV90aW1lcl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcl9pZHgsIHRpbWVvdXRfbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NydmNzLT5pZCwgcG1fYWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgdGltZXJfc3RhcnRlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHRpbWVyX3N0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8qIG5vIG1vcmUgdGltZXJzICovCkBAIC03MDcsNyArNzA3LDcgQEAKICAgICAgICAgaWYgKHBfcGVlcl9kZXZpY2UtPmxpbmtfcG9saWN5ICYgSENJX0VOQUJMRV9TTklGRl9NT0RFKQogICAgICAgICB7CiAgICAgICAgICAgICBwX3BlZXJfZGV2aWNlLT5wbV9tb2RlX2F0dGVtcHRlZCA9IEJUQV9ETV9QTV9TTklGRjsKLSAgICAgICAgICAgIGJ0YV9kbV9wbV9zbmlmZihwX3BlZXJfZGV2aWNlLCAoVUlOVDgpKHBtX2FjdGlvbiAmIDB4MEYpICk7CisgICAgICAgICAgICBidGFfZG1fcG1fc25pZmYocF9wZWVyX2RldmljZSwgKHVpbnQ4X3QpKHBtX2FjdGlvbiAmIDB4MEYpICk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CkBAIC03MjYsMTAgKzcyNiwxMCBAQAogKiogRGVzY3JpcHRpb24gICAgICBTd2l0Y2ggdG8gcGFyayBtb2RlLgogKioKICoqCi0qKiBSZXR1cm5zICAgICAgICAgIFRSVUUgaWYgcGFyayBhdHRlbXB0ZWQsIEZBTFNFIG90aGVyd2lzZS4KKyoqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBwYXJrIGF0dGVtcHRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgQk9PTEVBTiBidGFfZG1fcG1fcGFyayhCRF9BRERSIHBlZXJfYWRkcikKK3N0YXRpYyBib29sIGJ0YV9kbV9wbV9wYXJrKEJEX0FERFIgcGVlcl9hZGRyKQogewogCiAgICAgdEJUTV9QTV9NT0RFICAgIG1vZGUgPSBCVE1fUE1fU1RTX0FDVElWRTsKQEAgLTc0MSw3ICs3NDEsNyBAQAogICAgIHsKICAgICAgICAgQlRNX1NldFBvd2VyTW9kZSAoYnRhX2RtX2NiLnBtX2lkLCBwZWVyX2FkZHIsICZwX2J0YV9kbV9wbV9tZFtCVEFfRE1fUE1fUEFSS19JRFhdKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiAKIH0KIApAQCAtNzUyLDE2ICs3NTIsMTYgQEAKICoqIERlc2NyaXB0aW9uICAgICAgU3dpdGNoIHRvIHNuaWZmIG1vZGUuCiAqKgogKioKLSoqIFJldHVybnMgICAgICAgICAgVFJVRSBpZiBzbmlmZiBhdHRlbXB0ZWQsIEZBTFNFIG90aGVyd2lzZS4KKyoqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzbmlmZiBhdHRlbXB0ZWQsIGZhbHNlIG90aGVyd2lzZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIEJPT0xFQU4gYnRhX2RtX3BtX3NuaWZmKHRCVEFfRE1fUEVFUl9ERVZJQ0UgKnBfcGVlcl9kZXYsIFVJTlQ4IGluZGV4KQorc3RhdGljIGJvb2wgYnRhX2RtX3BtX3NuaWZmKHRCVEFfRE1fUEVFUl9ERVZJQ0UgKnBfcGVlcl9kZXYsIHVpbnQ4X3QgaW5kZXgpCiB7CiAgICAgdEJUTV9QTV9NT0RFICAgIG1vZGUgPSBCVE1fUE1fU1RTX0FDVElWRTsKICAgICB0QlRNX1BNX1BXUl9NRCAgcHdyX21kOwogICAgIHRCVE1fU1RBVFVTICAgICBzdGF0dXM7CiAjaWYgKEJUTV9TU1JfSU5DTFVERUQgPT0gVFJVRSkKLSAgICBVSU5UOCAqcF9yZW1fZmVhdCA9IE5VTEw7CisgICAgdWludDhfdCAqcF9yZW1fZmVhdCA9IE5VTEw7CiAjZW5kaWYKIAogICAgIEJUTV9SZWFkUG93ZXJNb2RlKHBfcGVlcl9kZXYtPnBlZXJfYmRhZGRyLCAmbW9kZSk7CkBAIC03ODUsNyArNzg1LDcgQEAKICAgICAgICAgaWYgKChtb2RlID09IEJUTV9QTV9NRF9TTklGRikgJiYgKHBfcGVlcl9kZXYtPmluZm8gJiBCVEFfRE1fRElfQUNQX1NOSUZGKSkKICAgICAgICAgewogICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGFscmVhZHkgaW4gcmVtb3RlIGluaXRpYXRlIHNuaWZmIiwgX19mdW5jX18pOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogI2VuZGlmCiAgICAgICAgIC8qIGlmIHRoZSBjdXJyZW50IG1vZGUgaXMgbm90IHNuaWZmLCBpc3N1ZSB0aGUgc25pZmYgY29tbWFuZC4KQEAgLTgxMiw3ICs4MTIsNyBAQAogICAgICAgICAgICAgcF9wZWVyX2Rldi0+aW5mbyAmPSB+KEJUQV9ETV9ESV9JTlRfU05JRkZ8QlRBX0RNX0RJX0FDUF9TTklGRnxCVEFfRE1fRElfU0VUX1NOSUZGKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIAogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTgyOCw3ICs4MjgsNyBAQAogc3RhdGljIHZvaWQgYnRhX2RtX3BtX3NzcihCRF9BRERSIHBlZXJfYWRkcikKIHsKICAgICB0QlRBX0RNX1NTUl9TUEVDICpwX3NwZWMsICpwX3NwZWNfY3VyOwotICAgIFVJTlQ4ICAgaSxqOworICAgIHVpbnQ4X3QgICBpLGo7CiAgICAgaW50ICAgICBzc3IgPSBCVEFfRE1fUE1fU1NSMDsKIAogICAgIC8qIGdvIHRocm91Z2ggdGhlIGNvbm5lY3RlZCBzZXJ2aWNlcyAqLwpAQCAtODU0LDcgKzg1NCw3IEBACiAgICAgICAgICAgICBwX3NwZWNfY3VyID0gJnBfYnRhX2RtX3Nzcl9zcGVjW3BfYnRhX2RtX3BtX3NwZWNbcF9idGFfZG1fcG1fY2ZnW2pdLnNwZWNfaWR4XS5zc3JdOwogICAgICAgICAgICAgcF9zcGVjID0gJnBfYnRhX2RtX3Nzcl9zcGVjW3Nzcl07CiAKLSNpZiAoZGVmaW5lZCBCVEFfSEhfSU5DTFVERUQgJiYgQlRBX0hIX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9ISF9JTkNMVURFRCA9PSBUUlVFKQogICAgICAgICAgICAgLyogSEggaGFzIHRoZSBwZXIgY29ubmVjdGlvbiBTU1IgcHJlZmVyZW5jZSwgYWxyZWFkeSByZWFkIHRoZSBTU1IgcGFyYW1zIGZyb20gQlRBIEhIICovCiAgICAgICAgICAgICBpZiAocF9idGFfZG1fcG1fc3BlY1twX2J0YV9kbV9wbV9jZmdbal0uc3BlY19pZHhdLnNzciA9PSBCVEFfRE1fUE1fU1NSX0hIKQogICAgICAgICAgICAgewpAQCAtOTMwLDcgKzkzMCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2RtX3BtX2J0bV9jYmFjayhCRF9BRERSIGJkX2FkZHIsIHRCVE1fUE1fU1RBVFVTIHN0YXR1cywgVUlOVDE2IHZhbHVlLCBVSU5UOCBoY2lfc3RhdHVzKQorc3RhdGljIHZvaWQgYnRhX2RtX3BtX2J0bV9jYmFjayhCRF9BRERSIGJkX2FkZHIsIHRCVE1fUE1fU1RBVFVTIHN0YXR1cywgdWludDE2X3QgdmFsdWUsIHVpbnQ4X3QgaGNpX3N0YXR1cykKIHsKICAgICB0QlRBX0RNX1BNX0JUTV9TVEFUVVMgKnBfYnVmID0KICAgICAgICAgKHRCVEFfRE1fUE1fQlRNX1NUQVRVUyAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfRE1fUE1fQlRNX1NUQVRVUykpOwpAQCAtOTU2LDcgKzk1Niw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgYnRhX2RtX3BtX3RpbWVyX2NiYWNrKHZvaWQgKmRhdGEpCiB7Ci0gICAgVUlOVDggaSwgajsKKyAgICB1aW50OF90IGksIGo7CiAgICAgYWxhcm1fdCAqYWxhcm0gPSAoYWxhcm1fdCAqKWRhdGE7CiAKICAgICBmb3IgKGk9MDsgaTxCVEFfRE1fTlVNX1BNX1RJTUVSOyBpKyspCkBAIC05NzUsNyArOTc1LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYnRhX2RtX2NiLnBtX3RpbWVyW2ldLmFjdGl2ZSA9PSAwKQotICAgICAgICAgICAgICAgIGJ0YV9kbV9jYi5wbV90aW1lcltpXS5pbl91c2UgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBidGFfZG1fY2IucG1fdGltZXJbaV0uaW5fdXNlID0gZmFsc2U7CiAgICAgICAgICAgICBpZiAoaiA8IEJUQV9ETV9QTV9NT0RFX1RJTUVSX01BWCkKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTE0NSwyMCArMTE0NSwyMCBAQAogKioKICoqIERlc2NyaXB0aW9uICAgICAgTG9vcCB0aHJvdWdoIGNvbm5lY3RlZCBzZXJ2aWNlcyBmb3IgSEZQK1N0YXRlPVNDTwogKioKLSoqIFJldHVybnMgICAgICAgICAgQk9PTEVBTi4gVFJVRSBpZiBTQ08gYWN0aXZlLCBlbHNlIEZBTFNFCisqKiBSZXR1cm5zICAgICAgICAgIGJvb2wuIHRydWUgaWYgU0NPIGFjdGl2ZSwgZWxzZSBmYWxzZQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgQk9PTEVBTiBidGFfZG1fcG1faXNfc2NvX2FjdGl2ZSAoKQorc3RhdGljIGJvb2wgYnRhX2RtX3BtX2lzX3Njb19hY3RpdmUgKCkKIHsKICAgICBpbnQgajsKLSAgICBCT09MRUFOIGJTY29BY3RpdmUgPSBGQUxTRTsKKyAgICBib29sIGJTY29BY3RpdmUgPSBmYWxzZTsKIAogICAgIGZvcihqPTA7IGo8YnRhX2RtX2Nvbm5fc3J2Y3MuY291bnQgOyBqKyspCiAgICAgewogICAgICAgICAvKiBjaGVjayBpZiBhbiBlbnRyeSBhbHJlYWR5IHByZXNlbnQgKi8KICAgICAgICAgaWYgKCAoYnRhX2RtX2Nvbm5fc3J2Y3MuY29ubl9zcnZjW2pdLmlkID09IEJUQV9JRF9BRyApICAmJiAoYnRhX2RtX2Nvbm5fc3J2Y3MuY29ubl9zcnZjW2pdLnN0YXRlID09IEJUQV9TWVNfU0NPX09QRU4pICkKICAgICAgICAgewotICAgICAgICAgICAgYlNjb0FjdGl2ZSA9IFRSVUU7CisgICAgICAgICAgICBiU2NvQWN0aXZlID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtMTIwMCw3ICsxMjAwLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgTm9uZQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZG1fcG1faGlkX2NoZWNrKEJPT0xFQU4gYlNjb0FjdGl2ZSkKK3N0YXRpYyB2b2lkIGJ0YV9kbV9wbV9oaWRfY2hlY2soYm9vbCBiU2NvQWN0aXZlKQogewogICAgIGludCBqOwogCkBAIC0xMjMyLDkgKzEyMzIsOSBAQAogKiogUmV0dXJucyAgICAgICAgICBOb25lCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9kbV9wbV9zZXRfc25pZmZfcG9saWN5KHRCVEFfRE1fUEVFUl9ERVZJQ0UgKnBfZGV2LCBCT09MRUFOIGJEaXNhYmxlKQorc3RhdGljIHZvaWQgYnRhX2RtX3BtX3NldF9zbmlmZl9wb2xpY3kodEJUQV9ETV9QRUVSX0RFVklDRSAqcF9kZXYsIGJvb2wgYkRpc2FibGUpCiB7Ci0gICAgVUlOVDE2IHBvbGljeV9zZXR0aW5nOworICAgIHVpbnQxNl90IHBvbGljeV9zZXR0aW5nOwogCiAgICAgaWYgKCFwX2RldikKICAgICAgICAgcmV0dXJuOwpAQCAtMTI2Myw3ICsxMjYzLDcgQEAKIAogfQogCi0jaWYgKChkZWZpbmVkIEJMRV9JTkNMVURFRCkgJiYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKSkKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUpCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKICoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX3BtX29idGFpbl9jb250cm9sbGVyX3N0YXRlCmRpZmYgLS1naXQgYS9idGEvZG0vYnRhX2RtX3Njby5jYyBiL2J0YS9kbS9idGFfZG1fc2NvLmNjCmluZGV4IDEwOTE0MGEuLjk5ZjFlNWMgMTAwNjQ0Ci0tLSBhL2J0YS9kbS9idGFfZG1fc2NvLmNjCisrKyBiL2J0YS9kbS9idGFfZG1fc2NvLmNjCkBAIC0zMiw3ICszMiw3IEBACiAjaWYgKEJUTV9TQ09fSENJX0lOQ0xVREVEID09IFRSVUUpCiAKICNpZm5kZWYgQlRBX0RNX1NDT19ERUJVRwotI2RlZmluZSBCVEFfRE1fU0NPX0RFQlVHICAgIEZBTFNFCisjZGVmaW5lIEJUQV9ETV9TQ09fREVCVUcgICAgZmFsc2UKICNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKiAgQ29uc3RhbnRzCkBAIC00OCwyNCArNDgsMjQgQEAKICoqICBEYXRhIHR5cGVzIGZvciBQQ00gUmVzYW1wbGluZyB1dGlsaXR5CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdHlwZWRlZiBJTlQzMiAgICgqUENPTlZFUlRfVE9fQlRfRklMVEVSRUQpICAoVUlOVDggKnBTcmMsIHZvaWQgKnBEc3QsIFVJTlQzMiBkd1NyY1NhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBkd1NyY1NwcyxJTlQzMiAqcExhc3RDdXJQb3MsIFVJTlQ4ICpwT3ZlcmxhcEFyZWEpOwotdHlwZWRlZiBJTlQzMiAgICgqUENPTlZFUlRfVE9fQlRfTk9GSUxURVIpICAodm9pZCAqcFNyYywgdm9pZCAqcERzdCwgVUlOVDMyIGR3U3JjU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBkd1NyY1Nwcyk7Cit0eXBlZGVmIGludDMyX3QgICAoKlBDT05WRVJUX1RPX0JUX0ZJTFRFUkVEKSAgKHVpbnQ4X3QgKnBTcmMsIHZvaWQgKnBEc3QsIHVpbnQzMl90IGR3U3JjU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTcmNTcHMsaW50MzJfdCAqcExhc3RDdXJQb3MsIHVpbnQ4X3QgKnBPdmVybGFwQXJlYSk7Cit0eXBlZGVmIGludDMyX3QgICAoKlBDT05WRVJUX1RPX0JUX05PRklMVEVSKSAgKHZvaWQgKnBTcmMsIHZvaWQgKnBEc3QsIHVpbnQzMl90IGR3U3JjU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3JjU3BzKTsKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBvdmVybGFwX2FyZWFbQlRBX0RNX1BDTV9PVkVSTEFQX1NJWkUgKiA0XTsKLSAgICBVSU5UMzIgICAgICAgICAgICAgIGN1cl9wb3M7ICAgIC8qIGN1cnJlbnQgcG9zaXRpb24gKi8KLSAgICBVSU5UMzIgICAgICAgICAgICAgIHNyY19zcHM7ICAgIC8qIHNhbXBsZXMgcGVyIHNlY29uZCAoc291cmNlIGF1ZGlvIGRhdGEpICovCisgICAgdWludDhfdCAgICAgICAgICAgICAgIG92ZXJsYXBfYXJlYVtCVEFfRE1fUENNX09WRVJMQVBfU0laRSAqIDRdOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBjdXJfcG9zOyAgICAvKiBjdXJyZW50IHBvc2l0aW9uICovCisgICAgdWludDMyX3QgICAgICAgICAgICAgIHNyY19zcHM7ICAgIC8qIHNhbXBsZXMgcGVyIHNlY29uZCAoc291cmNlIGF1ZGlvIGRhdGEpICovCiAgICAgUENPTlZFUlRfVE9fQlRfRklMVEVSRUQgICAgIGZpbHRlcjsgICAgLyogdGhlIGFjdGlvbiBmdW5jdGlvbiB0byBkbyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gNDQxMDAsIDIyMDUwLCAxMTAyNSovCiAgICAgUENPTlZFUlRfVE9fQlRfTk9GSUxURVIgICAgIG5vZmlsdGVyOyAgICAvKiB0aGUgYWN0aW9uIGZ1bmN0aW9uIHRvIGRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbnZlcnNpb24gNDgwMDAsIDMyMDAwLCAxNjAwMCovCi0gICAgVUlOVDMyICAgICAgICAgICAgICBiaXRzOyAgICAgICAvKiBudW1iZXIgb2YgYml0cyBwZXIgcGNtIHNhbXBsZSAqLwotICAgIFVJTlQzMiAgICAgICAgICAgICAgbl9jaGFubmVsczsgLyogbnVtYmVyIG9mIGNoYW5uZWxzIChpLmUuIG1vbm8oMSksIHN0ZXJlbygyKS4uLikgKi8KLSAgICBVSU5UMzIgICAgICAgICAgICAgIHNhbXBsZV9zaXplOwotICAgIFVJTlQzMiAgICAgICAgICAgICAgY2FuX2JlX2ZpbHRlcmVkOwotICAgIFVJTlQzMgkgICAgICAgICAgICBkaXZpc29yOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBiaXRzOyAgICAgICAvKiBudW1iZXIgb2YgYml0cyBwZXIgcGNtIHNhbXBsZSAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBuX2NoYW5uZWxzOyAvKiBudW1iZXIgb2YgY2hhbm5lbHMgKGkuZS4gbW9ubygxKSwgc3RlcmVvKDIpLi4uKSAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBzYW1wbGVfc2l6ZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgY2FuX2JlX2ZpbHRlcmVkOworICAgIHVpbnQzMl90CSAgICAgICAgICAgIGRpdmlzb3I7CiB9IHRCVEFfRE1fUENNX1JFU0FNUExFX0NCOwogCiB0QlRBX0RNX1BDTV9SRVNBTVBMRV9DQiBidGFfZG1fcGNtX2NiOwpAQCAtODUsNyArODUsNyBAQAogLy8KICNkZWZpbmUgQ09OVkVSVF80NDEwMF9UT19CTFVFVE9PVEgocFN0YXJ0LCBwRW5kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBJTlQzMiAgICAgICAgIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDU7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50MzJfdCAgICAgICAgIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDU7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgU1JDX1RZUEUgICAgKnBTID0gKFNSQ19UWVBFICopcFN0YXJ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIFNSQ19UWVBFICAgICpwU0VuZCA9IChTUkNfVFlQRSAqKXBFbmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTEyOCw3ICsxMjgsNyBAQAogICAgICAgICAgICAgb3V0NSA9IG91dDEgKyBvdXQyIC0gb3V0MyAtIG91dDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBDSEVDS19TQVRVUkFUSU9OMTYob3V0NSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgKnBzQnRPdXQrKyA9IChJTlQxNilvdXQ1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICpwc0J0T3V0KysgPSAoaW50MTZfdClvdXQ1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBwUyArPSBTUkNfQ0hBTk5FTFM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTEzOSw3ICsxMzksNyBAQAogLy8KICNkZWZpbmUgQ09OVkVSVF8yMjA1MF9UT19CTFVFVE9PVEgocFN0YXJ0LCBwRW5kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBJTlQzMiAgICAgICAgIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDU7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50MzJfdCAgICAgICAgIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDU7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgU1JDX1RZUEUgICAgKnBTID0gKFNSQ19UWVBFICopcFN0YXJ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIFNSQ19UWVBFICAgICpwU0VuZCA9IChTUkNfVFlQRSAqKXBFbmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTE4MSw3ICsxODEsNyBAQAogICAgICAgICAgICAgb3V0NSA9IG91dDEgLSBvdXQyICsgb3V0MyAtIG91dDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBDSEVDS19TQVRVUkFUSU9OMTYob3V0NSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgKnBzQnRPdXQrKyA9IChJTlQxNilvdXQ1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICpwc0J0T3V0KysgPSAoaW50MTZfdClvdXQ1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBwUyArPSBTUkNfQ0hBTk5FTFM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTE5Miw3ICsxOTIsNyBAQAogLy8KICNkZWZpbmUgQ09OVkVSVF8xMTAyNV9UT19CTFVFVE9PVEgocFN0YXJ0LCBwRW5kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBJTlQzMiAgICAgICAgIG91dDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQzMl90ICAgICAgICAgb3V0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIFNSQ19UWVBFICAgICpwUyA9IChTUkNfVFlQRSAqKXBTdGFydDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBTUkNfVFlQRSAgICAqcFNFbmQgPSAoU1JDX1RZUEUgKilwRW5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0yMTksNyArMjE5LDcgQEAKICAgICAgICAgICAgIG91dDEgPSBvdXQxIC8gMzAwMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgQ0hFQ0tfU0FUVVJBVElPTjE2KG91dDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICpwc0J0T3V0KysgPSAoSU5UMTYpb3V0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAqcHNCdE91dCsrID0gKGludDE2X3Qpb3V0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgcFMgKz0gU1JDX0NIQU5ORUxTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0yMzIsMjEgKzIzMiwyMSBAQAogI3VuZGVmICBTUkNfU0FNUExFCiAjdW5kZWYgIFNSQ19UWVBFCiAKLSNkZWZpbmUgU1JDX1RZUEUgICAgICAgIFVJTlQ4CisjZGVmaW5lIFNSQ19UWVBFICAgICAgICB1aW50OF90CiAjZGVmaW5lIFNSQ19DSEFOTkVMUyAgICAxCiAjZGVmaW5lIFNSQ19TQU1QTEUoeCkgICAoKHBTW3hdICAtIDB4ODApIDw8IDgpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiogIExvY2FsIEZ1bmN0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUlOVDMyIENvbnZlcnRfOE1fVG9CVF9GaWx0ZXJlZCAoVUlOVDggKnBTcmMsIHZvaWQgKnBEc3QsIFVJTlQzMiBkd1NyY1NhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgIFVJTlQzMiBkd1NyY1NwcywgSU5UMzIgKnBMYXN0Q3VyUG9zLCBVSU5UOCAqcE92ZXJsYXBBcmVhKQoraW50MzJfdCBDb252ZXJ0XzhNX1RvQlRfRmlsdGVyZWQgKHVpbnQ4X3QgKnBTcmMsIHZvaWQgKnBEc3QsIHVpbnQzMl90IGR3U3JjU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTcmNTcHMsIGludDMyX3QgKnBMYXN0Q3VyUG9zLCB1aW50OF90ICpwT3ZlcmxhcEFyZWEpCiB7Ci0gICAgSU5UMzIgICAgICAgICAgICAgQ3VycmVudFBvcyA9ICpwTGFzdEN1clBvczsKKyAgICBpbnQzMl90ICAgICAgICAgICAgIEN1cnJlbnRQb3MgPSAqcExhc3RDdXJQb3M7CiAgICAgU1JDX1RZUEUgICAgICAgICpwSW4sICpwSW5FbmQ7CiAgICAgU1JDX1RZUEUgICAgICAgICpwT3YsICpwT3ZFbmQ7Ci0gICAgSU5UMTYgICAgICAgICAgICpwc0J0T3V0ID0gKElOVDE2ICopcERzdDsKLSNpZiBCVEFfRE1fU0NPX0RFQlVHCisgICAgaW50MTZfdCAgICAgICAgICAgKnBzQnRPdXQgPSAoaW50MTZfdCAqKXBEc3Q7CisjaWYgKEJUQV9ETV9TQ09fREVCVUcgPT0gVFJVRSkKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJDb252ZXJ0XzhNX1RvQlRfRmlsdGVyZWQsICBDdXJyZW50UG9zICVkXG4iLCBDdXJyZW50UG9zKTsKICNlbmRpZgogICAgIG1lbWNweSAocE92ZXJsYXBBcmVhICsgKEJUQV9ETV9QQ01fT1ZFUkxBUF9TSVpFICogMiksIHBTcmMsIEJUQV9ETV9QQ01fT1ZFUkxBUF9TSVpFICogMik7CkBAIC0yNzksMTUgKzI3OSwxNSBAQAogCiAgICAgKnBMYXN0Q3VyUG9zID0gQ3VycmVudFBvczsKIAotICAgIHJldHVybiAocHNCdE91dCAtIChJTlQxNiAqKXBEc3QpOworICAgIHJldHVybiAocHNCdE91dCAtIChpbnQxNl90ICopcERzdCk7CiB9CiAKLUlOVDMyIENvbnZlcnRfOE1fVG9CVF9Ob0ZpbHRlciAodm9pZCAqcFNyYywgdm9pZCAqcERzdCwgVUlOVDMyIGR3U3JjU2FtcGxlcywgVUlOVDMyIGR3U3JjU3BzKQoraW50MzJfdCBDb252ZXJ0XzhNX1RvQlRfTm9GaWx0ZXIgKHZvaWQgKnBTcmMsIHZvaWQgKnBEc3QsIHVpbnQzMl90IGR3U3JjU2FtcGxlcywgdWludDMyX3QgZHdTcmNTcHMpCiB7Ci0gICAgSU5UMzIgICAgICAgICAgICAgQ3VycmVudFBvczsKLSAgICBVSU5UOCAgICAgICAgICAgICpwYlNyYyA9IChVSU5UOCAqKXBTcmM7Ci0gICAgSU5UMTYgICAgICAgICAgICpwc0RzdCA9IChJTlQxNiAqKXBEc3Q7Ci0gICAgSU5UMTYgICAgICAgICAgIHNXb3JrZXI7CisgICAgaW50MzJfdCAgICAgICAgICAgICBDdXJyZW50UG9zOworICAgIHVpbnQ4X3QgICAgICAgICAgICAqcGJTcmMgPSAodWludDhfdCAqKXBTcmM7CisgICAgaW50MTZfdCAgICAgICAgICAgKnBzRHN0ID0gKGludDE2X3QgKilwRHN0OworICAgIGludDE2X3QgICAgICAgICAgIHNXb3JrZXI7CiAKICAgICAvLyAgICAgIHN0YXJ0IGF0IGR3U3BzU3JjIC8gMiwgZGVjcmVtZW50IGJ5IDgwMDAKICAgICAvLwpAQCAtMzExLDcgKzMxMSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gKHBzRHN0IC0gKElOVDE2ICopcERzdCk7CisgICAgcmV0dXJuIChwc0RzdCAtIChpbnQxNl90ICopcERzdCk7CiB9CiAKIApAQCAtMzIxLDE3ICszMjEsMTcgQEAKICN1bmRlZiAgU1JDX1NBTVBMRQogI3VuZGVmICBTUkNfVFlQRQogCi0jZGVmaW5lIFNSQ19UWVBFICAgICAgICBJTlQxNgorI2RlZmluZSBTUkNfVFlQRSAgICAgICAgaW50MTZfdAogI2RlZmluZSBTUkNfQ0hBTk5FTFMgICAgMQogI2RlZmluZSBTUkNfU0FNUExFKHgpICAgcFNbeF0KIAotSU5UMzIgQ29udmVydF8xNk1fVG9CVF9GaWx0ZXJlZCAoVUlOVDggKnBTcmMsIHZvaWQgKnBEc3QsIFVJTlQzMiBkd1NyY1NhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgZHdTcmNTcHMsIElOVDMyICpwTGFzdEN1clBvcywgVUlOVDggKnBPdmVybGFwQXJlYSkKK2ludDMyX3QgQ29udmVydF8xNk1fVG9CVF9GaWx0ZXJlZCAodWludDhfdCAqcFNyYywgdm9pZCAqcERzdCwgdWludDMyX3QgZHdTcmNTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTcmNTcHMsIGludDMyX3QgKnBMYXN0Q3VyUG9zLCB1aW50OF90ICpwT3ZlcmxhcEFyZWEpCiB7Ci0gICAgSU5UMzIgICAgICAgICAgICAgQ3VycmVudFBvcyA9ICpwTGFzdEN1clBvczsKKyAgICBpbnQzMl90ICAgICAgICAgICAgIEN1cnJlbnRQb3MgPSAqcExhc3RDdXJQb3M7CiAgICAgU1JDX1RZUEUgICAgICAgICpwSW4sICpwSW5FbmQ7CiAgICAgU1JDX1RZUEUgICAgICAgICpwT3YsICpwT3ZFbmQ7Ci0gICAgSU5UMTYgICAgICAgICAgICpwc0J0T3V0ID0gKElOVDE2ICopcERzdDsKKyAgICBpbnQxNl90ICAgICAgICAgICAqcHNCdE91dCA9IChpbnQxNl90ICopcERzdDsKIAogICAgIG1lbWNweSAocE92ZXJsYXBBcmVhICsgKEJUQV9ETV9QQ01fT1ZFUkxBUF9TSVpFICogMiksIHBTcmMsIEJUQV9ETV9QQ01fT1ZFUkxBUF9TSVpFICogMik7CiAKQEAgLTM2MiwxNCArMzYyLDE0IEBACiAKICAgICAqcExhc3RDdXJQb3MgPSBDdXJyZW50UG9zOwogCi0gICAgcmV0dXJuIChwc0J0T3V0IC0gKElOVDE2ICopcERzdCk7CisgICAgcmV0dXJuIChwc0J0T3V0IC0gKGludDE2X3QgKilwRHN0KTsKIH0KIAotSU5UMzIgQ29udmVydF8xNk1fVG9CVF9Ob0ZpbHRlciAodm9pZCAqcFNyYywgdm9pZCAqcERzdCwgVUlOVDMyIGR3U3JjU2FtcGxlcywgVUlOVDMyIGR3U3JjU3BzKQoraW50MzJfdCBDb252ZXJ0XzE2TV9Ub0JUX05vRmlsdGVyICh2b2lkICpwU3JjLCB2b2lkICpwRHN0LCB1aW50MzJfdCBkd1NyY1NhbXBsZXMsIHVpbnQzMl90IGR3U3JjU3BzKQogewotICAgIElOVDMyICAgICAgICAgICAgIEN1cnJlbnRQb3M7Ci0gICAgSU5UMTYgICAgICAgICAgICpwc1NyYyA9IChJTlQxNiAqKXBTcmM7Ci0gICAgSU5UMTYgICAgICAgICAgICpwc0RzdCA9IChJTlQxNiAqKXBEc3Q7CisgICAgaW50MzJfdCAgICAgICAgICAgICBDdXJyZW50UG9zOworICAgIGludDE2X3QgICAgICAgICAgICpwc1NyYyA9IChpbnQxNl90ICopcFNyYzsKKyAgICBpbnQxNl90ICAgICAgICAgICAqcHNEc3QgPSAoaW50MTZfdCAqKXBEc3Q7CiAKICAgICAvLyAgICAgIHN0YXJ0IGF0IGR3U3BzU3JjIC8gMiwgZGVjcmVtZW50IGJ5IDgwMDAKICAgICAvLwpAQCAtMzg5LDcgKzM4OSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gKHBzRHN0IC0gKElOVDE2ICopcERzdCk7CisgICAgcmV0dXJuIChwc0RzdCAtIChpbnQxNl90ICopcERzdCk7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTM5OCwxOSArMzk4LDE5IEBACiAjdW5kZWYgIFNSQ19TQU1QTEUKICN1bmRlZiAgU1JDX1RZUEUKIAotI2RlZmluZSBTUkNfVFlQRSAgICAgICAgVUlOVDgKKyNkZWZpbmUgU1JDX1RZUEUgICAgICAgIHVpbnQ4X3QKICNkZWZpbmUgU1JDX0NIQU5ORUxTICAgIDIKICNkZWZpbmUgU1JDX1NBTVBMRSh4KSAoKCgocFNbeCAqIDJdICAtIDB4ODApIDw8IDgpICsgKChwU1soeCAqIDIpICsgMV0gIC0gMHg4MCkgPDwgOCkpID4+IDEpCiAKLUlOVDMyIENvbnZlcnRfOFNfVG9CVF9GaWx0ZXJlZCAoVUlOVDggKnBTcmMsIHZvaWQgKnBEc3QsIFVJTlQzMiBkd1NyY1NhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBkd1NyY1NwcywgSU5UMzIgKnBMYXN0Q3VyUG9zLCBVSU5UOCAqcE92ZXJsYXBBcmVhKQoraW50MzJfdCBDb252ZXJ0XzhTX1RvQlRfRmlsdGVyZWQgKHVpbnQ4X3QgKnBTcmMsIHZvaWQgKnBEc3QsIHVpbnQzMl90IGR3U3JjU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTcmNTcHMsIGludDMyX3QgKnBMYXN0Q3VyUG9zLCB1aW50OF90ICpwT3ZlcmxhcEFyZWEpCiB7Ci0gICAgSU5UMzIgICAgICAgICAgICAgQ3VycmVudFBvcyA9ICpwTGFzdEN1clBvczsKKyAgICBpbnQzMl90ICAgICAgICAgICAgIEN1cnJlbnRQb3MgPSAqcExhc3RDdXJQb3M7CiAgICAgU1JDX1RZUEUgICAgICAgICpwSW4sICpwSW5FbmQ7CiAgICAgU1JDX1RZUEUgICAgICAgICpwT3YsICpwT3ZFbmQ7Ci0gICAgSU5UMTYgICAgICAgICAgICpwc0J0T3V0ID0gKElOVDE2ICopcERzdDsKKyAgICBpbnQxNl90ICAgICAgICAgICAqcHNCdE91dCA9IChpbnQxNl90ICopcERzdDsKIAotI2lmIEJUQV9ETV9TQ09fREVCVUcKKyNpZiAoQlRBX0RNX1NDT19ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoIkNvbnZlcnRfOFNfVG9CVF9GaWx0ZXJlZCBDdXJyZW50UG9zICVkLCBTUkNfVFlQRSAlZCwgU1JDX0NIQU5ORUxTICVkLCBcCiAgICAgICAgIGR3U3JjU2FtcGxlcyAlZCwgIGR3U3JjU3BzICVkIiwgIAlDdXJyZW50UG9zLCBzaXplb2YgKFNSQ19UWVBFKSwgU1JDX0NIQU5ORUxTLCBcCiAgICAgICAgIGR3U3JjU2FtcGxlcywgZHdTcmNTcHMpOwpAQCAtNDQ0LDE1ICs0NDQsMTUgQEAKIAogICAgICpwTGFzdEN1clBvcyA9IEN1cnJlbnRQb3M7CiAKLSAgICByZXR1cm4gKHBzQnRPdXQgLSAoSU5UMTYgKilwRHN0KTsKKyAgICByZXR1cm4gKHBzQnRPdXQgLSAoaW50MTZfdCAqKXBEc3QpOwogfQogCi1JTlQzMiBDb252ZXJ0XzhTX1RvQlRfTm9GaWx0ZXIgKHZvaWQgKnBTcmMsIHZvaWQgKnBEc3QsIFVJTlQzMiBkd1NyY1NhbXBsZXMsIFVJTlQzMiBkd1NyY1NwcykKK2ludDMyX3QgQ29udmVydF84U19Ub0JUX05vRmlsdGVyICh2b2lkICpwU3JjLCB2b2lkICpwRHN0LCB1aW50MzJfdCBkd1NyY1NhbXBsZXMsIHVpbnQzMl90IGR3U3JjU3BzKQogewotICAgIElOVDMyICAgICAgICAgICAgIEN1cnJlbnRQb3M7Ci0gICAgVUlOVDggICAgICAgICAgICAqcGJTcmMgPSAoVUlOVDggKilwU3JjOwotICAgIElOVDE2ICAgICAgICAgICAqcHNEc3QgPSAoSU5UMTYgKilwRHN0OwotICAgIElOVDE2ICAgICAgICAgICBzV29ya2VyLCBzV29ya2VyMjsKKyAgICBpbnQzMl90ICAgICAgICAgICAgIEN1cnJlbnRQb3M7CisgICAgdWludDhfdCAgICAgICAgICAgICpwYlNyYyA9ICh1aW50OF90ICopcFNyYzsKKyAgICBpbnQxNl90ICAgICAgICAgICAqcHNEc3QgPSAoaW50MTZfdCAqKXBEc3Q7CisgICAgaW50MTZfdCAgICAgICAgICAgc1dvcmtlciwgc1dvcmtlcjI7CiAKICAgICAvLyAgICAgIHN0YXJ0IGF0IGR3U3BzU3JjIC8gMiwgZGVjcmVtZW50IGJ5IDgwMDAKICAgICAvLwpAQCAtNDg1LDcgKzQ4NSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gKHBzRHN0IC0gKElOVDE2ICopcERzdCk7CisgICAgcmV0dXJuIChwc0RzdCAtIChpbnQxNl90ICopcERzdCk7CiB9CiAKIApAQCAtNDk1LDE3ICs0OTUsMTcgQEAKICN1bmRlZiAgU1JDX1NBTVBMRQogI3VuZGVmICBTUkNfVFlQRQogCi0jZGVmaW5lIFNSQ19UWVBFICAgICAgICBJTlQxNgorI2RlZmluZSBTUkNfVFlQRSAgICAgICAgaW50MTZfdAogI2RlZmluZSBTUkNfQ0hBTk5FTFMgICAgMgogI2RlZmluZSBTUkNfU0FNUExFKHgpICgocFNbeCAqIDJdICsgcFNbKHggKiAyKSArIDFdKSA+PiAxKQogCi1JTlQzMiBDb252ZXJ0XzE2U19Ub0JUX0ZpbHRlcmVkIChVSU5UOCAqcFNyYywgdm9pZCAqcERzdCwgVUlOVDMyIGR3U3JjU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBkd1NyY1NwcywgSU5UMzIgKnBMYXN0Q3VyUG9zLCBVSU5UOCAqcE92ZXJsYXBBcmVhKQoraW50MzJfdCBDb252ZXJ0XzE2U19Ub0JUX0ZpbHRlcmVkICh1aW50OF90ICpwU3JjLCB2b2lkICpwRHN0LCB1aW50MzJfdCBkd1NyY1NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1NyY1NwcywgaW50MzJfdCAqcExhc3RDdXJQb3MsIHVpbnQ4X3QgKnBPdmVybGFwQXJlYSkKIHsKLSAgICBJTlQzMiAgICAgICAgICAgICBDdXJyZW50UG9zID0gKnBMYXN0Q3VyUG9zOworICAgIGludDMyX3QgICAgICAgICAgICAgQ3VycmVudFBvcyA9ICpwTGFzdEN1clBvczsKICAgICBTUkNfVFlQRSAgICAgICAgKnBJbiwgKnBJbkVuZDsKICAgICBTUkNfVFlQRSAgICAgICAgKnBPdiwgKnBPdkVuZDsKLSAgICBJTlQxNiAgICAgICAgICAgKnBzQnRPdXQgPSAoSU5UMTYgKilwRHN0OworICAgIGludDE2X3QgICAgICAgICAgICpwc0J0T3V0ID0gKGludDE2X3QgKilwRHN0OwogCiAgICAgbWVtY3B5IChwT3ZlcmxhcEFyZWEgKyAoQlRBX0RNX1BDTV9PVkVSTEFQX1NJWkUgKiAyKSwgcFNyYywgQlRBX0RNX1BDTV9PVkVSTEFQX1NJWkUgKiAyKTsKIApAQCAtNTM2LDE1ICs1MzYsMTUgQEAKIAogICAgICpwTGFzdEN1clBvcyA9IEN1cnJlbnRQb3M7CiAKLSAgICByZXR1cm4gKHBzQnRPdXQgLSAoSU5UMTYgKilwRHN0KTsKKyAgICByZXR1cm4gKHBzQnRPdXQgLSAoaW50MTZfdCAqKXBEc3QpOwogfQogCi1JTlQzMiBDb252ZXJ0XzE2U19Ub0JUX05vRmlsdGVyICh2b2lkICpwU3JjLCB2b2lkICpwRHN0LCBVSU5UMzIgZHdTcmNTYW1wbGVzLCBVSU5UMzIgZHdTcmNTcHMpCitpbnQzMl90IENvbnZlcnRfMTZTX1RvQlRfTm9GaWx0ZXIgKHZvaWQgKnBTcmMsIHZvaWQgKnBEc3QsIHVpbnQzMl90IGR3U3JjU2FtcGxlcywgdWludDMyX3QgZHdTcmNTcHMpCiB7Ci0gICAgSU5UMzIgICAgICAgICAgICAgQ3VycmVudFBvczsKLSAgICBJTlQxNiAgICAgICAgICAgKnBzU3JjID0gKElOVDE2ICopcFNyYzsKLSAgICBJTlQxNiAgICAgICAgICAgKnBzRHN0ID0gKElOVDE2ICopcERzdDsKLSAgICBJTlQxNiAgICAgICAgICAgc1dvcmtlcjsKKyAgICBpbnQzMl90ICAgICAgICAgICAgIEN1cnJlbnRQb3M7CisgICAgaW50MTZfdCAgICAgICAgICAgKnBzU3JjID0gKGludDE2X3QgKilwU3JjOworICAgIGludDE2X3QgICAgICAgICAgICpwc0RzdCA9IChpbnQxNl90ICopcERzdDsKKyAgICBpbnQxNl90ICAgICAgICAgICBzV29ya2VyOwogCiAgICAgLy8gICAgICBzdGFydCBhdCBkd1Nwc1NyYyAvIDIsIGRlY3JlbWVudCBieSA4MDAwCiAgICAgLy8KQEAgLTU3MCw3ICs1NzAsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIChwc0RzdCAtIChJTlQxNiAqKXBEc3QpOworICAgIHJldHVybiAocHNEc3QgLSAoaW50MTZfdCAqKXBEc3QpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNTg3LDcgKzU4Nyw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIG5vbmUKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfRG1QY21Jbml0U2FtcGxlcyAoVUlOVDMyIHNyY19zcHMsIFVJTlQzMiBiaXRzLCBVSU5UMzIgbl9jaGFubmVscykKK3ZvaWQgQlRBX0RtUGNtSW5pdFNhbXBsZXMgKHVpbnQzMl90IHNyY19zcHMsIHVpbnQzMl90IGJpdHMsIHVpbnQzMl90IG5fY2hhbm5lbHMpCiB7CiAgICAgdEJUQV9ETV9QQ01fUkVTQU1QTEVfQ0IgKnBfY2IgPSAmYnRhX2RtX3BjbV9jYjsKIApAQCAtNjA3LDcgKzYwNyw3IEBACiAgICAgZWxzZQogICAgICAgICAgcF9jYi0+Y2FuX2JlX2ZpbHRlcmVkID0gMDsKIAotI2lmIEJUQV9ETV9TQ09fREVCVUcKKyNpZiAoQlRBX0RNX1NDT19ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9kbV9wY21faW5pdF9zYW1wbGVzOiBuX2NoYW5uZWxzID0gJWQgYml0cyA9ICVkIiwgbl9jaGFubmVscywgYml0cyk7CiAjZW5kaWYKICAgICBpZihuX2NoYW5uZWxzID09IDEpCkBAIC02NDEsNyArNjQxLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotI2lmIEJUQV9ETV9TQ09fREVCVUcKKyNpZiAoQlRBX0RNX1NDT19ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9wY21faW5pdF9kd25fc2FtcGxlOiBjdXJfcG9zICVkLCBzcmNfc3BzICVkIiwgXAogCQlwX2NiLT5jdXJfcG9zLCBwX2NiLT5zcmNfc3BzKTsKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfcGNtX2luaXRfZHduX3NhbXBsZTogYml0cyAlZCwgbl9jaGFubmVscyAlZCwgc2FtcGxlX3NpemUgJWQsICIsIFwKQEAgLTY2NSwyMCArNjY1LDIwIEBACiAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb252ZXJ0ZWQgUENNIHNhbXBsZXMuCiAqKgogKioKLSoqIFJldHVybnMgICAgICAgICAgSU5UMzI6IG51bWJlciBvZiBzYW1wbGVzIGNvbnZlcnRlZC4KKyoqIFJldHVybnMgICAgICAgICAgaW50MzJfdDogbnVtYmVyIG9mIHNhbXBsZXMgY29udmVydGVkLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSU5UMzIgQlRBX0RtUGNtUmVzYW1wbGUgKHZvaWQgKnBfc3JjLCBVSU5UMzIgaW5fYnl0ZXMsIHZvaWQgKnBfZHN0KQoraW50MzJfdCBCVEFfRG1QY21SZXNhbXBsZSAodm9pZCAqcF9zcmMsIHVpbnQzMl90IGluX2J5dGVzLCB2b2lkICpwX2RzdCkKIHsKLSAgICBVSU5UMzIgb3V0X3NhbXBsZTsKKyAgICB1aW50MzJfdCBvdXRfc2FtcGxlOwogCi0jaWYgQlRBX0RNX1NDT19ERUJVRworI2lmIChCVEFfRE1fU0NPX0RFQlVHID09IFRSVUUpCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX3BjbV9yZXNhbXBsZSA6IGluc2FtcGxlcyAgJWQiLCAgKGluX2J5dGVzICAvIGJ0YV9kbV9wY21fY2IuZGl2aXNvcikpOwogI2VuZGlmCiAgICAgaWYoYnRhX2RtX3BjbV9jYi5jYW5fYmVfZmlsdGVyZWQpCiAgICAgewogICAgICAgICBvdXRfc2FtcGxlID0gKCpidGFfZG1fcGNtX2NiLmZpbHRlcikgKHBfc3JjLCBwX2RzdCwgKGluX2J5dGVzICAvIGJ0YV9kbV9wY21fY2IuZGl2aXNvciksCi0gICAgICAgICAgICBidGFfZG1fcGNtX2NiLnNyY19zcHMsIChJTlQzMiAqKSAmYnRhX2RtX3BjbV9jYi5jdXJfcG9zLCBidGFfZG1fcGNtX2NiLm92ZXJsYXBfYXJlYSk7CisgICAgICAgICAgICBidGFfZG1fcGNtX2NiLnNyY19zcHMsIChpbnQzMl90ICopICZidGFfZG1fcGNtX2NiLmN1cl9wb3MsIGJ0YV9kbV9wY21fY2Iub3ZlcmxhcF9hcmVhKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKQEAgLTY4Niw3ICs2ODYsNyBAQAogICAgICAgICAgICAgKGluX2J5dGVzIC8gYnRhX2RtX3BjbV9jYi5kaXZpc29yKSwgYnRhX2RtX3BjbV9jYi5zcmNfc3BzKTsKICAgICB9CiAKLSNpZiBCVEFfRE1fU0NPX0RFQlVHCisjaWYgKEJUQV9ETV9TQ09fREVCVUcgPT0gVFJVRSkKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfcGNtX3Jlc2FtcGxlIDogb3V0c2FtcGxlcyAgJWQiLCAgb3V0X3NhbXBsZSk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYnRhL2dhdHQvYnRhX2dhdHRjX2FjdC5jYyBiL2J0YS9nYXR0L2J0YV9nYXR0Y19hY3QuY2MKaW5kZXggMzg4ZDlhNC4uOGM4ODYxZiAxMDA2NDQKLS0tIGEvYnRhL2dhdHQvYnRhX2dhdHRjX2FjdC5jYworKysgYi9idGEvZ2F0dC9idGFfZ2F0dGNfYWN0LmNjCkBAIC0zNywyOCArMzcsMjggQEAKICNpbmNsdWRlICJzdGFjay9sMmNhcC9sMmNfaW50LmgiCiAjaW5jbHVkZSAidXRsLmgiCiAKLSNpZiAoZGVmaW5lZCBCVEFfSEhfTEVfSU5DTFVERUQgJiYgQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9ISF9MRV9JTkNMVURFRCA9PSBUUlVFKQogI2luY2x1ZGUgImJ0YV9oaF9pbnQuaCIKICNlbmRpZgogCi0jaWYgQlRBX0dBVFRfSU5DTFVERUQgJiYgQkxFX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRSAmJiBCTEVfSU5DTFVERUQgPT0gVFJVRSkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKiAgQ29uc3RhbnRzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9nYXR0Y19jb25uX2NiYWNrKHRHQVRUX0lGIGdhdHRjX2lmLCBCRF9BRERSIGJkYSwgVUlOVDE2IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MRUFOIGNvbm5lY3RlZCwgdEdBVFRfRElTQ09OTl9SRUFTT04gcmVhc29uLAorc3RhdGljIHZvaWQgYnRhX2dhdHRjX2Nvbm5fY2JhY2sodEdBVFRfSUYgZ2F0dGNfaWYsIEJEX0FERFIgYmRhLCB1aW50MTZfdCBjb25uX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb25uZWN0ZWQsIHRHQVRUX0RJU0NPTk5fUkVBU09OIHJlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKIAotc3RhdGljIHZvaWQgIGJ0YV9nYXR0Y19jbXBsX2NiYWNrKFVJTlQxNiBjb25uX2lkLCB0R0FUVENfT1BUWVBFIG9wLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAorc3RhdGljIHZvaWQgIGJ0YV9nYXR0Y19jbXBsX2NiYWNrKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUQ19PUFRZUEUgb3AsIHRHQVRUX1NUQVRVUyBzdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfQ0xfQ09NUExFVEUgKnBfZGF0YSk7Ci1zdGF0aWMgdm9pZCBidGFfZ2F0dGNfY21wbF9zZW5kbXNnKFVJTlQxNiBjb25uX2lkLCB0R0FUVENfT1BUWVBFIG9wLAorc3RhdGljIHZvaWQgYnRhX2dhdHRjX2NtcGxfc2VuZG1zZyh1aW50MTZfdCBjb25uX2lkLCB0R0FUVENfT1BUWVBFIG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRfU1RBVFVTIHN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfQ0xfQ09NUExFVEUgKnBfZGF0YSk7CiAKIHN0YXRpYyB2b2lkIGJ0YV9nYXR0Y19kZXJlZ2lzdGVyX2NtcGwodEJUQV9HQVRUQ19SQ0IgKnBfY2xyZWcpOwogc3RhdGljIHZvaWQgYnRhX2dhdHRjX2VuY19jbXBsX2NiYWNrKHRHQVRUX0lGIGdhdHRjX2lmLCBCRF9BRERSIGJkYSk7Ci1zdGF0aWMgdm9pZCBidGFfZ2F0dGNfY29uZ19jYmFjayAoVUlOVDE2IGNvbm5faWQsIEJPT0xFQU4gY29uZ2VzdGVkKTsKK3N0YXRpYyB2b2lkIGJ0YV9nYXR0Y19jb25nX2NiYWNrICh1aW50MTZfdCBjb25uX2lkLCBib29sIGNvbmdlc3RlZCk7CiAKIHN0YXRpYyB0R0FUVF9DQkFDSyBidGFfZ2F0dGNfY2xfY2JhY2sgPQogewpAQCAtNzIsNyArNzIsNyBAQAogfTsKIAogLyogb3Bjb2RlKHRHQVRUQ19PUFRZUEUpIG9yZGVyIGhhcyB0byBiZSBjb21wbHkgd2l0aCBpbnRlcm5hbCBldmVudCBvcmRlciAqLwotc3RhdGljIFVJTlQxNiBidGFfZ2F0dGNfb3Bjb2RlX3RvX2ludF9ldnRbXSA9CitzdGF0aWMgdWludDE2X3QgYnRhX2dhdHRjX29wY29kZV90b19pbnRfZXZ0W10gPQogewogICAgIEJUQV9HQVRUQ19BUElfUkVBRF9FVlQsCiAgICAgQlRBX0dBVFRDX0FQSV9XUklURV9FVlQsCkBAIC05Miw3ICs5Miw3IEBACiAgICAgIk5vdGlmaWNhdGlvbiIsCiAgICAgIkluZGljYXRpb24iCiB9OwotI2VuZGlmCisjZW5kaWYgLy8gQlRfVFJBQ0VfVkVSQk9TRQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKiAgQWN0aW9uIEZ1bmN0aW9ucwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMzgsNyArMTM4LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9nYXR0Y19kaXNhYmxlKHRCVEFfR0FUVENfQ0IgKnBfY2IpCiB7Ci0gICAgVUlOVDggICAgICAgICAgIGk7CisgICAgdWludDhfdCAgICAgICAgICAgaTsKIAogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9nYXR0Y19kaXNhYmxlIik7CiAKQEAgLTE1NSwxMSArMTU1LDExIEBACiAgICAgICAgICAgICBwX2NiLT5zdGF0ZSA9IEJUQV9HQVRUQ19TVEFURV9ESVNBQkxJTkc7CiAgICAgICAgICAgICAvKiBkb24ndCBkZXJlZ2lzdGVyIEhIIEdBVFQgSUYgKi8KICAgICAgICAgICAgIC8qIEhIIEdBVFQgSUYgd2lsbCBiZSBkZXJlZ2lzdGVyZWQgYnkgYnRhX2hoX2xlX2RlcmVnaXN0ZXIgd2hlbiBkaXNhYmxlIEhIICovCi0jaWYgKGRlZmluZWQgQlRBX0hIX0xFX0lOQ0xVREVEICYmIEJUQV9ISF9MRV9JTkNMVURFRCA9PSBUUlVFKQorI2lmIChCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRSkKICAgICAgICAgICAgIGlmICghYnRhX2hoX2xlX2lzX2hoX2dhdHRfaWYocF9jYi0+Y2xfcmNiW2ldLmNsaWVudF9pZikpIHsKICNlbmRpZgogICAgICAgICAgICAgICAgIGJ0YV9nYXR0Y19kZXJlZ2lzdGVyKHBfY2IsICZwX2NiLT5jbF9yY2JbaV0pOwotI2lmIChkZWZpbmVkIEJUQV9ISF9MRV9JTkNMVURFRCAmJiBCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRSkKKyNpZiAoQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUpCiAgICAgICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgfQpAQCAtMTg1LDcgKzE4NSw3IEBACiB2b2lkIGJ0YV9nYXR0Y19yZWdpc3Rlcih0QlRBX0dBVFRDX0NCICpwX2NiLCB0QlRBX0dBVFRDX0RBVEEgKnBfZGF0YSkKIHsKICAgICB0QlRBX0dBVFRDICAgICAgICAgICAgICAgY2JfZGF0YTsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgaTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICBpOwogICAgIHRCVF9VVUlEICAgICAgICAgICAgICAgICAqcF9hcHBfdXVpZCA9ICZwX2RhdGEtPmFwaV9yZWcuYXBwX3V1aWQ7CiAgICAgdEJUQV9HQVRUX1NUQVRVUyAgICAgICAgIHN0YXR1cyA9IEJUQV9HQVRUX05PX1JFU09VUkNFUzsKIApAQCAtMjEwLDcgKzIxMCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcF9jYi0+Y2xfcmNiW2ldLmluX3VzZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgcF9jYi0+Y2xfcmNiW2ldLmluX3VzZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgcF9jYi0+Y2xfcmNiW2ldLnBfY2JhY2sgPSBwX2RhdGEtPmFwaV9yZWcucF9jYmFjazsKICAgICAgICAgICAgICAgICBtZW1jcHkoJnBfY2ItPmNsX3JjYltpXS5hcHBfdXVpZCwgcF9hcHBfdXVpZCwgc2l6ZW9mKHRCVF9VVUlEKSk7CiAKQEAgLTI3Miw3ICsyNzIsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2dhdHRjX2RlcmVnaXN0ZXIodEJUQV9HQVRUQ19DQiAqcF9jYiwgdEJUQV9HQVRUQ19SQ0IgICpwX2NscmVnKQogewotICAgIFVJTlQ4ICAgICAgICAgICAgICAgaTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgaTsKICAgICBCVF9IRFIgICAgICAgICAgICAgIGJ1ZjsKIAogICAgIGlmIChwX2NscmVnICE9IE5VTEwpCkBAIC0yODQsMTIgKzI4NCwxMiBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChwX2NiLT5iZ190cmFja1tpXS5jaWZfbWFzayAmICgxIDw8KHBfY2xyZWctPmNsaWVudF9pZiAtIDEpKSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJ0YV9nYXR0Y19tYXJrX2JnX2Nvbm4ocF9jbHJlZy0+Y2xpZW50X2lmLCBwX2NiLT5iZ190cmFja1tpXS5yZW1vdGVfYmRhLCBGQUxTRSwgRkFMU0UpOwotICAgICAgICAgICAgICAgICAgICBHQVRUX0NhbmNlbENvbm5lY3QocF9jbHJlZy0+Y2xpZW50X2lmLCBwX2NiLT5iZ190cmFja1tpXS5yZW1vdGVfYmRhLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIGJ0YV9nYXR0Y19tYXJrX2JnX2Nvbm4ocF9jbHJlZy0+Y2xpZW50X2lmLCBwX2NiLT5iZ190cmFja1tpXS5yZW1vdGVfYmRhLCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBHQVRUX0NhbmNlbENvbm5lY3QocF9jbHJlZy0+Y2xpZW50X2lmLCBwX2NiLT5iZ190cmFja1tpXS5yZW1vdGVfYmRhLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChwX2NiLT5iZ190cmFja1tpXS5jaWZfYWR2X21hc2sgJiAoMSA8PChwX2NscmVnLT5jbGllbnRfaWYgLSAxKSkpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBidGFfZ2F0dGNfbWFya19iZ19jb25uKHBfY2xyZWctPmNsaWVudF9pZiwgcF9jYi0+YmdfdHJhY2tbaV0ucmVtb3RlX2JkYSwgRkFMU0UsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICBidGFfZ2F0dGNfbWFya19iZ19jb25uKHBfY2xyZWctPmNsaWVudF9pZiwgcF9jYi0+YmdfdHJhY2tbaV0ucmVtb3RlX2JkYSwgZmFsc2UsIHRydWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMzAxLDcgKzMwMSw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKHBfY2ItPmNsY2JbaV0uaW5fdXNlICYmIChwX2NiLT5jbGNiW2ldLnBfcmNiID09IHBfY2xyZWcpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcF9jbHJlZy0+ZGVyZWdfcGVuZGluZyA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHBfY2xyZWctPmRlcmVnX3BlbmRpbmcgPSB0cnVlOwogCiAgICAgICAgICAgICAgICAgICAgIGJ1Zi5ldmVudCA9IEJUQV9HQVRUQ19BUElfQ0xPU0VfRVZUOwogICAgICAgICAgICAgICAgICAgICBidWYubGF5ZXJfc3BlY2lmaWMgPSBwX2NiLT5jbGNiW2ldLmJ0YV9jb25uX2lkOwpAQCAtMzI4LDcgKzMyOCw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfZ2F0dGNfcHJvY2Vzc19hcGlfb3BlbiAodEJUQV9HQVRUQ19DQiAqcF9jYiwgdEJUQV9HQVRUQ19EQVRBICogcF9tc2cpCiB7Ci0gICAgVUlOVDE2IGV2ZW50ID0gKChCVF9IRFIgKilwX21zZyktPmV2ZW50OworICAgIHVpbnQxNl90IGV2ZW50ID0gKChCVF9IRFIgKilwX21zZyktPmV2ZW50OwogICAgIHRCVEFfR0FUVENfQ0xDQiAqcF9jbGNiID0gTlVMTDsKICAgICB0QlRBX0dBVFRDX1JDQiAqcF9jbHJlZyA9IGJ0YV9nYXR0Y19jbF9nZXRfcmVnY2IocF9tc2ctPmFwaV9jb25uLmNsaWVudF9pZik7CiAgICAgVU5VU0VEKHBfY2IpOwpAQCAtMzc2LDcgKzM3Niw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfZ2F0dGNfcHJvY2Vzc19hcGlfb3Blbl9jYW5jZWwgKHRCVEFfR0FUVENfQ0IgKnBfY2IsIHRCVEFfR0FUVENfREFUQSAqIHBfbXNnKQogewotICAgIFVJTlQxNiBldmVudCA9ICgoQlRfSERSICopcF9tc2cpLT5ldmVudDsKKyAgICB1aW50MTZfdCBldmVudCA9ICgoQlRfSERSICopcF9tc2cpLT5ldmVudDsKICAgICB0QlRBX0dBVFRDX0NMQ0IgKnBfY2xjYiA9IE5VTEw7CiAgICAgdEJUQV9HQVRUQ19SQ0IgKnBfY2xyZWc7CiAgICAgdEJUQV9HQVRUQyBjYl9kYXRhOwpAQCAtNTE4LDcgKzUxOCw3IEBACiAKICAgICAvKiBvcGVuL2hvbGQgYSBjb25uZWN0aW9uICovCiAgICAgaWYgKCFHQVRUX0Nvbm5lY3QocF9jbGNiLT5wX3JjYi0+Y2xpZW50X2lmLCBwX2RhdGEtPmFwaV9jb25uLnJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgVFJVRSwgcF9kYXRhLT5hcGlfY29ubi50cmFuc3BvcnQpKQorICAgICAgICAgICAgICAgICAgICAgIHRydWUsIHBfZGF0YS0+YXBpX2Nvbm4udHJhbnNwb3J0KSkKICAgICB7CiAgICAgICAgIEFQUExfVFJBQ0VfRVJST1IoIkNvbm5lY3Rpb24gb3BlbiBmYWlsdXJlIik7CiAKQEAgLTU1MSwxNCArNTUxLDE0IEBACiB2b2lkIGJ0YV9nYXR0Y19pbml0X2JrX2Nvbm4odEJUQV9HQVRUQ19BUElfT1BFTiAqcF9kYXRhLCB0QlRBX0dBVFRDX1JDQiAqcF9jbHJlZykKIHsKICAgICB0QlRBX0dBVFRfU1RBVFVTICAgICAgICAgc3RhdHVzID0gQlRBX0dBVFRfTk9fUkVTT1VSQ0VTOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICBjb25uX2lkOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgIGNvbm5faWQ7CiAgICAgdEJUQV9HQVRUQ19DTENCICAgICAgICAgKnBfY2xjYjsKICAgICB0QlRBX0dBVFRDX0RBVEEgICAgICAgICBnYXR0Y19kYXRhOwogCi0gICAgaWYgKGJ0YV9nYXR0Y19tYXJrX2JnX2Nvbm4ocF9kYXRhLT5jbGllbnRfaWYsIHBfZGF0YS0+cmVtb3RlX2JkYSwgVFJVRSwgRkFMU0UpKQorICAgIGlmIChidGFfZ2F0dGNfbWFya19iZ19jb25uKHBfZGF0YS0+Y2xpZW50X2lmLCBwX2RhdGEtPnJlbW90ZV9iZGEsIHRydWUsIGZhbHNlKSkKICAgICB7CiAgICAgICAgIC8qIGFsd2F5cyBjYWxsIG9wZW4gdG8gaG9sZCBhIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgaWYgKCFHQVRUX0Nvbm5lY3QocF9kYXRhLT5jbGllbnRfaWYsIHBfZGF0YS0+cmVtb3RlX2JkYSwgRkFMU0UsIHBfZGF0YS0+dHJhbnNwb3J0KSkKKyAgICAgICAgaWYgKCFHQVRUX0Nvbm5lY3QocF9kYXRhLT5jbGllbnRfaWYsIHBfZGF0YS0+cmVtb3RlX2JkYSwgZmFsc2UsIHBfZGF0YS0+dHJhbnNwb3J0KSkKICAgICAgICAgewogICAgICAgICAgICAgdWludDhfdCAqYmRhID0gKHVpbnQ4X3QgKilwX2RhdGEtPnJlbW90ZV9iZGE7CiAgICAgICAgICAgICBzdGF0dXMgPSBCVEFfR0FUVF9FUlJPUjsKQEAgLTYxMiw5ICs2MTIsOSBAQAogICAgIGNiX2RhdGEuc3RhdHVzID0gQlRBX0dBVFRfRVJST1I7CiAKICAgICAvKiByZW1vdmUgdGhlIGRldmljZSBmcm9tIHRoZSBiZyBjb25uZWN0aW9uIG1hc2sgKi8KLSAgICBpZiAoYnRhX2dhdHRjX21hcmtfYmdfY29ubihwX2RhdGEtPmNsaWVudF9pZiwgcF9kYXRhLT5yZW1vdGVfYmRhLCBGQUxTRSwgRkFMU0UpKQorICAgIGlmIChidGFfZ2F0dGNfbWFya19iZ19jb25uKHBfZGF0YS0+Y2xpZW50X2lmLCBwX2RhdGEtPnJlbW90ZV9iZGEsIGZhbHNlLCBmYWxzZSkpCiAgICAgewotICAgICAgICBpZiAoR0FUVF9DYW5jZWxDb25uZWN0KHBfZGF0YS0+Y2xpZW50X2lmLCBwX2RhdGEtPnJlbW90ZV9iZGEsIEZBTFNFKSkKKyAgICAgICAgaWYgKEdBVFRfQ2FuY2VsQ29ubmVjdChwX2RhdGEtPmNsaWVudF9pZiwgcF9kYXRhLT5yZW1vdGVfYmRhLCBmYWxzZSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNiX2RhdGEuc3RhdHVzID0gQlRBX0dBVFRfT0s7CiAgICAgICAgIH0KQEAgLTY2Niw3ICs2NjYsNyBAQAogewogICAgIHRCVEFfR0FUVEMgICAgICAgICAgY2JfZGF0YTsKIAotICAgIGlmIChHQVRUX0NhbmNlbENvbm5lY3QocF9jbGNiLT5wX3JjYi0+Y2xpZW50X2lmLCBwX2RhdGEtPmFwaV9jYW5jZWxfY29ubi5yZW1vdGVfYmRhLCBUUlVFKSkKKyAgICBpZiAoR0FUVF9DYW5jZWxDb25uZWN0KHBfY2xjYi0+cF9yY2ItPmNsaWVudF9pZiwgcF9kYXRhLT5hcGlfY2FuY2VsX2Nvbm4ucmVtb3RlX2JkYSwgdHJ1ZSkpCiAgICAgewogICAgICAgICBidGFfZ2F0dGNfc21fZXhlY3V0ZShwX2NsY2IsIEJUQV9HQVRUQ19JTlRfQ0FOQ0VMX09QRU5fT0tfRVZULCBwX2RhdGEpOwogICAgIH0KQEAgLTcwMiw3ICs3MDIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2F0dF9pZiwgcF9jbGNiLT5iZGEsICZwX2NsY2ItPnRyYW5zcG9ydCk7CiAgICAgfQogCi0gICAgICAgIHBfY2xjYi0+cF9zcmNiLT5jb25uZWN0ZWQgPSBUUlVFOworICAgICAgICBwX2NsY2ItPnBfc3JjYi0+Y29ubmVjdGVkID0gdHJ1ZTsKIAogICAgICAgICBpZiAocF9jbGNiLT5wX3NyY2ItPm10dSA9PSAwKQogICAgICAgICAgICAgcF9jbGNiLT5wX3NyY2ItPm10dSA9IEdBVFRfREVGX0JMRV9NVFVfU0laRTsKQEAgLTczMSw3ICs3MzEsNyBAQAogICAgICAgICAgICAgLyogYSBwZW5kaW5nIHNlcnZpY2UgaGFuZGxlIGNoYW5nZSBpbmRpY2F0aW9uICovCiAgICAgICAgICAgICBpZiAocF9jbGNiLT5wX3NyY2ItPnNydmNfaGRsX2NoZykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwX2NsY2ItPnBfc3JjYi0+c3J2Y19oZGxfY2hnID0gRkFMU0U7CisgICAgICAgICAgICAgICAgcF9jbGNiLT5wX3NyY2ItPnNydmNfaGRsX2NoZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGRpc2NvdmVyeSAqLwogICAgICAgICAgICAgICAgIGJ0YV9nYXR0Y19zbV9leGVjdXRlKHBfY2xjYiwgQlRBX0dBVFRDX0lOVF9ESVNDT1ZFUl9FVlQsIE5VTEwpOwogICAgICAgICAgICAgfQpAQCAtODM0LDcgKzgzNCw3IEBACiB2b2lkIGJ0YV9nYXR0Y19yZXNldF9kaXNjb3Zlcl9zdCh0QlRBX0dBVFRDX1NFUlYgKnBfc3JjYiwgdEJUQV9HQVRUX1NUQVRVUyBzdGF0dXMpCiB7CiAgICAgdEJUQV9HQVRUQ19DQiAgICpwX2NiID0gJmJ0YV9nYXR0Y19jYjsKLSAgICBVSU5UOCBpOworICAgIHVpbnQ4X3QgaTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBCVEFfR0FUVENfQ0xDQl9NQVg7IGkgKyspCiAgICAgewpAQCAtODg3LDEwICs4ODcsMTAgQEAKIHZvaWQgYnRhX2dhdHRjX3NldF9kaXNjb3Zlcl9zdCh0QlRBX0dBVFRDX1NFUlYgKnBfc3JjYikKIHsKICAgICB0QlRBX0dBVFRDX0NCICAgKnBfY2IgPSAmYnRhX2dhdHRjX2NiOwotICAgIFVJTlQ4ICAgaTsKKyAgICB1aW50OF90ICAgaTsKIAotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCi0gICAgTDJDQV9FbmFibGVVcGRhdGVCbGVDb25uUGFyYW1zKHBfc3JjYi0+c2VydmVyX2JkYSwgRkFMU0UpOworI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKKyAgICBMMkNBX0VuYWJsZVVwZGF0ZUJsZUNvbm5QYXJhbXMocF9zcmNiLT5zZXJ2ZXJfYmRhLCBmYWxzZSk7CiAjZW5kaWYKICAgICBmb3IgKGkgPSAwOyBpIDwgQlRBX0dBVFRDX0NMQ0JfTUFYOyBpICsrKQogICAgIHsKQEAgLTk3NCwxMiArOTc0LDEyIEBACiAgICAgICAgIGlmIChwX2NsY2ItPnBfc3JjYiAhPSBOVUxMKQogICAgICAgICB7CiAgICAgICAgICAgICAvKiBjbGVhciB0aGUgc2VydmljZSBjaGFuZ2UgbWFzayAqLwotICAgICAgICAgICAgcF9jbGNiLT5wX3NyY2ItPnNydmNfaGRsX2NoZyA9IEZBTFNFOworICAgICAgICAgICAgcF9jbGNiLT5wX3NyY2ItPnNydmNfaGRsX2NoZyA9IGZhbHNlOwogICAgICAgICAgICAgcF9jbGNiLT5wX3NyY2ItPnVwZGF0ZV9jb3VudCA9IDA7CiAgICAgICAgICAgICBwX2NsY2ItPnBfc3JjYi0+c3RhdGUgPSBCVEFfR0FUVENfU0VSVl9ESVNDX0FDVDsKIAogICAgICAgICAgICAgaWYgKHBfY2xjYi0+dHJhbnNwb3J0ID09IEJUQV9UUkFOU1BPUlRfTEUpCi0gICAgICAgICAgICAgICAgTDJDQV9FbmFibGVVcGRhdGVCbGVDb25uUGFyYW1zKHBfY2xjYi0+cF9zcmNiLT5zZXJ2ZXJfYmRhLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgTDJDQV9FbmFibGVVcGRhdGVCbGVDb25uUGFyYW1zKHBfY2xjYi0+cF9zcmNiLT5zZXJ2ZXJfYmRhLCBmYWxzZSk7CiAKICAgICAgICAgICAgIC8qIHNldCBhbGwgc3JjYiByZWxhdGVkIGNsY2IgaW50byBkaXNjb3ZlcnkgU1QgKi8KICAgICAgICAgICAgIGJ0YV9nYXR0Y19zZXRfZGlzY292ZXJfc3QocF9jbGNiLT5wX3NyY2IpOwpAQCAtOTk1LDcgKzk5NSw3IEBACiAgICAgICAgICAgICAgICAgYnRhX2dhdHRjX3Jlc2V0X2Rpc2NvdmVyX3N0KHBfY2xjYi0+cF9zcmNiLCBwX2NsY2ItPnN0YXR1cyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcF9jbGNiLT5kaXNjX2FjdGl2ZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgcF9jbGNiLT5kaXNjX2FjdGl2ZSA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CkBAIC0xMDI4LDEyICsxMDI4LDEyIEBACiAKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfZ2F0dGNfZGlzY19jbXBsIGNvbm5faWQ9JWQiLHBfY2xjYi0+YnRhX2Nvbm5faWQpOwogCi0jaWYgQkxFX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUpCiAgICAgaWYocF9jbGNiLT50cmFuc3BvcnQgPT0gQlRBX1RSQU5TUE9SVF9MRSkKLSAgICAgICAgTDJDQV9FbmFibGVVcGRhdGVCbGVDb25uUGFyYW1zKHBfY2xjYi0+cF9zcmNiLT5zZXJ2ZXJfYmRhLCBUUlVFKTsKKyAgICAgICAgTDJDQV9FbmFibGVVcGRhdGVCbGVDb25uUGFyYW1zKHBfY2xjYi0+cF9zcmNiLT5zZXJ2ZXJfYmRhLCB0cnVlKTsKICNlbmRpZgogICAgIHBfY2xjYi0+cF9zcmNiLT5zdGF0ZSA9IEJUQV9HQVRUQ19TRVJWX0lETEU7Ci0gICAgcF9jbGNiLT5kaXNjX2FjdGl2ZSA9IEZBTFNFOworICAgIHBfY2xjYi0+ZGlzY19hY3RpdmUgPSBmYWxzZTsKIAogICAgIGlmIChwX2NsY2ItPnN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpCiAgICAgewpAQCAtMTEyNSw3ICsxMTI1LDcgQEAKICAgICAgICAgICAgIHJlYWRfcGFyYW0ucmVhZF9tdWx0aXBsZS5udW1faGFuZGxlcyA9IHBfZGF0YS0+YXBpX3JlYWRfbXVsdGkubnVtX2F0dHI7CiAgICAgICAgICAgICByZWFkX3BhcmFtLnJlYWRfbXVsdGlwbGUuYXV0aF9yZXEgPSBwX2RhdGEtPmFwaV9yZWFkX211bHRpLmF1dGhfcmVxOwogICAgICAgICAgICAgbWVtY3B5KCZyZWFkX3BhcmFtLnJlYWRfbXVsdGlwbGUuaGFuZGxlcywgcF9kYXRhLT5hcGlfcmVhZF9tdWx0aS5oYW5kbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihVSU5UMTYpICogcF9kYXRhLT5hcGlfcmVhZF9tdWx0aS5udW1fYXR0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQxNl90KSAqIHBfZGF0YS0+YXBpX3JlYWRfbXVsdGkubnVtX2F0dHIpOwogCiAgICAgICAgICAgICBzdGF0dXMgPSBHQVRUQ19SZWFkKHBfY2xjYi0+YnRhX2Nvbm5faWQsIEdBVFRfUkVBRF9NVUxUSVBMRSwgJnJlYWRfcGFyYW0pOwogICAgICAgICB9CkBAIC0xMjE2LDcgKzEyMTYsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2dhdHRjX2NvbmZpcm0odEJUQV9HQVRUQ19DTENCICpwX2NsY2IsIHRCVEFfR0FUVENfREFUQSAqcF9kYXRhKQogewotICAgIFVJTlQxNiBoYW5kbGUgPSBwX2RhdGEtPmFwaV9jb25maXJtLmhhbmRsZTsKKyAgICB1aW50MTZfdCBoYW5kbGUgPSBwX2RhdGEtPmFwaV9jb25maXJtLmhhbmRsZTsKIAogICAgIGlmIChHQVRUQ19TZW5kSGFuZGxlVmFsdWVDb25maXJtKHBfZGF0YS0+YXBpX2NvbmZpcm0uaGRyLmxheWVyX3NwZWNpZmljLCBoYW5kbGUpCiAgICAgICAgICE9IEdBVFRfU1VDQ0VTUykgewpAQCAtMTI0MCw3ICsxMjQwLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9nYXR0Y19yZWFkX2NtcGwodEJUQV9HQVRUQ19DTENCICpwX2NsY2IsIHRCVEFfR0FUVENfT1BfQ01QTCAqcF9kYXRhKQogewotICAgIFVJTlQ4ICAgICAgICAgICAgICAgZXZlbnQ7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIGV2ZW50OwogICAgIHRCVEFfR0FUVEMgICAgICAgICAgY2JfZGF0YTsKICAgICB0QlRBX0dBVFRfVU5GTVQgICAgIHJlYWRfdmFsdWU7CiAKQEAgLTEyODAsNyArMTI4MCw3IEBACiB2b2lkIGJ0YV9nYXR0Y193cml0ZV9jbXBsKHRCVEFfR0FUVENfQ0xDQiAqcF9jbGNiLCB0QlRBX0dBVFRDX09QX0NNUEwgKnBfZGF0YSkKIHsKICAgICB0QlRBX0dBVFRDICAgICAgY2JfZGF0YSA9IHswfTsKLSAgICBVSU5UOCAgICAgICAgICBldmVudDsKKyAgICB1aW50OF90ICAgICAgICAgIGV2ZW50OwogCiAgICAgbWVtc2V0KCZjYl9kYXRhLCAwLCBzaXplb2YodEJUQV9HQVRUQykpOwogCkBAIC0xMzYzLDggKzEzNjMsOCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgIGJ0YV9nYXR0Y19vcF9jbXBsKHRCVEFfR0FUVENfQ0xDQiAqcF9jbGNiLCB0QlRBX0dBVFRDX0RBVEEgKnBfZGF0YSkKIHsKLSAgICBVSU5UOCAgICAgICAgICAgb3AgPSAoVUlOVDgpcF9kYXRhLT5vcF9jbXBsLm9wX2NvZGU7Ci0gICAgVUlOVDggICAgICAgICAgIG1hcHBlZF9vcCA9IDA7CisgICAgdWludDhfdCAgICAgICAgICAgb3AgPSAodWludDhfdClwX2RhdGEtPm9wX2NtcGwub3BfY29kZTsKKyAgICB1aW50OF90ICAgICAgICAgICBtYXBwZWRfb3AgPSAwOwogCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2dhdHRjX29wX2NtcGwgb3AgPSAlZCIsIG9wKTsKIApAQCAtMTU0Miw4ICsxNTQyLDggQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZ2F0dGNfY29ubl9jYmFjayh0R0FUVF9JRiBnYXR0Y19pZiwgQkRfQUREUiBiZGEsIFVJTlQxNiBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTEVBTiBjb25uZWN0ZWQsIHRHQVRUX0RJU0NPTk5fUkVBU09OIHJlYXNvbiwKK3N0YXRpYyB2b2lkIGJ0YV9nYXR0Y19jb25uX2NiYWNrKHRHQVRUX0lGIGdhdHRjX2lmLCBCRF9BRERSIGJkYSwgdWludDE2X3QgY29ubl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29ubmVjdGVkLCB0R0FUVF9ESVNDT05OX1JFQVNPTiByZWFzb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkKIHsKICAgICBpZiAocmVhc29uICE9IDApIHsKQEAgLTE1ODksNyArMTU4OSw3IEBACiAgICAgaWYgKHBfY2xjYiA9PSBOVUxMKQogICAgICAgICByZXR1cm47CiAKLSNpZiAoZGVmaW5lZCBCVEFfSEhfTEVfSU5DTFVERUQgJiYgQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9ISF9MRV9JTkNMVURFRCA9PSBUUlVFKQogICAgIC8qIGZpbHRlciB0aGlzIGV2ZW50IGp1c3QgZm9yIEJUQSBISCBMRSBHQVRUIGNsaWVudCwKICAgICAgICBJbiB0aGUgZnV0dXJlLCBpZiB3ZSB3YW50IHRvIGVuYWJsZSBlbmNyeXB0aW9uIGNvbXBsZXRlIGV2ZW50CiAgICAgICAgZm9yIGFsbCBHQVRUIGNsaWVudHMsIHdlIGNhbiByZW1vdmUgdGhpcyBjb2RlICovCkBAIC0xNjI1LDggKzE2MjUsOCBAQAogewogICAgIHRCVEFfR0FUVENfU0VSViAqcF9zcnZjX2NiID0gYnRhX2dhdHRjX2ZpbmRfc3J2cl9jYWNoZShwX21zZy0+YXBpX2Nvbm4ucmVtb3RlX2JkYSk7CiAgICAgdEJUQV9HQVRUQ19DTENCICAgICAgKnBfY2xjYiA9ICZidGFfZ2F0dGNfY2IuY2xjYlswXTsKLSAgICBCT09MRUFOICAgICAgICAgZm91bmQgPSBGQUxTRTsKLSAgICBVSU5UOCAgICAgICAgICAgaTsKKyAgICBib29sICAgICAgICAgZm91bmQgPSBmYWxzZTsKKyAgICB1aW50OF90ICAgICAgICAgICBpOwogICAgIFVOVVNFRChwX2NiKTsKIAogICAgIGlmIChwX3NydmNfY2IgIT0gTlVMTCkKQEAgLTE2MzgsNyArMTYzOCw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKHBfY2xjYi0+aW5fdXNlICYmIHBfY2xjYi0+cF9zcmNiID09IHBfc3J2Y19jYikKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xNjY3LDcgKzE2NjcsNyBAQAogKiogUmV0dXJucyAgICAgICAgICBOb25lLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9nYXR0Y19wcm9jZXNzX3NydmNfY2hnX2luZChVSU5UMTYgY29ubl9pZCwKK2Jvb2wgYnRhX2dhdHRjX3Byb2Nlc3Nfc3J2Y19jaGdfaW5kKHVpbnQxNl90IGNvbm5faWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRDX1JDQiAgICAgICpwX2NscmNiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9HQVRUQ19TRVJWICAgICAqcF9zcmNiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9HQVRUQ19DTENCICAgICAgKnBfY2xjYiwKQEAgLTE2NzUsOCArMTY3NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9WQUxVRSAqYXR0X3ZhbHVlKQogewogICAgIHRCVF9VVUlEICAgICAgICBnYXR0cF91dWlkLCBzcnZjX2NoZ191dWlkOwotICAgIEJPT0xFQU4gICAgICAgICBwcm9jZXNzZWQgPSBGQUxTRTsKLSAgICBVSU5UOCAgICAgICAgICAgaTsKKyAgICBib29sICAgICAgICAgcHJvY2Vzc2VkID0gZmFsc2U7CisgICAgdWludDhfdCAgICAgICAgICAgaTsKIAogICAgIGdhdHRwX3V1aWQubGVuID0gMjsKICAgICBnYXR0cF91dWlkLnV1LnV1aWQxNiA9IFVVSURfU0VSVkNMQVNTX0dBVFRfU0VSVkVSOwpAQCAtMTY4NSwyNCArMTY4NSwyNCBAQAogICAgIHNydmNfY2hnX3V1aWQudXUudXVpZDE2ID0gR0FUVF9VVUlEX0dBVFRfU1JWX0NIR0Q7CiAKICAgICBjb25zdCB0QlRBX0dBVFRDX0NIQVJBQ1RFUklTVElDICpwX2NoYXIgPSBidGFfZ2F0dGNfZ2V0X2NoYXJhY3RlcmlzdGljX3NyY2IocF9zcmNiLCBwX25vdGlmeS0+aGFuZGxlKTsKLSAgICBpZiAocF9jaGFyICYmIGJ0YV9nYXR0Y191dWlkX2NvbXBhcmUoJnBfY2hhci0+c2VydmljZS0+dXVpZCwgJmdhdHRwX3V1aWQsIFRSVUUpICYmCi0gICAgICAgIGJ0YV9nYXR0Y191dWlkX2NvbXBhcmUoJnBfY2hhci0+dXVpZCwgJnNydmNfY2hnX3V1aWQsIFRSVUUpKQorICAgIGlmIChwX2NoYXIgJiYgYnRhX2dhdHRjX3V1aWRfY29tcGFyZSgmcF9jaGFyLT5zZXJ2aWNlLT51dWlkLCAmZ2F0dHBfdXVpZCwgdHJ1ZSkgJiYKKyAgICAgICAgYnRhX2dhdHRjX3V1aWRfY29tcGFyZSgmcF9jaGFyLT51dWlkLCAmc3J2Y19jaGdfdXVpZCwgdHJ1ZSkpCiAgICAgewogICAgICAgICBpZiAoYXR0X3ZhbHVlLT5sZW4gIT0gQlRBX0dBVFRDX1NFUlZJQ0VfQ0hBTkdFRF9MRU4pIHsKICAgICAgICAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiByZWNlaXZlZCBtYWxmb3JtZWQgc2VydmljZSBjaGFuZ2VkIGluZGljYXRpb24sIHNraXBwaW5nIiwgX19mdW5jX18pOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgVUlOVDggKnAgPSBhdHRfdmFsdWUtPnZhbHVlOwotICAgICAgICBVSU5UMTYgc19oYW5kbGUgPSAoKFVJTlQxNikoKihwICAgICkpICsgKCgoVUlOVDE2KSgqKHAgKyAxKSkpIDw8IDgpKTsKLSAgICAgICAgVUlOVDE2IGVfaGFuZGxlID0gKChVSU5UMTYpKCoocCArIDIpKSArICgoKFVJTlQxNikoKihwICsgMykpKSA8PCA4KSk7CisgICAgICAgIHVpbnQ4X3QgKnAgPSBhdHRfdmFsdWUtPnZhbHVlOworICAgICAgICB1aW50MTZfdCBzX2hhbmRsZSA9ICgodWludDE2X3QpKCoocCAgICApKSArICgoKHVpbnQxNl90KSgqKHAgKyAxKSkpIDw8IDgpKTsKKyAgICAgICAgdWludDE2X3QgZV9oYW5kbGUgPSAoKHVpbnQxNl90KSgqKHAgKyAyKSkgKyAoKCh1aW50MTZfdCkoKihwICsgMykpKSA8PCA4KSk7CiAKICAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IHNlcnZpY2UgY2hhbmdlZCBzX2hhbmRsZToweCUwNHggZV9oYW5kbGU6MHglMDR4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc19oYW5kbGUsIGVfaGFuZGxlKTsKIAotICAgICAgICBwcm9jZXNzZWQgPSBUUlVFOworICAgICAgICBwcm9jZXNzZWQgPSB0cnVlOwogICAgICAgICAvKiBtYXJrIHNlcnZpY2UgaGFuZGxlIGNoYW5nZSBwZW5kaW5nICovCi0gICAgICAgIHBfc3JjYi0+c3J2Y19oZGxfY2hnID0gVFJVRTsKKyAgICAgICAgcF9zcmNiLT5zcnZjX2hkbF9jaGcgPSB0cnVlOwogICAgICAgICAvKiBjbGVhciB1cCBhbGwgbm90aWZpY2F0aW9uL2luZGljYXRpb24gcmVnaXN0cmF0aW9uICovCiAgICAgICAgIGJ0YV9nYXR0Y19jbGVhcl9ub3RpZl9yZWdpc3RyYXRpb24ocF9zcmNiLCBjb25uX2lkLCBzX2hhbmRsZSwgZV9oYW5kbGUpOwogICAgICAgICAvKiBzZXJ2aWNlIGNoYW5nZSBpbmRpY2F0aW9uIGFsbCByZWNlaXZlZCwgZG8gZGlzY292ZXJ5IHVwZGF0ZSAqLwpAQCAtMTc1MCw3ICsxNzUwLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgTm9uZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZ2F0dGNfcHJvY19vdGhlcl9pbmRpY2F0aW9uKHRCVEFfR0FUVENfQ0xDQiAqcF9jbGNiLCBVSU5UOCBvcCwKK3ZvaWQgYnRhX2dhdHRjX3Byb2Nfb3RoZXJfaW5kaWNhdGlvbih0QlRBX0dBVFRDX0NMQ0IgKnBfY2xjYiwgdWludDhfdCBvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9DTF9DT01QTEVURSAqcF9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVENfTk9USUZZICpwX25vdGlmeSkKIHsKQEAgLTE3NTksNyArMTc1OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+YXR0X3ZhbHVlLmhhbmRsZSwgcF9kYXRhLT5oYW5kbGUpOwogICAgIEFQUExfVFJBQ0VfREVCVUcoImlzX25vdGlmeSIsIHBfbm90aWZ5LT5pc19ub3RpZnkpOwogCi0gICAgcF9ub3RpZnktPmlzX25vdGlmeSA9IChvcCA9PSBHQVRUQ19PUFRZUEVfSU5ESUNBVElPTikgPyBGQUxTRSA6IFRSVUU7CisgICAgcF9ub3RpZnktPmlzX25vdGlmeSA9IChvcCA9PSBHQVRUQ19PUFRZUEVfSU5ESUNBVElPTikgPyBmYWxzZSA6IHRydWU7CiAgICAgcF9ub3RpZnktPmxlbiA9IHBfZGF0YS0+YXR0X3ZhbHVlLmxlbjsKICAgICBiZGNweShwX25vdGlmeS0+YmRhLCBwX2NsY2ItPmJkYSk7CiAgICAgbWVtY3B5KHBfbm90aWZ5LT52YWx1ZSwgcF9kYXRhLT5hdHRfdmFsdWUudmFsdWUsIHBfZGF0YS0+YXR0X3ZhbHVlLmxlbik7CkBAIC0xNzc4LDkgKzE3NzgsOSBAQAogKiogUmV0dXJucyAgICAgICAgICBOb25lLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9nYXR0Y19wcm9jZXNzX2luZGljYXRlKFVJTlQxNiBjb25uX2lkLCB0R0FUVENfT1BUWVBFIG9wLCB0R0FUVF9DTF9DT01QTEVURSAqcF9kYXRhKQordm9pZCBidGFfZ2F0dGNfcHJvY2Vzc19pbmRpY2F0ZSh1aW50MTZfdCBjb25uX2lkLCB0R0FUVENfT1BUWVBFIG9wLCB0R0FUVF9DTF9DT01QTEVURSAqcF9kYXRhKQogewotICAgIFVJTlQxNiAgICAgICAgICAgICAgaGFuZGxlID0gcF9kYXRhLT5hdHRfdmFsdWUuaGFuZGxlOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBoYW5kbGUgPSBwX2RhdGEtPmF0dF92YWx1ZS5oYW5kbGU7CiAgICAgdEJUQV9HQVRUQ19DTENCICAgICAqcF9jbGNiIDsKICAgICB0QlRBX0dBVFRDX1JDQiAgICAgICpwX2NscmNiID0gTlVMTDsKICAgICB0QlRBX0dBVFRDX1NFUlYgICAgICpwX3NyY2IgPSBOVUxMOwpAQCAtMTg1OCw3ICsxODU4LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgTm9uZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgIGJ0YV9nYXR0Y19jbXBsX2NiYWNrKFVJTlQxNiBjb25uX2lkLCB0R0FUVENfT1BUWVBFIG9wLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAorc3RhdGljIHZvaWQgIGJ0YV9nYXR0Y19jbXBsX2NiYWNrKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUQ19PUFRZUEUgb3AsIHRHQVRUX1NUQVRVUyBzdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfQ0xfQ09NUExFVEUgKnBfZGF0YSkKIHsKICAgICB0QlRBX0dBVFRDX0NMQ0IgICAgICpwX2NsY2I7CkBAIC0xODk3LDcgKzE4OTcsNyBAQAogKiogUmV0dXJucyAgICAgICAgICBOb25lLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZ2F0dGNfY21wbF9zZW5kbXNnKFVJTlQxNiBjb25uX2lkLCB0R0FUVENfT1BUWVBFIG9wLAorc3RhdGljIHZvaWQgYnRhX2dhdHRjX2NtcGxfc2VuZG1zZyh1aW50MTZfdCBjb25uX2lkLCB0R0FUVENfT1BUWVBFIG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRfU1RBVFVTIHN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfQ0xfQ09NUExFVEUgKnBfZGF0YSkKIHsKQEAgLTE5MjYsNyArMTkyNiw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9nYXR0Y19jb25nX2NiYWNrIChVSU5UMTYgY29ubl9pZCwgQk9PTEVBTiBjb25nZXN0ZWQpCitzdGF0aWMgdm9pZCBidGFfZ2F0dGNfY29uZ19jYmFjayAodWludDE2X3QgY29ubl9pZCwgYm9vbCBjb25nZXN0ZWQpCiB7CiAgICAgdEJUQV9HQVRUQ19DTENCICpwX2NsY2I7CiAgICAgdEJUQV9HQVRUQyBjYl9kYXRhOwpAQCAtMTk0Myw3ICsxOTQzLDcgQEAKICAgICB9CiB9CiAKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgogKiogRnVuY3Rpb24gICAgICAgICBidGFfZ2F0dGNfaW5pdF9jbGNiX2Nvbm4KQEAgLTE5NTMsMTQgKzE5NTMsMTQgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZ2F0dGNfaW5pdF9jbGNiX2Nvbm4oVUlOVDggY2lmLCBCRF9BRERSIHJlbW90ZV9iZGEpCit2b2lkIGJ0YV9nYXR0Y19pbml0X2NsY2JfY29ubih1aW50OF90IGNpZiwgQkRfQUREUiByZW1vdGVfYmRhKQogewogICAgIHRCVEFfR0FUVENfQ0xDQiAgICAgKnBfY2xjYiA9IE5VTEw7CiAgICAgdEJUQV9HQVRUQ19EQVRBICAgICBnYXR0Y19kYXRhOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgY29ubl9pZDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgY29ubl9pZDsKIAogICAgIC8qIHNob3VsZCBhbHdheXMgZ2V0IHRoZSBjb25uZWN0aW9uIElEICovCi0gICAgaWYgKEdBVFRfR2V0Q29ubklkSWZDb25uZWN0ZWQoY2lmLCByZW1vdGVfYmRhLCAmY29ubl9pZCwgQlRBX0dBVFRfVFJBTlNQT1JUX0xFKSA9PSBGQUxTRSkKKyAgICBpZiAoR0FUVF9HZXRDb25uSWRJZkNvbm5lY3RlZChjaWYsIHJlbW90ZV9iZGEsICZjb25uX2lkLCBCVEFfR0FUVF9UUkFOU1BPUlRfTEUpID09IGZhbHNlKQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigiYnRhX2dhdHRjX2luaXRfY2xjYl9jb25uIEVSUk9SOiBub3QgYSBjb25uZWN0ZWQgZGV2aWNlIik7CiAgICAgICAgIHJldHVybjsKQEAgLTE5NzMsNyArMTk3Myw3IEBACiAKICAgICAgICAgZ2F0dGNfZGF0YS5hcGlfY29ubi5jbGllbnRfaWYgPSBjaWY7CiAgICAgICAgIG1lbWNweShnYXR0Y19kYXRhLmFwaV9jb25uLnJlbW90ZV9iZGEsIHJlbW90ZV9iZGEsIEJEX0FERFJfTEVOKTsKLSAgICAgICAgZ2F0dGNfZGF0YS5hcGlfY29ubi5pc19kaXJlY3QgPSBUUlVFOworICAgICAgICBnYXR0Y19kYXRhLmFwaV9jb25uLmlzX2RpcmVjdCA9IHRydWU7CiAKICAgICAgICAgYnRhX2dhdHRjX3NtX2V4ZWN1dGUocF9jbGNiLCBCVEFfR0FUVENfQVBJX09QRU5fRVZULCAmZ2F0dGNfZGF0YSk7CiAgICAgfQpAQCAtMTk5Miw5ICsxOTkyLDkgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZ2F0dGNfcHJvY2Vzc19saXN0ZW5fYWxsKFVJTlQ4IGNpZikKK3ZvaWQgYnRhX2dhdHRjX3Byb2Nlc3NfbGlzdGVuX2FsbCh1aW50OF90IGNpZikKIHsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGlfY29ubiA9IDA7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIGlfY29ubiA9IDA7CiAgICAgdEJUQV9HQVRUQ19DT05OICAgICAqcF9jb25uID0gJmJ0YV9nYXR0Y19jYi5jb25uX3RyYWNrWzBdOwogCiAgICAgZm9yIChpX2Nvbm4gPSAwOyBpX2Nvbm4gPCBCVEFfR0FUVENfQ09OTl9NQVg7IGlfY29ubisrLCBwX2Nvbm4gKyspCkBAIC0yMDM3LDcgKzIwMzcsNyBAQAogICAgIGlmIChidGFfZ2F0dGNfbWFya19iZ19jb25uKHBfbXNnLT5hcGlfbGlzdGVuLmNsaWVudF9pZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQkRfQUREUl9QVFIpIHBfbXNnLT5hcGlfbGlzdGVuLnJlbW90ZV9iZGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tc2ctPmFwaV9saXN0ZW4uc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkpCiAgICAgewogICAgICAgICBpZiAoIUdBVFRfTGlzdGVuKHBfbXNnLT5hcGlfbGlzdGVuLmNsaWVudF9pZiwKICAgICAgICAgICAgICAgICAgICAgICAgICBwX21zZy0+YXBpX2xpc3Rlbi5zdGFydCwKQEAgLTIxMDMsNSArMjEwMyw1IEBACiAgICAgaWYgKHBfY2xyZWcgJiYgcF9jbHJlZy0+cF9jYmFjaykKICAgICAgICAgKCpwX2NscmVnLT5wX2NiYWNrKShCVEFfR0FUVENfTElTVEVOX0VWVCwgJmNiX2RhdGEpOwogfQotI2VuZGlmCi0jZW5kaWYKKyNlbmRpZiAvLyBCTEVfSU5DTFVERUQKKyNlbmRpZiAvLyBCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFICYmIEJMRV9JTkNMVURFRCA9PSBUUlVFCmRpZmYgLS1naXQgYS9idGEvZ2F0dC9idGFfZ2F0dGNfYXBpLmNjIGIvYnRhL2dhdHQvYnRhX2dhdHRjX2FwaS5jYwppbmRleCBlNTNjMzljLi40Yjg4NzgxIDEwMDY0NAotLS0gYS9idGEvZ2F0dC9idGFfZ2F0dGNfYXBpLmNjCisrKyBiL2J0YS9nYXR0L2J0YV9nYXR0Y19hcGkuY2MKQEAgLTI0LDcgKzI0LDcgQEAKIAogI2luY2x1ZGUgImJ0X3RhcmdldC5oIgogCi0jaWYgZGVmaW5lZChCVEFfR0FUVF9JTkNMVURFRCkgJiYgKEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJidF9jb21tb24uaCIKQEAgLTU2LDcgKzU2LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIEJUQV9HQVRUQ19EaXNhYmxlKHZvaWQpCiB7Ci0gICAgaWYgKGJ0YV9zeXNfaXNfcmVnaXN0ZXIoQlRBX0lEX0dBVFRDKSA9PSBGQUxTRSkKKyAgICBpZiAoYnRhX3N5c19pc19yZWdpc3RlcihCVEFfSURfR0FUVEMpID09IGZhbHNlKQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HKCJHQVRUQyBNb2R1bGUgbm90IGVuYWJsZWQvYWxyZWFkeSBkaXNhYmxlZCIpOwogICAgICAgICByZXR1cm47CkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgdEJUQV9HQVRUQ19BUElfUkVHICpwX2J1ZiA9CiAgICAgICAgICh0QlRBX0dBVFRDX0FQSV9SRUcgKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0dBVFRDX0FQSV9SRUcpKTsKIAotICAgIGlmIChidGFfc3lzX2lzX3JlZ2lzdGVyKEJUQV9JRF9HQVRUQykgPT0gRkFMU0UpCisgICAgaWYgKGJ0YV9zeXNfaXNfcmVnaXN0ZXIoQlRBX0lEX0dBVFRDKSA9PSBmYWxzZSkKICAgICAgICAgYnRhX3N5c19yZWdpc3RlcihCVEFfSURfR0FUVEMsICZidGFfZ2F0dGNfcmVnKTsKIAogICAgIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfR0FUVENfQVBJX1JFR19FVlQ7CkBAIC0xMzcsNyArMTM3LDcgQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBCVEFfR0FUVENfT3Blbih0QlRBX0dBVFRDX0lGIGNsaWVudF9pZiwgQkRfQUREUiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICBCT09MRUFOIGlzX2RpcmVjdCwgdEJUQV9HQVRUX1RSQU5TUE9SVCB0cmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZGlyZWN0LCB0QlRBX0dBVFRfVFJBTlNQT1JUIHRyYW5zcG9ydCkKIHsKICAgICB0QlRBX0dBVFRDX0FQSV9PUEVOICpwX2J1ZiA9CiAgICAgICAgKHRCVEFfR0FUVENfQVBJX09QRU4gKikgb3NpX21hbGxvYyhzaXplb2YodEJUQV9HQVRUQ19BUElfT1BFTikpOwpAQCAtMTY1LDcgKzE2NSw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfR0FUVENfQ2FuY2VsT3Blbih0QlRBX0dBVFRDX0lGIGNsaWVudF9pZiwgQkRfQUREUiByZW1vdGVfYmRhLCBCT09MRUFOIGlzX2RpcmVjdCkKK3ZvaWQgQlRBX0dBVFRDX0NhbmNlbE9wZW4odEJUQV9HQVRUQ19JRiBjbGllbnRfaWYsIEJEX0FERFIgcmVtb3RlX2JkYSwgYm9vbCBpc19kaXJlY3QpCiB7CiAgICAgdEJUQV9HQVRUQ19BUElfQ0FOQ0VMX09QRU4gKnBfYnVmID0KICAgICAgICAgKHRCVEFfR0FUVENfQVBJX0NBTkNFTF9PUEVOICopb3NpX21hbGxvYyhzaXplb2YodEJUQV9HQVRUQ19BUElfQ0FOQ0VMX09QRU4pKTsKQEAgLTE4OSw3ICsxODksNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRDX0Nsb3NlKFVJTlQxNiBjb25uX2lkKQordm9pZCBCVEFfR0FUVENfQ2xvc2UodWludDE2X3QgY29ubl9pZCkKIHsKICAgICBCVF9IRFIgKnBfYnVmID0gKEJUX0hEUiAqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUikpOwogCkBAIC0yMTIsNyArMjEyLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9HQVRUQ19Db25maWd1cmVNVFUgKFVJTlQxNiBjb25uX2lkLCBVSU5UMTYgbXR1KQordm9pZCBCVEFfR0FUVENfQ29uZmlndXJlTVRVICh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBtdHUpCiB7CiAgICAgdEJUQV9HQVRUQ19BUElfQ0ZHX01UVSAqcF9idWYgPQogICAgICAgICAodEJUQV9HQVRUQ19BUElfQ0ZHX01UVSAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfR0FUVENfQVBJX0NGR19NVFUpKTsKQEAgLTI0MCw3ICsyNDAsNyBAQAogKiogUmV0dXJucyAgICAgICAgICBOb25lCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRDX1NlcnZpY2VTZWFyY2hSZXF1ZXN0IChVSU5UMTYgY29ubl9pZCwgdEJUX1VVSUQgKnBfc3J2Y191dWlkKQordm9pZCBCVEFfR0FUVENfU2VydmljZVNlYXJjaFJlcXVlc3QgKHVpbnQxNl90IGNvbm5faWQsIHRCVF9VVUlEICpwX3NydmNfdXVpZCkKIHsKICAgICBjb25zdCBzaXplX3QgbGVuID0gc2l6ZW9mKHRCVEFfR0FUVENfQVBJX1NFQVJDSCkgKyBzaXplb2YodEJUX1VVSUQpOwogICAgIHRCVEFfR0FUVENfQVBJX1NFQVJDSCAqcF9idWYgPSAodEJUQV9HQVRUQ19BUElfU0VBUkNIICopb3NpX2NhbGxvYyhsZW4pOwpAQCAtMjY4LDcgKzI2OCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHJldHVybnMgbGlzdF90IG9mIHRCVEFfR0FUVENfU0VSVklDRSBvciBOVUxMLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBsaXN0X3QqIEJUQV9HQVRUQ19HZXRTZXJ2aWNlcyhVSU5UMTYgY29ubl9pZCkgeworY29uc3QgbGlzdF90KiBCVEFfR0FUVENfR2V0U2VydmljZXModWludDE2X3QgY29ubl9pZCkgewogICAgIHJldHVybiBidGFfZ2F0dGNfZ2V0X3NlcnZpY2VzKGNvbm5faWQpOwogfQogCkBAIC0yODQsNyArMjg0LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgcmV0dXJucyBwb2ludGVyIHRvIHRCVEFfR0FUVENfQ0hBUkFDVEVSSVNUSUMgb3IgTlVMTC4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgdEJUQV9HQVRUQ19DSEFSQUNURVJJU1RJQyogQlRBX0dBVFRDX0dldENoYXJhY3RlcmlzdGljKFVJTlQxNiBjb25uX2lkLCBVSU5UMTYgaGFuZGxlKSB7Citjb25zdCB0QlRBX0dBVFRDX0NIQVJBQ1RFUklTVElDKiBCVEFfR0FUVENfR2V0Q2hhcmFjdGVyaXN0aWModWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlKSB7CiAgICAgcmV0dXJuIGJ0YV9nYXR0Y19nZXRfY2hhcmFjdGVyaXN0aWMoY29ubl9pZCwgaGFuZGxlKTsKIH0KIApAQCAtMzAwLDcgKzMwMCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHJldHVybnMgcG9pbnRlciB0byB0QlRBX0dBVFRDX0RFU0NSSVBUT1Igb3IgTlVMTC4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgdEJUQV9HQVRUQ19ERVNDUklQVE9SKiBCVEFfR0FUVENfR2V0RGVzY3JpcHRvcihVSU5UMTYgY29ubl9pZCwgVUlOVDE2IGhhbmRsZSkgeworY29uc3QgdEJUQV9HQVRUQ19ERVNDUklQVE9SKiBCVEFfR0FUVENfR2V0RGVzY3JpcHRvcih1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUpIHsKICAgICByZXR1cm4gYnRhX2dhdHRjX2dldF9kZXNjcmlwdG9yKGNvbm5faWQsIGhhbmRsZSk7CiB9CiAKQEAgLTMxNiw3ICszMTYsNyBAQAogKiogICAgICAgICAgICAgICAgICBjb3VudDogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGRhdGFiYXNlLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICBCVEFfR0FUVENfR2V0R2F0dERiKFVJTlQxNiBjb25uX2lkLCBVSU5UMTYgc3RhcnRfaGFuZGxlLCBVSU5UMTYgZW5kX2hhbmRsZSwKK3ZvaWQgIEJUQV9HQVRUQ19HZXRHYXR0RGIodWludDE2X3QgY29ubl9pZCwgdWludDE2X3Qgc3RhcnRfaGFuZGxlLCB1aW50MTZfdCBlbmRfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBidGdhdHRfZGJfZWxlbWVudF90ICoqZGIsIGludCAqY291bnQpCiB7CiAgICAgYnRhX2dhdHRjX2dldF9nYXR0X2RiKGNvbm5faWQsIHN0YXJ0X2hhbmRsZSwgZW5kX2hhbmRsZSwgZGIsIGNvdW50KTsKQEAgLTMzNCw3ICszMzQsNyBAQAogKiogUmV0dXJucyAgICAgICAgICBOb25lCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRDX1JlYWRDaGFyYWN0ZXJpc3RpYyhVSU5UMTYgY29ubl9pZCwgVUlOVDE2IGhhbmRsZSwgdEJUQV9HQVRUX0FVVEhfUkVRIGF1dGhfcmVxKQordm9pZCBCVEFfR0FUVENfUmVhZENoYXJhY3RlcmlzdGljKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSwgdEJUQV9HQVRUX0FVVEhfUkVRIGF1dGhfcmVxKQogewogICAgIHRCVEFfR0FUVENfQVBJX1JFQUQgKnBfYnVmID0KICAgICAgICAgKHRCVEFfR0FUVENfQVBJX1JFQUQgKilvc2lfY2FsbG9jKHNpemVvZih0QlRBX0dBVFRDX0FQSV9SRUFEKSk7CkBAIC0zNjAsNyArMzYwLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgTm9uZQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9HQVRUQ19SZWFkQ2hhckRlc2NyIChVSU5UMTYgY29ubl9pZCwgVUlOVDE2IGhhbmRsZSwgdEJUQV9HQVRUX0FVVEhfUkVRIGF1dGhfcmVxKQordm9pZCBCVEFfR0FUVENfUmVhZENoYXJEZXNjciAodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLCB0QlRBX0dBVFRfQVVUSF9SRVEgYXV0aF9yZXEpCiB7CiAgICAgdEJUQV9HQVRUQ19BUElfUkVBRCAqcF9idWYgPQogICAgICAgICAodEJUQV9HQVRUQ19BUElfUkVBRCAqKW9zaV9jYWxsb2Moc2l6ZW9mKHRCVEFfR0FUVENfQVBJX1JFQUQpKTsKQEAgLTM4Nyw3ICszODcsNyBAQAogKiogUmV0dXJucyAgICAgICAgICBOb25lCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRDX1JlYWRNdWx0aXBsZShVSU5UMTYgY29ubl9pZCwgdEJUQV9HQVRUQ19NVUxUSSAqcF9yZWFkX211bHRpLAordm9pZCBCVEFfR0FUVENfUmVhZE11bHRpcGxlKHVpbnQxNl90IGNvbm5faWQsIHRCVEFfR0FUVENfTVVMVEkgKnBfcmVhZF9tdWx0aSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRfQVVUSF9SRVEgYXV0aF9yZXEpCiB7CiAgICAgdEJUQV9HQVRUQ19BUElfUkVBRF9NVUxUSSAqcF9idWYgPQpAQCAtMzk5LDcgKzM5OSw3IEBACiAgICAgcF9idWYtPm51bV9hdHRyID0gcF9yZWFkX211bHRpLT5udW1fYXR0cjsKIAogICAgIGlmIChwX2J1Zi0+bnVtX2F0dHIgPiAwKQotICAgICAgICBtZW1jcHkocF9idWYtPmhhbmRsZXMsIHBfcmVhZF9tdWx0aS0+aGFuZGxlcywgc2l6ZW9mKFVJTlQxNikgKiBwX3JlYWRfbXVsdGktPm51bV9hdHRyKTsKKyAgICAgICAgbWVtY3B5KHBfYnVmLT5oYW5kbGVzLCBwX3JlYWRfbXVsdGktPmhhbmRsZXMsIHNpemVvZih1aW50MTZfdCkgKiBwX3JlYWRfbXVsdGktPm51bV9hdHRyKTsKIAogICAgIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7CiB9CkBAIC00MTgsOCArNDE4LDggQEAKICoqIFJldHVybnMgICAgICAgICAgTm9uZQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9HQVRUQ19Xcml0ZUNoYXJWYWx1ZSAoIFVJTlQxNiBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgaGFuZGxlLAordm9pZCBCVEFfR0FUVENfV3JpdGVDaGFyVmFsdWUgKCB1aW50MTZfdCBjb25uX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVENfV1JJVEVfVFlQRSAgd3JpdGVfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVF9BVVRIX1JFUSBhdXRoX3JlcSkKQEAgLTQzNiw3ICs0MzYsNyBAQAogICAgIHBfYnVmLT5sZW4gPSB2YWx1ZS5zaXplKCk7CiAKICAgICBpZiAodmFsdWUuc2l6ZSgpID4gMCkgewotICAgICAgICBwX2J1Zi0+cF92YWx1ZSA9IChVSU5UOCAqKShwX2J1ZiArIDEpOworICAgICAgICBwX2J1Zi0+cF92YWx1ZSA9ICh1aW50OF90ICopKHBfYnVmICsgMSk7CiAgICAgICAgIG1lbWNweShwX2J1Zi0+cF92YWx1ZSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOwogICAgIH0KIApAQCAtNDU3LDggKzQ1Nyw4IEBACiAqKiBSZXR1cm5zICAgICAgICAgIE5vbmUKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfR0FUVENfV3JpdGVDaGFyRGVzY3IgKFVJTlQxNiBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBoYW5kbGUsCit2b2lkIEJUQV9HQVRUQ19Xcml0ZUNoYXJEZXNjciAodWludDE2X3QgY29ubl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9HQVRUQ19XUklURV9UWVBFICB3cml0ZV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVF9BVVRIX1JFUSBhdXRoX3JlcSkKQEAgLTQ3NCw3ICs0NzQsNyBAQAogICAgIHBfYnVmLT53cml0ZV90eXBlID0gd3JpdGVfdHlwZTsKIAogICAgIGlmICh2YWx1ZS5zaXplKCkgIT0gMCkgewotICAgICAgICBwX2J1Zi0+cF92YWx1ZSAgPSAoVUlOVDggKikocF9idWYgKyAxKTsKKyAgICAgICAgcF9idWYtPnBfdmFsdWUgID0gKHVpbnQ4X3QgKikocF9idWYgKyAxKTsKICAgICAgICAgcF9idWYtPmxlbiAgICAgID0gdmFsdWUuc2l6ZSgpOwogICAgICAgICBtZW1jcHkocF9idWYtPnBfdmFsdWUsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKICAgICB9CkBAIC00OTYsOCArNDk2LDggQEAKICoqIFJldHVybnMgICAgICAgICAgTm9uZQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9HQVRUQ19QcmVwYXJlV3JpdGUgIChVSU5UMTYgY29ubl9pZCwgVUlOVDE2IGhhbmRsZSwgVUlOVDE2IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlLAordm9pZCBCVEFfR0FUVENfUHJlcGFyZVdyaXRlICAodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgb2Zmc2V0LCBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVF9BVVRIX1JFUSBhdXRoX3JlcSkKIHsKICAgICB0QlRBX0dBVFRDX0FQSV9XUklURSAqcF9idWYgPQpAQCAtNTEzLDcgKzUxMyw3IEBACiAgICAgcF9idWYtPmxlbiA9IHZhbHVlLnNpemUoKTsKIAogICAgIGlmICh2YWx1ZS5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHBfYnVmLT5wX3ZhbHVlID0gKFVJTlQ4ICopKHBfYnVmICsgMSk7CisgICAgICAgIHBfYnVmLT5wX3ZhbHVlID0gKHVpbnQ4X3QgKikocF9idWYgKyAxKTsKICAgICAgICAgbWVtY3B5KHBfYnVmLT5wX3ZhbHVlLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CiAgICAgfQogCkBAIC01MzIsNyArNTMyLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgTm9uZQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9HQVRUQ19FeGVjdXRlV3JpdGUgIChVSU5UMTYgY29ubl9pZCwgQk9PTEVBTiBpc19leGVjdXRlKQordm9pZCBCVEFfR0FUVENfRXhlY3V0ZVdyaXRlICAodWludDE2X3QgY29ubl9pZCwgYm9vbCBpc19leGVjdXRlKQogewogICAgIHRCVEFfR0FUVENfQVBJX0VYRUMgKnBfYnVmID0KICAgICAgICAgKHRCVEFfR0FUVENfQVBJX0VYRUMgKilvc2lfY2FsbG9jKHNpemVvZih0QlRBX0dBVFRDX0FQSV9FWEVDKSk7CkBAIC01NTYsNyArNTU2LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgTm9uZQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9HQVRUQ19TZW5kSW5kQ29uZmlybSAoVUlOVDE2IGNvbm5faWQsIFVJTlQxNiBoYW5kbGUpCit2b2lkIEJUQV9HQVRUQ19TZW5kSW5kQ29uZmlybSAodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlKQogewogICAgIHRCVEFfR0FUVENfQVBJX0NPTkZJUk0gKnBfYnVmID0KICAgICAgICAgKHRCVEFfR0FUVENfQVBJX0NPTkZJUk0gKilvc2lfY2FsbG9jKHNpemVvZih0QlRBX0dBVFRDX0FQSV9DT05GSVJNKSk7CkBAIC01ODQsMTEgKzU4NCwxMSBAQAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB0QlRBX0dBVFRfU1RBVFVTIEJUQV9HQVRUQ19SZWdpc3RlckZvck5vdGlmaWNhdGlvbnMgKHRCVEFfR0FUVENfSUYgY2xpZW50X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCRF9BRERSIGJkYSwgVUlOVDE2IGhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQkRfQUREUiBiZGEsIHVpbnQxNl90IGhhbmRsZSkKIHsKICAgICB0QlRBX0dBVFRDX1JDQiAgICAgICpwX2NscmVnOwogICAgIHRCVEFfR0FUVF9TVEFUVVMgICAgc3RhdHVzID0gQlRBX0dBVFRfSUxMRUdBTF9QQVJBTUVURVI7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBpOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBpOwogCiAgICAgaWYgKCFoYW5kbGUpCiAgICAgewpAQCAtNjE3LDcgKzYxNyw3IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKikmcF9jbHJlZy0+bm90aWZfcmVnW2ldLCAwLCBzaXplb2YodEJUQV9HQVRUQ19OT1RJRl9SRUcpKTsKIAotICAgICAgICAgICAgICAgICAgICBwX2NscmVnLT5ub3RpZl9yZWdbaV0uaW5fdXNlID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcF9jbHJlZy0+bm90aWZfcmVnW2ldLmluX3VzZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwX2NscmVnLT5ub3RpZl9yZWdbaV0ucmVtb3RlX2JkYSwgYmRhLCBCRF9BRERSX0xFTik7CiAKICAgICAgICAgICAgICAgICAgICAgcF9jbHJlZy0+bm90aWZfcmVnW2ldLmhhbmRsZSA9IGhhbmRsZTsKQEAgLTY1NCw3ICs2NTQsNyBAQAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB0QlRBX0dBVFRfU1RBVFVTIEJUQV9HQVRUQ19EZXJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucyAodEJUQV9HQVRUQ19JRiBjbGllbnRfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQkRfQUREUiBiZGEsIFVJTlQxNiBoYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQkRfQUREUiBiZGEsIHVpbnQxNl90IGhhbmRsZSkKIHsKICAgICBpZiAoIWhhbmRsZSkgewogICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogZGVyZWdpc3RyYXRpb24gZmFpbGVkLCBoYW5kbGUgaXMgMCIsIF9fZnVuY19fKTsKQEAgLTcyMSw3ICs3MjEsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRDX0xpc3Rlbih0QlRBX0dBVFRDX0lGIGNsaWVudF9pZiwgQk9PTEVBTiBzdGFydCwgQkRfQUREUl9QVFIgdGFyZ2V0X2JkYSkKK3ZvaWQgQlRBX0dBVFRDX0xpc3Rlbih0QlRBX0dBVFRDX0lGIGNsaWVudF9pZiwgYm9vbCBzdGFydCwgQkRfQUREUl9QVFIgdGFyZ2V0X2JkYSkKIHsKICAgICB0QlRBX0dBVFRDX0FQSV9MSVNURU4gKnBfYnVmID0KICAgICAgICAgKHRCVEFfR0FUVENfQVBJX0xJU1RFTiAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfR0FUVENfQVBJX0xJU1RFTikgKyBCRF9BRERSX0xFTik7CkBAIC03MzAsNyArNzMwLDcgQEAKICAgICBwX2J1Zi0+Y2xpZW50X2lmID0gY2xpZW50X2lmOwogICAgIHBfYnVmLT5zdGFydCA9IHN0YXJ0OwogICAgIGlmICh0YXJnZXRfYmRhKSB7Ci0gICAgICAgIHBfYnVmLT5yZW1vdGVfYmRhID0gKFVJTlQ4KikocF9idWYgKyAxKTsKKyAgICAgICAgcF9idWYtPnJlbW90ZV9iZGEgPSAodWludDhfdCopKHBfYnVmICsgMSk7CiAgICAgICAgIG1lbWNweShwX2J1Zi0+cmVtb3RlX2JkYSwgdGFyZ2V0X2JkYSwgQkRfQUREUl9MRU4pOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHBfYnVmLT5yZW1vdGVfYmRhID0gTlVMTDsKQEAgLTc1MSw3ICs3NTEsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRDX0Jyb2FkY2FzdCh0QlRBX0dBVFRDX0lGIGNsaWVudF9pZiwgQk9PTEVBTiBzdGFydCkKK3ZvaWQgQlRBX0dBVFRDX0Jyb2FkY2FzdCh0QlRBX0dBVFRDX0lGIGNsaWVudF9pZiwgYm9vbCBzdGFydCkKIHsKICAgICB0QlRBX0dBVFRDX0FQSV9MSVNURU4gKnBfYnVmID0KICAgICAgICAgKHRCVEFfR0FUVENfQVBJX0xJU1RFTiAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfR0FUVENfQVBJX0xJU1RFTikgKyBCRF9BRERSX0xFTik7CmRpZmYgLS1naXQgYS9idGEvZ2F0dC9idGFfZ2F0dGNfY2FjaGUuY2MgYi9idGEvZ2F0dC9idGFfZ2F0dGNfY2FjaGUuY2MKaW5kZXggNDg1ZmVkZi4uMzZkNGE4ZiAxMDA2NDQKLS0tIGEvYnRhL2dhdHQvYnRhX2dhdHRjX2NhY2hlLmNjCisrKyBiL2J0YS9nYXR0L2J0YV9nYXR0Y19jYWNoZS5jYwpAQCAtMjcsNyArMjcsNyBAQAogCiAjaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCiAKLSNpZiBkZWZpbmVkKEJUQV9HQVRUX0lOQ0xVREVEKSAmJiAoQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRSkKKyNpZiAoQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRSkKIAogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTQ1LDEzICs0NSwxMyBAQAogI2luY2x1ZGUgInNkcGRlZnMuaCIKICNpbmNsdWRlICJ1dGwuaCIKIAotc3RhdGljIHZvaWQgYnRhX2dhdHRjX2NhY2hlX3dyaXRlKEJEX0FERFIgc2VydmVyX2JkYSwgVUlOVDE2IG51bV9hdHRyLCB0QlRBX0dBVFRDX05WX0FUVFIgKmF0dHIpOwotc3RhdGljIHZvaWQgYnRhX2dhdHRjX2NoYXJfZHNjcHRfZGlzY19jbXBsKFVJTlQxNiBjb25uX2lkLCB0QlRBX0dBVFRDX1NFUlYgKnBfc3J2Y19jYik7Ci1zdGF0aWMgdEJUQV9HQVRUX1NUQVRVUyBidGFfZ2F0dGNfc2RwX3NlcnZpY2VfZGlzYyhVSU5UMTYgY29ubl9pZCwgdEJUQV9HQVRUQ19TRVJWICpwX3NlcnZlcl9jYik7CitzdGF0aWMgdm9pZCBidGFfZ2F0dGNfY2FjaGVfd3JpdGUoQkRfQUREUiBzZXJ2ZXJfYmRhLCB1aW50MTZfdCBudW1fYXR0ciwgdEJUQV9HQVRUQ19OVl9BVFRSICphdHRyKTsKK3N0YXRpYyB2b2lkIGJ0YV9nYXR0Y19jaGFyX2RzY3B0X2Rpc2NfY21wbCh1aW50MTZfdCBjb25uX2lkLCB0QlRBX0dBVFRDX1NFUlYgKnBfc3J2Y19jYik7CitzdGF0aWMgdEJUQV9HQVRUX1NUQVRVUyBidGFfZ2F0dGNfc2RwX3NlcnZpY2VfZGlzYyh1aW50MTZfdCBjb25uX2lkLCB0QlRBX0dBVFRDX1NFUlYgKnBfc2VydmVyX2NiKTsKIGV4dGVybiB2b2lkIGJ0YV90b19idGlmX3V1aWQoYnRfdXVpZF90ICpwX2Rlc3QsIHRCVF9VVUlEICpwX3NyYyk7Ci10QlRBX0dBVFRDX1NFUlZJQ0UqICBidGFfZ2F0dGNfZmluZF9tYXRjaGluZ19zZXJ2aWNlKGNvbnN0IGxpc3RfdCAqc2VydmljZXMsIFVJTlQxNiBoYW5kbGUpOwotdEJUQV9HQVRUQ19ERVNDUklQVE9SKiAgYnRhX2dhdHRjX2dldF9kZXNjcmlwdG9yX3NyY2IodEJUQV9HQVRUQ19TRVJWICpwX3NyY2IsIFVJTlQxNiBoYW5kbGUpOwotdEJUQV9HQVRUQ19DSEFSQUNURVJJU1RJQyogIGJ0YV9nYXR0Y19nZXRfY2hhcmFjdGVyaXN0aWNfc3JjYih0QlRBX0dBVFRDX1NFUlYgKnBfc3JjYiwgVUlOVDE2IGhhbmRsZSk7Cit0QlRBX0dBVFRDX1NFUlZJQ0UqICBidGFfZ2F0dGNfZmluZF9tYXRjaGluZ19zZXJ2aWNlKGNvbnN0IGxpc3RfdCAqc2VydmljZXMsIHVpbnQxNl90IGhhbmRsZSk7Cit0QlRBX0dBVFRDX0RFU0NSSVBUT1IqICBidGFfZ2F0dGNfZ2V0X2Rlc2NyaXB0b3Jfc3JjYih0QlRBX0dBVFRDX1NFUlYgKnBfc3JjYiwgdWludDE2X3QgaGFuZGxlKTsKK3RCVEFfR0FUVENfQ0hBUkFDVEVSSVNUSUMqICBidGFfZ2F0dGNfZ2V0X2NoYXJhY3RlcmlzdGljX3NyY2IodEJUQV9HQVRUQ19TRVJWICpwX3NyY2IsIHVpbnQxNl90IGhhbmRsZSk7CiAKICNkZWZpbmUgQlRBX0dBVFRfU0RQX0RCX1NJWkUgNDA5NgogCkBAIC03MSwxMCArNzEsMTAgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgdFNEUF9ESVNDT1ZFUllfREIgICAqcF9zZHBfZGI7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBzZHBfY29ubl9pZDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgc2RwX2Nvbm5faWQ7CiB9IHRCVEFfR0FUVENfQ0JfREFUQTsKIAotI2lmIChkZWZpbmVkIEJUQV9HQVRUX0RFQlVHICYmIEJUQV9HQVRUX0RFQlVHID09IFRSVUUpCisjaWYgKEJUQV9HQVRUX0RFQlVHID09IFRSVUUpCiBzdGF0aWMgY2hhciAqYnRhX2dhdHRjX2F0dHJfdHlwZVtdID0KIHsKICAgICAiSSIsIC8qIEluY2x1ZGVkIFNlcnZpY2UgKi8KQEAgLTEzMiw5ICsxMzIsOSBAQAogKiogUmV0dXJucyAgICAgICAgICBub25lLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZ2F0dGNfZGlzcGxheV9leHBsb3JlX3JlY29yZCh0QlRBX0dBVFRDX0FUVFJfUkVDICpwX3JlYywgVUlOVDggbnVtX3JlYykKK3N0YXRpYyB2b2lkIGJ0YV9nYXR0Y19kaXNwbGF5X2V4cGxvcmVfcmVjb3JkKHRCVEFfR0FUVENfQVRUUl9SRUMgKnBfcmVjLCB1aW50OF90IG51bV9yZWMpCiB7Ci0gICAgVUlOVDggaTsKKyAgICB1aW50OF90IGk7CiAgICAgdEJUQV9HQVRUQ19BVFRSX1JFQyAqcHAgPSBwX3JlYzsKIAogICAgIEFQUExfVFJBQ0VfRVJST1IoIjw9PT09PT09PT09PT09PT09U3RhcnQgRXhwbG9yZSBRdWV1ZSA9PT09PT09PT09PT09PiIpOwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAgICAgQVBQTF9UUkFDRV9FUlJPUigiICIpOwogCiB9Ci0jZW5kaWYgIC8qIEJUQV9HQVRUX0RFQlVHID09IFRSVUUgKi8KKyNlbmRpZiAgLyogQlRBX0dBVFRfREVCVUcgPT0gdHJ1ZSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTE5OSwxMSArMTk5LDExIEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB0QlRBX0dBVFRfU1RBVFVTIGJ0YV9nYXR0Y19hZGRfc3J2Y190b19jYWNoZSh0QlRBX0dBVFRDX1NFUlYgKnBfc3J2Y19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgc19oYW5kbGUsIFVJTlQxNiBlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzX2hhbmRsZSwgdWludDE2X3QgZV9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1VVSUQgKnBfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MRUFOIGlzX3ByaW1hcnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcmltYXJ5KQogewotI2lmIChkZWZpbmVkIEJUQV9HQVRUX0RFQlVHICYmIEJUQV9HQVRUX0RFQlVHID09IFRSVUUpCisjaWYgKEJUQV9HQVRUX0RFQlVHID09IFRSVUUpCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiQWRkIGEgc2VydmljZSBpbnRvIFNlcnZpY2UiKTsKICNlbmRpZgogCkBAIC0yMjcsMTIgKzIyNywxMiBAQAogfQogCiBzdGF0aWMgdEJUQV9HQVRUX1NUQVRVUyBidGFfZ2F0dGNfYWRkX2NoYXJfdG9fY2FjaGUodEJUQV9HQVRUQ19TRVJWICpwX3NydmNfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IGF0dHJfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiB2YWx1ZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYXR0cl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdmFsdWVfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9VVUlEICpwX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggcHJvcGVydHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwcm9wZXJ0eSkKIHsKLSNpZiAoZGVmaW5lZCBCVEFfR0FUVF9ERUJVRyAmJiBCVEFfR0FUVF9ERUJVRyA9PSBUUlVFKQorI2lmIChCVEFfR0FUVF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBBZGQgYSBjaGFyYWN0ZXJpc3RpYyBpbnRvIFNlcnZpY2UiLCBfX2Z1bmNfXyk7CiAgICAgQVBQTF9UUkFDRV9ERUJVRygiaGFuZGxlPSVkIHV1aWQxNj0weCV4IHByb3BlcnR5PTB4JXgiLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2hhbmRsZSwgcF91dWlkLT51dS51dWlkMTYsIHByb3BlcnR5KTsKQEAgLTI3NCwxMyArMjc0LDEzIEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB0QlRBX0dBVFRfU1RBVFVTIGJ0YV9nYXR0Y19hZGRfYXR0cl90b19jYWNoZSh0QlRBX0dBVFRDX1NFUlYgKnBfc3J2Y19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVVVJRCAqcF91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4IHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBpbmNsX3NydmNfc19oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpbmNsX3NydmNfc19oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9HQVRUQ19BVFRSX1RZUEUgdHlwZSkKIHsKLSNpZiAoZGVmaW5lZCBCVEFfR0FUVF9ERUJVRyAmJiBCVEFfR0FUVF9ERUJVRyA9PSBUUlVFKQorI2lmIChCVEFfR0FUVF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBBZGQgYSBbJXNdIGludG8gU2VydmljZSIsIF9fZnVuY19fLCBidGFfZ2F0dGNfYXR0cl90eXBlW3R5cGVdKTsKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJoYW5kbGU9JWQgdXVpZDE2PTB4JXggcHJvcGVydHk9MHgleCB0eXBlPSVkIiwKICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsIHBfdXVpZC0+dXUudXVpZDE2LCBwcm9wZXJ0eSwgdHlwZSk7CkBAIC0zNDEsNyArMzQxLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgTm9uZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZ2F0dGNfZ2V0X2Rpc2NfcmFuZ2UodEJUQV9HQVRUQ19TRVJWICpwX3NydmNfY2IsIFVJTlQxNiAqcF9zX2hkbCwgVUlOVDE2ICpwX2VfaGRsLCBCT09MRUFOIGlzX3NydmMpCit2b2lkIGJ0YV9nYXR0Y19nZXRfZGlzY19yYW5nZSh0QlRBX0dBVFRDX1NFUlYgKnBfc3J2Y19jYiwgdWludDE2X3QgKnBfc19oZGwsIHVpbnQxNl90ICpwX2VfaGRsLCBib29sIGlzX3NydmMpCiB7CiAgICAgdEJUQV9HQVRUQ19BVFRSX1JFQyAqcF9yZWMgPSBOVUxMOwogCkBAIC0zNTcsNyArMzU3LDcgQEAKICAgICB9CiAKICAgICAqcF9lX2hkbCA9IHBfcmVjLT5lX2hhbmRsZTsKLSNpZiAoZGVmaW5lZCBCVEFfR0FUVF9ERUJVRyAmJiBCVEFfR0FUVF9ERUJVRyA9PSBUUlVFKQorI2lmIChCVEFfR0FUVF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImRpc2NvdmVyIHJhbmdlIFslZCB+ICVkXSIscF9yZWMtPnNfaGFuZGxlLCBwX3JlYy0+ZV9oYW5kbGUpOwogI2VuZGlmCiAgICAgcmV0dXJuOwpAQCAtMzcxLDggKzM3MSw4IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0dBVFRfU1RBVFVTIGJ0YV9nYXR0Y19kaXNjb3Zlcl9wcmlfc2VydmljZShVSU5UMTYgY29ubl9pZCwgdEJUQV9HQVRUQ19TRVJWICpwX3NlcnZlcl9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBkaXNjX3R5cGUpCit0QlRBX0dBVFRfU1RBVFVTIGJ0YV9nYXR0Y19kaXNjb3Zlcl9wcmlfc2VydmljZSh1aW50MTZfdCBjb25uX2lkLCB0QlRBX0dBVFRDX1NFUlYgKnBfc2VydmVyX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGlzY190eXBlKQogewogICAgIHRCVEFfR0FUVENfQ0xDQiAgICAgKnBfY2xjYiA9IGJ0YV9nYXR0Y19maW5kX2NsY2JfYnlfY29ubl9pZChjb25uX2lkKTsKICAgICB0QlRBX0dBVFRfU1RBVFVTICAgIHN0YXR1cyA9ICBCVEFfR0FUVF9FUlJPUjsKQEAgLTM5NiwxMSArMzk2LDExIEBACiAqKiBSZXR1cm5zICAgICAgICAgIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0dBVFRfU1RBVFVTIGJ0YV9nYXR0Y19kaXNjb3Zlcl9wcm9jZWR1cmUoVUlOVDE2IGNvbm5faWQsIHRCVEFfR0FUVENfU0VSViAqcF9zZXJ2ZXJfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBkaXNjX3R5cGUpCit0QlRBX0dBVFRfU1RBVFVTIGJ0YV9nYXR0Y19kaXNjb3Zlcl9wcm9jZWR1cmUodWludDE2X3QgY29ubl9pZCwgdEJUQV9HQVRUQ19TRVJWICpwX3NlcnZlcl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGlzY190eXBlKQogewogICAgIHRHQVRUX0RJU0NfUEFSQU0gcGFyYW07Ci0gICAgQk9PTEVBTiBpc19zZXJ2aWNlID0gVFJVRTsKKyAgICBib29sIGlzX3NlcnZpY2UgPSB0cnVlOwogCiAgICAgbWVtc2V0KCZwYXJhbSwgMCwgc2l6ZW9mKHRHQVRUX0RJU0NfUEFSQU0pKTsKIApAQCAtNDEyLDcgKzQxMiw3IEBACiAgICAgZWxzZQogICAgIHsKICAgICAgICAgaWYgKGRpc2NfdHlwZSA9PSBHQVRUX0RJU0NfQ0hBUl9EU0NQVCkKLSAgICAgICAgICAgIGlzX3NlcnZpY2UgPSBGQUxTRTsKKyAgICAgICAgICAgIGlzX3NlcnZpY2UgPSBmYWxzZTsKIAogICAgICAgICBidGFfZ2F0dGNfZ2V0X2Rpc2NfcmFuZ2UocF9zZXJ2ZXJfY2IsICZwYXJhbS5zX2hhbmRsZSwgJnBhcmFtLmVfaGFuZGxlLCBpc19zZXJ2aWNlKTsKIApAQCAtNDMzLDcgKzQzMyw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0dBVFRfU1RBVFVTIGJ0YV9nYXR0Y19zdGFydF9kaXNjX2luY2x1ZGVfc3J2YyhVSU5UMTYgY29ubl9pZCwgdEJUQV9HQVRUQ19TRVJWICpwX3NydmNfY2IpCit0QlRBX0dBVFRfU1RBVFVTIGJ0YV9nYXR0Y19zdGFydF9kaXNjX2luY2x1ZGVfc3J2Yyh1aW50MTZfdCBjb25uX2lkLCB0QlRBX0dBVFRDX1NFUlYgKnBfc3J2Y19jYikKIHsKICAgICByZXR1cm4gYnRhX2dhdHRjX2Rpc2NvdmVyX3Byb2NlZHVyZShjb25uX2lkLCBwX3NydmNfY2IsIEdBVFRfRElTQ19JTkNfU1JWQyk7CiB9CkBAIC00NDYsNyArNDQ2LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24uCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfR0FUVF9TVEFUVVMgYnRhX2dhdHRjX3N0YXJ0X2Rpc2NfY2hhcihVSU5UMTYgY29ubl9pZCwgdEJUQV9HQVRUQ19TRVJWICpwX3NydmNfY2IpCit0QlRBX0dBVFRfU1RBVFVTIGJ0YV9nYXR0Y19zdGFydF9kaXNjX2NoYXIodWludDE2X3QgY29ubl9pZCwgdEJUQV9HQVRUQ19TRVJWICpwX3NydmNfY2IpCiB7CiAgICAgcF9zcnZjX2NiLT50b3RhbF9jaGFyID0gMDsKIApAQCAtNDYxLDcgKzQ2MSw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIG5vbmUuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2dhdHRjX3N0YXJ0X2Rpc2NfY2hhcl9kc2NwKFVJTlQxNiBjb25uX2lkLCB0QlRBX0dBVFRDX1NFUlYgKnBfc3J2Y19jYikKK3ZvaWQgYnRhX2dhdHRjX3N0YXJ0X2Rpc2NfY2hhcl9kc2NwKHVpbnQxNl90IGNvbm5faWQsIHRCVEFfR0FUVENfU0VSViAqcF9zcnZjX2NiKQogewogICAgIEFQUExfVFJBQ0VfREVCVUcoInN0YXJ0aW5nIGRpc2NvdmVyIGNoYXJhY3RlcmlzdGljcyBkZXNjcmlwdG9yIik7CiAKQEAgLTQ3OCw3ICs0NzgsNyBAQAogKiogUmV0dXJucyAgICAgICAgICBzdGF0dXMKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2dhdHRjX2V4cGxvcmVfc3J2YyhVSU5UMTYgY29ubl9pZCwgdEJUQV9HQVRUQ19TRVJWICpwX3NydmNfY2IpCitzdGF0aWMgdm9pZCBidGFfZ2F0dGNfZXhwbG9yZV9zcnZjKHVpbnQxNl90IGNvbm5faWQsIHRCVEFfR0FUVENfU0VSViAqcF9zcnZjX2NiKQogewogICAgIHRCVEFfR0FUVENfQVRUUl9SRUMgKnBfcmVjID0gcF9zcnZjX2NiLT5wX3NydmNfbGlzdCArIHBfc3J2Y19jYi0+Y3VyX3NydmNfaWR4OwogICAgIHRCVEFfR0FUVENfQ0xDQiAqcF9jbGNiID0gYnRhX2dhdHRjX2ZpbmRfY2xjYl9ieV9jb25uX2lkKGNvbm5faWQpOwpAQCAtNTEwLDcgKzUxMCw3IEBACiAgICAgLyogbm8gc2VydmljZSBmb3VuZCBhdCBhbGwsIHRoZSBlbmQgb2Ygc2VydmVyIGRpc2NvdmVyeSovCiAgICAgTE9HX1dBUk4oTE9HX1RBRywgIiVzIG5vIG1vcmUgc2VydmljZXMgZm91bmQiLCBfX2Z1bmNfXyk7CiAKLSNpZiAoZGVmaW5lZCBCVEFfR0FUVF9ERUJVRyAmJiBCVEFfR0FUVF9ERUJVRyA9PSBUUlVFKQorI2lmIChCVEFfR0FUVF9ERUJVRyA9PSBUUlVFKQogICAgIGJ0YV9nYXR0Y19kaXNwbGF5X2NhY2hlX3NlcnZlcihwX3NydmNfY2ItPnBfc3J2Y19jYWNoZSk7CiAjZW5kaWYKICAgICAvKiBzYXZlIGNhY2hlIHRvIE5WICovCkBAIC01MzEsNyArNTMxLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgc3RhdHVzCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9nYXR0Y19pbmNsX3NydmNfZGlzY19jbXBsKFVJTlQxNiBjb25uX2lkLCB0QlRBX0dBVFRDX1NFUlYgKnBfc3J2Y19jYikKK3N0YXRpYyB2b2lkIGJ0YV9nYXR0Y19pbmNsX3NydmNfZGlzY19jbXBsKHVpbnQxNl90IGNvbm5faWQsIHRCVEFfR0FUVENfU0VSViAqcF9zcnZjX2NiKQogewogICAgIHBfc3J2Y19jYi0+Y3VyX2NoYXJfaWR4ID0gcF9zcnZjX2NiLT50b3RhbF9zcnZjOwogCkBAIC01NDcsNyArNTQ3LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgc3RhdHVzCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9nYXR0Y19jaGFyX2Rpc2NfY21wbChVSU5UMTYgY29ubl9pZCwgdEJUQV9HQVRUQ19TRVJWICpwX3NydmNfY2IpCitzdGF0aWMgdm9pZCBidGFfZ2F0dGNfY2hhcl9kaXNjX2NtcGwodWludDE2X3QgY29ubl9pZCwgdEJUQV9HQVRUQ19TRVJWICpwX3NydmNfY2IpCiB7CiAgICAgdEJUQV9HQVRUQ19BVFRSX1JFQyAqcF9yZWMgPSBwX3NydmNfY2ItPnBfc3J2Y19saXN0ICsgcF9zcnZjX2NiLT5jdXJfY2hhcl9pZHg7CiAKQEAgLTU4MCw3ICs1ODAsNyBAQAogKiogUmV0dXJucyAgICAgICAgICBzdGF0dXMKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2dhdHRjX2NoYXJfZHNjcHRfZGlzY19jbXBsKFVJTlQxNiBjb25uX2lkLCB0QlRBX0dBVFRDX1NFUlYgKnBfc3J2Y19jYikKK3N0YXRpYyB2b2lkIGJ0YV9nYXR0Y19jaGFyX2RzY3B0X2Rpc2NfY21wbCh1aW50MTZfdCBjb25uX2lkLCB0QlRBX0dBVFRDX1NFUlYgKnBfc3J2Y19jYikKIHsKICAgICB0QlRBX0dBVFRDX0FUVFJfUkVDICpwX3JlYyA9IE5VTEw7CiAKQEAgLTYwMCw3ICs2MDAsNyBAQAogICAgIGVsc2UKICAgICAvKiBhbGwgY2hhcmFjdGVyaXN0aWMgaGFzIGJlZW4gZXhwbG9yZWQsIHN0YXJ0IHdpdGggbmV4dCBzZXJ2aWNlIGlmIGFueSAqLwogICAgIHsKLSNpZiAoZGVmaW5lZCBCVEFfR0FUVF9ERUJVRyAmJiBCVEFfR0FUVF9ERUJVRyA9PSBUUlVFKQorI2lmIChCVEFfR0FUVF9ERUJVRyA9PSBUUlVFKQogICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKCJhbGwgY2hhciBoYXMgYmVlbiBleHBsb3JlZCIpOwogI2VuZGlmCiAgICAgICAgIHBfc3J2Y19jYi0+Y3VyX3NydmNfaWR4ICsrOwpAQCAtNjA4LDE4ICs2MDgsMTggQEAKICAgICB9CiAKIH0KLXN0YXRpYyBCT09MRUFOIGJ0YV9nYXR0Y19zcnZjX2luX2xpc3QodEJUQV9HQVRUQ19TRVJWICpwX3NydmNfY2IsIFVJTlQxNiBzX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IGVfaGFuZGxlLCB0QlRfVVVJRCB1dWlkKQorc3RhdGljIGJvb2wgYnRhX2dhdHRjX3NydmNfaW5fbGlzdCh0QlRBX0dBVFRDX1NFUlYgKnBfc3J2Y19jYiwgdWludDE2X3Qgc19oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVfaGFuZGxlLCB0QlRfVVVJRCB1dWlkKQogewogICAgIHRCVEFfR0FUVENfQVRUUl9SRUMgKnBfcmVjID0gTlVMTDsKLSAgICBVSU5UOCAgIGk7Ci0gICAgQk9PTEVBTiBleGlzdF9zcnZjID0gRkFMU0U7CisgICAgdWludDhfdCAgIGk7CisgICAgYm9vbCBleGlzdF9zcnZjID0gZmFsc2U7CiAgICAgVU5VU0VEKHV1aWQpOwogCiAgICAgaWYgKCFHQVRUX0hBTkRMRV9JU19WQUxJRChzX2hhbmRsZSkgfHwgIUdBVFRfSEFORExFX0lTX1ZBTElEKGVfaGFuZGxlKSkKICAgICB7CiAgICAgICAgIEFQUExfVFJBQ0VfRVJST1IoImludmFsaWQgaW5jbHVkZWQgc2VydmljZSBoYW5kbGU6IFsweCUwNHggfiAweCUwNHhdIiwgc19oYW5kbGUsIGVfaGFuZGxlKTsKLSAgICAgICAgZXhpc3Rfc3J2YyA9IFRSVUU7CisgICAgICAgIGV4aXN0X3NydmMgPSB0cnVlOwogICAgIH0KICAgICBlbHNlCiAgICAgewpAQCAtNjMwLDcgKzYzMCw3IEBACiAgICAgICAgICAgICAvKiBhIG5ldyBzZXJ2aWNlIHNob3VsZCBub3QgaGF2ZSBhbnkgb3ZlcmxhcCB3aXRoIG90aGVyIHNlcnZpY2UgaGFuZGxlIHJhbmdlICovCiAgICAgICAgICAgICBpZiAocF9yZWMtPnNfaGFuZGxlID09IHNfaGFuZGxlIHx8IHBfcmVjLT5lX2hhbmRsZSA9PSBlX2hhbmRsZSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleGlzdF9zcnZjID0gVFJVRTsKKyAgICAgICAgICAgICAgICBleGlzdF9zcnZjID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjQ3LDggKzY0Nyw4IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB0QlRBX0dBVFRfU1RBVFVTIGJ0YV9nYXR0Y19hZGRfc3J2Y190b19saXN0KHRCVEFfR0FUVENfU0VSViAqcF9zcnZjX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IHNfaGFuZGxlLCBVSU5UMTYgZV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVVVJRCB1dWlkLCBCT09MRUFOIGlzX3ByaW1hcnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzX2hhbmRsZSwgdWludDE2X3QgZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVVVJRCB1dWlkLCBib29sIGlzX3ByaW1hcnkpCiB7CiAgICAgdEJUQV9HQVRUQ19BVFRSX1JFQyAqcF9yZWMgPSBOVUxMOwogICAgIHRCVEFfR0FUVF9TVEFUVVMgICAgc3RhdHVzID0gQlRBX0dBVFRfT0s7CkBAIC02ODYsOCArNjg2LDggQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHRCVEFfR0FUVF9TVEFUVVMgYnRhX2dhdHRjX2FkZF9jaGFyX3RvX2xpc3QodEJUQV9HQVRUQ19TRVJWICpwX3NydmNfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgZGVjbF9oYW5kbGUsIFVJTlQxNiB2YWx1ZV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVVVJRCB1dWlkLCBVSU5UOCBwcm9wZXJ0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGRlY2xfaGFuZGxlLCB1aW50MTZfdCB2YWx1ZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVVVJRCB1dWlkLCB1aW50OF90IHByb3BlcnR5KQogewogICAgIHRCVEFfR0FUVENfQVRUUl9SRUMgKnBfcmVjID0gTlVMTDsKICAgICB0QlRBX0dBVFRfU1RBVFVTICAgIHN0YXR1cyA9IEJUQV9HQVRUX09LOwpAQCAtNzM3LDEyICs3MzcsMTIgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9nYXR0Y19zZHBfY2FsbGJhY2soVUlOVDE2IHNkcF9zdGF0dXMsIHZvaWQqIHVzZXJfZGF0YSkKK3ZvaWQgYnRhX2dhdHRjX3NkcF9jYWxsYmFjayh1aW50MTZfdCBzZHBfc3RhdHVzLCB2b2lkKiB1c2VyX2RhdGEpCiB7CiAgICAgdFNEUF9ESVNDX1JFQyAgICAgICAqcF9zZHBfcmVjID0gTlVMTDsKICAgICB0QlRfVVVJRCAgICAgICAgICAgIHNlcnZpY2VfdXVpZDsKICAgICB0U0RQX1BST1RPQ09MX0VMRU0gIHBlOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgc3RhcnRfaGFuZGxlID0gMCwgZW5kX2hhbmRsZSA9IDA7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIHN0YXJ0X2hhbmRsZSA9IDAsIGVuZF9oYW5kbGUgPSAwOwogICAgIHRCVEFfR0FUVENfQ0JfREFUQSAgKmNiX2RhdGEgPSAodEJUQV9HQVRUQ19DQl9EQVRBICopdXNlcl9kYXRhOwogICAgIHRCVEFfR0FUVENfU0VSViAgICAgKnBfc3J2Y19jYiA9IGJ0YV9nYXR0Y19maW5kX3NjYl9ieV9jaWQoY2JfZGF0YS0+c2RwX2Nvbm5faWQpOwogCkBAIC03NTksMTAgKzc1OSwxMCBAQAogCiAgICAgICAgICAgICAgICAgICAgIGlmIChTRFBfRmluZFByb3RvY29sTGlzdEVsZW1JblJlYyhwX3NkcF9yZWMsIFVVSURfUFJPVE9DT0xfQVRULCAmcGUpKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9oYW5kbGUgICAgPSAoVUlOVDE2KSBwZS5wYXJhbXNbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmRfaGFuZGxlICAgICAgPSAoVUlOVDE2KSBwZS5wYXJhbXNbMV07CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9oYW5kbGUgICAgPSAodWludDE2X3QpIHBlLnBhcmFtc1swXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9oYW5kbGUgICAgICA9ICh1aW50MTZfdCkgcGUucGFyYW1zWzFdOwogCi0jaWYgKGRlZmluZWQgQlRBX0dBVFRfREVCVUcgJiYgQlRBX0dBVFRfREVCVUcgPT0gVFJVRSkKKyNpZiAoQlRBX0dBVFRfREVCVUcgPT0gVFJVRSkKICAgICAgICAgICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfRVZFTlQoIkZvdW5kIEFUVCBzZXJ2aWNlIFsweCUwNHhdIGhhbmRsZVsweCUwNHggfiAweCUwNHhdIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX3V1aWQudXUudXVpZDE2LCBzdGFydF9oYW5kbGUsIGVuZF9oYW5kbGUpOwogI2VuZGlmCkBAIC03NzUsNyArNzc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICB7CkBAIC04MTMsMTEgKzgxMywxMSBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QlRBX0dBVFRfU1RBVFVTIGJ0YV9nYXR0Y19zZHBfc2VydmljZV9kaXNjKFVJTlQxNiBjb25uX2lkLCB0QlRBX0dBVFRDX1NFUlYgKnBfc2VydmVyX2NiKQorc3RhdGljIHRCVEFfR0FUVF9TVEFUVVMgYnRhX2dhdHRjX3NkcF9zZXJ2aWNlX2Rpc2ModWludDE2X3QgY29ubl9pZCwgdEJUQV9HQVRUQ19TRVJWICpwX3NlcnZlcl9jYikKIHsKICAgICB0U0RQX1VVSUQgICAgICAgdXVpZDsKLSAgICBVSU5UMTYgICAgICAgICAgbnVtX2F0dHJzID0gMjsKLSAgICBVSU5UMTYgICAgICAgICAgYXR0cl9saXN0WzJdOworICAgIHVpbnQxNl90ICAgICAgICAgIG51bV9hdHRycyA9IDI7CisgICAgdWludDE2X3QgICAgICAgICAgYXR0cl9saXN0WzJdOwogCiAgICAgbWVtc2V0ICgmdXVpZCwgMCwgc2l6ZW9mKHRTRFBfVVVJRCkpOwogCkBAIC04NTksMTAgKzg1OSwxMCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2dhdHRjX2Rpc2NfcmVzX2NiYWNrIChVSU5UMTYgY29ubl9pZCwgdEdBVFRfRElTQ19UWVBFIGRpc2NfdHlwZSwgdEdBVFRfRElTQ19SRVMgKnBfZGF0YSkKK3ZvaWQgYnRhX2dhdHRjX2Rpc2NfcmVzX2NiYWNrICh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9ESVNDX1RZUEUgZGlzY190eXBlLCB0R0FUVF9ESVNDX1JFUyAqcF9kYXRhKQogewogICAgIHRCVEFfR0FUVENfU0VSViAqIHBfc3J2Y19jYiA9IE5VTEw7Ci0gICAgQk9PTEVBTiAgICAgICAgICBwcmlfc3J2YzsKKyAgICBib29sICAgICAgICAgIHByaV9zcnZjOwogICAgIHRCVEFfR0FUVENfQ0xDQiAqcF9jbGNiID0gYnRhX2dhdHRjX2ZpbmRfY2xjYl9ieV9jb25uX2lkKGNvbm5faWQpOwogCiAgICAgcF9zcnZjX2NiID0gYnRhX2dhdHRjX2ZpbmRfc2NiX2J5X2NpZChjb25uX2lkKTsKQEAgLTg3Nyw3ICs4NzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+aGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+dmFsdWUuZ3JvdXBfdmFsdWUuZV9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT52YWx1ZS5ncm91cF92YWx1ZS5zZXJ2aWNlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CiAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgR0FUVF9ESVNDX1NSVkNfQllfVVVJRDoKQEAgLTg4NSw3ICs4ODUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+aGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+dmFsdWUuZ3JvdXBfdmFsdWUuZV9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT52YWx1ZS5ncm91cF92YWx1ZS5zZXJ2aWNlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgR0FUVF9ESVNDX0lOQ19TUlZDOgpAQCAtOTAxLDcgKzkwMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+dmFsdWUuaW5jbF9zZXJ2aWNlLnNfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPnZhbHVlLmluY2xfc2VydmljZS5lX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT52YWx1ZS5pbmNsX3NlcnZpY2Uuc2VydmljZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKICAgICAgICAgICAgICAgICAvKiBhZGQgaW50byBkYXRhYmFzZSAqLwogICAgICAgICAgICAgICAgIGJ0YV9nYXR0Y19hZGRfYXR0cl90b19jYWNoZShwX3NydmNfY2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+aGFuZGxlLApAQCAtOTI4LDcgKzkyOCw3IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci12b2lkIGJ0YV9nYXR0Y19kaXNjX2NtcGxfY2JhY2sgKFVJTlQxNiBjb25uX2lkLCB0R0FUVF9ESVNDX1RZUEUgZGlzY190eXBlLCB0R0FUVF9TVEFUVVMgc3RhdHVzKQordm9pZCBidGFfZ2F0dGNfZGlzY19jbXBsX2NiYWNrICh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9ESVNDX1RZUEUgZGlzY190eXBlLCB0R0FUVF9TVEFUVVMgc3RhdHVzKQogewogICAgIHRCVEFfR0FUVENfU0VSViAqIHBfc3J2Y19jYjsKICAgICB0QlRBX0dBVFRDX0NMQ0IgKnBfY2xjYiA9IGJ0YV9nYXR0Y19maW5kX2NsY2JfYnlfY29ubl9pZChjb25uX2lkKTsKQEAgLTk0OCw3ICs5NDgsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBjYXNlIEdBVFRfRElTQ19TUlZDX0FMTDoKICAgICAgICAgICAgIGNhc2UgR0FUVF9ESVNDX1NSVkNfQllfVVVJRDoKLSNpZiAoZGVmaW5lZCBCVEFfR0FUVF9ERUJVRyAmJiBCVEFfR0FUVF9ERUJVRyA9PSBUUlVFKQorI2lmIChCVEFfR0FUVF9ERUJVRyA9PSBUUlVFKQogICAgICAgICAgICAgICAgIGJ0YV9nYXR0Y19kaXNwbGF5X2V4cGxvcmVfcmVjb3JkKHBfc3J2Y19jYi0+cF9zcnZjX2xpc3QsIHBfc3J2Y19jYi0+bmV4dF9hdmFpbF9pZHgpOwogI2VuZGlmCiAgICAgICAgICAgICAgICAgYnRhX2dhdHRjX2V4cGxvcmVfc3J2Yyhjb25uX2lkLCBwX3NydmNfY2IpOwpAQCAtOTYwLDcgKzk2MCw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgR0FUVF9ESVNDX0NIQVI6Ci0jaWYgKGRlZmluZWQgQlRBX0dBVFRfREVCVUcgJiYgQlRBX0dBVFRfREVCVUcgPT0gVFJVRSkKKyNpZiAoQlRBX0dBVFRfREVCVUcgPT0gVFJVRSkKICAgICAgICAgICAgICAgICBidGFfZ2F0dGNfZGlzcGxheV9leHBsb3JlX3JlY29yZChwX3NydmNfY2ItPnBfc3J2Y19saXN0LCBwX3NydmNfY2ItPm5leHRfYXZhaWxfaWR4KTsKICNlbmRpZgogICAgICAgICAgICAgICAgIGJ0YV9nYXR0Y19jaGFyX2Rpc2NfY21wbChjb25uX2lkLCBwX3NydmNfY2IpOwpAQCAtOTc5LDcgKzk3OSw3IEBACiAqKgogKiogRGVzY3JpcHRpb24gICAgICBzZWFyY2ggbG9jYWwgY2FjaGUgZm9yIG1hdGNoaW5nIHNlcnZpY2UgcmVjb3JkLgogKioKLSoqIFJldHVybnMgICAgICAgICAgRkFMU0UgaWYgbWFwIGNhbiBub3QgYmUgZm91bmQuCisqKiBSZXR1cm5zICAgICAgICAgIGZhbHNlIGlmIG1hcCBjYW4gbm90IGJlIGZvdW5kLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9nYXR0Y19zZWFyY2hfc2VydmljZSh0QlRBX0dBVFRDX0NMQ0IgKnBfY2xjYiwgdEJUX1VVSUQgKnBfdXVpZCkKQEAgLTk5MywxMCArOTkzLDEwIEBACiAgICAgICAgICBzbiAhPSBsaXN0X2VuZChwX2NsY2ItPnBfc3JjYi0+cF9zcnZjX2NhY2hlKTsgc24gPSBsaXN0X25leHQoc24pKSB7CiAgICAgICAgIHRCVEFfR0FUVENfU0VSVklDRSAqcF9jYWNoZSA9ICh0QlRBX0dBVFRDX1NFUlZJQ0UqKSBsaXN0X25vZGUoc24pOwogCi0gICAgICAgIGlmICghYnRhX2dhdHRjX3V1aWRfY29tcGFyZShwX3V1aWQsICZwX2NhY2hlLT51dWlkLCBGQUxTRSkpCisgICAgICAgIGlmICghYnRhX2dhdHRjX3V1aWRfY29tcGFyZShwX3V1aWQsICZwX2NhY2hlLT51dWlkLCBmYWxzZSkpCiAgICAgICAgICAgICBjb250aW51ZTsKIAotI2lmIChkZWZpbmVkIEJUQV9HQVRUX0RFQlVHICYmIEJUQV9HQVRUX0RFQlVHID09IFRSVUUpCisjaWYgKEJUQV9HQVRUX0RFQlVHID09IFRSVUUpCiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImZvdW5kIHNlcnZpY2UgWzB4JTA0eF0sIGluc3RbJWRdIGhhbmRsZSBbJWRdIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jYWNoZS0+dXVpZC51dS51dWlkMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2FjaGUtPmhhbmRsZSwKQEAgLTEwMjIsNyArMTAyMiw3IEBACiAgICAgcmV0dXJuIHBfc3JjYi0+cF9zcnZjX2NhY2hlOwogfQogCi1jb25zdCBsaXN0X3QqIGJ0YV9nYXR0Y19nZXRfc2VydmljZXMoVUlOVDE2IGNvbm5faWQpIHsKK2NvbnN0IGxpc3RfdCogYnRhX2dhdHRjX2dldF9zZXJ2aWNlcyh1aW50MTZfdCBjb25uX2lkKSB7CiAgICAgdEJUQV9HQVRUQ19DTENCICpwX2NsY2IgPSBidGFfZ2F0dGNfZmluZF9jbGNiX2J5X2Nvbm5faWQoY29ubl9pZCk7CiAKICAgICBpZiAocF9jbGNiID09IE5VTEwgKQpAQCAtMTAzMyw3ICsxMDMzLDcgQEAKICAgICByZXR1cm4gYnRhX2dhdHRjX2dldF9zZXJ2aWNlc19zcmNiKHBfc3JjYik7CiB9CiAKLXRCVEFfR0FUVENfU0VSVklDRSogIGJ0YV9nYXR0Y19maW5kX21hdGNoaW5nX3NlcnZpY2UoY29uc3QgbGlzdF90ICpzZXJ2aWNlcywgVUlOVDE2IGhhbmRsZSkgewordEJUQV9HQVRUQ19TRVJWSUNFKiAgYnRhX2dhdHRjX2ZpbmRfbWF0Y2hpbmdfc2VydmljZShjb25zdCBsaXN0X3QgKnNlcnZpY2VzLCB1aW50MTZfdCBoYW5kbGUpIHsKICAgICBpZiAoIXNlcnZpY2VzIHx8IGxpc3RfaXNfZW1wdHkoc2VydmljZXMpKQogICAgICAgICByZXR1cm4gTlVMTDsKIApAQCAtMTA0OCwxOSArMTA0OCwxOSBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1jb25zdCB0QlRBX0dBVFRDX1NFUlZJQ0UqICBidGFfZ2F0dGNfZ2V0X3NlcnZpY2VfZm9yX2hhbmRsZV9zcmNiKHRCVEFfR0FUVENfU0VSViAqcF9zcmNiLCBVSU5UMTYgaGFuZGxlKSB7Citjb25zdCB0QlRBX0dBVFRDX1NFUlZJQ0UqICBidGFfZ2F0dGNfZ2V0X3NlcnZpY2VfZm9yX2hhbmRsZV9zcmNiKHRCVEFfR0FUVENfU0VSViAqcF9zcmNiLCB1aW50MTZfdCBoYW5kbGUpIHsKICAgICBjb25zdCBsaXN0X3QgKnNlcnZpY2VzID0gYnRhX2dhdHRjX2dldF9zZXJ2aWNlc19zcmNiKHBfc3JjYik7CiAKICAgICByZXR1cm4gYnRhX2dhdHRjX2ZpbmRfbWF0Y2hpbmdfc2VydmljZShzZXJ2aWNlcywgaGFuZGxlKTsKIH0KIAotY29uc3QgdEJUQV9HQVRUQ19TRVJWSUNFKiAgYnRhX2dhdHRjX2dldF9zZXJ2aWNlX2Zvcl9oYW5kbGUoVUlOVDE2IGNvbm5faWQsIFVJTlQxNiBoYW5kbGUpIHsKK2NvbnN0IHRCVEFfR0FUVENfU0VSVklDRSogIGJ0YV9nYXR0Y19nZXRfc2VydmljZV9mb3JfaGFuZGxlKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSkgewogICAgIGNvbnN0IGxpc3RfdCAqc2VydmljZXMgPSBidGFfZ2F0dGNfZ2V0X3NlcnZpY2VzKGNvbm5faWQpOwogCiAgICAgcmV0dXJuIGJ0YV9nYXR0Y19maW5kX21hdGNoaW5nX3NlcnZpY2Uoc2VydmljZXMsIGhhbmRsZSk7CiB9CiAKLXRCVEFfR0FUVENfQ0hBUkFDVEVSSVNUSUMqICBidGFfZ2F0dGNfZ2V0X2NoYXJhY3RlcmlzdGljX3NyY2IodEJUQV9HQVRUQ19TRVJWICpwX3NyY2IsIFVJTlQxNiBoYW5kbGUpIHsKK3RCVEFfR0FUVENfQ0hBUkFDVEVSSVNUSUMqICBidGFfZ2F0dGNfZ2V0X2NoYXJhY3RlcmlzdGljX3NyY2IodEJUQV9HQVRUQ19TRVJWICpwX3NyY2IsIHVpbnQxNl90IGhhbmRsZSkgewogICAgIGNvbnN0IHRCVEFfR0FUVENfU0VSVklDRSogc2VydmljZSA9IGJ0YV9nYXR0Y19nZXRfc2VydmljZV9mb3JfaGFuZGxlX3NyY2IocF9zcmNiLCBoYW5kbGUpOwogCiAgICAgaWYgKCFzZXJ2aWNlKQpAQCAtMTA3Niw3ICsxMDc2LDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotdEJUQV9HQVRUQ19DSEFSQUNURVJJU1RJQyogIGJ0YV9nYXR0Y19nZXRfY2hhcmFjdGVyaXN0aWMoVUlOVDE2IGNvbm5faWQsIFVJTlQxNiBoYW5kbGUpIHsKK3RCVEFfR0FUVENfQ0hBUkFDVEVSSVNUSUMqICBidGFfZ2F0dGNfZ2V0X2NoYXJhY3RlcmlzdGljKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSkgewogICAgdEJUQV9HQVRUQ19DTENCICpwX2NsY2IgPSBidGFfZ2F0dGNfZmluZF9jbGNiX2J5X2Nvbm5faWQoY29ubl9pZCk7CiAKICAgICBpZiAocF9jbGNiID09IE5VTEwgKQpAQCAtMTA4Niw3ICsxMDg2LDcgQEAKICAgICByZXR1cm4gYnRhX2dhdHRjX2dldF9jaGFyYWN0ZXJpc3RpY19zcmNiKHBfc3JjYiwgaGFuZGxlKTsKIH0KIAotdEJUQV9HQVRUQ19ERVNDUklQVE9SKiAgYnRhX2dhdHRjX2dldF9kZXNjcmlwdG9yX3NyY2IodEJUQV9HQVRUQ19TRVJWICpwX3NyY2IsIFVJTlQxNiBoYW5kbGUpIHsKK3RCVEFfR0FUVENfREVTQ1JJUFRPUiogIGJ0YV9nYXR0Y19nZXRfZGVzY3JpcHRvcl9zcmNiKHRCVEFfR0FUVENfU0VSViAqcF9zcmNiLCB1aW50MTZfdCBoYW5kbGUpIHsKICAgICBjb25zdCB0QlRBX0dBVFRDX1NFUlZJQ0UqIHNlcnZpY2UgPSBidGFfZ2F0dGNfZ2V0X3NlcnZpY2VfZm9yX2hhbmRsZV9zcmNiKHBfc3JjYiwgaGFuZGxlKTsKIAogICAgIGlmICghc2VydmljZSkgewpAQCAtMTEwNyw3ICsxMTA3LDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotdEJUQV9HQVRUQ19ERVNDUklQVE9SKiAgYnRhX2dhdHRjX2dldF9kZXNjcmlwdG9yKFVJTlQxNiBjb25uX2lkLCBVSU5UMTYgaGFuZGxlKSB7Cit0QlRBX0dBVFRDX0RFU0NSSVBUT1IqICBidGFfZ2F0dGNfZ2V0X2Rlc2NyaXB0b3IodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlKSB7CiAgICAgdEJUQV9HQVRUQ19DTENCICpwX2NsY2IgPSBidGFfZ2F0dGNfZmluZF9jbGNiX2J5X2Nvbm5faWQoY29ubl9pZCk7CiAKICAgICBpZiAocF9jbGNiID09IE5VTEwgKQpAQCAtMTEyOCw5ICsxMTI4LDkgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9nYXR0Y19maWxsX2dhdHRfZGJfZWwoYnRnYXR0X2RiX2VsZW1lbnRfdCAqcF9hdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X2dhdHRfZGJfYXR0cmlidXRlX3R5cGVfdCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBhdHRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBzX2hhbmRsZSwgVUlOVDE2IGVfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBpZCwgdEJUX1VVSUQgdXVpZCwgVUlOVDggcHJvcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBhdHRfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNfaGFuZGxlLCB1aW50MTZfdCBlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpZCwgdEJUX1VVSUQgdXVpZCwgdWludDhfdCBwcm9wKQogewogICAgIHBfYXR0ci0+dHlwZSAgICAgICAgICAgICA9IHR5cGU7CiAgICAgcF9hdHRyLT5hdHRyaWJ1dGVfaGFuZGxlID0gYXR0X2hhbmRsZTsKQEAgLTExNDUsNyArMTE0NSw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIG51bWJlciBvZiBlbGVtZW50cyBpbnNpZGUgZGIgZnJvbSBzdGFydF9oYW5kbGUgdG8gZW5kX2hhbmRsZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBzaXplX3QgYnRhX2dhdHRjX2dldF9kYl9zaXplKGxpc3RfdCAqc2VydmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgc3RhcnRfaGFuZGxlLCBVSU5UMTYgZW5kX2hhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3RhcnRfaGFuZGxlLCB1aW50MTZfdCBlbmRfaGFuZGxlKSB7CiAgICAgaWYgKCFzZXJ2aWNlcyB8fCBsaXN0X2lzX2VtcHR5KHNlcnZpY2VzKSkKICAgICAgICAgcmV0dXJuIDA7CiAKQEAgLTExOTgsNyArMTE5OCw3IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkIGJ0YV9nYXR0Y19nZXRfZ2F0dF9kYl9pbXBsKHRCVEFfR0FUVENfU0VSViAqcF9zcnZjX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IHN0YXJ0X2hhbmRsZSwgVUlOVDE2IGVuZF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdGFydF9oYW5kbGUsIHVpbnQxNl90IGVuZF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGdhdHRfZGJfZWxlbWVudF90ICoqZGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmNvdW50KQogewpAQCAtMTMxMSw3ICsxMzExLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgTm9uZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZ2F0dGNfZ2V0X2dhdHRfZGIoVUlOVDE2IGNvbm5faWQsIFVJTlQxNiBzdGFydF9oYW5kbGUsIFVJTlQxNiBlbmRfaGFuZGxlLCBidGdhdHRfZGJfZWxlbWVudF90ICoqZGIsIGludCAqY291bnQpCit2b2lkIGJ0YV9nYXR0Y19nZXRfZ2F0dF9kYih1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBzdGFydF9oYW5kbGUsIHVpbnQxNl90IGVuZF9oYW5kbGUsIGJ0Z2F0dF9kYl9lbGVtZW50X3QgKipkYiwgaW50ICpjb3VudCkKIHsKICAgICB0QlRBX0dBVFRDX0NMQ0IgKnBfY2xjYiA9IGJ0YV9nYXR0Y19maW5kX2NsY2JfYnlfY29ubl9pZChjb25uX2lkKTsKIApAQCAtMTM0Niw3ICsxMzQ2LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgTm9uZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZ2F0dGNfcmVidWlsZF9jYWNoZSh0QlRBX0dBVFRDX1NFUlYgKnBfc3J2Y19jYiwgVUlOVDE2IG51bV9hdHRyLAordm9pZCBidGFfZ2F0dGNfcmVidWlsZF9jYWNoZSh0QlRBX0dBVFRDX1NFUlYgKnBfc3J2Y19jYiwgdWludDE2X3QgbnVtX2F0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVENfTlZfQVRUUiAqcF9hdHRyKQogewogICAgIC8qIGZpcnN0IGF0dHJpYnV0ZSBsb2FkaW5nLCBpbml0aWFsaXplIGJ1ZmZlciAqLwpAQCAtMTQwMCw5ICsxNDAwLDkgQEAKICoqIFJldHVybnMgICAgICAgICAgTm9uZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZ2F0dGNfZmlsbF9udl9hdHRyKHRCVEFfR0FUVENfTlZfQVRUUiAqcF9hdHRyLCBVSU5UOCB0eXBlLCBVSU5UMTYgc19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IGVfaGFuZGxlLCB0QlRfVVVJRCB1dWlkLCBVSU5UOCBwcm9wLCBVSU5UMTYgaW5jbF9zcnZjX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MRUFOIGlzX3ByaW1hcnkpCit2b2lkIGJ0YV9nYXR0Y19maWxsX252X2F0dHIodEJUQV9HQVRUQ19OVl9BVFRSICpwX2F0dHIsIHVpbnQ4X3QgdHlwZSwgdWludDE2X3Qgc19oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZV9oYW5kbGUsIHRCVF9VVUlEIHV1aWQsIHVpbnQ4X3QgcHJvcCwgdWludDE2X3QgaW5jbF9zcnZjX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaW1hcnkpCiB7CiAgICAgcF9hdHRyLT5zX2hhbmRsZSAgICA9IHNfaGFuZGxlOwogICAgIHBfYXR0ci0+ZV9oYW5kbGUgICAgPSBlX2hhbmRsZTsKQEAgLTE0MjQsNyArMTQyNCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIE5vbmUuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2dhdHRjX2NhY2hlX3NhdmUodEJUQV9HQVRUQ19TRVJWICpwX3NydmNfY2IsIFVJTlQxNiBjb25uX2lkKQordm9pZCBidGFfZ2F0dGNfY2FjaGVfc2F2ZSh0QlRBX0dBVFRDX1NFUlYgKnBfc3J2Y19jYiwgdWludDE2X3QgY29ubl9pZCkKIHsKICAgICBpZiAoIXBfc3J2Y19jYi0+cF9zcnZjX2NhY2hlIHx8IGxpc3RfaXNfZW1wdHkocF9zcnZjX2NiLT5wX3NydmNfY2FjaGUpKQogICAgICAgICByZXR1cm47CkBAIC0xNDY1LDcgKzE0NjUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NoYXItPnV1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2hhci0+cHJvcGVydGllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBpbmNsX3NydmNfaGFuZGxlICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKIAogICAgICAgICAgICAgaWYgKCFwX2NoYXItPmRlc2NyaXB0b3JzIHx8IGxpc3RfaXNfZW1wdHkocF9jaGFyLT5kZXNjcmlwdG9ycykpCiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0xNDgxLDcgKzE0ODEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kZXNjLT51dWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBwcm9wZXJ0aWVzICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBpbmNsX3NydmNfaGFuZGxlICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE0OTksNyArMTQ5OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfaXN2Yy0+dXVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBwcm9wZXJ0aWVzICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2lzdmMtPmluY2x1ZGVkX3NlcnZpY2UtPnNfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTUzMCwxMiArMTUzMCwxMiBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgVUlOVDE2IGNhY2hlX3ZlciA9IDA7CisgICAgdWludDE2X3QgY2FjaGVfdmVyID0gMDsKICAgICB0QlRBX0dBVFRDX05WX0FUVFIgICphdHRyID0gTlVMTDsKICAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICBVSU5UMTYgbnVtX2F0dHIgPSAwOworICAgIHVpbnQxNl90IG51bV9hdHRyID0gMDsKIAotICAgIGlmIChmcmVhZCgmY2FjaGVfdmVyLCBzaXplb2YoVUlOVDE2KSwgMSwgZmQpICE9IDEpIHsKKyAgICBpZiAoZnJlYWQoJmNhY2hlX3Zlciwgc2l6ZW9mKHVpbnQxNl90KSwgMSwgZmQpICE9IDEpIHsKICAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IGNhbid0IHJlYWQgR0FUVCBjYWNoZSB2ZXJzaW9uIGZyb206ICVzIiwgX19mdW5jX18sIGZuYW1lKTsKICAgICAgICAgZ290byBkb25lOwogICAgIH0KQEAgLTE1NDYsNyArMTU0Niw3IEBACiAgICAgfQogCiAKLSAgICBpZiAoZnJlYWQoJm51bV9hdHRyLCBzaXplb2YoVUlOVDE2KSwgMSwgZmQpICE9IDEpIHsKKyAgICBpZiAoZnJlYWQoJm51bV9hdHRyLCBzaXplb2YodWludDE2X3QpLCAxLCBmZCkgIT0gMSkgewogICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogY2FuJ3QgcmVhZCBudW1iZXIgb2YgR0FUVCBhdHRyaWJ1dGVzOiAlcyIsIF9fZnVuY19fLCBmbmFtZSk7CiAgICAgICAgIGdvdG8gZG9uZTsKICAgICB9CkBAIC0xNTgxLDcgKzE1ODEsNyBAQAogKiogUmV0dXJucwogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZ2F0dGNfY2FjaGVfd3JpdGUoQkRfQUREUiBzZXJ2ZXJfYmRhLCBVSU5UMTYgbnVtX2F0dHIsCitzdGF0aWMgdm9pZCBidGFfZ2F0dGNfY2FjaGVfd3JpdGUoQkRfQUREUiBzZXJ2ZXJfYmRhLCB1aW50MTZfdCBudW1fYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVENfTlZfQVRUUiAqYXR0cikKIHsKICAgICBjaGFyIGZuYW1lWzI1NV0gPSB7MH07CkBAIC0xNTkzLDE0ICsxNTkzLDE0IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBVSU5UMTYgY2FjaGVfdmVyID0gR0FUVF9DQUNIRV9WRVJTSU9OOwotICAgIGlmIChmd3JpdGUoJmNhY2hlX3Zlciwgc2l6ZW9mKFVJTlQxNiksIDEsIGZkKSAhPSAxKSB7CisgICAgdWludDE2X3QgY2FjaGVfdmVyID0gR0FUVF9DQUNIRV9WRVJTSU9OOworICAgIGlmIChmd3JpdGUoJmNhY2hlX3Zlciwgc2l6ZW9mKHVpbnQxNl90KSwgMSwgZmQpICE9IDEpIHsKICAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IGNhbid0IHdyaXRlIEdBVFQgY2FjaGUgdmVyc2lvbjogJXMiLCBfX2Z1bmNfXywgZm5hbWUpOwogICAgICAgICBmY2xvc2UoZmQpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKGZ3cml0ZSgmbnVtX2F0dHIsIHNpemVvZihVSU5UMTYpLCAxLCBmZCkgIT0gMSkgeworICAgIGlmIChmd3JpdGUoJm51bV9hdHRyLCBzaXplb2YodWludDE2X3QpLCAxLCBmZCkgIT0gMSkgewogICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogY2FuJ3Qgd3JpdGUgR0FUVCBjYWNoZSBhdHRyaWJ1dGUgY291bnQ6ICVzIiwgX19mdW5jX18sIGZuYW1lKTsKICAgICAgICAgZmNsb3NlKGZkKTsKICAgICAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYnRhL2dhdHQvYnRhX2dhdHRjX2ludC5oIGIvYnRhL2dhdHQvYnRhX2dhdHRjX2ludC5oCmluZGV4IGY4ZmY1MGMuLjViMmVjZGQgMTAwNjQ0Ci0tLSBhL2J0YS9nYXR0L2J0YV9nYXR0Y19pbnQuaAorKysgYi9idGEvZ2F0dC9idGFfZ2F0dGNfaW50LmgKQEAgLTcyLDcgKzcyLDcgQEAKICAgICBCVEFfR0FUVENfQVBJX0RJU0FCTEVfRVZULAogICAgIEJUQV9HQVRUQ19FTkNfQ01QTF9FVlQKIH07Ci10eXBlZGVmIFVJTlQxNiB0QlRBX0dBVFRDX0lOVF9FVlQ7Cit0eXBlZGVmIHVpbnQxNl90IHRCVEFfR0FUVENfSU5UX0VWVDsKIAogI2RlZmluZSBCVEFfR0FUVENfU0VSVklDRV9DSEFOR0VEX0xFTiAgICA0CiAKQEAgLTExNyw3ICsxMTcsNyBAQAogICAgIEJUX0hEUiAgICAgICAgICAgICAgICAgIGhkcjsKICAgICBCRF9BRERSICAgICAgICAgICAgICAgICByZW1vdGVfYmRhOwogICAgIHRCVEFfR0FUVENfSUYgICAgICAgICAgIGNsaWVudF9pZjsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICBpc19kaXJlY3Q7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgaXNfZGlyZWN0OwogICAgIHRCVEFfVFJBTlNQT1JUICAgICAgICAgIHRyYW5zcG9ydDsKIH0gdEJUQV9HQVRUQ19BUElfT1BFTjsKIApAQCAtMTI3LDcgKzEyNyw3IEBACiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICAgICAgaGRyOwogICAgIHRCVEFfR0FUVF9BVVRIX1JFUSAgICAgIGF1dGhfcmVxOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIGhhbmRsZTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIGhhbmRsZTsKICAgICB0QlRBX0dBVFRDX0VWVCAgICAgICAgICBjbXBsX2V2dDsKIH0gdEJUQV9HQVRUQ19BUElfUkVBRDsKIApAQCAtMTM1LDI0ICsxMzUsMjQgQEAKIHsKICAgICBCVF9IRFIgICAgICAgICAgICAgICAgICBoZHI7CiAgICAgdEJUQV9HQVRUX0FVVEhfUkVRICAgICAgYXV0aF9yZXE7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgaGFuZGxlOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgaGFuZGxlOwogICAgIHRCVEFfR0FUVENfRVZUICAgICAgICAgIGNtcGxfZXZ0OwogICAgIHRCVEFfR0FUVENfV1JJVEVfVFlQRSAgIHdyaXRlX3R5cGU7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgb2Zmc2V0OwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIGxlbjsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAqcF92YWx1ZTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIG9mZnNldDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIGxlbjsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICpwX3ZhbHVlOwogfXRCVEFfR0FUVENfQVBJX1dSSVRFOwogCiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJUX0hEUiAgICAgICAgICAgICAgICAgIGhkcjsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICBpc19leGVjdXRlOworICAgIGJvb2wgICAgICAgICAgICAgICAgIGlzX2V4ZWN1dGU7CiB9dEJUQV9HQVRUQ19BUElfRVhFQzsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICAgICAgICAgICAgICBoZHI7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgaGFuZGxlOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgaGFuZGxlOwogfSB0QlRBX0dBVFRDX0FQSV9DT05GSVJNOwogCiB0eXBlZGVmIHRHQVRUX0NMX0NPTVBMRVRFIHRCVEFfR0FUVENfQ01QTDsKQEAgLTE2MCw3ICsxNjAsNyBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICAgICAgICAgICAgICBoZHI7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgb3BfY29kZTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIG9wX2NvZGU7CiAgICAgdEdBVFRfU1RBVFVTICAgICAgICAgICAgc3RhdHVzOwogICAgIHRCVEFfR0FUVENfQ01QTCAgICAgICAgICpwX2NtcGw7CiB9dEJUQV9HQVRUQ19PUF9DTVBMOwpAQCAtMTc1LDggKzE3NSw4IEBACiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICAgICAgaGRyOwogICAgIHRCVEFfR0FUVF9BVVRIX1JFUSAgICAgIGF1dGhfcmVxOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIG51bV9hdHRyOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIGhhbmRsZXNbR0FUVF9NQVhfUkVBRF9NVUxUSV9IQU5ETEVTXTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIG51bV9hdHRyOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgaGFuZGxlc1tHQVRUX01BWF9SRUFEX01VTFRJX0hBTkRMRVNdOwogfXRCVEFfR0FUVENfQVBJX1JFQURfTVVMVEk7CiAKIHR5cGVkZWYgc3RydWN0CkBAIC0xODQsMTQgKzE4NCwxNCBAQAogICAgIEJUX0hEUiAgICAgICAgICAgICAgICAgIGhkcjsKICAgICBCRF9BRERSX1BUUiAgICAgICAgICAgICByZW1vdGVfYmRhOwogICAgIHRCVEFfR0FUVENfSUYgICAgICAgICAgIGNsaWVudF9pZjsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICBzdGFydDsKKyAgICBib29sICAgICAgICAgICAgICAgICBzdGFydDsKIH0gdEJUQV9HQVRUQ19BUElfTElTVEVOOwogCiAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICBoZHI7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBtdHU7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIG10dTsKIH10QlRBX0dBVFRDX0FQSV9DRkdfTVRVOwogCiB0eXBlZGVmIHN0cnVjdApAQCAtMTk5LDcgKzE5OSw3IEBACiAgICAgQlRfSERSICAgICAgICAgICAgICAgICAgaGRyOwogICAgIEJEX0FERFIgICAgICAgICAgICAgICAgIHJlbW90ZV9iZGE7CiAgICAgdEJUQV9HQVRUQ19JRiAgICAgICAgICAgY2xpZW50X2lmOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIHJvbGU7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICByb2xlOwogICAgIHRCVF9UUkFOU1BPUlQgICAgICAgICAgIHRyYW5zcG9ydDsKICAgICB0R0FUVF9ESVNDT05OX1JFQVNPTiAgICByZWFzb247CiB9dEJUQV9HQVRUQ19JTlRfQ09OTjsKQEAgLTI0MiwxMSArMjQyLDExIEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIHRCVF9VVUlEICAgICAgICAgICAgdXVpZDsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIHNfaGFuZGxlOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgZV9oYW5kbGU7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIHNfaGFuZGxlOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBlX2hhbmRsZTsKICAgICAvLyB0aGlzIGZpZWxkIGlzIHNldCBvbmx5IGZvciBjaGFyYWN0ZXJpc3RpYwotICAgIFVJTlQxNiAgICAgICAgICAgICAgY2hhcl9kZWNsX2hhbmRsZTsKLSAgICBCT09MRUFOICAgICAgICAgICAgIGlzX3ByaW1hcnk7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIGNoYXJfZGVjbF9oYW5kbGU7CisgICAgYm9vbCAgICAgICAgICAgICBpc19wcmltYXJ5OwogICAgIHRCVEFfR0FUVF9DSEFSX1BST1AgcHJvcGVydHk7CiB9dEJUQV9HQVRUQ19BVFRSX1JFQzsKIApAQCAtMjY1LDEzICsyNjUsMTMgQEAKICAgICBCVEFfR0FUVENfQ09OTl9TVCwgICAgICAgICAgLyogY29ubmVjdGVkIHN0YXRlICovCiAgICAgQlRBX0dBVFRDX0RJU0NPVkVSX1NUICAgICAgIC8qIGRpc2NvdmVyIGlzIGluIHByb2dyZXNzICovCiB9OwotdHlwZWRlZiBVSU5UOCB0QlRBX0dBVFRDX1NUQVRFOwordHlwZWRlZiB1aW50OF90IHRCVEFfR0FUVENfU1RBVEU7CiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBpbl91c2U7CisgICAgYm9vbCAgICAgICAgICAgICBpbl91c2U7CiAgICAgQkRfQUREUiAgICAgICAgICAgICBzZXJ2ZXJfYmRhOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgY29ubmVjdGVkOworICAgIGJvb2wgICAgICAgICAgICAgY29ubmVjdGVkOwogCiAjZGVmaW5lIEJUQV9HQVRUQ19TRVJWX0lETEUgICAgIDAKICNkZWZpbmUgQlRBX0dBVFRDX1NFUlZfTE9BRCAgICAgMQpAQCAtMjc5LDI0ICsyNzksMjQgQEAKICNkZWZpbmUgQlRBX0dBVFRDX1NFUlZfRElTQyAgICAgMwogI2RlZmluZSBCVEFfR0FUVENfU0VSVl9ESVNDX0FDVCA0CiAKLSAgICBVSU5UOCAgICAgICAgICAgICAgIHN0YXRlOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBzdGF0ZTsKIAogICAgIGxpc3RfdCAgICAgICAgICAgICAgKnBfc3J2Y19jYWNoZTsgIC8qIGxpc3Qgb2YgdEJUQV9HQVRUQ19TRVJWSUNFICovCi0gICAgVUlOVDggICAgICAgICAgICAgICB1cGRhdGVfY291bnQ7ICAgLyogaW5kaWNhdGlvbiByZWNlaXZlZCAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgbnVtX2NsY2I7ICAgICAgIC8qIG51bWJlciBvZiBhc3NvY2lhdGVkIENMQ0IgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgdXBkYXRlX2NvdW50OyAgIC8qIGluZGljYXRpb24gcmVjZWl2ZWQgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgbnVtX2NsY2I7ICAgICAgIC8qIG51bWJlciBvZiBhc3NvY2lhdGVkIENMQ0IgKi8KIAogCiAgICAgdEJUQV9HQVRUQ19BVFRSX1JFQyAqcF9zcnZjX2xpc3Q7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBjdXJfc3J2Y19pZHg7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBjdXJfY2hhcl9pZHg7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBuZXh0X2F2YWlsX2lkeDsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIHRvdGFsX3NydmM7Ci0gICAgVUlOVDggICAgICAgICAgICAgICB0b3RhbF9jaGFyOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBjdXJfc3J2Y19pZHg7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIGN1cl9jaGFyX2lkeDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgbmV4dF9hdmFpbF9pZHg7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIHRvdGFsX3NydmM7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIHRvdGFsX2NoYXI7CiAKLSAgICBVSU5UOCAgICAgICAgICAgICAgIHNydmNfaGRsX2NoZzsgICAvKiBzZXJ2aWNlIGhhbmRsZSBjaGFuZ2UgaW5kaWNhdGlvbiBwZW5kaW5nICovCi0gICAgVUlOVDE2ICAgICAgICAgICAgICBhdHRyX2luZGV4OyAgICAgLyogY2FoY2UgTlYgc2F2aW5nL2xvYWRpbmcgYXR0cmlidXRlIGluZGV4ICovCisgICAgdWludDhfdCAgICAgICAgICAgICAgIHNydmNfaGRsX2NoZzsgICAvKiBzZXJ2aWNlIGhhbmRsZSBjaGFuZ2UgaW5kaWNhdGlvbiBwZW5kaW5nICovCisgICAgdWludDE2X3QgICAgICAgICAgICAgIGF0dHJfaW5kZXg7ICAgICAvKiBjYWhjZSBOViBzYXZpbmcvbG9hZGluZyBhdHRyaWJ1dGUgaW5kZXggKi8KIAotICAgIFVJTlQxNiAgICAgICAgICAgICAgbXR1OworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBtdHU7CiB9IHRCVEFfR0FUVENfU0VSVjsKIAogI2lmbmRlZiBCVEFfR0FUVENfTk9USUZfUkVHX01BWApAQCAtMzA1LDE4ICszMDUsMTggQEAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBCT09MRUFOICAgICAgICAgICAgIGluX3VzZTsKKyAgICBib29sICAgICAgICAgICAgIGluX3VzZTsKICAgICBCRF9BRERSICAgICAgICAgICAgIHJlbW90ZV9iZGE7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBoYW5kbGU7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIGhhbmRsZTsKIH10QlRBX0dBVFRDX05PVElGX1JFRzsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICB0QlRBX0dBVFRDX0NCQUNLICAgICAgICAqcF9jYmFjazsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICBpbl91c2U7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgaW5fdXNlOwogICAgIHRCVEFfR0FUVENfSUYgICAgICAgICAgIGNsaWVudF9pZjsgICAgICAvKiBjbGllbnQgaW50ZXJmYWNlIHdpdGggQlRFIHN0YWNrIGZvciB0aGlzIGFwcGxpY2F0aW9uICovCi0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgbnVtX2NsY2I7ICAgICAgIC8qIG51bWJlciBvZiBhc3NvY2lhdGVkIENMQ0IgKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICBkZXJlZ19wZW5kaW5nOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgbnVtX2NsY2I7ICAgICAgIC8qIG51bWJlciBvZiBhc3NvY2lhdGVkIENMQ0IgKi8KKyAgICBib29sICAgICAgICAgICAgICAgICBkZXJlZ19wZW5kaW5nOwogICAgIHRCVF9VVUlEICAgICAgICAgICAgICAgIGFwcF91dWlkOwogICAgIHRCVEFfR0FUVENfTk9USUZfUkVHICAgIG5vdGlmX3JlZ1tCVEFfR0FUVENfTk9USUZfUkVHX01BWF07CiB9dEJUQV9HQVRUQ19SQ0I7CkBAIC0zMjQsNyArMzI0LDcgQEAKIC8qIGNsaWVudCBjaGFubmVsIGlzIGEgbWFwcGluZyBiZXR3ZWVuIGEgQlRBIGNsaWVudChjbF9pZCkgYW5kIGEgcmVtb3RlIEJEIGFkZHJlc3MgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBidGFfY29ubl9pZDsgICAgLyogY2xpZW50IGNoYW5uZWwgSUQsIHVuaXF1ZSBmb3IgY2xjYiAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBidGFfY29ubl9pZDsgICAgLyogY2xpZW50IGNoYW5uZWwgSUQsIHVuaXF1ZSBmb3IgY2xjYiAqLwogICAgIEJEX0FERFIgICAgICAgICAgICAgYmRhOwogICAgIHRCVEFfVFJBTlNQT1JUICAgICAgdHJhbnNwb3J0OyAgICAgIC8qIGNoYW5uZWwgdHJhbnNwb3J0ICovCiAgICAgdEJUQV9HQVRUQ19SQ0IgICAgICAqcF9yY2I7ICAgICAgICAgLyogcG9pbnRlciB0byB0aGUgcmVnaXN0cmF0aW9uIENCICovCkBAIC0zMzUsMjYgKzMzNSwyNiBAQAogI2RlZmluZSBCVEFfR0FUVENfRElTQ19XQUlUSU5HICAgICAgMHgwMQogI2RlZmluZSBCVEFfR0FUVENfUkVRX1dBSVRJTkcgICAgICAgMHgxMAogCi0gICAgVUlOVDggICAgICAgICAgICAgICBhdXRvX3VwZGF0ZTsgLyogYXV0byB1cGRhdGUgaXMgd2FpdGluZyAqLwotICAgIEJPT0xFQU4gICAgICAgICAgICAgZGlzY19hY3RpdmU7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBpbl91c2U7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIGF1dG9fdXBkYXRlOyAvKiBhdXRvIHVwZGF0ZSBpcyB3YWl0aW5nICovCisgICAgYm9vbCAgICAgICAgICAgICBkaXNjX2FjdGl2ZTsKKyAgICBib29sICAgICAgICAgICAgIGluX3VzZTsKICAgICB0QlRBX0dBVFRDX1NUQVRFICAgIHN0YXRlOwogICAgIHRCVEFfR0FUVF9TVEFUVVMgICAgc3RhdHVzOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgcmVhc29uOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICByZWFzb247CiB9IHRCVEFfR0FUVENfQ0xDQjsKIAogLyogYmFjayBncm91bmQgY29ubmVjdGlvbiB0cmFja2luZyBpbmZvcm1hdGlvbiAqLwogI2lmIEdBVFRfTUFYX0FQUFMgPD0gOAotdHlwZWRlZiBVSU5UOCB0QlRBX0dBVFRDX0NJRl9NQVNLIDsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0dBVFRDX0NJRl9NQVNLIDsKICNlbGlmIEdBVFRfTUFYX0FQUFMgPD0gMTYKLXR5cGVkZWYgVUlOVDE2IHRCVEFfR0FUVENfQ0lGX01BU0s7Cit0eXBlZGVmIHVpbnQxNl90IHRCVEFfR0FUVENfQ0lGX01BU0s7CiAjZWxpZiBHQVRUX01BWF9BUFBTIDw9IDMyCi10eXBlZGVmIFVJTlQzMiB0QlRBX0dBVFRDX0NJRl9NQVNLOwordHlwZWRlZiB1aW50MzJfdCB0QlRBX0dBVFRDX0NJRl9NQVNLOwogI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgaW5fdXNlOworICAgIGJvb2wgICAgICAgICAgICAgICAgIGluX3VzZTsKICAgICBCRF9BRERSICAgICAgICAgICAgICAgICByZW1vdGVfYmRhOwogICAgIHRCVEFfR0FUVENfQ0lGX01BU0sgICAgIGNpZl9tYXNrOwogICAgIHRCVEFfR0FUVENfQ0lGX01BU0sgICAgIGNpZl9hZHZfbWFzazsKQEAgLTM2Myw3ICszNjMsNyBAQAogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIEJPT0xFQU4gICAgICAgICAgICAgaW5fdXNlOworICAgIGJvb2wgICAgICAgICAgICAgaW5fdXNlOwogICAgIEJEX0FERFIgICAgICAgICAgICAgcmVtb3RlX2JkYTsKIH10QlRBX0dBVFRDX0NPTk47CiAKQEAgLTM3Nyw3ICszNzcsNyBAQAogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQ4ICAgICAgICAgICAgIHN0YXRlOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgc3RhdGU7CiAKICAgICB0QlRBX0dBVFRDX0NPTk4gICAgIGNvbm5fdHJhY2tbQlRBX0dBVFRDX0NPTk5fTUFYXTsKICAgICB0QlRBX0dBVFRDX0JHX1RDSyAgIGJnX3RyYWNrW0JUQV9HQVRUQ19LTk9XTl9TUl9NQVhdOwpAQCAtMzkyLDcgKzM5Miw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogR0FUVEMgY29udHJvbCBibG9jayAqLwotI2lmIEJUQV9EWU5BTUlDX01FTU9SWSA9PSBGQUxTRQorI2lmIChCVEFfRFlOQU1JQ19NRU1PUlkgPT0gRkFMU0UpCiBleHRlcm4gdEJUQV9HQVRUQ19DQiAgYnRhX2dhdHRjX2NiOwogI2Vsc2UKIGV4dGVybiB0QlRBX0dBVFRDX0NCICpidGFfZ2F0dGNfY2JfcHRyOwpAQCAtNDAyLDggKzQwMiw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqICBGdW5jdGlvbiBwcm90b3R5cGVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBCT09MRUFOIGJ0YV9nYXR0Y19oZGxfZXZlbnQoQlRfSERSICpwX21zZyk7Ci1leHRlcm4gQk9PTEVBTiBidGFfZ2F0dGNfc21fZXhlY3V0ZSh0QlRBX0dBVFRDX0NMQ0IgKnBfY2xjYiwgVUlOVDE2IGV2ZW50LCB0QlRBX0dBVFRDX0RBVEEgKnBfZGF0YSk7CitleHRlcm4gYm9vbCBidGFfZ2F0dGNfaGRsX2V2ZW50KEJUX0hEUiAqcF9tc2cpOworZXh0ZXJuIGJvb2wgYnRhX2dhdHRjX3NtX2V4ZWN1dGUodEJUQV9HQVRUQ19DTENCICpwX2NsY2IsIHVpbnQxNl90IGV2ZW50LCB0QlRBX0dBVFRDX0RBVEEgKnBfZGF0YSk7CiAKIC8qIGZ1bmN0aW9uIHByb2Nlc3NlZCBvdXRzaWRlIFNNICovCiBleHRlcm4gdm9pZCBidGFfZ2F0dGNfZGlzYWJsZSh0QlRBX0dBVFRDX0NCICpwX2NiKTsKQEAgLTQ0Nyw1NyArNDQ3LDU3IEBACiBleHRlcm4gdm9pZCBidGFfZ2F0dGNfaW5pdF9ia19jb25uKHRCVEFfR0FUVENfQVBJX09QRU4gKnBfZGF0YSwgdEJUQV9HQVRUQ19SQ0IgKnBfY2xyZWcpOwogZXh0ZXJuIHZvaWQgYnRhX2dhdHRjX2NhbmNlbF9ia19jb25uKHRCVEFfR0FUVENfQVBJX0NBTkNFTF9PUEVOICpwX2RhdGEpOwogZXh0ZXJuIHZvaWQgYnRhX2dhdHRjX3NlbmRfb3Blbl9jYmFjayggdEJUQV9HQVRUQ19SQ0IgKnBfY2xyZWcsIHRCVEFfR0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRfQUREUiByZW1vdGVfYmRhLCBVSU5UMTYgY29ubl9pZCwgdEJUQV9UUkFOU1BPUlQgdHJhbnNwb3J0LCAgVUlOVDE2IG10dSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRF9BRERSIHJlbW90ZV9iZGEsIHVpbnQxNl90IGNvbm5faWQsIHRCVEFfVFJBTlNQT1JUIHRyYW5zcG9ydCwgIHVpbnQxNl90IG10dSk7CiBleHRlcm4gdm9pZCBidGFfZ2F0dGNfcHJvY2Vzc19hcGlfcmVmcmVzaCh0QlRBX0dBVFRDX0NCICpwX2NiLCB0QlRBX0dBVFRDX0RBVEEgKiBwX21zZyk7CiBleHRlcm4gdm9pZCBidGFfZ2F0dGNfY2ZnX210dSh0QlRBX0dBVFRDX0NMQ0IgKnBfY2xjYiwgdEJUQV9HQVRUQ19EQVRBICpwX2RhdGEpOwotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogZXh0ZXJuIHZvaWQgYnRhX2dhdHRjX2xpc3Rlbih0QlRBX0dBVFRDX0NCICpwX2NiLCB0QlRBX0dBVFRDX0RBVEEgKiBwX21zZyk7CiBleHRlcm4gdm9pZCBidGFfZ2F0dGNfYnJvYWRjYXN0KHRCVEFfR0FUVENfQ0IgKnBfY2IsIHRCVEFfR0FUVENfREFUQSAqIHBfbXNnKTsKICNlbmRpZgogLyogdXRpbGl0eSBmdW5jdGlvbnMgKi8KLWV4dGVybiB0QlRBX0dBVFRDX0NMQ0IgKiBidGFfZ2F0dGNfZmluZF9jbGNiX2J5X2NpZiAoVUlOVDggY2xpZW50X2lmLCBCRF9BRERSIHJlbW90ZV9iZGEsIHRCVEFfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci1leHRlcm4gdEJUQV9HQVRUQ19DTENCICogYnRhX2dhdHRjX2ZpbmRfY2xjYl9ieV9jb25uX2lkIChVSU5UMTYgY29ubl9pZCk7CitleHRlcm4gdEJUQV9HQVRUQ19DTENCICogYnRhX2dhdHRjX2ZpbmRfY2xjYl9ieV9jaWYgKHVpbnQ4X3QgY2xpZW50X2lmLCBCRF9BRERSIHJlbW90ZV9iZGEsIHRCVEFfVFJBTlNQT1JUIHRyYW5zcG9ydCk7CitleHRlcm4gdEJUQV9HQVRUQ19DTENCICogYnRhX2dhdHRjX2ZpbmRfY2xjYl9ieV9jb25uX2lkICh1aW50MTZfdCBjb25uX2lkKTsKIGV4dGVybiB0QlRBX0dBVFRDX0NMQ0IgKiBidGFfZ2F0dGNfY2xjYl9hbGxvYyh0QlRBX0dBVFRDX0lGIGNsaWVudF9pZiwgQkRfQUREUiByZW1vdGVfYmRhLCB0QlRBX1RSQU5TUE9SVCB0cmFuc3BvcnQpOwogZXh0ZXJuIHZvaWQgYnRhX2dhdHRjX2NsY2JfZGVhbGxvYyh0QlRBX0dBVFRDX0NMQ0IgKnBfY2xjYik7CiBleHRlcm4gdEJUQV9HQVRUQ19DTENCICogYnRhX2dhdHRjX2ZpbmRfYWxsb2NfY2xjYih0QlRBX0dBVFRDX0lGIGNsaWVudF9pZiwgQkRfQUREUiByZW1vdGVfYmRhLCB0QlRBX1RSQU5TUE9SVCB0cmFuc3BvcnQpOwotZXh0ZXJuIHRCVEFfR0FUVENfUkNCICogYnRhX2dhdHRjX2NsX2dldF9yZWdjYihVSU5UOCBjbGllbnRfaWYpOworZXh0ZXJuIHRCVEFfR0FUVENfUkNCICogYnRhX2dhdHRjX2NsX2dldF9yZWdjYih1aW50OF90IGNsaWVudF9pZik7CiBleHRlcm4gdEJUQV9HQVRUQ19TRVJWICogYnRhX2dhdHRjX2ZpbmRfc3JjYihCRF9BRERSIGJkYSk7CiBleHRlcm4gdEJUQV9HQVRUQ19TRVJWICogYnRhX2dhdHRjX3NyY2JfYWxsb2MoQkRfQUREUiBiZGEpOwotZXh0ZXJuIHRCVEFfR0FUVENfU0VSViAqIGJ0YV9nYXR0Y19maW5kX3NjYl9ieV9jaWQgKFVJTlQxNiBjb25uX2lkKTsKK2V4dGVybiB0QlRBX0dBVFRDX1NFUlYgKiBidGFfZ2F0dGNfZmluZF9zY2JfYnlfY2lkICh1aW50MTZfdCBjb25uX2lkKTsKIGV4dGVybiB0QlRBX0dBVFRDX0NMQ0IgKiBidGFfZ2F0dGNfZmluZF9pbnRfY29ubl9jbGNiKHRCVEFfR0FUVENfREFUQSAqcF9tc2cpOwogZXh0ZXJuIHRCVEFfR0FUVENfQ0xDQiAqIGJ0YV9nYXR0Y19maW5kX2ludF9kaXNjb25uX2NsY2IodEJUQV9HQVRUQ19EQVRBICpwX21zZyk7CiAKLWV4dGVybiBCT09MRUFOIGJ0YV9nYXR0Y19lbnF1ZXVlKHRCVEFfR0FUVENfQ0xDQiAqcF9jbGNiLCB0QlRBX0dBVFRDX0RBVEEgKnBfZGF0YSk7CitleHRlcm4gYm9vbCBidGFfZ2F0dGNfZW5xdWV1ZSh0QlRBX0dBVFRDX0NMQ0IgKnBfY2xjYiwgdEJUQV9HQVRUQ19EQVRBICpwX2RhdGEpOwogCi1leHRlcm4gQk9PTEVBTiBidGFfZ2F0dGNfdXVpZF9jb21wYXJlIChjb25zdCB0QlRfVVVJRCAqcF9zcmMsIGNvbnN0IHRCVF9VVUlEICpwX3RhciwgQk9PTEVBTiBpc19wcmVjaXNlKTsKLWV4dGVybiBCT09MRUFOIGJ0YV9nYXR0Y19jaGVja19ub3RpZl9yZWdpc3RyeSh0QlRBX0dBVFRDX1JDQiAgKnBfY2xyZWcsIHRCVEFfR0FUVENfU0VSViAqcF9zcmNiLCB0QlRBX0dBVFRDX05PVElGWSAgKnBfbm90aWZ5KTsKLWV4dGVybiBCT09MRUFOIGJ0YV9nYXR0Y19tYXJrX2JnX2Nvbm4gKHRCVEFfR0FUVENfSUYgY2xpZW50X2lmLCAgQkRfQUREUl9QVFIgcmVtb3RlX2JkYSwgQk9PTEVBTiBhZGQsIEJPT0xFQU4gaXNfbGlzdGVuKTsKLWV4dGVybiBCT09MRUFOIGJ0YV9nYXR0Y19jaGVja19iZ19jb25uICh0QlRBX0dBVFRDX0lGIGNsaWVudF9pZiwgIEJEX0FERFIgcmVtb3RlX2JkYSwgVUlOVDggcm9sZSk7Ci1leHRlcm4gVUlOVDggYnRhX2dhdHRjX251bV9yZWdfYXBwKHZvaWQpOwotZXh0ZXJuIHZvaWQgYnRhX2dhdHRjX2NsZWFyX25vdGlmX3JlZ2lzdHJhdGlvbih0QlRBX0dBVFRDX1NFUlYgKnBfc3JjYiwgVUlOVDE2IGNvbm5faWQsIFVJTlQxNiBzdGFydF9oYW5kbGUsIFVJTlQxNiBlbmRfaGFuZGxlKTsKK2V4dGVybiBib29sIGJ0YV9nYXR0Y191dWlkX2NvbXBhcmUgKGNvbnN0IHRCVF9VVUlEICpwX3NyYywgY29uc3QgdEJUX1VVSUQgKnBfdGFyLCBib29sIGlzX3ByZWNpc2UpOworZXh0ZXJuIGJvb2wgYnRhX2dhdHRjX2NoZWNrX25vdGlmX3JlZ2lzdHJ5KHRCVEFfR0FUVENfUkNCICAqcF9jbHJlZywgdEJUQV9HQVRUQ19TRVJWICpwX3NyY2IsIHRCVEFfR0FUVENfTk9USUZZICAqcF9ub3RpZnkpOworZXh0ZXJuIGJvb2wgYnRhX2dhdHRjX21hcmtfYmdfY29ubiAodEJUQV9HQVRUQ19JRiBjbGllbnRfaWYsICBCRF9BRERSX1BUUiByZW1vdGVfYmRhLCBib29sIGFkZCwgYm9vbCBpc19saXN0ZW4pOworZXh0ZXJuIGJvb2wgYnRhX2dhdHRjX2NoZWNrX2JnX2Nvbm4gKHRCVEFfR0FUVENfSUYgY2xpZW50X2lmLCAgQkRfQUREUiByZW1vdGVfYmRhLCB1aW50OF90IHJvbGUpOworZXh0ZXJuIHVpbnQ4X3QgYnRhX2dhdHRjX251bV9yZWdfYXBwKHZvaWQpOworZXh0ZXJuIHZvaWQgYnRhX2dhdHRjX2NsZWFyX25vdGlmX3JlZ2lzdHJhdGlvbih0QlRBX0dBVFRDX1NFUlYgKnBfc3JjYiwgdWludDE2X3QgY29ubl9pZCwgdWludDE2X3Qgc3RhcnRfaGFuZGxlLCB1aW50MTZfdCBlbmRfaGFuZGxlKTsKIGV4dGVybiB0QlRBX0dBVFRDX1NFUlYgKiBidGFfZ2F0dGNfZmluZF9zcnZyX2NhY2hlKEJEX0FERFIgYmRhKTsKIAogLyogZGlzY292ZXJ5IGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgYnRhX2dhdHRjX2Rpc2NfcmVzX2NiYWNrIChVSU5UMTYgY29ubl9pZCwgdEdBVFRfRElTQ19UWVBFIGRpc2NfdHlwZSwgdEdBVFRfRElTQ19SRVMgKnBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfZ2F0dGNfZGlzY19jbXBsX2NiYWNrIChVSU5UMTYgY29ubl9pZCwgdEdBVFRfRElTQ19UWVBFIGRpc2NfdHlwZSwgdEdBVFRfU1RBVFVTIHN0YXR1cyk7Ci1leHRlcm4gdEJUQV9HQVRUX1NUQVRVUyBidGFfZ2F0dGNfZGlzY292ZXJfcHJvY2VkdXJlKFVJTlQxNiBjb25uX2lkLCB0QlRBX0dBVFRDX1NFUlYgKnBfc2VydmVyX2NiLCBVSU5UOCBkaXNjX3R5cGUpOwotZXh0ZXJuIHRCVEFfR0FUVF9TVEFUVVMgYnRhX2dhdHRjX2Rpc2NvdmVyX3ByaV9zZXJ2aWNlKFVJTlQxNiBjb25uX2lkLCB0QlRBX0dBVFRDX1NFUlYgKnBfc2VydmVyX2NiLCBVSU5UOCBkaXNjX3R5cGUpOworZXh0ZXJuIHZvaWQgYnRhX2dhdHRjX2Rpc2NfcmVzX2NiYWNrICh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9ESVNDX1RZUEUgZGlzY190eXBlLCB0R0FUVF9ESVNDX1JFUyAqcF9kYXRhKTsKK2V4dGVybiB2b2lkIGJ0YV9nYXR0Y19kaXNjX2NtcGxfY2JhY2sgKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX0RJU0NfVFlQRSBkaXNjX3R5cGUsIHRHQVRUX1NUQVRVUyBzdGF0dXMpOworZXh0ZXJuIHRCVEFfR0FUVF9TVEFUVVMgYnRhX2dhdHRjX2Rpc2NvdmVyX3Byb2NlZHVyZSh1aW50MTZfdCBjb25uX2lkLCB0QlRBX0dBVFRDX1NFUlYgKnBfc2VydmVyX2NiLCB1aW50OF90IGRpc2NfdHlwZSk7CitleHRlcm4gdEJUQV9HQVRUX1NUQVRVUyBidGFfZ2F0dGNfZGlzY292ZXJfcHJpX3NlcnZpY2UodWludDE2X3QgY29ubl9pZCwgdEJUQV9HQVRUQ19TRVJWICpwX3NlcnZlcl9jYiwgdWludDhfdCBkaXNjX3R5cGUpOwogZXh0ZXJuIHZvaWQgYnRhX2dhdHRjX3NlYXJjaF9zZXJ2aWNlKHRCVEFfR0FUVENfQ0xDQiAqcF9jbGNiLCB0QlRfVVVJRCAqcF91dWlkKTsKLWV4dGVybiBjb25zdCBsaXN0X3QqIGJ0YV9nYXR0Y19nZXRfc2VydmljZXMoVUlOVDE2IGNvbm5faWQpOwotZXh0ZXJuIGNvbnN0IHRCVEFfR0FUVENfU0VSVklDRSogYnRhX2dhdHRjX2dldF9zZXJ2aWNlX2Zvcl9oYW5kbGUoVUlOVDE2IGNvbm5faWQsIFVJTlQxNiBoYW5kbGUpOwotdEJUQV9HQVRUQ19DSEFSQUNURVJJU1RJQyogIGJ0YV9nYXR0Y19nZXRfY2hhcmFjdGVyaXN0aWNfc3JjYih0QlRBX0dBVFRDX1NFUlYgKnBfc3JjYiwgVUlOVDE2IGhhbmRsZSk7Ci1leHRlcm4gdEJUQV9HQVRUQ19DSEFSQUNURVJJU1RJQyogYnRhX2dhdHRjX2dldF9jaGFyYWN0ZXJpc3RpYyhVSU5UMTYgY29ubl9pZCwgVUlOVDE2IGhhbmRsZSk7Ci1leHRlcm4gdEJUQV9HQVRUQ19ERVNDUklQVE9SKiBidGFfZ2F0dGNfZ2V0X2Rlc2NyaXB0b3IoVUlOVDE2IGNvbm5faWQsIFVJTlQxNiBoYW5kbGUpOwotZXh0ZXJuIHZvaWQgYnRhX2dhdHRjX2dldF9nYXR0X2RiKFVJTlQxNiBjb25uX2lkLCBVSU5UMTYgc3RhcnRfaGFuZGxlLCBVSU5UMTYgZW5kX2hhbmRsZSwgYnRnYXR0X2RiX2VsZW1lbnRfdCAqKmRiLCBpbnQgKmNvdW50KTsKK2V4dGVybiBjb25zdCBsaXN0X3QqIGJ0YV9nYXR0Y19nZXRfc2VydmljZXModWludDE2X3QgY29ubl9pZCk7CitleHRlcm4gY29uc3QgdEJUQV9HQVRUQ19TRVJWSUNFKiBidGFfZ2F0dGNfZ2V0X3NlcnZpY2VfZm9yX2hhbmRsZSh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUpOwordEJUQV9HQVRUQ19DSEFSQUNURVJJU1RJQyogIGJ0YV9nYXR0Y19nZXRfY2hhcmFjdGVyaXN0aWNfc3JjYih0QlRBX0dBVFRDX1NFUlYgKnBfc3JjYiwgdWludDE2X3QgaGFuZGxlKTsKK2V4dGVybiB0QlRBX0dBVFRDX0NIQVJBQ1RFUklTVElDKiBidGFfZ2F0dGNfZ2V0X2NoYXJhY3RlcmlzdGljKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSk7CitleHRlcm4gdEJUQV9HQVRUQ19ERVNDUklQVE9SKiBidGFfZ2F0dGNfZ2V0X2Rlc2NyaXB0b3IodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlKTsKK2V4dGVybiB2b2lkIGJ0YV9nYXR0Y19nZXRfZ2F0dF9kYih1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBzdGFydF9oYW5kbGUsIHVpbnQxNl90IGVuZF9oYW5kbGUsIGJ0Z2F0dF9kYl9lbGVtZW50X3QgKipkYiwgaW50ICpjb3VudCk7CiBleHRlcm4gdEJUQV9HQVRUX1NUQVRVUyBidGFfZ2F0dGNfaW5pdF9jYWNoZSh0QlRBX0dBVFRDX1NFUlYgKnBfc3J2Y19jYik7Ci1leHRlcm4gdm9pZCBidGFfZ2F0dGNfcmVidWlsZF9jYWNoZSh0QlRBX0dBVFRDX1NFUlYgKnBfc3JjdiwgVUlOVDE2IG51bV9hdHRyLCB0QlRBX0dBVFRDX05WX0FUVFIgKmF0dHIpOwotZXh0ZXJuIHZvaWQgYnRhX2dhdHRjX2NhY2hlX3NhdmUodEJUQV9HQVRUQ19TRVJWICpwX3NydmNfY2IsIFVJTlQxNiBjb25uX2lkKTsKK2V4dGVybiB2b2lkIGJ0YV9nYXR0Y19yZWJ1aWxkX2NhY2hlKHRCVEFfR0FUVENfU0VSViAqcF9zcmN2LCB1aW50MTZfdCBudW1fYXR0ciwgdEJUQV9HQVRUQ19OVl9BVFRSICphdHRyKTsKK2V4dGVybiB2b2lkIGJ0YV9nYXR0Y19jYWNoZV9zYXZlKHRCVEFfR0FUVENfU0VSViAqcF9zcnZjX2NiLCB1aW50MTZfdCBjb25uX2lkKTsKIGV4dGVybiB2b2lkIGJ0YV9nYXR0Y19yZXNldF9kaXNjb3Zlcl9zdCh0QlRBX0dBVFRDX1NFUlYgKnBfc3JjYiwgdEJUQV9HQVRUX1NUQVRVUyBzdGF0dXMpOwogCiBleHRlcm4gdEJUQV9HQVRUQ19DT05OICogYnRhX2dhdHRjX2Nvbm5fYWxsb2MoQkRfQUREUiByZW1vdGVfYmRhKTsKIGV4dGVybiB0QlRBX0dBVFRDX0NPTk4gKiBidGFfZ2F0dGNfY29ubl9maW5kKEJEX0FERFIgcmVtb3RlX2JkYSk7CiBleHRlcm4gdEJUQV9HQVRUQ19DT05OICogYnRhX2dhdHRjX2Nvbm5fZmluZF9hbGxvYyhCRF9BRERSIHJlbW90ZV9iZGEpOwotZXh0ZXJuIEJPT0xFQU4gYnRhX2dhdHRjX2Nvbm5fZGVhbGxvYyhCRF9BRERSIHJlbW90ZV9iZGEpOworZXh0ZXJuIGJvb2wgYnRhX2dhdHRjX2Nvbm5fZGVhbGxvYyhCRF9BRERSIHJlbW90ZV9iZGEpOwogCiBleHRlcm4gYm9vbCBidGFfZ2F0dGNfY2FjaGVfbG9hZCh0QlRBX0dBVFRDX0NMQ0IgKnBfY2xjYik7CiBleHRlcm4gdm9pZCBidGFfZ2F0dGNfY2FjaGVfcmVzZXQoQkRfQUREUiBzZXJ2ZXJfYmRhKTsKZGlmZiAtLWdpdCBhL2J0YS9nYXR0L2J0YV9nYXR0Y19tYWluLmNjIGIvYnRhL2dhdHQvYnRhX2dhdHRjX21haW4uY2MKaW5kZXggODZkODUzNi4uY2MxYmQwMiAxMDA2NDQKLS0tIGEvYnRhL2dhdHQvYnRhX2dhdHRjX21haW4uY2MKKysrIGIvYnRhL2dhdHQvYnRhX2dhdHRjX21haW4uY2MKQEAgLTI0LDcgKzI0LDcgQEAKIAogI2luY2x1ZGUgImJ0X3RhcmdldC5oIgogCi0jaWYgZGVmaW5lZChCVEFfR0FUVF9JTkNMVURFRCkgJiYgKEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIApAQCAtMTEwLDcgKzExMCw3IEBACiAjZGVmaW5lIEJUQV9HQVRUQ19OVU1fQ09MUyAgICAgICAgICAgIDIgICAgICAgLyogbnVtYmVyIG9mIGNvbHVtbnMgaW4gc3RhdGUgdGFibGVzICovCiAKIC8qIHN0YXRlIHRhYmxlIGZvciBpZGxlIHN0YXRlICovCi1zdGF0aWMgY29uc3QgVUlOVDggYnRhX2dhdHRjX3N0X2lkbGVbXVtCVEFfR0FUVENfTlVNX0NPTFNdID0KK3N0YXRpYyBjb25zdCB1aW50OF90IGJ0YV9nYXR0Y19zdF9pZGxlW11bQlRBX0dBVFRDX05VTV9DT0xTXSA9CiB7CiAvKiBFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gMSAgICAgICAgICAgICAgICAgIE5leHQgc3RhdGUgKi8KIC8qIEJUQV9HQVRUQ19BUElfT1BFTl9FVlQgICAgICAgICAgICovICAge0JUQV9HQVRUQ19PUEVOLCAgICAgICAgICAgICAgQlRBX0dBVFRDX1c0X0NPTk5fU1R9LApAQCAtMTM5LDcgKzEzOSw3IEBACiB9OwogCiAvKiBzdGF0ZSB0YWJsZSBmb3Igd2FpdCBmb3Igb3BlbiBzdGF0ZSAqLwotc3RhdGljIGNvbnN0IFVJTlQ4IGJ0YV9nYXR0Y19zdF93NF9jb25uW11bQlRBX0dBVFRDX05VTV9DT0xTXSA9CitzdGF0aWMgY29uc3QgdWludDhfdCBidGFfZ2F0dGNfc3RfdzRfY29ubltdW0JUQV9HQVRUQ19OVU1fQ09MU10gPQogewogLyogRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5leHQgc3RhdGUgKi8KIC8qIEJUQV9HQVRUQ19BUElfT1BFTl9FVlQgICAgICAgICAgICovICAge0JUQV9HQVRUQ19PUEVOLCAgICAgICAgICAgICAgQlRBX0dBVFRDX1c0X0NPTk5fU1R9LApAQCAtMTY4LDcgKzE2OCw3IEBACiB9OwogCiAvKiBzdGF0ZSB0YWJsZSBmb3Igb3BlbiBzdGF0ZSAqLwotc3RhdGljIGNvbnN0IFVJTlQ4IGJ0YV9nYXR0Y19zdF9jb25uZWN0ZWRbXVtCVEFfR0FUVENfTlVNX0NPTFNdID0KK3N0YXRpYyBjb25zdCB1aW50OF90IGJ0YV9nYXR0Y19zdF9jb25uZWN0ZWRbXVtCVEFfR0FUVENfTlVNX0NPTFNdID0KIHsKIC8qIEV2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5leHQgc3RhdGUgKi8KIC8qIEJUQV9HQVRUQ19BUElfT1BFTl9FVlQgICAgICAgICAgICovICAge0JUQV9HQVRUQ19PUEVOLCAgICAgICAgICAgICAgIEJUQV9HQVRUQ19DT05OX1NUfSwKQEAgLTE5OCw3ICsxOTgsNyBAQAogfTsKIAogLyogc3RhdGUgdGFibGUgZm9yIGRpc2NvdmVyIHN0YXRlICovCi1zdGF0aWMgY29uc3QgVUlOVDggYnRhX2dhdHRjX3N0X2Rpc2NvdmVyW11bQlRBX0dBVFRDX05VTV9DT0xTXSA9CitzdGF0aWMgY29uc3QgdWludDhfdCBidGFfZ2F0dGNfc3RfZGlzY292ZXJbXVtCVEFfR0FUVENfTlVNX0NPTFNdID0KIHsKIC8qIEV2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5leHQgc3RhdGUgKi8KIC8qIEJUQV9HQVRUQ19BUElfT1BFTl9FVlQgICAgICAgICAgICovICAge0JUQV9HQVRUQ19PUEVOLCAgICAgICAgICAgICAgIEJUQV9HQVRUQ19ESVNDT1ZFUl9TVH0sCkBAIC0yMjcsNyArMjI3LDcgQEAKIH07CiAKIC8qIHR5cGUgZm9yIHN0YXRlIHRhYmxlICovCi10eXBlZGVmIGNvbnN0IFVJTlQ4ICgqdEJUQV9HQVRUQ19TVF9UQkwpW0JUQV9HQVRUQ19OVU1fQ09MU107Cit0eXBlZGVmIGNvbnN0IHVpbnQ4X3QgKCp0QlRBX0dBVFRDX1NUX1RCTClbQlRBX0dBVFRDX05VTV9DT0xTXTsKIAogLyogc3RhdGUgdGFibGUgKi8KIGNvbnN0IHRCVEFfR0FUVENfU1RfVEJMIGJ0YV9nYXR0Y19zdF90YmxbXSA9CkBAIC0yNDMsMTEgKzI0MywxMSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEdBVFRDIGNvbnRyb2wgYmxvY2sgKi8KLSNpZiBCVEFfRFlOQU1JQ19NRU1PUlkgPT0gRkFMU0UKKyNpZiAoQlRBX0RZTkFNSUNfTUVNT1JZID09IEZBTFNFKQogdEJUQV9HQVRUQ19DQiAgYnRhX2dhdHRjX2NiOwogI2VuZGlmCiAKLSNpZiBCVEFfR0FUVF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9HQVRUX0RFQlVHID09IFRSVUUpCiBzdGF0aWMgY2hhciAqZ2F0dGNfZXZ0X2NvZGUodEJUQV9HQVRUQ19JTlRfRVZUIGV2dF9jb2RlKTsKIHN0YXRpYyBjaGFyICpnYXR0Y19zdGF0ZV9jb2RlKHRCVEFfR0FUVENfU1RBVEUgc3RhdGVfY29kZSk7CiAjZW5kaWYKQEAgLTI1OSwxOSArMjU5LDE5IEBACiAqKiBEZXNjcmlwdGlvbiAgICAgIFN0YXRlIG1hY2hpbmUgZXZlbnQgaGFuZGxpbmcgZnVuY3Rpb24gZm9yIEdBVFRDCiAqKgogKioKLSoqIFJldHVybnMgICAgICAgICAgQk9PTEVBTiAgOiBUUlVFIGlmIHF1ZXVlZCBjbGllbnQgcmVxdWVzdCBidWZmZXIgY2FuIGJlIGltbWVkaWF0ZWx5IHJlbGVhc2VkCi0qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIEZBTFNFCisqKiBSZXR1cm5zICAgICAgICAgIGJvb2wgIDogdHJ1ZSBpZiBxdWV1ZWQgY2xpZW50IHJlcXVlc3QgYnVmZmVyIGNhbiBiZSBpbW1lZGlhdGVseSByZWxlYXNlZAorKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBmYWxzZQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9nYXR0Y19zbV9leGVjdXRlKHRCVEFfR0FUVENfQ0xDQiAqcF9jbGNiLCBVSU5UMTYgZXZlbnQsIHRCVEFfR0FUVENfREFUQSAqcF9kYXRhKQorYm9vbCBidGFfZ2F0dGNfc21fZXhlY3V0ZSh0QlRBX0dBVFRDX0NMQ0IgKnBfY2xjYiwgdWludDE2X3QgZXZlbnQsIHRCVEFfR0FUVENfREFUQSAqcF9kYXRhKQogewogICAgIHRCVEFfR0FUVENfU1RfVEJMICAgICBzdGF0ZV90YWJsZTsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGFjdGlvbjsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgYWN0aW9uOwogICAgIGludCAgICAgICAgICAgICAgICAgaTsKLSAgICBCT09MRUFOICAgICAgICAgICAgIHJ0ID0gVFJVRTsKLSNpZiBCVEFfR0FUVF9ERUJVRyA9PSBUUlVFCisgICAgYm9vbCAgICAgICAgICAgICBydCA9IHRydWU7CisjaWYgKEJUQV9HQVRUX0RFQlVHID09IFRSVUUpCiAgICAgdEJUQV9HQVRUQ19TVEFURSBpbl9zdGF0ZSA9IHBfY2xjYi0+c3RhdGU7Ci0gICAgVUlOVDE2ICAgICAgICAgaW5fZXZlbnQgPSBldmVudDsKKyAgICB1aW50MTZfdCAgICAgICAgIGluX2V2ZW50ID0gZXZlbnQ7CiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2dhdHRjX3NtX2V4ZWN1dGU6IFN0YXRlIDB4JTAyeCBbJXNdLCBFdmVudCAweCV4WyVzXSIsIGluX3N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgIGdhdHRjX3N0YXRlX2NvZGUoaW5fc3RhdGUpLAogICAgICAgICAgICAgICAgICAgICAgIGluX2V2ZW50LApAQCAtMjk3LDcgKzI5Nyw3IEBACiAgICAgICAgICAgICAgICAgLyogYnVmZmVyIGlzIHF1ZXVlZCwgZG9uJ3QgZnJlZSBpbiB0aGUgYnRhIGRpc3BhdGNoZXIuCiAgICAgICAgICAgICAgICAgICogd2UgZnJlZSBpdCBvdXJzZWx2ZXMgd2hlbiBhIGNvbXBsZXRpb24gZXZlbnQgaXMgcmVjZWl2ZWQuCiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcnQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBydCA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UKQEAgLTMwNiw3ICszMDYsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0jaWYgQlRBX0dBVFRfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfR0FUVF9ERUJVRyA9PSBUUlVFKQogICAgIGlmIChpbl9zdGF0ZSAhPSBwX2NsY2ItPnN0YXRlKQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiR0FUVEMgU3RhdGUgQ2hhbmdlOiBbJXNdIC0+IFslc10gYWZ0ZXIgRXZlbnQgWyVzXSIsCkBAIC0zMjUsMTYgKzMyNSwxNiBAQAogKiogRGVzY3JpcHRpb24gICAgICBHQVRUIGNsaWVudCBtYWluIGV2ZW50IGhhbmRsaW5nIGZ1bmN0aW9uLgogKioKICoqCi0qKiBSZXR1cm5zICAgICAgICAgIEJPT0xFQU4KKyoqIFJldHVybnMgICAgICAgICAgYm9vbAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9nYXR0Y19oZGxfZXZlbnQoQlRfSERSICpwX21zZykKK2Jvb2wgYnRhX2dhdHRjX2hkbF9ldmVudChCVF9IRFIgKnBfbXNnKQogewogICAgIHRCVEFfR0FUVENfQ0IgKnBfY2IgPSAmYnRhX2dhdHRjX2NiOwogICAgIHRCVEFfR0FUVENfQ0xDQiAqcF9jbGNiID0gTlVMTDsKICAgICB0QlRBX0dBVFRDX1JDQiAgICAgICpwX2NscmVnOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgcnQgPSBUUlVFOwotI2lmIEJUQV9HQVRUX0RFQlVHID09IFRSVUUKKyAgICBib29sICAgICAgICAgICAgIHJ0ID0gdHJ1ZTsKKyNpZiAoQlRBX0dBVFRfREVCVUcgPT0gVFJVRSkKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfZ2F0dGNfaGRsX2V2ZW50OiBFdmVudCBbJXNdIiwgZ2F0dGNfZXZ0X2NvZGUocF9tc2ctPmV2ZW50KSk7CiAjZW5kaWYKICAgICBzd2l0Y2ggKHBfbXNnLT5ldmVudCkKQEAgLTM2OCw3ICszNjgsNyBAQAogICAgICAgICAgICAgYnRhX2dhdHRjX3Byb2Nlc3NfYXBpX3JlZnJlc2gocF9jYiwgKHRCVEFfR0FUVENfREFUQSAqKSBwX21zZyk7CiAgICAgICAgICAgICBicmVhazsKIAotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogICAgICAgICBjYXNlIEJUQV9HQVRUQ19BUElfTElTVEVOX0VWVDoKICAgICAgICAgICAgIGJ0YV9nYXR0Y19saXN0ZW4ocF9jYiwgKHRCVEFfR0FUVENfREFUQSAqKSBwX21zZyk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTQwOSw3ICs0MDksNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKiAgRGVidWcgRnVuY3Rpb25zCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZiBCVEFfR0FUVF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9HQVRUX0RFQlVHID09IFRSVUUpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpkaWZmIC0tZ2l0IGEvYnRhL2dhdHQvYnRhX2dhdHRjX3V0aWxzLmNjIGIvYnRhL2dhdHQvYnRhX2dhdHRjX3V0aWxzLmNjCmluZGV4IDE2MDBkNWMuLjllM2YxNmIgMTAwNjQ0Ci0tLSBhL2J0YS9nYXR0L2J0YV9nYXR0Y191dGlscy5jYworKysgYi9idGEvZ2F0dC9idGFfZ2F0dGNfdXRpbHMuY2MKQEAgLTI2LDcgKzI2LDcgQEAKIAogI2luY2x1ZGUgImJ0X3RhcmdldC5oIgogCi0jaWYgZGVmaW5lZChCVEFfR0FUVF9JTkNMVURFRCkgJiYgKEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIApAQCAtNDEsNyArNDEsNyBAQAogKiogIENvbnN0YW50cwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBjb25zdCBVSU5UOCAgYmFzZV91dWlkW0xFTl9VVUlEXzEyOF0gPSB7MHhGQiwgMHgzNCwgMHg5QiwgMHg1RiwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwKK3N0YXRpYyBjb25zdCB1aW50OF90ICBiYXNlX3V1aWRbTEVOX1VVSURfMTI4XSA9IHsweEZCLCAweDM0LCAweDlCLCAweDVGLCAweDgwLCAweDAwLCAweDAwLCAweDgwLAogICAgIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwogCiBzdGF0aWMgY29uc3QgQkRfQUREUiBkdW1teV9iZGEgPSB7MCwwLDAsMCwwLDB9OwpAQCAtNTIsMTIgKzUyLDEyIEBACiAqKgogKiogRGVzY3JpcHRpb24gICAgICBDb252ZXJ0IGEgMTYgYml0cyBVVUlEIHRvIGJlIGFuIHN0YW5kYXJkIDEyOCBiaXRzIG9uZS4KICoqCi0qKiBSZXR1cm5zICAgICAgICAgIFRSVUUgaWYgdHdvIHV1aWQgbWF0Y2g7IEZBTFNFIG90aGVyd2lzZS4KKyoqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiB0d28gdXVpZCBtYXRjaDsgZmFsc2Ugb3RoZXJ3aXNlLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9nYXR0X2NvbnZlcnRfdXVpZDE2X3RvX3V1aWQxMjgoVUlOVDggdXVpZF8xMjhbTEVOX1VVSURfMTI4XSwgVUlOVDE2IHV1aWRfMTYpCit2b2lkIGJ0YV9nYXR0X2NvbnZlcnRfdXVpZDE2X3RvX3V1aWQxMjgodWludDhfdCB1dWlkXzEyOFtMRU5fVVVJRF8xMjhdLCB1aW50MTZfdCB1dWlkXzE2KQogewotICAgIFVJTlQ4ICAgKnAgPSAmdXVpZF8xMjhbTEVOX1VVSURfMTI4IC0gNF07CisgICAgdWludDhfdCAgICpwID0gJnV1aWRfMTI4W0xFTl9VVUlEXzEyOCAtIDRdOwogCiAgICAgbWVtY3B5ICh1dWlkXzEyOCwgYmFzZV91dWlkLCBMRU5fVVVJRF8xMjgpOwogCkBAIC02OSwyMSArNjksMjEgQEAKICoqCiAqKiBEZXNjcmlwdGlvbiAgICAgIENvbXBhcmUgdHdvIFVVSUQgdG8gc2VlIGlmIHRoZXkgYXJlIHRoZSBzYW1lLgogKioKLSoqIFJldHVybnMgICAgICAgICAgVFJVRSBpZiB0d28gdXVpZCBtYXRjaDsgRkFMU0Ugb3RoZXJ3aXNlLgorKiogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHR3byB1dWlkIG1hdGNoOyBmYWxzZSBvdGhlcndpc2UuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX2dhdHRjX3V1aWRfY29tcGFyZSAoY29uc3QgdEJUX1VVSUQgKnBfc3JjLCBjb25zdCB0QlRfVVVJRCAqcF90YXIsIEJPT0xFQU4gaXNfcHJlY2lzZSkKK2Jvb2wgYnRhX2dhdHRjX3V1aWRfY29tcGFyZSAoY29uc3QgdEJUX1VVSUQgKnBfc3JjLCBjb25zdCB0QlRfVVVJRCAqcF90YXIsIGJvb2wgaXNfcHJlY2lzZSkKIHsKLSAgICBVSU5UOCAgc3VbTEVOX1VVSURfMTI4XSwgdHVbTEVOX1VVSURfMTI4XTsKLSAgICBjb25zdCBVSU5UOCAgKnBzLCAqcHQ7CisgICAgdWludDhfdCAgc3VbTEVOX1VVSURfMTI4XSwgdHVbTEVOX1VVSURfMTI4XTsKKyAgICBjb25zdCB1aW50OF90ICAqcHMsICpwdDsKIAogICAgIC8qIGFueSBvZiB0aGUgVVVJRCBpcyB1bnNwZWNpZmllZCAqLwogICAgIGlmIChwX3NyYyA9PSAwIHx8IHBfdGFyID09IDApCiAgICAgewogICAgICAgICBpZiAoaXNfcHJlY2lzZSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICAvKiBJZiBib3RoIGFyZSAxNi1iaXQsIHdlIGNhbiBkbyBhIHNpbXBsZSBjb21wYXJlICovCkBAIC0xMjMsOSArMTIzLDkgQEAKICoqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgcmVnY2IKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9HQVRUQ19SQ0IgKiBidGFfZ2F0dGNfY2xfZ2V0X3JlZ2NiKFVJTlQ4IGNsaWVudF9pZikKK3RCVEFfR0FUVENfUkNCICogYnRhX2dhdHRjX2NsX2dldF9yZWdjYih1aW50OF90IGNsaWVudF9pZikKIHsKLSAgICBVSU5UOCAgIGkgPSAwOworICAgIHVpbnQ4X3QgICBpID0gMDsKICAgICB0QlRBX0dBVFRDX1JDQiAgKnBfY2xyY2IgPSAmYnRhX2dhdHRjX2NiLmNsX3JjYlswXTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBCVEFfR0FUVENfQ0xfTUFYOyBpICsrLCBwX2NscmNiICsrKQpAQCAtMTQ1LDkgKzE0NSw5IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHJlZ2NiCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVVJTlQ4IGJ0YV9nYXR0Y19udW1fcmVnX2FwcCh2b2lkKQordWludDhfdCBidGFfZ2F0dGNfbnVtX3JlZ19hcHAodm9pZCkKIHsKLSAgICBVSU5UOCAgIGkgPSAwLCBqID0gMDsKKyAgICB1aW50OF90ICAgaSA9IDAsIGogPSAwOwogCiAgICAgZm9yIChpID0gMDsgaSA8IEJUQV9HQVRUQ19DTF9NQVg7IGkgKyspCiAgICAgewpAQCAtMTY1LDExICsxNjUsMTEgQEAKICoqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgY2xjYgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0dBVFRDX0NMQ0IgKiBidGFfZ2F0dGNfZmluZF9jbGNiX2J5X2NpZiAoVUlOVDggY2xpZW50X2lmLCBCRF9BRERSIHJlbW90ZV9iZGEsCit0QlRBX0dBVFRDX0NMQ0IgKiBidGFfZ2F0dGNfZmluZF9jbGNiX2J5X2NpZiAodWludDhfdCBjbGllbnRfaWYsIEJEX0FERFIgcmVtb3RlX2JkYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX1RSQU5TUE9SVCB0cmFuc3BvcnQpCiB7CiAgICAgdEJUQV9HQVRUQ19DTENCICpwX2NsY2IgPSAmYnRhX2dhdHRjX2NiLmNsY2JbMF07Ci0gICAgVUlOVDggICBpOworICAgIHVpbnQ4X3QgICBpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IEJUQV9HQVRUQ19DTENCX01BWDsgaSArKywgcF9jbGNiICsrKQogICAgIHsKQEAgLTE5MCwxMCArMTkwLDEwIEBACiAqKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNsY2IKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9HQVRUQ19DTENCICogYnRhX2dhdHRjX2ZpbmRfY2xjYl9ieV9jb25uX2lkIChVSU5UMTYgY29ubl9pZCkKK3RCVEFfR0FUVENfQ0xDQiAqIGJ0YV9nYXR0Y19maW5kX2NsY2JfYnlfY29ubl9pZCAodWludDE2X3QgY29ubl9pZCkKIHsKICAgICB0QlRBX0dBVFRDX0NMQ0IgKnBfY2xjYiA9ICZidGFfZ2F0dGNfY2IuY2xjYlswXTsKLSAgICBVSU5UOCBpOworICAgIHVpbnQ4X3QgaTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBCVEFfR0FUVENfQ0xDQl9NQVg7IGkgKyssIHBfY2xjYiArKykKICAgICB7CkBAIC0yMTYsMTggKzIxNiwxOCBAQAogdEJUQV9HQVRUQ19DTENCICogYnRhX2dhdHRjX2NsY2JfYWxsb2ModEJUQV9HQVRUQ19JRiBjbGllbnRfaWYsIEJEX0FERFIgcmVtb3RlX2JkYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfVFJBTlNQT1JUIHRyYW5zcG9ydCkKIHsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGlfY2xjYiA9IDA7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIGlfY2xjYiA9IDA7CiAgICAgdEJUQV9HQVRUQ19DTENCICAgICAqcF9jbGNiID0gTlVMTDsKIAogICAgIGZvciAoaV9jbGNiID0gMDsgaV9jbGNiIDwgQlRBX0dBVFRDX0NMQ0JfTUFYOyBpX2NsY2IrKykKICAgICB7CiAgICAgICAgIGlmICghYnRhX2dhdHRjX2NiLmNsY2JbaV9jbGNiXS5pbl91c2UpCiAgICAgICAgIHsKLSNpZiBCVEFfR0FUVF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9HQVRUX0RFQlVHID09IFRSVUUpCiAgICAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfZ2F0dGNfY2xjYl9hbGxvYzogZm91bmQgY2xjYlslZF0gYXZhaWxhYmxlIixpX2NsY2IpOwogI2VuZGlmCiAgICAgICAgICAgICBwX2NsY2IgICAgICAgICAgICAgICAgICA9ICZidGFfZ2F0dGNfY2IuY2xjYltpX2NsY2JdOwotICAgICAgICAgICAgcF9jbGNiLT5pbl91c2UgICAgICAgICAgPSBUUlVFOworICAgICAgICAgICAgcF9jbGNiLT5pbl91c2UgICAgICAgICAgPSB0cnVlOwogICAgICAgICAgICAgcF9jbGNiLT5zdGF0dXMgICAgICAgICAgPSBCVEFfR0FUVF9PSzsKICAgICAgICAgICAgIHBfY2xjYi0+dHJhbnNwb3J0ICAgICAgID0gdHJhbnNwb3J0OwogICAgICAgICAgICAgYmRjcHkocF9jbGNiLT5iZGEsIHJlbW90ZV9iZGEpOwpAQCAtMjQ1LDcgKzI0NSw3IEBACiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLyogcmVsZWFzZSB0aGlzIGNsY2IgaWYgY2xjYiBvciBzcmNiIGFsbG9jYXRpb24gZmFpbGVkICovCi0gICAgICAgICAgICAgICAgcF9jbGNiLT5pbl91c2UgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBwX2NsY2ItPmluX3VzZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHBfY2xjYiA9IE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTI5OSw3ICsyOTksNyBAQAogICAgICAgICAvKiBpZiB0aGUgc3JjYiBpcyBubyBsb25nZXIgbmVlZGVkLCByZXNldCB0aGUgc3RhdGUgKi8KICAgICAgICAgaWYgKCBwX3NyY2ItPm51bV9jbGNiID09IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIHBfc3JjYi0+Y29ubmVjdGVkID0gRkFMU0U7CisgICAgICAgICAgICBwX3NyY2ItPmNvbm5lY3RlZCA9IGZhbHNlOwogICAgICAgICAgICAgcF9zcmNiLT5zdGF0ZSA9IEJUQV9HQVRUQ19TRVJWX0lETEU7CiAgICAgICAgICAgICBwX3NyY2ItPm10dSA9IDA7CiAgICAgICAgIH0KQEAgLTMyMyw3ICszMjMsNyBAQAogdEJUQV9HQVRUQ19TRVJWICogYnRhX2dhdHRjX2ZpbmRfc3JjYihCRF9BRERSIGJkYSkKIHsKICAgICB0QlRBX0dBVFRDX1NFUlYgKnBfc3JjYiA9ICZidGFfZ2F0dGNfY2Iua25vd25fc2VydmVyWzBdOwotICAgIFVJTlQ4ICAgaTsKKyAgICB1aW50OF90ICAgaTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBCVEFfR0FUVENfS05PV05fU1JfTUFYOyBpICsrLCBwX3NyY2IgKyspCiAgICAgewpAQCAtMzQ1LDcgKzM0NSw3IEBACiB0QlRBX0dBVFRDX1NFUlYgKiBidGFfZ2F0dGNfZmluZF9zcnZyX2NhY2hlKEJEX0FERFIgYmRhKQogewogICAgIHRCVEFfR0FUVENfU0VSViAqcF9zcmNiID0gJmJ0YV9nYXR0Y19jYi5rbm93bl9zZXJ2ZXJbMF07Ci0gICAgVUlOVDggICBpOworICAgIHVpbnQ4X3QgICBpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IEJUQV9HQVRUQ19LTk9XTl9TUl9NQVg7IGkgKyssIHBfc3JjYiArKykKICAgICB7CkBAIC0zNjMsNyArMzYzLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgc2VydmVyIGNhY2hlLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0dBVFRDX1NFUlYgKiBidGFfZ2F0dGNfZmluZF9zY2JfYnlfY2lkIChVSU5UMTYgY29ubl9pZCkKK3RCVEFfR0FUVENfU0VSViAqIGJ0YV9nYXR0Y19maW5kX3NjYl9ieV9jaWQgKHVpbnQxNl90IGNvbm5faWQpCiB7CiAgICAgdEJUQV9HQVRUQ19DTENCICpwX2NsY2IgPSBidGFfZ2F0dGNfZmluZF9jbGNiX2J5X2Nvbm5faWQoY29ubl9pZCk7CiAKQEAgLTM4NSwxNCArMzg1LDE0IEBACiB7CiAgICAgdEJUQV9HQVRUQ19TRVJWICpwX3RjYiA9ICZidGFfZ2F0dGNfY2Iua25vd25fc2VydmVyWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9yZWN5Y2xlID0gTlVMTDsKLSAgICBCT09MRUFOICAgICAgICAgZm91bmQgPSBGQUxTRTsKLSAgICBVSU5UOCAgICAgICAgICAgaTsKKyAgICBib29sICAgICAgICAgZm91bmQgPSBmYWxzZTsKKyAgICB1aW50OF90ICAgICAgICAgICBpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IEJUQV9HQVRUQ19LTk9XTl9TUl9NQVg7IGkgKyssIHBfdGNiICsrKQogICAgIHsKICAgICAgICAgaWYgKCFwX3RjYi0+aW5fdXNlKQogICAgICAgICB7Ci0gICAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmICghcF90Y2ItPmNvbm5lY3RlZCkKQEAgLTQxNSw3ICs0MTUsNyBAQAogICAgICAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQgKiopJnBfdGNiLT5wX3NydmNfbGlzdCk7CiAgICAgICAgIG1lbXNldChwX3RjYiwgMCAsIHNpemVvZih0QlRBX0dBVFRDX1NFUlYpKTsKIAotICAgICAgICBwX3RjYi0+aW5fdXNlID0gVFJVRTsKKyAgICAgICAgcF90Y2ItPmluX3VzZSA9IHRydWU7CiAgICAgICAgIGJkY3B5KHBfdGNiLT5zZXJ2ZXJfYmRhLCBiZGEpOwogICAgIH0KICAgICByZXR1cm4gcF90Y2I7CkBAIC00MjksMTggKzQyOSwxOCBAQAogKiogUmV0dXJucyAgICAgICAgICBzdWNjZXNzIG9yIGZhaWx1cmUuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX2dhdHRjX2VucXVldWUodEJUQV9HQVRUQ19DTENCICpwX2NsY2IsIHRCVEFfR0FUVENfREFUQSAqcF9kYXRhKQorYm9vbCBidGFfZ2F0dGNfZW5xdWV1ZSh0QlRBX0dBVFRDX0NMQ0IgKnBfY2xjYiwgdEJUQV9HQVRUQ19EQVRBICpwX2RhdGEpCiB7CiAKICAgICBpZiAocF9jbGNiLT5wX3FfY21kID09IE5VTEwpCiAgICAgewogICAgICAgICBwX2NsY2ItPnBfcV9jbWQgPSBwX2RhdGE7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICBBUFBMX1RSQUNFX0VSUk9SICgiJXM6IGFscmVhZHkgaGFzIGEgcGVuZGluZyBjb21tYW5kISEiLCBfX2Z1bmNfXyk7CiAgICAgLyogc2tpcCB0aGUgY2FsbGJhY2sgbm93LiAtLS0tLSBuZWVkIHRvIHNlbmQgY2FsbGJhY2sgPyAqLwotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00NTIsMTAgKzQ1MiwxMCBAQAogKiogUmV0dXJucwogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9nYXR0Y19jaGVja19ub3RpZl9yZWdpc3RyeSh0QlRBX0dBVFRDX1JDQiAgKnBfY2xyZWcsIHRCVEFfR0FUVENfU0VSViAqcF9zcmNiLAorYm9vbCBidGFfZ2F0dGNfY2hlY2tfbm90aWZfcmVnaXN0cnkodEJUQV9HQVRUQ19SQ0IgICpwX2NscmVnLCB0QlRBX0dBVFRDX1NFUlYgKnBfc3JjYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVENfTk9USUZZICAqcF9ub3RpZnkpCiB7Ci0gICAgVUlOVDggICAgICAgICAgIGk7CisgICAgdWludDhfdCAgICAgICAgICAgaTsKIAogICAgIGZvciAoaSA9IDAgOyBpIDwgQlRBX0dBVFRDX05PVElGX1JFR19NQVg7IGkgKyspCiAgICAgewpAQCAtNDY0LDEwICs0NjQsMTAgQEAKICAgICAgICAgICAgIHBfY2xyZWctPm5vdGlmX3JlZ1tpXS5oYW5kbGUgPT0gcF9ub3RpZnktPmhhbmRsZSkKICAgICAgICAgewogICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiTm90aWZpY2F0aW9uIHJlZ2lzdGVyZWQhIik7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiAKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00ODIsMTUgKzQ4MiwxNSBAQAogKiogUmV0dXJucyAgICAgICAgICBOb25lLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9nYXR0Y19jbGVhcl9ub3RpZl9yZWdpc3RyYXRpb24odEJUQV9HQVRUQ19TRVJWICpwX3NyY2IsIFVJTlQxNiBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBzdGFydF9oYW5kbGUsIFVJTlQxNiBlbmRfaGFuZGxlKQordm9pZCBidGFfZ2F0dGNfY2xlYXJfbm90aWZfcmVnaXN0cmF0aW9uKHRCVEFfR0FUVENfU0VSViAqcF9zcmNiLCB1aW50MTZfdCBjb25uX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN0YXJ0X2hhbmRsZSwgdWludDE2X3QgZW5kX2hhbmRsZSkKIHsKICAgICBCRF9BRERSICAgICAgICAgICAgIHJlbW90ZV9iZGE7CiAgICAgdEJUQV9HQVRUQ19JRiAgICAgICBnYXR0X2lmOwogICAgIHRCVEFfR0FUVENfUkNCICAgICAgKnBfY2xyY2IgOwotICAgIFVJTlQ4ICAgICAgIGk7CisgICAgdWludDhfdCAgICAgICBpOwogICAgIHRHQVRUX1RSQU5TUE9SVCAgICAgdHJhbnNwb3J0OwotICAgIFVJTlQxNiAgICAgICAgICAgICAgaGFuZGxlOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBoYW5kbGU7CiAKICAgICBpZiAoR0FUVF9HZXRDb25uZWN0aW9uSW5mb3IoY29ubl9pZCwgJmdhdHRfaWYsIHJlbW90ZV9iZGEsICZ0cmFuc3BvcnQpKSB7CiAgICAgICAgIGlmICgocF9jbHJjYiA9IGJ0YV9nYXR0Y19jbF9nZXRfcmVnY2IoZ2F0dF9pZikpICE9IE5VTEwpIHsKQEAgLTUyMCwxNCArNTIwLDE0IEBACiAqKiBEZXNjcmlwdGlvbiAgICAgIG1hcmsgYmFja2dyb3VuZCBjb25uZWN0aW9uIHN0YXR1cyB3aGVuIGEgYmcgY29ubmVjdGlvbiBpcyBpbml0aWF0ZWQKICoqICAgICAgICAgICAgICAgICAgb3IgdGVybWluYXRlZC4KICoqCi0qKiBSZXR1cm5zICAgICAgICAgIFRSVUUgaWYgc3VjY2VzczsgRkFMU0Ugb3RoZXJ3aXNlLgorKiogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHN1Y2Nlc3M7IGZhbHNlIG90aGVyd2lzZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfZ2F0dGNfbWFya19iZ19jb25uICh0QlRBX0dBVFRDX0lGIGNsaWVudF9pZiwgIEJEX0FERFJfUFRSIHJlbW90ZV9iZGFfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MRUFOIGFkZCwgQk9PTEVBTiBpc19saXN0ZW4pCitib29sIGJ0YV9nYXR0Y19tYXJrX2JnX2Nvbm4gKHRCVEFfR0FUVENfSUYgY2xpZW50X2lmLCAgQkRfQUREUl9QVFIgcmVtb3RlX2JkYV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWRkLCBib29sIGlzX2xpc3RlbikKIHsKICAgICB0QlRBX0dBVFRDX0JHX1RDSyAgICpwX2JnX3RjayA9ICZidGFfZ2F0dGNfY2IuYmdfdHJhY2tbMF07Ci0gICAgVUlOVDggICBpID0gMDsKKyAgICB1aW50OF90ICAgaSA9IDA7CiAgICAgdEJUQV9HQVRUQ19DSUZfTUFTSyAgKnBfY2lmX21hc2s7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgQlRBX0dBVFRDX0tOT1dOX1NSX01BWDsgaSArKywgcF9iZ190Y2sgKyspCkBAIC01NTMsNyArNTUzLDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtZW1zZXQocF9iZ190Y2ssIDAsIHNpemVvZih0QlRBX0dBVFRDX0JHX1RDSykpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoIWFkZCkKQEAgLTU2NCw3ICs1NjQsNyBAQAogICAgICAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigiJXMgdW5hYmxlIHRvIGZpbmQgdGhlIGJnIGNvbm5lY3Rpb24gbWFzayBmb3I6ICVzIiwgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgYmRhZGRyX3RvX3N0cmluZygoYnRfYmRhZGRyX3QgKilyZW1vdGVfYmRhX3B0ciwgYmRzdHIsIHNpemVvZihiZHN0cikpKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgZWxzZSAvKiBhZGRpbmcgYSBuZXcgZGV2aWNlIG1hc2sgKi8KICAgICB7CkBAIC01NzMsNyArNTczLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYgKCFwX2JnX3Rjay0+aW5fdXNlKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBfYmdfdGNrLT5pbl91c2UgPSBUUlVFOworICAgICAgICAgICAgICAgIHBfYmdfdGNrLT5pbl91c2UgPSB0cnVlOwogICAgICAgICAgICAgICAgIGlmIChyZW1vdGVfYmRhX3B0cikKICAgICAgICAgICAgICAgICAgICAgYmRjcHkocF9iZ190Y2stPnJlbW90ZV9iZGEsIHJlbW90ZV9iZGFfcHRyKTsKICAgICAgICAgICAgICAgICBlbHNlCkBAIC01ODIsMTEgKzU4MiwxMSBAQAogICAgICAgICAgICAgICAgIHBfY2lmX21hc2sgPSBpc19saXN0ZW4gPyAmcF9iZ190Y2stPmNpZl9hZHZfbWFzayA6ICZwX2JnX3Rjay0+Y2lmX21hc2s7CiAKICAgICAgICAgICAgICAgICAqcF9jaWZfbWFzayA9ICgxIDw8KGNsaWVudF9pZiAtIDEpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKCJubyBhdmFpbGFibGUgc3BhY2UgdG8gbWFyayB0aGUgYmcgY29ubmVjdGlvbiBzdGF0dXMiKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU5NSwxNCArNTk1LDE0IEBACiAqKgogKiogRGVzY3JpcHRpb24gICAgICBjaGVjayBpZiB0aGlzIGlzIGEgYmFja2dyb3VuZCBjb25uZWN0aW9uIGJhY2tncm91bmQgY29ubmVjdGlvbi4KICoqCi0qKiBSZXR1cm5zICAgICAgICAgIFRSVUUgaWYgc3VjY2VzczsgRkFMU0Ugb3RoZXJ3aXNlLgorKiogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHN1Y2Nlc3M7IGZhbHNlIG90aGVyd2lzZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfZ2F0dGNfY2hlY2tfYmdfY29ubiAodEJUQV9HQVRUQ19JRiBjbGllbnRfaWYsICBCRF9BRERSIHJlbW90ZV9iZGEsIFVJTlQ4IHJvbGUpCitib29sIGJ0YV9nYXR0Y19jaGVja19iZ19jb25uICh0QlRBX0dBVFRDX0lGIGNsaWVudF9pZiwgIEJEX0FERFIgcmVtb3RlX2JkYSwgdWludDhfdCByb2xlKQogewogICAgIHRCVEFfR0FUVENfQkdfVENLICAgKnBfYmdfdGNrID0gJmJ0YV9nYXR0Y19jYi5iZ190cmFja1swXTsKLSAgICBVSU5UOCAgICAgICBpID0gMDsKLSAgICBCT09MRUFOICAgICBpc19iZ19jb25uID0gRkFMU0U7CisgICAgdWludDhfdCAgICAgICBpID0gMDsKKyAgICBib29sICAgICBpc19iZ19jb25uID0gZmFsc2U7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgQlRBX0dBVFRDX0tOT1dOX1NSX01BWCAmJiAhaXNfYmdfY29ubjsgaSArKywgcF9iZ190Y2sgKyspCiAgICAgewpAQCAtNjEyLDExICs2MTIsMTEgQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYgKCgocF9iZ190Y2stPmNpZl9tYXNrICYoMSA8PChjbGllbnRfaWYgLSAxKSkpICE9IDApICYmCiAgICAgICAgICAgICAgICAgcm9sZSA9PSBIQ0lfUk9MRV9NQVNURVIpCi0gICAgICAgICAgICAgICAgaXNfYmdfY29ubiA9IFRSVUU7CisgICAgICAgICAgICAgICAgaXNfYmdfY29ubiA9IHRydWU7CiAKICAgICAgICAgICAgIGlmICgoKHBfYmdfdGNrLT5jaWZfYWR2X21hc2sgJigxIDw8KGNsaWVudF9pZiAtIDEpKSkgIT0gMCkgJiYKICAgICAgICAgICAgICAgICByb2xlID09IEhDSV9ST0xFX1NMQVZFKQotICAgICAgICAgICAgICAgIGlzX2JnX2Nvbm4gPSBUUlVFOworICAgICAgICAgICAgICAgIGlzX2JnX2Nvbm4gPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBpc19iZ19jb25uOwpAQCAtNjMxLDggKzYzMSw4IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2dhdHRjX3NlbmRfb3Blbl9jYmFjayggdEJUQV9HQVRUQ19SQ0IgKnBfY2xyZWcsIHRCVEFfR0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRF9BRERSIHJlbW90ZV9iZGEsIFVJTlQxNiBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX1RSQU5TUE9SVCB0cmFuc3BvcnQsIFVJTlQxNiBtdHUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEX0FERFIgcmVtb3RlX2JkYSwgdWludDE2X3QgY29ubl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9UUkFOU1BPUlQgdHJhbnNwb3J0LCB1aW50MTZfdCBtdHUpCiB7CiAgICAgdEJUQV9HQVRUQyAgICAgIGNiX2RhdGE7CiAKQEAgLTY2MSwxNyArNjYxLDE3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdEJUQV9HQVRUQ19DT05OICogYnRhX2dhdHRjX2Nvbm5fYWxsb2MoQkRfQUREUiByZW1vdGVfYmRhKQogewotICAgIFVJTlQ4ICAgICAgICAgICAgICAgaV9jb25uID0gMDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgaV9jb25uID0gMDsKICAgICB0QlRBX0dBVFRDX0NPTk4gICAgICpwX2Nvbm4gPSAmYnRhX2dhdHRjX2NiLmNvbm5fdHJhY2tbMF07CiAKICAgICBmb3IgKGlfY29ubiA9IDA7IGlfY29ubiA8IEJUQV9HQVRUQ19DT05OX01BWDsgaV9jb25uKyssIHBfY29ubiArKykKICAgICB7CiAgICAgICAgIGlmICghcF9jb25uLT5pbl91c2UpCiAgICAgICAgIHsKLSNpZiBCVEFfR0FUVF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9HQVRUX0RFQlVHID09IFRSVUUpCiAgICAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfZ2F0dGNfY29ubl9hbGxvYzogZm91bmQgY29ubl90cmFja1slZF0gYXZhaWxhYmxlIixpX2Nvbm4pOwogI2VuZGlmCi0gICAgICAgICAgICBwX2Nvbm4tPmluX3VzZSAgICAgICAgICA9IFRSVUU7CisgICAgICAgICAgICBwX2Nvbm4tPmluX3VzZSAgICAgICAgICA9IHRydWU7CiAgICAgICAgICAgICBiZGNweShwX2Nvbm4tPnJlbW90ZV9iZGEsIHJlbW90ZV9iZGEpOwogICAgICAgICAgICAgcmV0dXJuIHBfY29ubjsKICAgICAgICAgfQpAQCAtNjkwLDE0ICs2OTAsMTQgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB0QlRBX0dBVFRDX0NPTk4gKiBidGFfZ2F0dGNfY29ubl9maW5kKEJEX0FERFIgcmVtb3RlX2JkYSkKIHsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGlfY29ubiA9IDA7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIGlfY29ubiA9IDA7CiAgICAgdEJUQV9HQVRUQ19DT05OICAgICAqcF9jb25uID0gJmJ0YV9nYXR0Y19jYi5jb25uX3RyYWNrWzBdOwogCiAgICAgZm9yIChpX2Nvbm4gPSAwOyBpX2Nvbm4gPCBCVEFfR0FUVENfQ09OTl9NQVg7IGlfY29ubisrLCBwX2Nvbm4gKyspCiAgICAgewogICAgICAgICBpZiAocF9jb25uLT5pbl91c2UgJiYgYmRjbXAocmVtb3RlX2JkYSwgcF9jb25uLT5yZW1vdGVfYmRhKSA9PSAwKQogICAgICAgICB7Ci0jaWYgQlRBX0dBVFRfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfR0FUVF9ERUJVRyA9PSBUUlVFKQogICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2dhdHRjX2Nvbm5fZmluZDogZm91bmQgY29ubl90cmFja1slZF0gbWF0Y2hlZCIsaV9jb25uKTsKICNlbmRpZgogICAgICAgICAgICAgcmV0dXJuIHBfY29ubjsKQEAgLTczNSwxNyArNzM1LDE3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNsY2IKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfZ2F0dGNfY29ubl9kZWFsbG9jKEJEX0FERFIgcmVtb3RlX2JkYSkKK2Jvb2wgYnRhX2dhdHRjX2Nvbm5fZGVhbGxvYyhCRF9BRERSIHJlbW90ZV9iZGEpCiB7CiAgICAgdEJUQV9HQVRUQ19DT05OICAgICAqcF9jb25uID0gYnRhX2dhdHRjX2Nvbm5fZmluZCAocmVtb3RlX2JkYSk7CiAKICAgICBpZiAocF9jb25uICE9IE5VTEwpCiAgICAgewotICAgICAgICBwX2Nvbm4tPmluX3VzZSA9IEZBTFNFOworICAgICAgICBwX2Nvbm4tPmluX3VzZSA9IGZhbHNlOwogICAgICAgICBtZW1zZXQocF9jb25uLT5yZW1vdGVfYmRhLCAwLCBCRF9BRERSX0xFTik7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2J0YS9nYXR0L2J0YV9nYXR0c19hY3QuY2MgYi9idGEvZ2F0dC9idGFfZ2F0dHNfYWN0LmNjCmluZGV4IDRjMzViMGMuLjhhZDk0ZGYgMTAwNjQ0Ci0tLSBhL2J0YS9nYXR0L2J0YV9nYXR0c19hY3QuY2MKKysrIGIvYnRhL2dhdHQvYnRhX2dhdHRzX2FjdC5jYwpAQCAtMjYsNyArMjYsNyBAQAogCiAjaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCiAKLSNpZiBkZWZpbmVkKEJUQV9HQVRUX0lOQ0xVREVEKSAmJiAoQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRSkKKyNpZiAoQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRSkKIAogI2luY2x1ZGUgInV0bC5oIgogI2luY2x1ZGUgImJ0X2NvbW1vbi5oIgpAQCAtMzcsMTcgKzM3LDE3IEBACiAjaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfZGVidWdfY29ubi5oIgogI2luY2x1ZGUgPHN0cmluZy5oPgogCi1zdGF0aWMgdm9pZCBidGFfZ2F0dHNfbnZfc2F2ZV9jYmFjayhCT09MRUFOIGlzX3NhdmVkLCB0R0FUVFNfSE5ETF9SQU5HRSAqcF9obmRsX3JhbmdlKTsKLXN0YXRpYyBCT09MRUFOIGJ0YV9nYXR0c19udl9zcnZfY2hnX2NiYWNrKHRHQVRUU19TUlZfQ0hHX0NNRCBjbWQsIHRHQVRUU19TUlZfQ0hHX1JFUSAqcF9yZXEsCitzdGF0aWMgdm9pZCBidGFfZ2F0dHNfbnZfc2F2ZV9jYmFjayhib29sIGlzX3NhdmVkLCB0R0FUVFNfSE5ETF9SQU5HRSAqcF9obmRsX3JhbmdlKTsKK3N0YXRpYyBib29sIGJ0YV9nYXR0c19udl9zcnZfY2hnX2NiYWNrKHRHQVRUU19TUlZfQ0hHX0NNRCBjbWQsIHRHQVRUU19TUlZfQ0hHX1JFUSAqcF9yZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVFNfU1JWX0NIR19SU1AgKnBfcnNwKTsKIAotc3RhdGljIHZvaWQgYnRhX2dhdHRzX2Nvbm5fY2JhY2sgKHRHQVRUX0lGIGdhdHRfaWYsIEJEX0FERFIgYmRhLCBVSU5UMTYgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTEVBTiBjb25uZWN0ZWQsIHRHQVRUX0RJU0NPTk5fUkVBU09OIHJlYXNvbiwKK3N0YXRpYyB2b2lkIGJ0YV9nYXR0c19jb25uX2NiYWNrICh0R0FUVF9JRiBnYXR0X2lmLCBCRF9BRERSIGJkYSwgdWludDE2X3QgY29ubl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb25uZWN0ZWQsIHRHQVRUX0RJU0NPTk5fUkVBU09OIHJlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci1zdGF0aWMgdm9pZCBidGFfZ2F0dHNfc2VuZF9yZXF1ZXN0X2NiYWNrIChVSU5UMTYgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiB0cmFuc19pZCwKK3N0YXRpYyB2b2lkIGJ0YV9nYXR0c19zZW5kX3JlcXVlc3RfY2JhY2sgKHVpbnQxNl90IGNvbm5faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0cmFuc19pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUU19SRVFfVFlQRSByZXFfdHlwZSwgdEdBVFRTX0RBVEEgKnBfZGF0YSk7Ci1zdGF0aWMgdm9pZCBidGFfZ2F0dHNfY29uZ19jYmFjayAoVUlOVDE2IGNvbm5faWQsIEJPT0xFQU4gY29uZ2VzdGVkKTsKK3N0YXRpYyB2b2lkIGJ0YV9nYXR0c19jb25nX2NiYWNrICh1aW50MTZfdCBjb25uX2lkLCBib29sIGNvbmdlc3RlZCk7CiAKIHN0YXRpYyB0R0FUVF9DQkFDSyBidGFfZ2F0dHNfY2JhY2sgPQogewpAQCAtNzYsNyArNzYsNyBAQAogKiogUmV0dXJucyAgICAgICAgICBub25lLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZ2F0dHNfbnZfc2F2ZV9jYmFjayhCT09MRUFOIGlzX2FkZCwgdEdBVFRTX0hORExfUkFOR0UgKnBfaG5kbF9yYW5nZSkKK3N0YXRpYyB2b2lkIGJ0YV9nYXR0c19udl9zYXZlX2NiYWNrKGJvb2wgaXNfYWRkLCB0R0FUVFNfSE5ETF9SQU5HRSAqcF9obmRsX3JhbmdlKQogewogICAgIGJ0YV9nYXR0c19jb191cGRhdGVfaGFuZGxlX3JhbmdlKGlzX2FkZCwgKHRCVEFfR0FUVFNfSE5ETF9SQU5HRSAqKXBfaG5kbF9yYW5nZSk7CiB9CkBAIC05Miw3ICs5Miw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIG5vbmUuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBCT09MRUFOIGJ0YV9nYXR0c19udl9zcnZfY2hnX2NiYWNrKHRHQVRUU19TUlZfQ0hHX0NNRCBjbWQsCitzdGF0aWMgYm9vbCBidGFfZ2F0dHNfbnZfc3J2X2NoZ19jYmFjayh0R0FUVFNfU1JWX0NIR19DTUQgY21kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUU19TUlZfQ0hHX1JFUSAqcF9yZXEsIHRHQVRUU19TUlZfQ0hHX1JTUCAqcF9yc3ApCiB7CiAgICAgcmV0dXJuIGJ0YV9nYXR0c19jb19zcnZfY2hnKCh0QlRBX0dBVFRTX1NSVl9DSEdfQ01EKSBjbWQsCkBAIC0xMTIsNyArMTEyLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9nYXR0c19lbmFibGUodEJUQV9HQVRUU19DQiAqcF9jYikKIHsKLSAgICBVSU5UOCBpbmRleD0wOworICAgIHVpbnQ4X3QgaW5kZXg9MDsKICAgICB0QlRBX0dBVFRTX0hORExfUkFOR0UgaGFuZGxlX3JhbmdlOwogCiAgICAgaWYgKHBfY2ItPmVuYWJsZWQpCkBAIC0xMjMsNyArMTIzLDcgQEAKICAgICB7CiAgICAgICAgIG1lbXNldChwX2NiLCAwLCBzaXplb2YodEJUQV9HQVRUU19DQikpOwogCi0gICAgICAgIHBfY2ItPmVuYWJsZWQgPSBUUlVFOworICAgICAgICBwX2NiLT5lbmFibGVkID0gdHJ1ZTsKIAogICAgICAgICB3aGlsZSAoIGJ0YV9nYXR0c19jb19sb2FkX2hhbmRsZV9yYW5nZShpbmRleCwgJmhhbmRsZV9yYW5nZSkpCiAgICAgICAgIHsKQEAgLTE1Miw3ICsxNTIsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2dhdHRzX2FwaV9kaXNhYmxlKHRCVEFfR0FUVFNfQ0IgKnBfY2IpCiB7Ci0gICAgVUlOVDggaTsKKyAgICB1aW50OF90IGk7CiAKICAgICBpZiAocF9jYi0+ZW5hYmxlZCkKICAgICB7CkBAIC0xODQsOSArMTg0LDkgQEAKIHsKICAgICB0QlRBX0dBVFRTICAgICAgICAgICAgICAgY2JfZGF0YTsKICAgICB0QlRBX0dBVFRfU1RBVFVTICAgICAgICAgc3RhdHVzID0gQlRBX0dBVFRfT0s7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgIGksIGZpcnN0X3VudXNlID0gMHhmZjsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICBpLCBmaXJzdF91bnVzZSA9IDB4ZmY7CiAKLSAgICBpZiAocF9jYi0+ZW5hYmxlZCA9PSBGQUxTRSkKKyAgICBpZiAocF9jYi0+ZW5hYmxlZCA9PSBmYWxzZSkKICAgICB7CiAgICAgICAgIGJ0YV9nYXR0c19lbmFibGUocF9jYik7CiAgICAgfQpAQCAtMjIxLDcgKzIyMSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIEFQUExfVFJBQ0VfRVJST1IoInJlZ2lzdGVyIGFwcGxpY2F0aW9uIGZpcnN0X3VudXNlIHJjYl9pZHggPSAlZCIsIGZpcnN0X3VudXNlKTsKIAotICAgICAgICAgICAgcF9jYi0+cmNiW2ZpcnN0X3VudXNlXS5pbl91c2UgPSBUUlVFOworICAgICAgICAgICAgcF9jYi0+cmNiW2ZpcnN0X3VudXNlXS5pbl91c2UgPSB0cnVlOwogICAgICAgICAgICAgcF9jYi0+cmNiW2ZpcnN0X3VudXNlXS5wX2NiYWNrID0gcF9tc2ctPmFwaV9yZWcucF9jYmFjazsKICAgICAgICAgICAgIG1lbWNweSgmcF9jYi0+cmNiW2ZpcnN0X3VudXNlXS5hcHBfdXVpZCwgJnBfbXNnLT5hcGlfcmVnLmFwcF91dWlkLCBzaXplb2YodEJUX1VVSUQpKTsKICAgICAgICAgICAgIGNiX2RhdGEucmVnX29wZXIuc2VydmVyX2lmICAgICAgPQpAQCAtMjg0LDcgKzI4NCw3IEBACiB7CiAgICAgdEJUQV9HQVRUX1NUQVRVUyAgICBzdGF0dXMgPSBCVEFfR0FUVF9FUlJPUjsKICAgICB0QlRBX0dBVFRTX0NCQUNLICAgICpwX2NiYWNrID0gTlVMTDsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGk7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIGk7CiAgICAgdEJUQV9HQVRUUyAgICAgICAgICBjYl9kYXRhOwogCiAgICAgY2JfZGF0YS5yZWdfb3Blci5zZXJ2ZXJfaWYgPSBwX21zZy0+YXBpX2RlcmVnLnNlcnZlcl9pZjsKQEAgLTMyNywxMCArMzI3LDEwIEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfZ2F0dHNfY3JlYXRlX3NydmModEJUQV9HQVRUU19DQiAqcF9jYiwgdEJUQV9HQVRUU19EQVRBICogcF9tc2cpCiB7Ci0gICAgVUlOVDggICAgICAgICAgICAgICByY2JfaWR4OworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICByY2JfaWR4OwogICAgIHRCVEFfR0FUVFMgICAgICAgICAgY2JfZGF0YTsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIHNydmNfaWR4OwotICAgIFVJTlQxNiAgICAgICAgICAgICAgc2VydmljZV9pZCA9IDA7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIHNydmNfaWR4OworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBzZXJ2aWNlX2lkID0gMDsKIAogICAgIGNiX2RhdGEuY3JlYXRlLnN0YXR1cyA9IEJUQV9HQVRUX0VSUk9SOwogCkBAIC0zOTEsNyArMzkxLDcgQEAKIHZvaWQgYnRhX2dhdHRzX2FkZF9pbmNsdWRlX3NydmModEJUQV9HQVRUU19TUlZDX0NCICpwX3NydmNfY2IsdEJUQV9HQVRUU19EQVRBICogcF9tc2cpCiB7CiAgICAgdEJUQV9HQVRUU19SQ0IgICpwX3JjYiA9ICZidGFfZ2F0dHNfY2IucmNiW3Bfc3J2Y19jYi0+cmNiX2lkeF07Ci0gICAgVUlOVDE2ICAgICAgICAgIGF0dHJfaWQgPSAwOworICAgIHVpbnQxNl90ICAgICAgICAgIGF0dHJfaWQgPSAwOwogICAgIHRCVEFfR0FUVFMgICAgICBjYl9kYXRhOwogCiAgICAgYXR0cl9pZCA9IEdBVFRTX0FkZEluY2x1ZGVTZXJ2aWNlKHBfbXNnLT5hcGlfYWRkX2luY2xfc3J2Yy5oZHIubGF5ZXJfc3BlY2lmaWMsCkBAIC00MjUsNyArNDI1LDcgQEAKIHZvaWQgYnRhX2dhdHRzX2FkZF9jaGFyKHRCVEFfR0FUVFNfU1JWQ19DQiAqcF9zcnZjX2NiLCB0QlRBX0dBVFRTX0RBVEEgKiBwX21zZykKIHsKICAgICB0QlRBX0dBVFRTX1JDQiAgKnBfcmNiID0gJmJ0YV9nYXR0c19jYi5yY2JbcF9zcnZjX2NiLT5yY2JfaWR4XTsKLSAgICBVSU5UMTYgICAgICAgICAgYXR0cl9pZCA9IDA7CisgICAgdWludDE2X3QgICAgICAgICAgYXR0cl9pZCA9IDA7CiAgICAgdEJUQV9HQVRUUyAgICAgIGNiX2RhdGE7CiAKICAgICBhdHRyX2lkID0gR0FUVFNfQWRkQ2hhcmFjdGVyaXN0aWMocF9tc2ctPmFwaV9hZGRfY2hhci5oZHIubGF5ZXJfc3BlY2lmaWMsCkBAIC00NjEsNyArNDYxLDcgQEAKIHZvaWQgYnRhX2dhdHRzX2FkZF9jaGFyX2Rlc2NyKHRCVEFfR0FUVFNfU1JWQ19DQiAqcF9zcnZjX2NiLCB0QlRBX0dBVFRTX0RBVEEgKiBwX21zZykKIHsKICAgICB0QlRBX0dBVFRTX1JDQiAgKnBfcmNiID0gJmJ0YV9nYXR0c19jYi5yY2JbcF9zcnZjX2NiLT5yY2JfaWR4XTsKLSAgICBVSU5UMTYgICAgICAgICAgYXR0cl9pZCA9IDA7CisgICAgdWludDE2X3QgICAgICAgICAgYXR0cl9pZCA9IDA7CiAgICAgdEJUQV9HQVRUUyAgICAgIGNiX2RhdGE7CiAKICAgICBhdHRyX2lkID0gR0FUVFNfQWRkQ2hhckRlc2NyaXB0b3IocF9tc2ctPmFwaV9hZGRfY2hhcl9kZXNjci5oZHIubGF5ZXJfc3BlY2lmaWMsCkBAIC02ODIsNyArNjgyLDcgQEAKIHsKICAgICB0QlRBX0dBVFRTX1JDQiAgICAgICpwX3JjYj1OVUxMOwogICAgIHRCVEFfR0FUVF9TVEFUVVMgICAgc3RhdHVzPSBCVEFfR0FUVF9FUlJPUjsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIGNvbm5faWQ7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIGNvbm5faWQ7CiAgICAgVU5VU0VEKHBfY2IpOwogCiAgICAgaWYgKChwX3JjYiA9IGJ0YV9nYXR0c19maW5kX2FwcF9yY2JfYnlfYXBwX2lmKHBfbXNnLT5hcGlfb3Blbi5zZXJ2ZXJfaWYpKSAhPSBOVUxMKQpAQCAtODM1LDggKzgzNSw4IEBACiAqKiBSZXR1cm5zICAgICAgICAgIG5vbmUuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9nYXR0c19zZW5kX3JlcXVlc3RfY2JhY2sgKFVJTlQxNiBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIHRyYW5zX2lkLAorc3RhdGljIHZvaWQgYnRhX2dhdHRzX3NlbmRfcmVxdWVzdF9jYmFjayAodWludDE2X3QgY29ubl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRyYW5zX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRTX1JFUV9UWVBFIHJlcV90eXBlLCB0R0FUVFNfREFUQSAqcF9kYXRhKQogewogICAgIHRCVEFfR0FUVFMgICAgICAgICAgY2JfZGF0YTsKQEAgLTg4OCwxMiArODg4LDEyIEBACiAqKiBSZXR1cm5zICAgICAgICAgIG5vbmUuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9nYXR0c19jb25uX2NiYWNrICh0R0FUVF9JRiBnYXR0X2lmLCBCRF9BRERSIGJkYSwgVUlOVDE2IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTEVBTiBjb25uZWN0ZWQsIHRHQVRUX0RJU0NPTk5fUkVBU09OIHJlYXNvbiwKK3N0YXRpYyB2b2lkIGJ0YV9nYXR0c19jb25uX2NiYWNrICh0R0FUVF9JRiBnYXR0X2lmLCBCRF9BRERSIGJkYSwgdWludDE2X3QgY29ubl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbm5lY3RlZCwgdEdBVFRfRElTQ09OTl9SRUFTT04gcmVhc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1RSQU5TUE9SVCB0cmFuc3BvcnQpCiB7CiAgICAgdEJUQV9HQVRUUyAgICAgIGNiX2RhdGE7Ci0gICAgVUlOVDggICAgICAgICAgIGV2dCA9IGNvbm5lY3RlZCA/IEJUQV9HQVRUU19DT05ORUNUX0VWVDogQlRBX0dBVFRTX0RJU0NPTk5FQ1RfRVZUOworICAgIHVpbnQ4X3QgICAgICAgICAgIGV2dCA9IGNvbm5lY3RlZCA/IEJUQV9HQVRUU19DT05ORUNUX0VWVDogQlRBX0dBVFRTX0RJU0NPTk5FQ1RfRVZUOwogICAgIHRCVEFfR0FUVFNfUkNCICAqcF9yZWc7CiAKICAgICBBUFBMX1RSQUNFX0RFQlVHICgiYnRhX2dhdHRzX2Nvbm5fY2JhY2sgZ2F0dF9pZj0lZCBjb25uX2lkPSVkIGNvbm5lY3RlZD0lZCByZWFzb24gPSAweCUwNGQiLApAQCAtOTQzLDcgKzk0Myw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIG5vbmUuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9nYXR0c19jb25nX2NiYWNrIChVSU5UMTYgY29ubl9pZCwgQk9PTEVBTiBjb25nZXN0ZWQpCitzdGF0aWMgdm9pZCBidGFfZ2F0dHNfY29uZ19jYmFjayAodWludDE2X3QgY29ubl9pZCwgYm9vbCBjb25nZXN0ZWQpCiB7CiAgICAgdEJUQV9HQVRUU19SQ0IgKnBfcmNiOwogICAgIHRHQVRUX0lGIGdhdHRfaWY7CmRpZmYgLS1naXQgYS9idGEvZ2F0dC9idGFfZ2F0dHNfYXBpLmNjIGIvYnRhL2dhdHQvYnRhX2dhdHRzX2FwaS5jYwppbmRleCBjYzUyNTI3Li5hNmM1YTE0IDEwMDY0NAotLS0gYS9idGEvZ2F0dC9idGFfZ2F0dHNfYXBpLmNjCisrKyBiL2J0YS9nYXR0L2J0YV9nYXR0c19hcGkuY2MKQEAgLTI0LDcgKzI0LDcgQEAKIAogI2luY2x1ZGUgImJ0X3RhcmdldC5oIgogCi0jaWYgZGVmaW5lZChCVEFfR0FUVF9JTkNMVURFRCkgJiYgKEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJidF9jb21tb24uaCIKQEAgLTU1LDcgKzU1LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIEJUQV9HQVRUU19EaXNhYmxlKHZvaWQpCiB7Ci0gICAgaWYgKGJ0YV9zeXNfaXNfcmVnaXN0ZXIoQlRBX0lEX0dBVFRTKSA9PSBGQUxTRSkKKyAgICBpZiAoYnRhX3N5c19pc19yZWdpc3RlcihCVEFfSURfR0FUVFMpID09IGZhbHNlKQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HKCJHQVRUUyBNb2R1bGUgbm90IGVuYWJsZWQvYWxyZWFkeSBkaXNhYmxlZCIpOwogICAgICAgICByZXR1cm47CkBAIC04Niw3ICs4Niw3IEBACiAgICAgICAgICh0QlRBX0dBVFRTX0FQSV9SRUcgKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0dBVFRTX0FQSV9SRUcpKTsKIAogICAgIC8qIHJlZ2lzdGVyIHdpdGggQlRBIHN5c3RlbSBtYW5hZ2VyICovCi0gICAgaWYgKGJ0YV9zeXNfaXNfcmVnaXN0ZXIoQlRBX0lEX0dBVFRTKSA9PSBGQUxTRSkKKyAgICBpZiAoYnRhX3N5c19pc19yZWdpc3RlcihCVEFfSURfR0FUVFMpID09IGZhbHNlKQogICAgICAgICBidGFfc3lzX3JlZ2lzdGVyKEJUQV9JRF9HQVRUUywgJmJ0YV9nYXR0c19yZWcpOwogCiAgICAgcF9idWYtPmhkci5ldmVudCA9IEJUQV9HQVRUU19BUElfUkVHX0VWVDsKQEAgLTE0MCw4ICsxNDAsOCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRTX0NyZWF0ZVNlcnZpY2UodEJUQV9HQVRUU19JRiBzZXJ2ZXJfaWYsIHRCVF9VVUlEICpwX3NlcnZpY2VfdXVpZCwgVUlOVDggaW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IG51bV9oYW5kbGUsIEJPT0xFQU4gaXNfcHJpbWFyeSkKK3ZvaWQgQlRBX0dBVFRTX0NyZWF0ZVNlcnZpY2UodEJUQV9HQVRUU19JRiBzZXJ2ZXJfaWYsIHRCVF9VVUlEICpwX3NlcnZpY2VfdXVpZCwgdWludDhfdCBpbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBudW1faGFuZGxlLCBib29sIGlzX3ByaW1hcnkpCiB7CiAgICAgdEJUQV9HQVRUU19BUElfQ1JFQVRFX1NSVkMgKnBfYnVmID0KICAgICAgICAgKHRCVEFfR0FUVFNfQVBJX0NSRUFURV9TUlZDICopb3NpX21hbGxvYyhzaXplb2YodEJUQV9HQVRUU19BUElfQ1JFQVRFX1NSVkMpKTsKQEAgLTE3MCw3ICsxNzAsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRTX0FkZEluY2x1ZGVTZXJ2aWNlKFVJTlQxNiBzZXJ2aWNlX2lkLCBVSU5UMTYgaW5jbHVkZWRfc2VydmljZV9pZCkKK3ZvaWQgQlRBX0dBVFRTX0FkZEluY2x1ZGVTZXJ2aWNlKHVpbnQxNl90IHNlcnZpY2VfaWQsIHVpbnQxNl90IGluY2x1ZGVkX3NlcnZpY2VfaWQpCiB7CiAgICAgdEJUQV9HQVRUU19BUElfQUREX0lOQ0xfU1JWQyAqcF9idWYgPQogICAgICAgICAodEJUQV9HQVRUU19BUElfQUREX0lOQ0xfU1JWQyAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfR0FUVFNfQVBJX0FERF9JTkNMX1NSVkMpKTsKQEAgLTE5Nyw3ICsxOTcsNyBAQAogKiogUmV0dXJucyAgICAgICAgICBOb25lCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRTX0FkZENoYXJhY3RlcmlzdGljIChVSU5UMTYgc2VydmljZV9pZCwgIHRCVF9VVUlEICAqcF9jaGFyX3V1aWQsCit2b2lkIEJUQV9HQVRUU19BZGRDaGFyYWN0ZXJpc3RpYyAodWludDE2X3Qgc2VydmljZV9pZCwgIHRCVF9VVUlEICAqcF9jaGFyX3V1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9HQVRUX1BFUk0gcGVybSwgdEJUQV9HQVRUX0NIQVJfUFJPUCBwcm9wZXJ0eSkKIHsKICAgICB0QlRBX0dBVFRTX0FQSV9BRERfQ0hBUiAqcF9idWYgPQpAQCAtMjMwLDcgKzIzMCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHJldHVybnMgc3RhdHVzLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9HQVRUU19BZGRDaGFyRGVzY3JpcHRvciAoVUlOVDE2IHNlcnZpY2VfaWQsCit2b2lkIEJUQV9HQVRUU19BZGRDaGFyRGVzY3JpcHRvciAodWludDE2X3Qgc2VydmljZV9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRfUEVSTSBwZXJtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9VVUlEICAqIHBfZGVzY3JfdXVpZCkKIHsKQEAgLTI1OCw3ICsyNTgsNyBAQAogKiogUmV0dXJucyAgICAgICAgICByZXR1cm5zIG5vbmUuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRTX0RlbGV0ZVNlcnZpY2UoVUlOVDE2IHNlcnZpY2VfaWQpCit2b2lkIEJUQV9HQVRUU19EZWxldGVTZXJ2aWNlKHVpbnQxNl90IHNlcnZpY2VfaWQpCiB7CiAgICAgQlRfSERSICpwX2J1ZiA9IChCVF9IRFIgKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFIpKTsKIApAQCAtMjgwLDcgKzI4MCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIE5vbmUuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRTX1N0YXJ0U2VydmljZShVSU5UMTYgc2VydmljZV9pZCwgdEJUQV9HQVRUX1RSQU5TUE9SVCBzdXBfdHJhbnNwb3J0KQordm9pZCBCVEFfR0FUVFNfU3RhcnRTZXJ2aWNlKHVpbnQxNl90IHNlcnZpY2VfaWQsIHRCVEFfR0FUVF9UUkFOU1BPUlQgc3VwX3RyYW5zcG9ydCkKIHsKICAgICB0QlRBX0dBVFRTX0FQSV9TVEFSVCAqcF9idWYgPQogICAgICAgICAodEJUQV9HQVRUU19BUElfU1RBUlQgKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0dBVFRTX0FQSV9TVEFSVCkpOwpAQCAtMzAzLDcgKzMwMyw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIE5vbmUKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfR0FUVFNfU3RvcFNlcnZpY2UoVUlOVDE2IHNlcnZpY2VfaWQpCit2b2lkIEJUQV9HQVRUU19TdG9wU2VydmljZSh1aW50MTZfdCBzZXJ2aWNlX2lkKQogewogICAgIEJUX0hEUiAqcF9idWYgPSAoQlRfSERSICopb3NpX21hbGxvYyhzaXplb2YoQlRfSERSKSk7CiAKQEAgLTMyNyw4ICszMjcsOCBAQAogKiogUmV0dXJucyAgICAgICAgICBOb25lCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRTX0hhbmRsZVZhbHVlSW5kaWNhdGlvbiAoVUlOVDE2IGNvbm5faWQsIFVJTlQxNiBhdHRyX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSwgQk9PTEVBTiBuZWVkX2NvbmZpcm0pCit2b2lkIEJUQV9HQVRUU19IYW5kbGVWYWx1ZUluZGljYXRpb24gKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGF0dHJfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlLCBib29sIG5lZWRfY29uZmlybSkKIHsKICAgICB0QlRBX0dBVFRTX0FQSV9JTkRJQ0FUSU9OICpwX2J1ZiA9CiAgICAgICAgICh0QlRBX0dBVFRTX0FQSV9JTkRJQ0FUSU9OICopb3NpX2NhbGxvYyhzaXplb2YodEJUQV9HQVRUU19BUElfSU5ESUNBVElPTikpOwpAQCAtMzU5LDcgKzM1OSw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIE5vbmUKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfR0FUVFNfU2VuZFJzcCAoVUlOVDE2IGNvbm5faWQsIFVJTlQzMiB0cmFuc19pZCwKK3ZvaWQgQlRBX0dBVFRTX1NlbmRSc3AgKHVpbnQxNl90IGNvbm5faWQsIHVpbnQzMl90IHRyYW5zX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9HQVRUX1NUQVRVUyBzdGF0dXMsIHRCVEFfR0FUVFNfUlNQICpwX21zZykKIHsKICAgICBjb25zdCBzaXplX3QgbGVuID0gc2l6ZW9mKHRCVEFfR0FUVFNfQVBJX1JTUCkgKyBzaXplb2YodEJUQV9HQVRUU19SU1ApOwpAQCAtMzkyLDcgKzM5Miw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfR0FUVFNfT3Blbih0QlRBX0dBVFRTX0lGIHNlcnZlcl9pZiwgQkRfQUREUiByZW1vdGVfYmRhLCBCT09MRUFOIGlzX2RpcmVjdCwKK3ZvaWQgQlRBX0dBVFRTX09wZW4odEJUQV9HQVRUU19JRiBzZXJ2ZXJfaWYsIEJEX0FERFIgcmVtb3RlX2JkYSwgYm9vbCBpc19kaXJlY3QsCiAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVF9UUkFOU1BPUlQgdHJhbnNwb3J0KQogewogICAgIHRCVEFfR0FUVFNfQVBJX09QRU4gKnBfYnVmID0KQEAgLTQyMSw3ICs0MjEsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRTX0NhbmNlbE9wZW4odEJUQV9HQVRUU19JRiBzZXJ2ZXJfaWYsIEJEX0FERFIgcmVtb3RlX2JkYSwgQk9PTEVBTiBpc19kaXJlY3QpCit2b2lkIEJUQV9HQVRUU19DYW5jZWxPcGVuKHRCVEFfR0FUVFNfSUYgc2VydmVyX2lmLCBCRF9BRERSIHJlbW90ZV9iZGEsIGJvb2wgaXNfZGlyZWN0KQogewogICAgIHRCVEFfR0FUVFNfQVBJX0NBTkNFTF9PUEVOICpwX2J1ZiA9CiAgICAgICAgICh0QlRBX0dBVFRTX0FQSV9DQU5DRUxfT1BFTiAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfR0FUVFNfQVBJX0NBTkNFTF9PUEVOKSk7CkBAIC00NDUsNyArNDQ1LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9HQVRUU19DbG9zZShVSU5UMTYgY29ubl9pZCkKK3ZvaWQgQlRBX0dBVFRTX0Nsb3NlKHVpbnQxNl90IGNvbm5faWQpCiB7CiAgICAgQlRfSERSICpwX2J1ZiA9IChCVF9IRFIgKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFIpKTsKIApAQCAtNDcwLDcgKzQ3MCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfR0FUVFNfTGlzdGVuKHRCVEFfR0FUVFNfSUYgc2VydmVyX2lmLCBCT09MRUFOIHN0YXJ0LCBCRF9BRERSX1BUUiB0YXJnZXRfYmRhKQordm9pZCBCVEFfR0FUVFNfTGlzdGVuKHRCVEFfR0FUVFNfSUYgc2VydmVyX2lmLCBib29sIHN0YXJ0LCBCRF9BRERSX1BUUiB0YXJnZXRfYmRhKQogewogICAgIHRCVEFfR0FUVFNfQVBJX0xJU1RFTiAqcF9idWYgPQogICAgICAgICAodEJUQV9HQVRUU19BUElfTElTVEVOICopb3NpX21hbGxvYyhzaXplb2YodEJUQV9HQVRUU19BUElfTElTVEVOKSArIEJEX0FERFJfTEVOKTsKQEAgLTQ3OSw3ICs0NzksNyBAQAogICAgIHBfYnVmLT5zZXJ2ZXJfaWYgPSBzZXJ2ZXJfaWY7CiAgICAgcF9idWYtPnN0YXJ0ID0gc3RhcnQ7CiAgICAgaWYgKHRhcmdldF9iZGEpIHsKLSAgICAgICAgcF9idWYtPnJlbW90ZV9iZGEgPSAoVUlOVDggKikocF9idWYgKyAxKTsKKyAgICAgICAgcF9idWYtPnJlbW90ZV9iZGEgPSAodWludDhfdCAqKShwX2J1ZiArIDEpOwogICAgICAgICBtZW1jcHkocF9idWYtPnJlbW90ZV9iZGEsIHRhcmdldF9iZGEsIEJEX0FERFJfTEVOKTsKICAgICB9IGVsc2UgewogICAgICAgIHBfYnVmLT5yZW1vdGVfYmRhID0gTlVMTDsKZGlmZiAtLWdpdCBhL2J0YS9nYXR0L2J0YV9nYXR0c19pbnQuaCBiL2J0YS9nYXR0L2J0YV9nYXR0c19pbnQuaAppbmRleCAxMTViYTk4Li44Nzg0ZTJlIDEwMDY0NAotLS0gYS9idGEvZ2F0dC9idGFfZ2F0dHNfaW50LmgKKysrIGIvYnRhL2dhdHQvYnRhX2dhdHRzX2ludC5oCkBAIC01NSw3ICs1NSw3IEBACiAgICAgQlRBX0dBVFRTX0FQSV9MSVNURU5fRVZULAogICAgIEJUQV9HQVRUU19BUElfRElTQUJMRV9FVlQKIH07Ci10eXBlZGVmIFVJTlQxNiB0QlRBX0dBVFRTX0lOVF9FVlQ7Cit0eXBlZGVmIHVpbnQxNl90IHRCVEFfR0FUVFNfSU5UX0VWVDsKIAogLyogbWF4IG51bWJlciBvZiBhcHBsaWNhdGlvbiBhbGxvd2VkIG9uIGRldmljZSAqLwogI2RlZmluZSBCVEFfR0FUVFNfTUFYX0FQUF9OVU0gICBHQVRUX01BWF9TUl9QUk9GSUxFUwpAQCAtODQsOSArODQsOSBAQAogICAgIEJUX0hEUiAgICAgICAgICAgICAgICAgIGhkcjsKICAgICB0QlRBX0dBVFRTX0lGICAgICAgICAgICBzZXJ2ZXJfaWY7CiAgICAgdEJUX1VVSUQgICAgICAgICAgICAgICAgc2VydmljZV91dWlkOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIG51bV9oYW5kbGU7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgaW5zdDsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICBpc19wcmk7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICBudW1faGFuZGxlOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgaW5zdDsKKyAgICBib29sICAgICAgICAgICAgICAgICBpc19wcmk7CiAKIH0gdEJUQV9HQVRUU19BUElfQ1JFQVRFX1NSVkM7CiAKQEAgLTEwMiw3ICsxMDIsNyBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICAgICAgICAgICAgICBoZHI7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgaW5jbHVkZWRfc2VydmljZV9pZDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIGluY2x1ZGVkX3NlcnZpY2VfaWQ7CiAKIH10QlRBX0dBVFRTX0FQSV9BRERfSU5DTF9TUlZDOwogCkBAIC0xMTYsMTYgKzExNiwxNiBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgIGhkcjsKLSAgICBVSU5UMTYgIGF0dHJfaWQ7Ci0gICAgVUlOVDE2ICBsZW47Ci0gICAgQk9PTEVBTiBuZWVkX2NvbmZpcm07Ci0gICAgVUlOVDggICB2YWx1ZVtCVEFfR0FUVF9NQVhfQVRUUl9MRU5dOworICAgIHVpbnQxNl90ICBhdHRyX2lkOworICAgIHVpbnQxNl90ICBsZW47CisgICAgYm9vbCBuZWVkX2NvbmZpcm07CisgICAgdWludDhfdCAgIHZhbHVlW0JUQV9HQVRUX01BWF9BVFRSX0xFTl07CiB9dEJUQV9HQVRUU19BUElfSU5ESUNBVElPTjsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICAgICAgICAgIGhkcjsKLSAgICBVSU5UMzIgICAgICAgICAgICAgIHRyYW5zX2lkOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICB0cmFuc19pZDsKICAgICB0QlRBX0dBVFRfU1RBVFVTICAgIHN0YXR1czsKICAgICB0QlRBX0dBVFRTX1JTUCAgICAgICpwX3JzcDsKIH10QlRBX0dBVFRTX0FQSV9SU1A7CkBAIC0xNDIsNyArMTQyLDcgQEAKICAgICBCVF9IRFIgICAgICAgICAgICAgICAgICBoZHI7CiAgICAgQkRfQUREUiAgICAgICAgICAgICAgICAgcmVtb3RlX2JkYTsKICAgICB0QlRBX0dBVFRTX0lGICAgICAgICAgICBzZXJ2ZXJfaWY7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgaXNfZGlyZWN0OworICAgIGJvb2wgICAgICAgICAgICAgICAgIGlzX2RpcmVjdDsKICAgICB0QlRBX0dBVFRfVFJBTlNQT1JUICAgICB0cmFuc3BvcnQ7CiAKIH10QlRBX0dBVFRTX0FQSV9PUEVOOwpAQCAtMTU0LDcgKzE1NCw3IEBACiAgICAgQlRfSERSICAgICAgICAgICAgICAgICAgaGRyOwogICAgIEJEX0FERFJfUFRSICAgICAgICAgICAgIHJlbW90ZV9iZGE7CiAgICAgdEJUQV9HQVRUU19JRiAgICAgICAgICAgc2VydmVyX2lmOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgIHN0YXJ0OworICAgIGJvb2wgICAgICAgICAgICAgICAgIHN0YXJ0OwogfSB0QlRBX0dBVFRTX0FQSV9MSVNURU47CiAKIHR5cGVkZWYgdW5pb24KQEAgLTE4MCw3ICsxODAsNyBAQAogLyogYXBwbGljYXRpb24gcmVnaXN0cmF0aW9uIGNvbnRyb2wgYmxvY2sgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBpbl91c2U7CisgICAgYm9vbCAgICAgICAgICAgICBpbl91c2U7CiAgICAgdEJUX1VVSUQgICAgICAgICAgICBhcHBfdXVpZDsKICAgICB0QlRBX0dBVFRTX0NCQUNLICAgICpwX2NiYWNrOwogICAgIHRCVEFfR0FUVFNfSUYgICAgICAgIGdhdHRfaWY7CkBAIC0xOTAsMTEgKzE5MCwxMSBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICB0QlRfVVVJRCAgICBzZXJ2aWNlX3V1aWQ7ICAgLyogc2VydmljZSBVVUlEICovCi0gICAgVUlOVDE2ICAgICAgc2VydmljZV9pZDsgICAgIC8qIHNlcnZpY2UgaGFuZGxlICovCi0gICAgVUlOVDggICAgICAgaW5zdF9udW07ICAgICAgIC8qIGluc3RhbmNlIElEICovCi0gICAgVUlOVDggICAgICAgcmNiX2lkeDsKLSAgICBVSU5UOCAgICAgICBpZHg7ICAgICAgICAgICAgLyogc2VsZiBpbmRleCBvZiBzZXJ2aWVjIENCICovCi0gICAgQk9PTEVBTiAgICAgaW5fdXNlOworICAgIHVpbnQxNl90ICAgICAgc2VydmljZV9pZDsgICAgIC8qIHNlcnZpY2UgaGFuZGxlICovCisgICAgdWludDhfdCAgICAgICBpbnN0X251bTsgICAgICAgLyogaW5zdGFuY2UgSUQgKi8KKyAgICB1aW50OF90ICAgICAgIHJjYl9pZHg7CisgICAgdWludDhfdCAgICAgICBpZHg7ICAgICAgICAgICAgLyogc2VsZiBpbmRleCBvZiBzZXJ2aWVjIENCICovCisgICAgYm9vbCAgICAgaW5fdXNlOwogCiB9dEJUQV9HQVRUU19TUlZDX0NCOwogCkBAIC0yMDIsNyArMjAyLDcgQEAKIC8qIEdBVFQgc2VydmVyIGNvbnRyb2wgYmxvY2sgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBlbmFibGVkOworICAgIGJvb2wgICAgICAgICAgICAgZW5hYmxlZDsKICAgICB0QlRBX0dBVFRTX1JDQiAgICAgIHJjYltCVEFfR0FUVFNfTUFYX0FQUF9OVU1dOwogICAgIHRCVEFfR0FUVFNfU1JWQ19DQiAgc3J2Y19jYltCVEFfR0FUVFNfTUFYX1NSVkNfTlVNXTsKIH10QlRBX0dBVFRTX0NCOwpAQCAtMjE0LDcgKzIxNCw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogR0FUVEMgY29udHJvbCBibG9jayAqLwotI2lmIEJUQV9EWU5BTUlDX01FTU9SWSA9PSBGQUxTRQorI2lmIChCVEFfRFlOQU1JQ19NRU1PUlkgPT0gRkFMU0UpCiBleHRlcm4gdEJUQV9HQVRUU19DQiAgYnRhX2dhdHRzX2NiOwogI2Vsc2UKIGV4dGVybiB0QlRBX0dBVFRTX0NCICpidGFfZ2F0dHNfY2JfcHRyOwpAQCAtMjI0LDcgKzIyNCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqICBGdW5jdGlvbiBwcm90b3R5cGVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBCT09MRUFOIGJ0YV9nYXR0c19oZGxfZXZlbnQoQlRfSERSICpwX21zZyk7CitleHRlcm4gYm9vbCBidGFfZ2F0dHNfaGRsX2V2ZW50KEJUX0hEUiAqcF9tc2cpOwogCiBleHRlcm4gdm9pZCBidGFfZ2F0dHNfYXBpX2Rpc2FibGUodEJUQV9HQVRUU19DQiAqcF9jYik7CiBleHRlcm4gdm9pZCBidGFfZ2F0dHNfYXBpX2VuYWJsZSh0QlRBX0dBVFRTX0NCICpwX2NiLCB0QlRBX0dBVFRTX0RBVEEgKnBfZGF0YSk7CkBAIC0yNDgsMTIgKzI0OCwxMiBAQAogZXh0ZXJuIHZvaWQgYnRhX2dhdHRzX2Nsb3NlICh0QlRBX0dBVFRTX0NCICpwX2NiLCB0QlRBX0dBVFRTX0RBVEEgKiBwX21zZyk7CiBleHRlcm4gdm9pZCBidGFfZ2F0dHNfbGlzdGVuKHRCVEFfR0FUVFNfQ0IgKnBfY2IsIHRCVEFfR0FUVFNfREFUQSAqIHBfbXNnKTsKIAotZXh0ZXJuIEJPT0xFQU4gYnRhX2dhdHRzX3V1aWRfY29tcGFyZSh0QlRfVVVJRCB0YXIsIHRCVF9VVUlEIHNyYyk7CitleHRlcm4gYm9vbCBidGFfZ2F0dHNfdXVpZF9jb21wYXJlKHRCVF9VVUlEIHRhciwgdEJUX1VVSUQgc3JjKTsKIGV4dGVybiB0QlRBX0dBVFRTX1JDQiAqYnRhX2dhdHRzX2ZpbmRfYXBwX3JjYl9ieV9hcHBfaWYodEJUQV9HQVRUU19JRiBzZXJ2ZXJfaWYpOwotZXh0ZXJuIFVJTlQ4IGJ0YV9nYXR0c19maW5kX2FwcF9yY2JfaWR4X2J5X2FwcF9pZih0QlRBX0dBVFRTX0NCICpwX2NiLCB0QlRBX0dBVFRTX0lGIHNlcnZlcl9pZik7Ci1leHRlcm4gVUlOVDggYnRhX2dhdHRzX2FsbG9jX3NydmNfY2IodEJUQV9HQVRUU19DQiAqcF9jYiwgVUlOVDggcmNiX2lkeCk7Ci1leHRlcm4gdEJUQV9HQVRUU19TUlZDX0NCICogYnRhX2dhdHRzX2ZpbmRfc3J2Y19jYl9ieV9zcnZjX2lkKHRCVEFfR0FUVFNfQ0IgKnBfY2IsIFVJTlQxNiBzZXJ2aWNlX2lkKTsKLWV4dGVybiB0QlRBX0dBVFRTX1NSVkNfQ0IgKiBidGFfZ2F0dHNfZmluZF9zcnZjX2NiX2J5X2F0dHJfaWQodEJUQV9HQVRUU19DQiAqcF9jYiwgVUlOVDE2IGF0dHJfaWQpOworZXh0ZXJuIHVpbnQ4X3QgYnRhX2dhdHRzX2ZpbmRfYXBwX3JjYl9pZHhfYnlfYXBwX2lmKHRCVEFfR0FUVFNfQ0IgKnBfY2IsIHRCVEFfR0FUVFNfSUYgc2VydmVyX2lmKTsKK2V4dGVybiB1aW50OF90IGJ0YV9nYXR0c19hbGxvY19zcnZjX2NiKHRCVEFfR0FUVFNfQ0IgKnBfY2IsIHVpbnQ4X3QgcmNiX2lkeCk7CitleHRlcm4gdEJUQV9HQVRUU19TUlZDX0NCICogYnRhX2dhdHRzX2ZpbmRfc3J2Y19jYl9ieV9zcnZjX2lkKHRCVEFfR0FUVFNfQ0IgKnBfY2IsIHVpbnQxNl90IHNlcnZpY2VfaWQpOworZXh0ZXJuIHRCVEFfR0FUVFNfU1JWQ19DQiAqIGJ0YV9nYXR0c19maW5kX3NydmNfY2JfYnlfYXR0cl9pZCh0QlRBX0dBVFRTX0NCICpwX2NiLCB1aW50MTZfdCBhdHRyX2lkKTsKIAogCiAjZW5kaWYgLyogQlRBX0dBVFRTX0lOVF9IICovCmRpZmYgLS1naXQgYS9idGEvZ2F0dC9idGFfZ2F0dHNfbWFpbi5jYyBiL2J0YS9nYXR0L2J0YV9nYXR0c19tYWluLmNjCmluZGV4IDUwMDhmNWQuLjhhODM5MDcgMTAwNjQ0Ci0tLSBhL2J0YS9nYXR0L2J0YV9nYXR0c19tYWluLmNjCisrKyBiL2J0YS9nYXR0L2J0YV9nYXR0c19tYWluLmNjCkBAIC0yNCw3ICsyNCw3IEBACiAKICNpbmNsdWRlICJidF90YXJnZXQuaCIKIAotI2lmIGRlZmluZWQoQlRBX0dBVFRfSU5DTFVERUQpICYmIChCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFKQorI2lmIChCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFKQogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKQEAgLTQ2LDcgKzQ2LDcgQEAKIH07CiAKIC8qIEdBVFRTIGNvbnRyb2wgYmxvY2sgKi8KLSNpZiBCVEFfRFlOQU1JQ19NRU1PUlkgPT0gRkFMU0UKKyNpZiAoQlRBX0RZTkFNSUNfTUVNT1JZID09IEZBTFNFKQogdEJUQV9HQVRUU19DQiAgYnRhX2dhdHRzX2NiOwogI2VuZGlmCiAKQEAgLTYwLDcgKzYwLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9nYXR0c19oZGxfZXZlbnQoQlRfSERSICpwX21zZykKK2Jvb2wgYnRhX2dhdHRzX2hkbF9ldmVudChCVF9IRFIgKnBfbXNnKQogewogICAgIHRCVEFfR0FUVFNfQ0IgKnBfY2IgPSAmYnRhX2dhdHRzX2NiOwogICAgIHRCVEFfR0FUVFNfU1JWQ19DQiAqcF9zcnZjX2NiID0gTlVMTDsKQEAgLTEzNyw3ICsxMzcsNyBAQAogICAgIH0KIAogCi0gICAgcmV0dXJuIChUUlVFKTsKKyAgICByZXR1cm4gKHRydWUpOwogfQogCiAjZW5kaWYgLyogQlRBX0dBVFRfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2J0YS9nYXR0L2J0YV9nYXR0c191dGlscy5jYyBiL2J0YS9nYXR0L2J0YV9nYXR0c191dGlscy5jYwppbmRleCBkZjhiMTQwLi4wMTc1MmIyIDEwMDY0NAotLS0gYS9idGEvZ2F0dC9idGFfZ2F0dHNfdXRpbHMuY2MKKysrIGIvYnRhL2dhdHQvYnRhX2dhdHRzX3V0aWxzLmNjCkBAIC0yNCw3ICsyNCw3IEBACiAKICNpbmNsdWRlICJidF90YXJnZXQuaCIKIAotI2lmIGRlZmluZWQoQlRBX0dBVFRfSU5DTFVERUQpICYmIChCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFKQorI2lmIChCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFKQogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAidXRsLmgiCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSAiYnRhX3N5cy5oIgogI2luY2x1ZGUgImJ0YV9nYXR0c19pbnQuaCIKIAotc3RhdGljIGNvbnN0IFVJTlQ4ICBiYXNlX3V1aWRbTEVOX1VVSURfMTI4XSA9IHsweEZCLCAweDM0LCAweDlCLCAweDVGLCAweDgwLCAweDAwLCAweDAwLCAweDgwLAorc3RhdGljIGNvbnN0IHVpbnQ4X3QgIGJhc2VfdXVpZFtMRU5fVVVJRF8xMjhdID0gezB4RkIsIDB4MzQsIDB4OUIsIDB4NUYsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsCiAgICAgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00MSwxMiArNDEsMTIgQEAKICoqCiAqKiBEZXNjcmlwdGlvbiAgICAgIENvbnZlcnQgYSAxNiBiaXRzIFVVSUQgdG8gYmUgYW4gc3RhbmRhcmQgMTI4IGJpdHMgb25lLgogKioKLSoqIFJldHVybnMgICAgICAgICAgVFJVRSBpZiB0d28gdXVpZCBtYXRjaDsgRkFMU0Ugb3RoZXJ3aXNlLgorKiogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHR3byB1dWlkIG1hdGNoOyBmYWxzZSBvdGhlcndpc2UuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9nYXR0X2NvbnZlcnRfdXVpZDE2X3RvX3V1aWQxMjgoVUlOVDggdXVpZF8xMjhbTEVOX1VVSURfMTI4XSwgVUlOVDE2IHV1aWRfMTYpCitzdGF0aWMgdm9pZCBidGFfZ2F0dF9jb252ZXJ0X3V1aWQxNl90b191dWlkMTI4KHVpbnQ4X3QgdXVpZF8xMjhbTEVOX1VVSURfMTI4XSwgdWludDE2X3QgdXVpZF8xNikKIHsKLSAgICBVSU5UOCAgICpwID0gJnV1aWRfMTI4W0xFTl9VVUlEXzEyOCAtIDRdOworICAgIHVpbnQ4X3QgICAqcCA9ICZ1dWlkXzEyOFtMRU5fVVVJRF8xMjggLSA0XTsKIAogICAgIG1lbWNweSAodXVpZF8xMjgsIGJhc2VfdXVpZCwgTEVOX1VVSURfMTI4KTsKIApAQCAtNjEsMTUgKzYxLDE1IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvbnRyb2wgYmxvY2ssIG9yIG90aGVyd2lzZSBOVUxMIHdoZW4gZmFpbGVkLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1VSU5UOCBidGFfZ2F0dHNfYWxsb2Nfc3J2Y19jYih0QlRBX0dBVFRTX0NCICpwX2NiLCBVSU5UOCByY2JfaWR4KQordWludDhfdCBidGFfZ2F0dHNfYWxsb2Nfc3J2Y19jYih0QlRBX0dBVFRTX0NCICpwX2NiLCB1aW50OF90IHJjYl9pZHgpCiB7Ci0gICAgVUlOVDggaTsKKyAgICB1aW50OF90IGk7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgQlRBX0dBVFRTX01BWF9TUlZDX05VTTsgaSArKykKICAgICB7CiAgICAgICAgIGlmICghcF9jYi0+c3J2Y19jYltpXS5pbl91c2UpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHBfY2ItPnNydmNfY2JbaV0uaW5fdXNlID0gVFJVRTsKKyAgICAgICAgICAgIHBfY2ItPnNydmNfY2JbaV0uaW5fdXNlID0gdHJ1ZTsKICAgICAgICAgICAgIHBfY2ItPnNydmNfY2JbaV0ucmNiX2lkeCA9IHJjYl9pZHg7CiAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgfQpAQCAtODgsNyArODgsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHRCVEFfR0FUVFNfUkNCICpidGFfZ2F0dHNfZmluZF9hcHBfcmNiX2J5X2FwcF9pZih0QlRBX0dBVFRTX0lGIHNlcnZlcl9pZikKIHsKLSAgICBVSU5UOCBpOworICAgIHVpbnQ4X3QgaTsKICAgICB0QlRBX0dBVFRTX1JDQiAqcF9yZWc7CiAKICAgICBmb3IgKGkgPSAwLCBwX3JlZyA9IGJ0YV9nYXR0c19jYi5yY2I7IGkgPCBCVEFfR0FUVFNfTUFYX0FQUF9OVU07IGkgKyssIHBfcmVnKyspCkBAIC0xMDksOSArMTA5LDkgQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1VSU5UOCBidGFfZ2F0dHNfZmluZF9hcHBfcmNiX2lkeF9ieV9hcHBfaWYodEJUQV9HQVRUU19DQiAqcF9jYiwgdEJUQV9HQVRUU19JRiBzZXJ2ZXJfaWYpCit1aW50OF90IGJ0YV9nYXR0c19maW5kX2FwcF9yY2JfaWR4X2J5X2FwcF9pZih0QlRBX0dBVFRTX0NCICpwX2NiLCB0QlRBX0dBVFRTX0lGIHNlcnZlcl9pZikKIHsKLSAgICBVSU5UOCBpOworICAgIHVpbnQ4X3QgaTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBCVEFfR0FUVFNfTUFYX0FQUF9OVU07IGkgKyspCiAgICAgewpAQCAtMTI5LDkgKzEyOSw5IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHJjYi4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9HQVRUU19TUlZDX0NCICogYnRhX2dhdHRzX2ZpbmRfc3J2Y19jYl9ieV9zcnZjX2lkKHRCVEFfR0FUVFNfQ0IgKnBfY2IsIFVJTlQxNiBzZXJ2aWNlX2lkKQordEJUQV9HQVRUU19TUlZDX0NCICogYnRhX2dhdHRzX2ZpbmRfc3J2Y19jYl9ieV9zcnZjX2lkKHRCVEFfR0FUVFNfQ0IgKnBfY2IsIHVpbnQxNl90IHNlcnZpY2VfaWQpCiB7Ci0gICAgVUlOVDggaTsKKyAgICB1aW50OF90IGk7CiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2dhdHRzX2ZpbmRfc3J2Y19jYl9ieV9zcnZjX2lkICBzZXJ2aWNlX2lkPSVkIiwgc2VydmljZV9pZCk7CiAgICAgZm9yIChpID0gMDsgaSA8IEJUQV9HQVRUU19NQVhfU1JWQ19OVU07IGkgKyspCiAgICAgewpAQCAtMTUzLDkgKzE1Myw5IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHJjYi4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9HQVRUU19TUlZDX0NCICogYnRhX2dhdHRzX2ZpbmRfc3J2Y19jYl9ieV9hdHRyX2lkKHRCVEFfR0FUVFNfQ0IgKnBfY2IsIFVJTlQxNiBhdHRyX2lkKQordEJUQV9HQVRUU19TUlZDX0NCICogYnRhX2dhdHRzX2ZpbmRfc3J2Y19jYl9ieV9hdHRyX2lkKHRCVEFfR0FUVFNfQ0IgKnBfY2IsIHVpbnQxNl90IGF0dHJfaWQpCiB7Ci0gICAgVUlOVDggaTsKKyAgICB1aW50OF90IGk7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgKEJUQV9HQVRUU19NQVhfU1JWQ19OVU0pOyBpICsrKQogICAgIHsKQEAgLTE4NiwxOCArMTg2LDE4IEBACiAqKgogKiogRGVzY3JpcHRpb24gICAgICBDb21wYXJlIHR3byBVVUlEIHRvIHNlZSBpZiB0aGV5IGFyZSB0aGUgc2FtZS4KICoqCi0qKiBSZXR1cm5zICAgICAgICAgIFRSVUUgaWYgdHdvIHV1aWQgbWF0Y2g7IEZBTFNFIG90aGVyd2lzZS4KKyoqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiB0d28gdXVpZCBtYXRjaDsgZmFsc2Ugb3RoZXJ3aXNlLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9nYXR0c191dWlkX2NvbXBhcmUodEJUX1VVSUQgdGFyLCB0QlRfVVVJRCBzcmMpCitib29sIGJ0YV9nYXR0c191dWlkX2NvbXBhcmUodEJUX1VVSUQgdGFyLCB0QlRfVVVJRCBzcmMpCiB7Ci0gICAgVUlOVDggIHN1W0xFTl9VVUlEXzEyOF0sIHR1W0xFTl9VVUlEXzEyOF07Ci0gICAgVUlOVDggICpwcywgKnB0OworICAgIHVpbnQ4X3QgIHN1W0xFTl9VVUlEXzEyOF0sIHR1W0xFTl9VVUlEXzEyOF07CisgICAgdWludDhfdCAgKnBzLCAqcHQ7CiAKICAgICAvKiBhbnkgb2YgdGhlIFVVSUQgaXMgdW5zcGVjaWZpZWQgKi8KICAgICBpZiAoc3JjLmxlbiA9PSAwIHx8IHRhci5sZW4gPT0gMCkKICAgICB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICAvKiBJZiBib3RoIGFyZSAxNi1iaXQsIHdlIGNhbiBkbyBhIHNpbXBsZSBjb21wYXJlICovCmRpZmYgLS1naXQgYS9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfYWN0LmMgYi9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfYWN0LmMKaW5kZXggYjcwOTQwZC4uYjcwYjUyNSAxMDA2NDQKLS0tIGEvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2FjdC5jCisrKyBiL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9hY3QuYwpAQCAtOTgsNyArOTgsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2hmX2NsaWVudF9kZXJlZ2lzdGVyKHRCVEFfSEZfQ0xJRU5UX0RBVEEgKnBfZGF0YSkKIHsKLSAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5kZXJlZ2lzdGVyID0gVFJVRTsKKyAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5kZXJlZ2lzdGVyID0gdHJ1ZTsKIAogICAgIC8qIHJlbW92ZSBzZHAgcmVjb3JkICovCiAgICAgYnRhX2hmX2NsaWVudF9kZWxfcmVjb3JkKHBfZGF0YSk7CkBAIC0xMjIsNyArMTIyLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9oZl9jbGllbnRfc3RhcnRfZGVyZWcodEJUQV9IRl9DTElFTlRfREFUQSAqcF9kYXRhKQogewotICAgIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLmRlcmVnaXN0ZXIgPSBUUlVFOworICAgIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLmRlcmVnaXN0ZXIgPSB0cnVlOwogCiAgICAgLyogcmVtb3ZlIHNkcCByZWNvcmQgKi8KICAgICBidGFfaGZfY2xpZW50X2RlbF9yZWNvcmQocF9kYXRhKTsKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICAgIC8qIGlmIFNDTyBpcyBvcGVuIGNsb3NlIFNDTyBhbmQgd2FpdCBvbiBSRkNPTU0gY2xvc2UgKi8KICAgICBpZiAoYnRhX2hmX2NsaWVudF9jYi5zY2Iuc2NvX3N0YXRlID09IEJUQV9IRl9DTElFTlRfU0NPX09QRU5fU1QpCiAgICAgewotICAgICAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5zY29fY2xvc2VfcmZjID0gVFJVRTsKKyAgICAgICAgYnRhX2hmX2NsaWVudF9jYi5zY2Iuc2NvX2Nsb3NlX3JmYyA9IHRydWU7CiAgICAgfQogICAgIGVsc2UKICAgICB7CkBAIC0yNDksNyArMjQ5LDcgQEAKICAgICBidGFfaGZfY2xpZW50X2NiYWNrX29wZW4oTlVMTCwgQlRBX0hGX0NMSUVOVF9TVUNDRVNTKTsKIAogICAgIC8qIHN0YXJ0IFNMQyBwcm9jZWR1cmUgKi8KLSAgICBidGFfaGZfY2xpZW50X3NsY19zZXEoRkFMU0UpOworICAgIGJ0YV9oZl9jbGllbnRfc2xjX3NlcShmYWxzZSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yNjQsNyArMjY0LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9oZl9jbGllbnRfcmZjX2FjcF9vcGVuKHRCVEFfSEZfQ0xJRU5UX0RBVEEgKnBfZGF0YSkKIHsKLSAgICBVSU5UMTYgICAgICAgICAgbGNpZDsKKyAgICB1aW50MTZfdCAgICAgICAgICBsY2lkOwogICAgIEJEX0FERFIgICAgICAgICBkZXZfYWRkcjsKICAgICBpbnQgICAgICAgICAgICAgc3RhdHVzOwogCkBAIC0zMjUsOCArMzI1LDggQEAKICAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5wZWVyX2ZlYXR1cmVzID0gMDsKICAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5jaGxkX2ZlYXR1cmVzID0gMDsKICAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5yb2xlID0gQlRBX0hGX0NMSUVOVF9BQ1A7Ci0gICAgYnRhX2hmX2NsaWVudF9jYi5zY2Iuc3ZjX2Nvbm4gPSBGQUxTRTsKLSAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5zZW5kX2F0X3JlcGx5ID0gRkFMU0U7CisgICAgYnRhX2hmX2NsaWVudF9jYi5zY2Iuc3ZjX2Nvbm4gPSBmYWxzZTsKKyAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5zZW5kX2F0X3JlcGx5ID0gZmFsc2U7CiAgICAgYnRhX2hmX2NsaWVudF9jYi5zY2IubmVnb3RpYXRlZF9jb2RlYyA9IEJUTV9TQ09fQ09ERUNfQ1ZTRDsKIAogICAgIGJ0YV9oZl9jbGllbnRfYXRfcmVzZXQoKTsKQEAgLTM5NSw4ICszOTUsOCBAQAogICAgIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnBlZXJfZmVhdHVyZXMgPSAwOwogICAgIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLmNobGRfZmVhdHVyZXMgPSAwOwogICAgIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnJvbGUgPSBCVEFfSEZfQ0xJRU5UX0FDUDsKLSAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5zdmNfY29ubiA9IEZBTFNFOwotICAgIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnNlbmRfYXRfcmVwbHkgPSBGQUxTRTsKKyAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5zdmNfY29ubiA9IGZhbHNlOworICAgIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnNlbmRfYXRfcmVwbHkgPSBmYWxzZTsKICAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5uZWdvdGlhdGVkX2NvZGVjID0gQlRNX1NDT19DT0RFQ19DVlNEOwogCiAgICAgYnRhX2hmX2NsaWVudF9hdF9yZXNldCgpOwpAQCAtNDA3LDcgKzQwNyw3IEBACiAgICAgKCpidGFfaGZfY2xpZW50X2NiLnBfY2JhY2spKEJUQV9IRl9DTElFTlRfQ0xPU0VfRVZULCBOVUxMKTsKIAogICAgIC8qIGlmIG5vdCBkZXJlZ2lzdGVyaW5nIHJlb3BlbiBzZXJ2ZXIgKi8KLSAgICBpZiAoYnRhX2hmX2NsaWVudF9jYi5zY2IuZGVyZWdpc3RlciA9PSBGQUxTRSkKKyAgICBpZiAoYnRhX2hmX2NsaWVudF9jYi5zY2IuZGVyZWdpc3RlciA9PSBmYWxzZSkKICAgICB7CiAgICAgICAgIC8qIENsZWFyIHBlZXIgYmRfYWRkciBzbyBpbnN0YW5jZSBjYW4gYmUgcmV1c2VkICovCiAgICAgICAgIGJkY3B5KGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnBlZXJfYWRkciwgYmRfYWRkcl9udWxsKTsKQEAgLTQ0Miw3ICs0NDIsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2hmX2NsaWVudF9kaXNjX2ludF9yZXModEJUQV9IRl9DTElFTlRfREFUQSAqcF9kYXRhKQogewotICAgIFVJTlQxNiBldmVudCA9IEJUQV9IRl9DTElFTlRfRElTQ19GQUlMX0VWVDsKKyAgICB1aW50MTZfdCBldmVudCA9IEJUQV9IRl9DTElFTlRfRElTQ19GQUlMX0VWVDsKIAogICAgIEFQUExfVFJBQ0VfREVCVUcgKCJidGFfaGZfY2xpZW50X2Rpc2NfaW50X3JlczogU3RhdHVzOiAlZCIsIHBfZGF0YS0+ZGlzY19yZXN1bHQuc3RhdHVzKTsKIApAQCAtNTAwLDcgKzUwMCw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfaGZfY2xpZW50X3JmY19kYXRhKHRCVEFfSEZfQ0xJRU5UX0RBVEEgKnBfZGF0YSkKIHsKLSAgICBVSU5UMTYgIGxlbjsKKyAgICB1aW50MTZfdCAgbGVuOwogICAgIGNoYXIgICAgYnVmW0JUQV9IRl9DTElFTlRfUkZDX1JFQURfTUFYXTsKICAgICBVTlVTRUQocF9kYXRhKTsKIApAQCAtNTQ1LDcgKzU0NSw3IEBACiAgICAgaWYgKCFidGFfaGZfY2xpZW50X2NiLnNjYi5zdmNfY29ubikKICAgICB7CiAgICAgICAgIC8qIHNldCBzdGF0ZSB2YXJpYWJsZSAqLwotICAgICAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5zdmNfY29ubiA9IFRSVUU7CisgICAgICAgIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnN2Y19jb25uID0gdHJ1ZTsKIAogICAgICAgICAvKiBjYWxsIGNhbGxiYWNrICovCiAgICAgICAgIGV2dC5jb25uLnBlZXJfZmVhdCA9IGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnBlZXJfZmVhdHVyZXM7CkBAIC01NjQsNyArNTY0LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oZl9jbGllbnRfaW5kKHRCVEFfSEZfQ0xJRU5UX0lORF9UWVBFIHR5cGUsIFVJTlQxNiB2YWx1ZSkKK3ZvaWQgYnRhX2hmX2NsaWVudF9pbmQodEJUQV9IRl9DTElFTlRfSU5EX1RZUEUgdHlwZSwgdWludDE2X3QgdmFsdWUpCiB7CiAgICAgdEJUQV9IRl9DTElFTlQgZXZ0OwogCkBAIC01ODcsNyArNTg3LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oZl9jbGllbnRfZXZ0X3ZhbCh0QlRBX0hGX0NMSUVOVF9FVlQgdHlwZSwgVUlOVDE2IHZhbHVlKQordm9pZCBidGFfaGZfY2xpZW50X2V2dF92YWwodEJUQV9IRl9DTElFTlRfRVZUIHR5cGUsIHVpbnQxNl90IHZhbHVlKQogewogICAgIHRCVEFfSEZfQ0xJRU5UIGV2dDsKIApAQCAtNjc1LDcgKzY3NSw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGZfY2xpZW50X2F0X3Jlc3VsdCh0QlRBX0hGX0NMSUVOVF9BVF9SRVNVTFRfVFlQRSB0eXBlLCBVSU5UMTYgY21lKQordm9pZCBidGFfaGZfY2xpZW50X2F0X3Jlc3VsdCh0QlRBX0hGX0NMSUVOVF9BVF9SRVNVTFRfVFlQRSB0eXBlLCB1aW50MTZfdCBjbWUpCiB7CiAgICAgdEJUQV9IRl9DTElFTlQgZXZ0OwogCkBAIC02OTcsNyArNjk3LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oZl9jbGllbnRfY2xjYyhVSU5UMzIgaWR4LCBCT09MRUFOIGluY29taW5nLCBVSU5UOCBzdGF0dXMsIEJPT0xFQU4gbXB0eSwgY2hhciAqbnVtYmVyKQordm9pZCBidGFfaGZfY2xpZW50X2NsY2ModWludDMyX3QgaWR4LCBib29sIGluY29taW5nLCB1aW50OF90IHN0YXR1cywgYm9vbCBtcHR5LCBjaGFyICpudW1iZXIpCiB7CiAgICAgdEJUQV9IRl9DTElFTlQgZXZ0OwogCkBAIC03MTAsNyArNzEwLDcgQEAKIAogICAgIGlmIChudW1iZXIpCiAgICAgewotICAgICAgICBldnQuY2xjYy5udW1iZXJfcHJlc2VudCA9IFRSVUU7CisgICAgICAgIGV2dC5jbGNjLm51bWJlcl9wcmVzZW50ID0gdHJ1ZTsKICAgICAgICAgc3RybGNweShldnQuY2xjYy5udW1iZXIsIG51bWJlciwgQlRBX0hGX0NMSUVOVF9OVU1CRVJfTEVOICsgMSk7CiAgICAgICAgIGV2dC5jbGNjLm51bWJlcltCVEFfSEZfQ0xJRU5UX05VTUJFUl9MRU5dID0gJ1wwJzsKICAgICB9CkBAIC03MjgsNyArNzI4LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oZl9jbGllbnRfY251bShjaGFyICpudW1iZXIsIFVJTlQxNiBzZXJ2aWNlKQordm9pZCBidGFfaGZfY2xpZW50X2NudW0oY2hhciAqbnVtYmVyLCB1aW50MTZfdCBzZXJ2aWNlKQogewogICAgIHRCVEFfSEZfQ0xJRU5UIGV2dDsKIApkaWZmIC0tZ2l0IGEvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2FwaS5jIGIvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2FwaS5jCmluZGV4IDgzZDY0OGMuLjVkNzc3M2MgMTAwNjQ0Ci0tLSBhL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9hcGkuYworKysgYi9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfYXBpLmMKQEAgLTEzMyw3ICsxMzMsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0hmQ2xpZW50RGVyZWdpc3RlcihVSU5UMTYgaGFuZGxlKQordm9pZCBCVEFfSGZDbGllbnREZXJlZ2lzdGVyKHVpbnQxNl90IGhhbmRsZSkKIHsKICAgICBCVF9IRFIgKnBfYnVmID0gKEJUX0hEUiAqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUikpOwogCkBAIC0xNTYsNyArMTU2LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9IZkNsaWVudE9wZW4oVUlOVDE2IGhhbmRsZSwgQkRfQUREUiBiZF9hZGRyLCB0QlRBX1NFQyBzZWNfbWFzaykKK3ZvaWQgQlRBX0hmQ2xpZW50T3Blbih1aW50MTZfdCBoYW5kbGUsIEJEX0FERFIgYmRfYWRkciwgdEJUQV9TRUMgc2VjX21hc2spCiB7CiAgICAgdEJUQV9IRl9DTElFTlRfQVBJX09QRU4gKnBfYnVmID0KICAgICAgICAgKHRCVEFfSEZfQ0xJRU5UX0FQSV9PUEVOICopb3NpX21hbGxvYyhzaXplb2YodEJUQV9IRl9DTElFTlRfQVBJX09QRU4pKTsKQEAgLTE4MCw3ICsxODAsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0hmQ2xpZW50Q2xvc2UoVUlOVDE2IGhhbmRsZSkKK3ZvaWQgQlRBX0hmQ2xpZW50Q2xvc2UodWludDE2X3QgaGFuZGxlKQogewogICAgIEJUX0hEUiAqcF9idWYgPSAoQlRfSERSICopb3NpX21hbGxvYyhzaXplb2YoQlRfSERSKSk7CiAKQEAgLTIwMSw3ICsyMDEsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0hmQ2xpZW50QXVkaW9PcGVuKFVJTlQxNiBoYW5kbGUpCit2b2lkIEJUQV9IZkNsaWVudEF1ZGlvT3Blbih1aW50MTZfdCBoYW5kbGUpCiB7CiAgICAgQlRfSERSICpwX2J1ZiA9IChCVF9IRFIgKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFIpKTsKIApAQCAtMjIyLDcgKzIyMiw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfSGZDbGllbnRBdWRpb0Nsb3NlKFVJTlQxNiBoYW5kbGUpCit2b2lkIEJUQV9IZkNsaWVudEF1ZGlvQ2xvc2UodWludDE2X3QgaGFuZGxlKQogewogICAgIEJUX0hEUiAqcF9idWYgPSAoQlRfSERSICopb3NpX21hbGxvYyhzaXplb2YoQlRfSERSKSk7CiAKQEAgLTI0Miw3ICsyNDIsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0hmQ2xpZW50U2VuZEFUKFVJTlQxNiBoYW5kbGUsIHRCVEFfSEZfQ0xJRU5UX0FUX0NNRF9UWVBFIGF0LCBVSU5UMzIgdmFsMSwgVUlOVDMyIHZhbDIsIGNvbnN0IGNoYXIgKnN0cikKK3ZvaWQgQlRBX0hmQ2xpZW50U2VuZEFUKHVpbnQxNl90IGhhbmRsZSwgdEJUQV9IRl9DTElFTlRfQVRfQ01EX1RZUEUgYXQsIHVpbnQzMl90IHZhbDEsIHVpbnQzMl90IHZhbDIsIGNvbnN0IGNoYXIgKnN0cikKIHsKICAgICB0QlRBX0hGX0NMSUVOVF9EQVRBX1ZBTCAqcF9idWYgPQogICAgICAgICAodEJUQV9IRl9DTElFTlRfREFUQV9WQUwgKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0hGX0NMSUVOVF9EQVRBX1ZBTCkpOwpkaWZmIC0tZ2l0IGEvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2F0LmMgYi9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfYXQuYwppbmRleCBlZTVhM2VlLi5lNjdkNGViIDEwMDY0NAotLS0gYS9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfYXQuYworKysgYi9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfYXQuYwpAQCAtNzEsOSArNzEsOSBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBjaGFyKiBuYW1lOwotICAgIFVJTlQ4IG1pbjsKLSAgICBVSU5UOCBtYXg7Ci0gICAgVUlOVDggbmFtZWxlbjsKKyAgICB1aW50OF90IG1pbjsKKyAgICB1aW50OF90IG1heDsKKyAgICB1aW50OF90IG5hbWVsZW47CiB9IHRCVEFfSEZfQ0xJRU5UX0lORElDQVRPUjsKIAogI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0FUX1NVUFBPUlRFRF9JTkRJQ0FUT1JfQ09VTlQgNwpAQCAtOTcsOCArOTcsOCBAQAogI2RlZmluZSBCVEFfSEZfQ0xJRU5UX1ZHTV9NSU4gICAwCiAjZGVmaW5lIEJUQV9IRl9DTElFTlRfVkdNX01BWCAgMTUKIAotVUlOVDMyIHNlcnZpY2VfaW5kZXggPSAwOwotQk9PTEVBTiBzZXJ2aWNlX2F2YWlsYWJpbGl0eSA9IFRSVUU7Cit1aW50MzJfdCBzZXJ2aWNlX2luZGV4ID0gMDsKK2Jvb2wgc2VydmljZV9hdmFpbGFiaWxpdHkgPSB0cnVlOwogLyogaGVscGVyIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgQVQgY29tbWFuZHMgcXVldWVpbmcgKi8KIAogc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9oYW5kbGVfb2soKTsKQEAgLTExNyw3ICsxMTcsNyBAQAogICAgIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLmF0X2NiLnF1ZXVlZF9jbWQgPSBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X3F1ZXVlX2F0KHRCVEFfSEZfQ0xJRU5UX0FUX0NNRCBjbWQsIGNvbnN0IGNoYXIgKmJ1ZiwgVUlOVDE2IGJ1Zl9sZW4pCitzdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X3F1ZXVlX2F0KHRCVEFfSEZfQ0xJRU5UX0FUX0NNRCBjbWQsIGNvbnN0IGNoYXIgKmJ1ZiwgdWludDE2X3QgYnVmX2xlbikKIHsKICAgICB0QlRBX0hGX0NMSUVOVF9BVF9RQ01EICpuZXdfY21kID0KICAgICAgICAgKHRCVEFfSEZfQ0xJRU5UX0FUX1FDTUQgKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0hGX0NMSUVOVF9BVF9RQ01EKSk7CkBAIC0xNjYsMTYgKzE2NiwxNiBAQAogICAgIGFsYXJtX2NhbmNlbChidGFfaGZfY2xpZW50X2NiLnNjYi5hdF9jYi5yZXNwX3RpbWVyKTsKIH0KIAotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0KHRCVEFfSEZfQ0xJRU5UX0FUX0NNRCBjbWQsIGNoYXIgKmJ1ZiwgVUlOVDE2IGJ1Zl9sZW4pCitzdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXQodEJUQV9IRl9DTElFTlRfQVRfQ01EIGNtZCwgY2hhciAqYnVmLCB1aW50MTZfdCBidWZfbGVuKQogewogICAgIGlmICgoYnRhX2hmX2NsaWVudF9jYi5zY2IuYXRfY2IuY3VycmVudF9jbWQgPT0gQlRBX0hGX0NMSUVOVF9BVF9OT05FIHx8Ci0gICAgICAgICAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5zdmNfY29ubiA9PSBGQUxTRSkgJiYKKyAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnN2Y19jb25uID09IGZhbHNlKSAmJgogICAgICAgICAgICAgIWFsYXJtX2lzX3NjaGVkdWxlZChidGFfaGZfY2xpZW50X2NiLnNjYi5hdF9jYi5ob2xkX3RpbWVyKSkKICAgICB7Ci0gICAgICAgIFVJTlQxNiAgbGVuOworICAgICAgICB1aW50MTZfdCAgbGVuOwogCiAjaWZkZWYgQlRBX0hGX0NMSUVOVF9BVF9EVU1QCi0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzICUuKnMiLCBfX0ZVTkNUSU9OX18sIGJ1Zl9sZW4gLSAxLCBidWYpOworICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAlLipzIiwgX19mdW5jX18sIGJ1Zl9sZW4gLSAxLCBidWYpOwogI2VuZGlmCiAKICAgICAgICAgYnRhX2hmX2NsaWVudF9jYi5zY2IuYXRfY2IuY3VycmVudF9jbWQgPSBjbWQ7CkBAIC0xODMsNyArMTgzLDcgQEAKICAgICAgICAgaWYgKCFzZXJ2aWNlX2F2YWlsYWJpbGl0eSAmJgogICAgICAgICAgICAgICAgIChjbWQgPT0gQlRBX0hGX0NMSUVOVF9BVF9DTlVNIHx8IGNtZCA9PSBCVEFfSEZfQ0xJRU5UX0FUX0NPUFMpKQogICAgICAgICB7Ci0gICAgICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBObyBzZXJ2aWNlLCBza2lwcGluZyAlZCBjb21tYW5kIiwgX19GVU5DVElPTl9fLCBjbWQpOworICAgICAgICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogTm8gc2VydmljZSwgc2tpcHBpbmcgJWQgY29tbWFuZCIsIF9fZnVuY19fLCBjbWQpOwogICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9oYW5kbGVfb2soKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMjAyLDcgKzIwMiw3IEBACiB7CiAgICAgdEJUQV9IRl9DTElFTlRfQVRfUUNNRCAqY3VyID0gYnRhX2hmX2NsaWVudF9jYi5zY2IuYXRfY2IucXVldWVkX2NtZDsKIAotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKIAogICAgIGlmIChjdXIgIT0gTlVMTCkKICAgICB7CkBAIC0yMTYsMTkgKzIxNiwxOSBAQAogCiBzdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2F0X2hvbGRfdGltZXJfY2JhY2soVU5VU0VEX0FUVFIgdm9pZCAqZGF0YSkKIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7CiAgICAgYnRhX2hmX2NsaWVudF9zZW5kX3F1ZXVlZF9hdCgpOwogfQogCiBzdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X3N0b3BfYXRfaG9sZF90aW1lcih2b2lkKQogewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKICAgICBhbGFybV9jYW5jZWwoYnRhX2hmX2NsaWVudF9jYi5zY2IuYXRfY2IuaG9sZF90aW1lcik7CiB9CiAKIHN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfc3RhcnRfYXRfaG9sZF90aW1lcih2b2lkKQogewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKICAgICBhbGFybV9zZXRfb25fcXVldWUoYnRhX2hmX2NsaWVudF9jYi5zY2IuYXRfY2IuaG9sZF90aW1lciwKICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9BVF9IT0xEX1RJTUVPVVQsCiAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfYXRfaG9sZF90aW1lcl9jYmFjaywKQEAgLTIzOCw3ICsyMzgsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgotKiogICAgICAgICAgQ09NTU9OIEFUIEVWRU5UIEhBTkRMSU5HIEZVTkNUSU9OUworKiogICAgICAgICAgQ09NTU9OIEFUIEVWRU5UIEhBTkRMSU5HIGZ1bmNTCiAqKgogKiogICBSZWNlaXZlcyBkYXRhIChzdHJpbmdzLCBpbnRzLCBldGMuKSBmcm9tIHRoZSBwYXJzZXIgYW5kIHByb2Nlc3NlcyB0aGlzIGRhdGEuCiAqKiAgIE5vIGJ1ZmZlciBwYXJzaW5nIGlzIGJlaW5nIGRvbmUgaGVyZS4KQEAgLTI0NiwxMyArMjQ2LDEzIEBACiAKIHN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfaGFuZGxlX29rKCkKIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7CiAKICAgICBidGFfaGZfY2xpZW50X3N0b3BfYXRfcmVzcF90aW1lcigpOwogCiAgICAgaWYgKCFidGFfaGZfY2xpZW50X2NiLnNjYi5zdmNfY29ubikKICAgICB7Ci0gICAgICAgIGJ0YV9oZl9jbGllbnRfc2xjX3NlcShGQUxTRSk7CisgICAgICAgIGJ0YV9oZl9jbGllbnRfc2xjX3NlcShmYWxzZSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTI2Niw5ICsyNjYsOSBAQAogICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9jYi5zY2IuYXRfY2IuY3VycmVudF9jbWQgPSBCVEFfSEZfQ0xJRU5UX0FUX05PTkU7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9BVF9DTElQOiAvL2xhc3QgY21kIGlzIHBvc3Qgc2xjIHNlcQotICAgICAgICAgICAgaWYgKGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnNlbmRfYXRfcmVwbHkgPT0gRkFMU0UpCisgICAgICAgICAgICBpZiAoYnRhX2hmX2NsaWVudF9jYi5zY2Iuc2VuZF9hdF9yZXBseSA9PSBmYWxzZSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5zZW5kX2F0X3JlcGx5ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5zZW5kX2F0X3JlcGx5ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEJUQV9IRl9DTElFTlRfQVRfTk9ORToKQEAgLTI4NywxNSArMjg3LDE1IEBACiAgICAgYnRhX2hmX2NsaWVudF9zZW5kX3F1ZXVlZF9hdCgpOwogfQogCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV9lcnJvcih0QlRBX0hGX0NMSUVOVF9BVF9SRVNVTFRfVFlQRSB0eXBlLCBVSU5UMTYgY21lKQorc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9oYW5kbGVfZXJyb3IodEJUQV9IRl9DTElFTlRfQVRfUkVTVUxUX1RZUEUgdHlwZSwgdWludDE2X3QgY21lKQogewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzICV1ICV1IiwgX19GVU5DVElPTl9fLCB0eXBlLCBjbWUpOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzICV1ICV1IiwgX19mdW5jX18sIHR5cGUsIGNtZSk7CiAKICAgICBidGFfaGZfY2xpZW50X3N0b3BfYXRfcmVzcF90aW1lcigpOwogCiAgICAgaWYgKCFidGFfaGZfY2xpZW50X2NiLnNjYi5zdmNfY29ubikKICAgICB7Ci0gICAgICAgIGJ0YV9oZl9jbGllbnRfc2xjX3NlcShUUlVFKTsKKyAgICAgICAgYnRhX2hmX2NsaWVudF9zbGNfc2VxKHRydWUpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0zMDgsOSArMzA4LDkgQEAKICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfY2JhY2tfc2NvKEJUQV9IRl9DTElFTlRfQVVESU9fQ0xPU0VfRVZUKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEJUQV9IRl9DTElFTlRfQVRfQ0xJUDogLy9sYXN0IGNtZCBpcyBwb3N0IHNsYyBzZXEKLSAgICAgICAgICAgIGlmIChidGFfaGZfY2xpZW50X2NiLnNjYi5zZW5kX2F0X3JlcGx5ID09IEZBTFNFKQorICAgICAgICAgICAgaWYgKGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnNlbmRfYXRfcmVwbHkgPT0gZmFsc2UpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9jYi5zY2Iuc2VuZF9hdF9yZXBseSA9IFRSVUU7CisgICAgICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9jYi5zY2Iuc2VuZF9hdF9yZXBseSA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKQEAgLTMyOCwyMyArMzI4LDIzIEBACiAKIHN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfaGFuZGxlX3JpbmcoKQogewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKICAgICBidGFfaGZfY2xpZW50X2V2dF92YWwoQlRBX0hGX0NMSUVOVF9SSU5HX0lORElDQVRJT04sMCk7CiB9CiAKLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2Jyc2YoVUlOVDMyIHZhbHVlKQorc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9oYW5kbGVfYnJzZih1aW50MzJfdCB2YWx1ZSkKIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAweCV4IiwgX19GVU5DVElPTl9fLCB2YWx1ZSk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgMHgleCIsIF9fZnVuY19fLCB2YWx1ZSk7CiAgICAgYnRhX2hmX2NsaWVudF9jYi5zY2IucGVlcl9mZWF0dXJlcyA9IHZhbHVlOwogfQogCiAvKiBoYW5kbGVzIGEgc2luZ2xlIGluZGljYXRvciBkZXNjcmlwdG9yIC0gcmVnaXN0ZXJzIGl0IGZvciB2YWx1ZSBjaGFuZ2luZyBldmVudHMgKi8KLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2NpbmRfbGlzdF9pdGVtKGNoYXIgKm5hbWUsIFVJTlQzMiBtaW4sIFVJTlQzMiBtYXgsIFVJTlQzMiBpbmRleCkKK3N0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2NpbmRfbGlzdF9pdGVtKGNoYXIgKm5hbWUsIHVpbnQzMl90IG1pbiwgdWludDMyX3QgbWF4LCB1aW50MzJfdCBpbmRleCkKIHsKIAotICAgIFVJTlQ4IGkgPSAwOworICAgIHVpbnQ4X3QgaSA9IDA7CiAKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAlbHUuJXMgPCVsdTolbHU+IiwgX19GVU5DVElPTl9fLCBpbmRleCwgbmFtZSwgbWluLCBtYXgpOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzICVsdS4lcyA8JWx1OiVsdT4iLCBfX2Z1bmNfXywgaW5kZXgsIG5hbWUsIG1pbiwgbWF4KTsKIAogICAgIC8qIGxvb2sgZm9yIGEgbWF0Y2hpbmcgaW5kaWNhdG9yIG9uIGxpc3Qgb2Ygc3VwcG9ydGVkIG9uZXMgKi8KICAgICBmb3IoaSA9IDA7IGkgPCBCVEFfSEZfQ0xJRU5UX0FUX1NVUFBPUlRFRF9JTkRJQ0FUT1JfQ09VTlQ7IGkrKykKQEAgLTM2Nyw5ICszNjcsOSBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9oYW5kbGVfY2luZF92YWx1ZShVSU5UMzIgaW5kZXgsIFVJTlQzMiB2YWx1ZSkKK3N0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2NpbmRfdmFsdWUodWludDMyX3QgaW5kZXgsIHVpbnQzMl90IHZhbHVlKQogewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIGluZGV4OiAldSB2YWx1ZTogJXUiLCBfX0ZVTkNUSU9OX18sIGluZGV4LCB2YWx1ZSk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgaW5kZXg6ICV1IHZhbHVlOiAldSIsIF9fZnVuY19fLCBpbmRleCwgdmFsdWUpOwogCiAgICAgaWYgKGluZGV4ID49IEJUQV9IRl9DTElFTlRfQVRfSU5ESUNBVE9SX0NPVU5UKQogICAgIHsKQEAgLTM4MCwxMSArMzgwLDExIEBACiAgICAgewogICAgICAgICBpZiAodmFsdWUgPT0gMCkKICAgICAgICAgewotICAgICAgICAgICAgc2VydmljZV9hdmFpbGFiaWxpdHkgPSBGQUxTRTsKKyAgICAgICAgICAgIHNlcnZpY2VfYXZhaWxhYmlsaXR5ID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7Ci0gICAgICAgICAgICBzZXJ2aWNlX2F2YWlsYWJpbGl0eSA9IFRSVUU7CisgICAgICAgICAgICBzZXJ2aWNlX2F2YWlsYWJpbGl0eSA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGJ0YV9oZl9jbGllbnRfY2Iuc2NiLmF0X2NiLmluZGljYXRvcl9sb29rdXBbaW5kZXhdID09IC0xKQpAQCAtNDA2LDE4ICs0MDYsMTggQEAKICAgICBidGFfaGZfY2xpZW50X2luZChpbmRleCwgdmFsdWUpOwogfQogCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV9jaGxkKFVJTlQzMiBtYXNrKQorc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9oYW5kbGVfY2hsZCh1aW50MzJfdCBtYXNrKQogewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIDB4JXgiLCBfX0ZVTkNUSU9OX18sIG1hc2spOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIDB4JXgiLCBfX2Z1bmNfXywgbWFzayk7CiAKICAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5jaGxkX2ZlYXR1cmVzIHw9IG1hc2s7CiB9CiAKLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2NpZXYoVUlOVDMyIGluZGV4LCBVSU5UMzIgdmFsdWUpCitzdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV9jaWV2KHVpbnQzMl90IGluZGV4LCB1aW50MzJfdCB2YWx1ZSkKIHsKLSAgICBJTlQ4IHJlYWxpbmQgPSAtMTsKKyAgICBpbnQ4X3QgcmVhbGluZCA9IC0xOwogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgaW5kZXg6ICV1IHZhbHVlOiAldSIsIF9fRlVOQ1RJT05fXywgaW5kZXgsIHZhbHVlKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBpbmRleDogJXUgdmFsdWU6ICV1IiwgX19mdW5jX18sIGluZGV4LCB2YWx1ZSk7CiAKICAgICBpZihpbmRleCA9PSAwIHx8IGluZGV4ID4gQlRBX0hGX0NMSUVOVF9BVF9JTkRJQ0FUT1JfQ09VTlQpCiAgICAgewpAQCAtNDI2LDcgKzQyNiw3IEBACiAKICAgICBpZiAoc2VydmljZV9pbmRleCA9PSBpbmRleCAtIDEpCiAgICAgewotICAgICAgICBzZXJ2aWNlX2F2YWlsYWJpbGl0eSA9IHZhbHVlID09IDAgPyBGQUxTRSA6IFRSVUU7CisgICAgICAgIHNlcnZpY2VfYXZhaWxhYmlsaXR5ID0gdmFsdWUgPT0gMCA/IGZhbHNlIDogdHJ1ZTsKICAgICB9CiAKICAgICByZWFsaW5kID0gYnRhX2hmX2NsaWVudF9jYi5zY2IuYXRfY2IuaW5kaWNhdG9yX2xvb2t1cFtpbmRleCAtIDFdOwpAQCAtNDQ1LDExICs0NDUsMTEgQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYgKHZhbHVlID09IDEpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VydmljZV9hdmFpbGFiaWxpdHkgPSBUUlVFOworICAgICAgICAgICAgICAgIHNlcnZpY2VfYXZhaWxhYmlsaXR5ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlX2F2YWlsYWJpbGl0eSA9IEZBTFNFOworICAgICAgICAgICAgICAgIHNlcnZpY2VfYXZhaWxhYmlsaXR5ID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNDU4LDEyICs0NTgsMTIgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2JjcyhVSU5UMzIgY29kZWMpCitzdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV9iY3ModWludDMyX3QgY29kZWMpCiB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgJXUiLCBfX0ZVTkNUSU9OX18sIGNvZGVjKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAldSIsIF9fZnVuY19fLCBjb2RlYyk7CiAKICAgICBpZiAoY29kZWMgPT0gQlRNX1NDT19DT0RFQ19DVlNEIHx8Ci0gICAgICAgICAgICAoY29kZWMgPT0gQlRNX1NDT19DT0RFQ19NU0JDICYmIGJ0YV9oZl9jbGllbnRfY2IubXNiY19lbmFibGVkID09IFRSVUUpKQorICAgICAgICAgICAgKGNvZGVjID09IEJUTV9TQ09fQ09ERUNfTVNCQyAmJiBidGFfaGZfY2xpZW50X2NiLm1zYmNfZW5hYmxlZCA9PSB0cnVlKSkKICAgICB7CiAgICAgICAgIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLm5lZ290aWF0ZWRfY29kZWMgPSBjb2RlYzsKICAgICAgICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2Jjcyhjb2RlYyk7CkBAIC00NzUsMjEgKzQ3NSwyMSBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9oYW5kbGVfYnNpcihVSU5UMzIgcHJvdmlkZWQpCitzdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV9ic2lyKHVpbnQzMl90IHByb3ZpZGVkKQogewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzICV1IiwgX19GVU5DVElPTl9fLCBwcm92aWRlZCk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgJXUiLCBfX2Z1bmNfXywgcHJvdmlkZWQpOwogCiAgICAgYnRhX2hmX2NsaWVudF9ldnRfdmFsKEJUQV9IRl9DTElFTlRfQlNJUl9FVlQsIHByb3ZpZGVkKTsKIH0KIAotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9oYW5kbGVfY21lZXJyb3IoVUlOVDMyIGNvZGUpCitzdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV9jbWVlcnJvcih1aW50MzJfdCBjb2RlKQogewogICAgIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2Vycm9yKEJUQV9IRl9DTElFTlRfQVRfUkVTVUxUX0NNRSwgY29kZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfaGFuZGxlX3ZnbShVSU5UMzIgdmFsdWUpCitzdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV92Z20odWludDMyX3QgdmFsdWUpCiB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgJWx1IiwgX19GVU5DVElPTl9fLCB2YWx1ZSk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgJWx1IiwgX19mdW5jX18sIHZhbHVlKTsKIAogICAgIGlmKHZhbHVlIDw9IEJUQV9IRl9DTElFTlRfVkdNX01BWCkKICAgICB7CkBAIC00OTcsOSArNDk3LDkgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfaGFuZGxlX3ZncyhVSU5UMzIgdmFsdWUpCitzdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV92Z3ModWludDMyX3QgdmFsdWUpCiB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgJWx1IiwgX19GVU5DVElPTl9fLCB2YWx1ZSk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgJWx1IiwgX19mdW5jX18sIHZhbHVlKTsKIAogICAgIGlmKHZhbHVlIDw9IEJUQV9IRl9DTElFTlRfVkdTX01BWCkKICAgICB7CkBAIC01MDcsOSArNTA3LDkgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2J2cmEoVUlOVDMyIHZhbHVlKQorc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9oYW5kbGVfYnZyYSh1aW50MzJfdCB2YWx1ZSkKIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAlbHUiLCBfX0ZVTkNUSU9OX18sIHZhbHVlKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAlbHUiLCBfX2Z1bmNfXywgdmFsdWUpOwogCiAgICAgaWYgKHZhbHVlID4gMSkKICAgICB7CkBAIC01MTksNTggKzUxOSw1OCBAQAogICAgIGJ0YV9oZl9jbGllbnRfZXZ0X3ZhbChCVEFfSEZfQ0xJRU5UX1ZPSUNFX1JFQ19FVlQsIHZhbHVlKTsKIH0KIAotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9oYW5kbGVfY2xpcChjaGFyICpudW1zdHIsIFVJTlQzMiB0eXBlKQorc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9oYW5kbGVfY2xpcChjaGFyICpudW1zdHIsIHVpbnQzMl90IHR5cGUpCiB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgJXUgJXMiLCBfX0ZVTkNUSU9OX18sIHR5cGUsIG51bXN0cik7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgJXUgJXMiLCBfX2Z1bmNfXywgdHlwZSwgbnVtc3RyKTsKIAogICAgIGJ0YV9oZl9jbGllbnRfY2xpcChudW1zdHIpOwogfQogCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV9jY3dhKGNoYXIgKm51bXN0ciwgVUlOVDMyIHR5cGUpCitzdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV9jY3dhKGNoYXIgKm51bXN0ciwgdWludDMyX3QgdHlwZSkKIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAldSAlcyIsIF9fRlVOQ1RJT05fXywgdHlwZSwgbnVtc3RyKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAldSAlcyIsIF9fZnVuY19fLCB0eXBlLCBudW1zdHIpOwogCiAgICAgYnRhX2hmX2NsaWVudF9jY3dhKG51bXN0cik7CiB9CiAKLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2NvcHMoY2hhciAqb3BzdHIsIFVJTlQzMiBtb2RlKQorc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9oYW5kbGVfY29wcyhjaGFyICpvcHN0ciwgdWludDMyX3QgbW9kZSkKIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAldSAlcyIsIF9fRlVOQ1RJT05fXywgbW9kZSwgb3BzdHIpOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzICV1ICVzIiwgX19mdW5jX18sIG1vZGUsIG9wc3RyKTsKIAogICAgIGJ0YV9oZl9jbGllbnRfb3BlcmF0b3JfbmFtZShvcHN0cik7CiB9CiAKIHN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2JpbnAoY2hhciAqbnVtc3RyKQogewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzICVzIiwgX19GVU5DVElPTl9fLCBudW1zdHIpOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzICVzIiwgX19mdW5jX18sIG51bXN0cik7CiAKICAgICBidGFfaGZfY2xpZW50X2JpbnAobnVtc3RyKTsKIH0KIAotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9oYW5kbGVfY2xjYyhVSU5UMTYgaWR4LCBVSU5UMTYgZGlyLCBVSU5UMTYgc3RhdHVzLCBVSU5UMTYgbW9kZSwgVUlOVDE2IG1wdHksIGNoYXIgKm51bXN0ciwgVUlOVDE2IHR5cGUpCitzdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV9jbGNjKHVpbnQxNl90IGlkeCwgdWludDE2X3QgZGlyLCB1aW50MTZfdCBzdGF0dXMsIHVpbnQxNl90IG1vZGUsIHVpbnQxNl90IG1wdHksIGNoYXIgKm51bXN0ciwgdWludDE2X3QgdHlwZSkKIHsKICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBpZHg6ICV1IGRpcjogJXUgc3RhdHVzOiAldSBtb2RlOiAldSBtcHR5OiAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkeCwgZGlyLCBzdGF0dXMsIG1vZGUsIG1wdHkpOworICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGlkeCwgZGlyLCBzdGF0dXMsIG1vZGUsIG1wdHkpOwogCiAgICAgaWYgKG51bXN0cikKICAgICB7Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIG51bWJlcjogJXMgIHR5cGU6ICV1IiwgX19GVU5DVElPTl9fLCBudW1zdHIsIHR5cGUpOworICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBudW1iZXI6ICVzICB0eXBlOiAldSIsIF9fZnVuY19fLCBudW1zdHIsIHR5cGUpOwogICAgIH0KIAogICAgIGJ0YV9oZl9jbGllbnRfY2xjYyhpZHgsIGRpciwgc3RhdHVzLCBtcHR5LCBudW1zdHIpOwogfQogCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV9jbnVtKCBjaGFyICpudW1zdHIsIFVJTlQxNiB0eXBlLCBVSU5UMTYgc2VydmljZSkKK3N0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2NudW0oIGNoYXIgKm51bXN0ciwgdWludDE2X3QgdHlwZSwgdWludDE2X3Qgc2VydmljZSkKIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBudW1iZXI6ICVzIHR5cGU6ICV1IHNlcnZpY2U6ICV1IiwgX19GVU5DVElPTl9fLCBudW1zdHIsIHR5cGUsIHNlcnZpY2UpOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIG51bWJlcjogJXMgdHlwZTogJXUgc2VydmljZTogJXUiLCBfX2Z1bmNfXywgbnVtc3RyLCB0eXBlLCBzZXJ2aWNlKTsKIAogICAgIC8qIFRPRE86IHNob3VsZCBudW1iZXIgYmUgbW9kaWZpZWQgYWNjb3JkaW5nIHRvIHR5cGU/ICovCiAgICAgYnRhX2hmX2NsaWVudF9jbnVtKG51bXN0ciwgc2VydmljZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2J0cmgoIFVJTlQxNiBjb2RlKQorc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9oYW5kbGVfYnRyaCggdWludDE2X3QgY29kZSkKIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAlbHUiLCBfX0ZVTkNUSU9OX18sIGNvZGUpOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzICVsdSIsIF9fZnVuY19fLCBjb2RlKTsKIAogICAgIGJ0YV9oZl9jbGllbnRfZXZ0X3ZhbChCVEFfSEZfQ0xJRU5UX0JUUkhfRVZULCBjb2RlKTsKIH0KQEAgLTU5MCw3ICs1OTAsNyBAQAogLyogY2hlY2sgZm9yIDxjcj48bGY+IGFuZCBmb3J3YXJkIGJ1ZmZlciBpZiBtYXRjaCAqLwogI2RlZmluZSBBVF9DSEVDS19STihidWYpIFwKICAgICBpZiAoc3RybmNtcCgiXHJcbiIsIGJ1Ziwgc2l6ZW9mKCJcclxuIikgLSAxKSAhPSAwKSB7IFwKLSAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgbWlzc2luZyBlbmQgPGNyPjxsZj4iLCBfX0ZVTkNUSU9OX18pOyBcCisgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIG1pc3NpbmcgZW5kIDxjcj48bGY+IiwgX19mdW5jX18pOyBcCiAgICAgICAgIHJldHVybiBOVUxMO30gXAogICAgIChidWYpICs9IHNpemVvZigiXHJcbiIpIC0gMTsKIApAQCAtNjI4LDkgKzYyOCw5IEBACiB9CiAKIC8qIGdlbmVyaWMgdWludDMyIHBhcnNlciAqLwotc3RhdGljIGNoYXIgKmJ0YV9oZl9jbGllbnRfcGFyc2VfdWludDMyKGNoYXIgKmJ1ZmZlciwgdm9pZCAoKmhhbmRsZXJfY2FsbGJhY2spKFVJTlQzMikpCitzdGF0aWMgY2hhciAqYnRhX2hmX2NsaWVudF9wYXJzZV91aW50MzIoY2hhciAqYnVmZmVyLCB2b2lkICgqaGFuZGxlcl9jYWxsYmFjaykodWludDMyX3QpKQogewotICAgIFVJTlQzMiB2YWx1ZTsKKyAgICB1aW50MzJfdCB2YWx1ZTsKICAgICBpbnQgcmVzOwogICAgIGludCBvZmZzZXQ7CiAKQEAgLTY1OCw4ICs2NTgsOCBAQAogc3RhdGljIGNoYXIgKmJ0YV9oZl9jbGllbnRfcGFyc2VfY2luZF92YWx1ZXMoY2hhciAqYnVmZmVyKQogewogICAgIC8qIHZhbHVlIGFuZCBpdHMgcG9zaXRpb24gKi8KLSAgICBVSU5UMTYgaW5kZXggPSAwOwotICAgIFVJTlQzMiB2YWx1ZSA9IDA7CisgICAgdWludDE2X3QgaW5kZXggPSAwOworICAgIHVpbnQzMl90IHZhbHVlID0gMDsKIAogICAgIGludCBvZmZzZXQ7CiAgICAgaW50IHJlczsKQEAgLTY5NCw4ICs2OTQsOCBAQAogewogICAgIGludCBvZmZzZXQgPSAwOwogICAgIGNoYXIgbmFtZVsxMjldOwotICAgIFVJTlQzMiBtaW4sIG1heDsKLSAgICBVSU5UMzIgaW5kZXggPSAwOworICAgIHVpbnQzMl90IG1pbiwgbWF4OworICAgIHVpbnQzMl90IGluZGV4ID0gMDsKICAgICBpbnQgcmVzOwogCiAgICAgd2hpbGUgKChyZXMgPSBzc2NhbmYoYnVmZmVyLCAiKFwiJTEyOFteXCJdXCIsKCV1JSpbLSxdJXUpKSVuIiwgbmFtZSwgJm1pbiwgJm1heCwgJm9mZnNldCkpID4gMikKQEAgLTgxMiw3ICs4MTIsNyBAQAogCiBzdGF0aWMgY2hhciAqYnRhX2hmX2NsaWVudF9wYXJzZV9jaWV2KGNoYXIgKmJ1ZmZlcikKIHsKLSAgICBVSU5UMzIgaW5kZXgsIHZhbHVlOworICAgIHVpbnQzMl90IGluZGV4LCB2YWx1ZTsKICAgICBpbnQgcmVzOwogICAgIGludCBvZmZzZXQgPSAwOwogCkBAIC04OTgsNyArODk4LDcgQEAKIHsKICAgICAvKiBzcGVjIGZvcmNlcyAzMiBjaGFycywgcGx1cyBcMCBoZXJlICovCiAgICAgY2hhciBudW1iZXJbMzNdOwotICAgIFVJTlQzMiB0eXBlID0gMDsKKyAgICB1aW50MzJfdCB0eXBlID0gMDsKICAgICBpbnQgcmVzOwogICAgIGludCBvZmZzZXQgPSAwOwogCkBAIC05MzIsNyArOTMyLDcgQEAKIHsKICAgICAvKiBhYyB0byBzcGVjIDMyIGNoYXJzIG1heCwgcGx1cyBcMCBoZXJlICovCiAgICAgY2hhciBudW1iZXJbMzNdOwotICAgIFVJTlQzMiB0eXBlID0gMDsKKyAgICB1aW50MzJfdCB0eXBlID0gMDsKICAgICBpbnQgcmVzIDsKICAgICBpbnQgb2Zmc2V0ID0gMDsKIApAQCAtOTYzLDcgKzk2Myw3IEBACiAKIHN0YXRpYyBjaGFyICpidGFfaGZfY2xpZW50X3BhcnNlX2NvcHMoY2hhciAqYnVmZmVyKQogewotICAgIFVJTlQ4IG1vZGU7CisgICAgdWludDhfdCBtb2RlOwogICAgIC8qIHNwZWMgZm9yY2VzIDE2IGNoYXJzIG1heCwgcGx1cyBcMCBoZXJlICovCiAgICAgY2hhciBvcHN0clsxN107CiAgICAgaW50IHJlczsKQEAgLTEwNDMsOSArMTA0Myw5IEBACiAKIHN0YXRpYyBjaGFyICpidGFfaGZfY2xpZW50X3BhcnNlX2NsY2MoY2hhciAqYnVmZmVyKQogewotICAgIFVJTlQxNiBpZHgsIGRpciwgc3RhdHVzLCBtb2RlLCBtcHR5OworICAgIHVpbnQxNl90IGlkeCwgZGlyLCBzdGF0dXMsIG1vZGUsIG1wdHk7CiAgICAgY2hhciBudW1zdHJbMzNdOyAgICAgLyogc3BlYyBmb3JjZXMgMzIgY2hhcnMsIHBsdXMgb25lIGZvciBcMCovCi0gICAgVUlOVDE2IHR5cGU7CisgICAgdWludDE2X3QgdHlwZTsKICAgICBpbnQgcmVzOwogICAgIGludCBvZmZzZXQgPSAwOwogCkBAIC0xMTI2LDggKzExMjYsOCBAQAogc3RhdGljIGNoYXIgKmJ0YV9oZl9jbGllbnRfcGFyc2VfY251bShjaGFyICpidWZmZXIpCiB7CiAgICAgY2hhciBudW1zdHJbMzNdOyAgICAgLyogc3BlYyBmb3JjZXMgMzIgY2hhcnMsIHBsdXMgb25lIGZvciBcMCovCi0gICAgVUlOVDE2IHR5cGU7Ci0gICAgVUlOVDE2IHNlcnZpY2UgPSAwOyAvKiAwIGluIGNhc2UgdGhpcyBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgbm90IGJlaW5nIHNlbnQgKi8KKyAgICB1aW50MTZfdCB0eXBlOworICAgIHVpbnQxNl90IHNlcnZpY2UgPSAwOyAvKiAwIGluIGNhc2UgdGhpcyBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgbm90IGJlaW5nIHNlbnQgKi8KICAgICBpbnQgcmVzOwogICAgIGludCBvZmZzZXQgPSAwOwogCkBAIC0xMTkyLDcgKzExOTIsNyBAQAogCiBzdGF0aWMgY2hhciAqYnRhX2hmX2NsaWVudF9wYXJzZV9idHJoKGNoYXIgKmJ1ZmZlcikKIHsKLSAgICBVSU5UMTYgY29kZSA9IDA7CisgICAgdWludDE2X3QgY29kZSA9IDA7CiAgICAgaW50IHJlczsKICAgICBpbnQgb2Zmc2V0OwogCkBAIC0xMjg0LDcgKzEyODQsNyBAQAogCiAgICAgYnVmZmVyID0gdG1wICsgMjsKIAotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzICUuKnMiLCBfX0ZVTkNUSU9OX18sIGJ1ZmZlciAtIHN0YXJ0IC0gMiwgc3RhcnQpOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzICUuKnMiLCBfX2Z1bmNfXywgYnVmZmVyIC0gc3RhcnQgLSAyLCBzdGFydCk7CiAKICAgICByZXR1cm4gYnVmZmVyOwogfQpAQCAtMTMzNCw3ICsxMzM0LDcgQEAKIH07CiAKIC8qIGNhbGN1bGF0ZSBzdXBwb3J0ZWQgZXZlbnQgbGlzdCBsZW5ndGggKi8KLXN0YXRpYyBjb25zdCBVSU5UMTYgYnRhX2hmX2NsaWVudF9wc3Jhc2VyX2NiX2NvdW50ID0KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBidGFfaGZfY2xpZW50X3BzcmFzZXJfY2JfY291bnQgPQogICAgICAgICBzaXplb2YoYnRhX2hmX2NsaWVudF9wYXJzZXJfY2IpIC8gc2l6ZW9mKGJ0YV9oZl9jbGllbnRfcGFyc2VyX2NiWzBdKTsKIAogI2lmZGVmIEJUQV9IRl9DTElFTlRfQVRfRFVNUApAQCAtMTM2OCw3ICsxMzY4LDcgQEAKIAogICAgICpwMiA9ICdcMCc7CiAKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAlcyIsIF9fRlVOQ1RJT05fXywgZHVtcCk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgJXMiLCBfX2Z1bmNfXywgZHVtcCk7CiB9CiAjZW5kaWYKIApAQCAtMTM3Niw3ICsxMzc2LDcgQEAKIHsKICAgICBjaGFyICpidWYgPSBidGFfaGZfY2xpZW50X2NiLnNjYi5hdF9jYi5idWY7CiAKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7CiAKICNpZmRlZiBCVEFfSEZfQ0xJRU5UX0FUX0RVTVAKICAgICBidGFfaGZfY2xpZW50X2R1bXBfYXQoKTsKQEAgLTE0MTksMjAgKzE0MTksMjAgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBCT09MRUFOIGJ0YV9oZl9jbGllbnRfY2hlY2tfYXRfY29tcGxldGUodm9pZCkKK3N0YXRpYyBib29sIGJ0YV9oZl9jbGllbnRfY2hlY2tfYXRfY29tcGxldGUodm9pZCkKIHsKLSAgICBCT09MRUFOIHJldCA9IEZBTFNFOworICAgIGJvb2wgcmV0ID0gZmFsc2U7CiAgICAgdEJUQV9IRl9DTElFTlRfQVRfQ0IgKmF0X2NiID0gJmJ0YV9oZl9jbGllbnRfY2Iuc2NiLmF0X2NiOwogCiAgICAgaWYgKGF0X2NiLT5vZmZzZXQgPj0gQlRBX0hGX0NMSUVOVF9BVF9FVkVOVF9NSU5fTEVOKQogICAgIHsKICAgICAgICAgaWYgKGF0X2NiLT5idWZbYXRfY2ItPm9mZnNldCAtIDJdID09ICdccicgJiYgYXRfY2ItPmJ1ZlthdF9jYi0+b2Zmc2V0IC0gMV0gPT0gJ1xuJykKICAgICAgICAgewotICAgICAgICAgICAgcmV0ID0gVFJVRTsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAlZCIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAlZCIsIF9fZnVuY19fLCByZXQpOwogCiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTE0NTEsNyArMTQ1MSw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfaGZfY2xpZW50X2F0X3BhcnNlKGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBvZmZzZXQ6ICV1IGxlbjogJXUiLCBfX0ZVTkNUSU9OX18sIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLmF0X2NiLm9mZnNldCwgbGVuKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBvZmZzZXQ6ICV1IGxlbjogJXUiLCBfX2Z1bmNfXywgYnRhX2hmX2NsaWVudF9jYi5zY2IuYXRfY2Iub2Zmc2V0LCBsZW4pOwogCiAgICAgaWYgKGxlbiArIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLmF0X2NiLm9mZnNldCA+IEJUQV9IRl9DTElFTlRfQVRfUEFSU0VSX01BWF9MRU4pCiAgICAgewpAQCAtMTQ1OSw3ICsxNDU5LDcgQEAKICAgICAgICAgdW5zaWduZWQgaW50IHRtcCA9IGJ0YV9oZl9jbGllbnRfY2Iuc2NiLmF0X2NiLm9mZnNldDsKICAgICAgICAgdW5zaWduZWQgaW50IHNwYWNlX2xlZnQgPSBCVEFfSEZfQ0xJRU5UX0FUX1BBUlNFUl9NQVhfTEVOIC0gYnRhX2hmX2NsaWVudF9jYi5zY2IuYXRfY2Iub2Zmc2V0OwogCi0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIG92ZXJydW4sIHRyeWluZyB0byByZWNvdmVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgb3ZlcnJ1biwgdHJ5aW5nIHRvIHJlY292ZXIiLCBfX2Z1bmNfXyk7CiAKICAgICAgICAgLyogZmlsbCB1cCBwYXJzZXIgYnVmZmVyICovCiAgICAgICAgIG1lbWNweShidGFfaGZfY2xpZW50X2NiLnNjYi5hdF9jYi5idWYgKyBidGFfaGZfY2xpZW50X2NiLnNjYi5hdF9jYi5vZmZzZXQsIGJ1Ziwgc3BhY2VfbGVmdCk7CkBAIC0xNDY4LDcgKzE0NjgsNyBAQAogICAgICAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5hdF9jYi5vZmZzZXQgKz0gc3BhY2VfbGVmdDsKIAogICAgICAgICAvKiBmaW5kIGVuZCBvZiBsYXN0IGNvbXBsZXRlIGNvbW1hbmQgYmVmb3JlIHByb2NlZWRpbmcgKi8KLSAgICAgICAgd2hpbGUoYnRhX2hmX2NsaWVudF9jaGVja19hdF9jb21wbGV0ZSgpID09IEZBTFNFKQorICAgICAgICB3aGlsZShidGFfaGZfY2xpZW50X2NoZWNrX2F0X2NvbXBsZXRlKCkgPT0gZmFsc2UpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChidGFfaGZfY2xpZW50X2NiLnNjYi5hdF9jYi5vZmZzZXQgPT0gMCkgewogICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfRVJST1IoIkhGUENsaWVudDogQVQgcGFyc2VyIGJ1ZmZlciBvdmVycnVuLCBkaXNjb25uZWN0aW5nIik7CkBAIC0xNDk5LDcgKzE0OTksNyBAQAogICAgIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLmF0X2NiLm9mZnNldCArPSBsZW47CiAKICAgICAvKiBJZiBsYXN0IGV2ZW50IGlzIGNvbXBsZXRlLCBwYXJzaW5nIGNhbiBiZSBzdGFydGVkICovCi0gICAgaWYgKGJ0YV9oZl9jbGllbnRfY2hlY2tfYXRfY29tcGxldGUoKSA9PSBUUlVFKQorICAgIGlmIChidGFfaGZfY2xpZW50X2NoZWNrX2F0X2NvbXBsZXRlKCkgPT0gdHJ1ZSkKICAgICB7CiAgICAgICAgIGJ0YV9oZl9jbGllbnRfYXRfcGFyc2Vfc3RhcnQoKTsKICAgICAgICAgYnRhX2hmX2NsaWVudF9hdF9jbGVhcl9idWYoKTsKQEAgLTE1MTEsNyArMTUxMSw3IEBACiAgICAgY2hhciBidWZbQlRBX0hGX0NMSUVOVF9BVF9NQVhfTEVOXTsKICAgICBpbnQgYXRfbGVuOwogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwogCiAgICAgYXRfbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkFUK0JSU0Y9JXVcciIsIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLmZlYXR1cmVzKTsKICAgICBpZiAoYXRfbGVuIDwgMCkKQEAgLTE1MjcsNyArMTUyNyw3IEBACiB7CiAgICAgY2hhciAqYnVmOwogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwogCiAgICAgaWYgKGJ0YV9oZl9jbGllbnRfY2IubXNiY19lbmFibGVkKQogICAgIHsKQEAgLTE1NDEsMTIgKzE1NDEsMTIgQEAKICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXQoQlRBX0hGX0NMSUVOVF9BVF9CQUMsIGJ1Ziwgc3RybGVuKGJ1ZikpOwogfQogCi12b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9iY3MoVUlOVDMyIGNvZGVjKQordm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfYmNzKHVpbnQzMl90IGNvZGVjKQogewogICAgIGNoYXIgYnVmW0JUQV9IRl9DTElFTlRfQVRfTUFYX0xFTl07CiAgICAgaW50IGF0X2xlbjsKIAotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKIAogICAgIGF0X2xlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJBVCtCQ1M9JXVcciIsIGNvZGVjKTsKICAgICBpZiAoYXRfbGVuIDwgMCkKQEAgLTE1NTgsMTIgKzE1NTgsMTIgQEAKICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXQoQlRBX0hGX0NMSUVOVF9BVF9CQ1MsIGJ1ZiwgYXRfbGVuKTsKIH0KIAotdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfY2luZChCT09MRUFOIHN0YXR1cykKK3ZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NpbmQoYm9vbCBzdGF0dXMpCiB7CiAgICAgY2hhciAqYnVmOwogICAgIHRCVEFfSEZfQ0xJRU5UX0FUX0NNRCBjbWQ7CiAKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7CiAKICAgICBpZiAoc3RhdHVzKQogICAgIHsKQEAgLTE1NzksMTEgKzE1NzksMTEgQEAKICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXQoY21kLCBidWYsIHN0cmxlbihidWYpKTsKIH0KIAotdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfY21lcihCT09MRUFOIGFjdGl2YXRlKQordm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfY21lcihib29sIGFjdGl2YXRlKQogewogICAgIGNoYXIgKmJ1ZjsKIAotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKIAogICAgIGlmIChhY3RpdmF0ZSkKICAgICAgICAgYnVmID0gIkFUK0NNRVI9MywwLDAsMVxyIjsKQEAgLTE1OTMsMTIgKzE1OTMsMTIgQEAKICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXQoQlRBX0hGX0NMSUVOVF9BVF9DTUVSLCBidWYsIHN0cmxlbihidWYpKTsKIH0KIAotdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfY2hsZChjaGFyIGNtZCwgVUlOVDMyIGlkeCkKK3ZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NobGQoY2hhciBjbWQsIHVpbnQzMl90IGlkeCkKIHsKICAgICBjaGFyIGJ1ZltCVEFfSEZfQ0xJRU5UX0FUX01BWF9MRU5dOwogICAgIGludCBhdF9sZW47CiAKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7CiAKICAgICBpZiAoaWR4ID4gMCkKICAgICAgICAgYXRfbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkFUK0NITEQ9JWMldVxyIiwgY21kLCBpZHgpOwpAQCAtMTYxNCwxMSArMTYxNCwxMSBAQAogICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdChCVEFfSEZfQ0xJRU5UX0FUX0NITEQsIGJ1ZiwgYXRfbGVuKTsKIH0KIAotdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfY2xpcChCT09MRUFOIGFjdGl2YXRlKQordm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfY2xpcChib29sIGFjdGl2YXRlKQogewogICAgIGNoYXIgKmJ1ZjsKIAotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKIAogICAgIGlmIChhY3RpdmF0ZSkKICAgICAgICAgYnVmID0gIkFUK0NMSVA9MVxyIjsKQEAgLTE2MjgsMTEgKzE2MjgsMTEgQEAKICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXQoQlRBX0hGX0NMSUVOVF9BVF9DTElQLCBidWYsIHN0cmxlbihidWYpKTsKIH0KIAotdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfY2N3YShCT09MRUFOIGFjdGl2YXRlKQordm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfY2N3YShib29sIGFjdGl2YXRlKQogewogICAgIGNoYXIgKmJ1ZjsKIAotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKIAogICAgIGlmIChhY3RpdmF0ZSkKICAgICAgICAgYnVmID0gIkFUK0NDV0E9MVxyIjsKQEAgLTE2NDMsMTEgKzE2NDMsMTEgQEAKIH0KIAogCi12b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jbWVlKEJPT0xFQU4gYWN0aXZhdGUpCit2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jbWVlKGJvb2wgYWN0aXZhdGUpCiB7CiAgICAgY2hhciAqYnVmOwogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwogCiAgICAgaWYgKGFjdGl2YXRlKQogICAgICAgICBidWYgPSAiQVQrQ01FRT0xXHIiOwpAQCAtMTY1NywxMSArMTY1NywxMSBAQAogICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdChCVEFfSEZfQ0xJRU5UX0FUX0NNRUUsIGJ1Ziwgc3RybGVuKGJ1ZikpOwogfQogCi12b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jb3BzKEJPT0xFQU4gcXVlcnkpCit2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jb3BzKGJvb2wgcXVlcnkpCiB7CiAgICAgY2hhciAqYnVmOwogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwogCiAgICAgaWYgKHF1ZXJ5KQogICAgICAgICBidWYgPSAiQVQrQ09QUz9cciI7CkBAIC0xNjc1LDE4ICsxNjc1LDE4IEBACiB7CiAgICAgY2hhciAqYnVmOwogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwogCiAgICAgYnVmID0gIkFUK0NMQ0NcciI7CiAKICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXQoQlRBX0hGX0NMSUVOVF9BVF9DTENDLCBidWYsIHN0cmxlbihidWYpKTsKIH0KIAotdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfYnZyYShCT09MRUFOIGVuYWJsZSkKK3ZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2J2cmEoYm9vbCBlbmFibGUpCiB7CiAgICAgY2hhciAqYnVmOwogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwogCiAgICAgaWYgKGVuYWJsZSkKICAgICAgICAgYnVmID0gIkFUK0JWUkE9MVxyIjsKQEAgLTE2OTYsMTIgKzE2OTYsMTIgQEAKICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXQoQlRBX0hGX0NMSUVOVF9BVF9CVlJBLCBidWYsIHN0cmxlbihidWYpKTsKIH0KIAotdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfdmdzKFVJTlQzMiB2b2x1bWUpCit2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF92Z3ModWludDMyX3Qgdm9sdW1lKQogewogICAgIGNoYXIgYnVmW0JUQV9IRl9DTElFTlRfQVRfTUFYX0xFTl07CiAgICAgaW50IGF0X2xlbjsKIAotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKIAogICAgIGF0X2xlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJBVCtWR1M9JXVcciIsIHZvbHVtZSk7CiAgICAgaWYgKGF0X2xlbiA8IDApCkBAIC0xNzEzLDEyICsxNzEzLDEyIEBACiAgICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0KEJUQV9IRl9DTElFTlRfQVRfVkdTLCBidWYsIGF0X2xlbik7CiB9CiAKLXZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X3ZnbShVSU5UMzIgdm9sdW1lKQordm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfdmdtKHVpbnQzMl90IHZvbHVtZSkKIHsKICAgICBjaGFyIGJ1ZltCVEFfSEZfQ0xJRU5UX0FUX01BWF9MRU5dOwogICAgIGludCBhdF9sZW47CiAKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7CiAKICAgICBhdF9sZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiQVQrVkdNPSV1XHIiLCB2b2x1bWUpOwogICAgIGlmIChhdF9sZW4gPCAwKQpAQCAtMTczMCwxMiArMTczMCwxMiBAQAogICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdChCVEFfSEZfQ0xJRU5UX0FUX1ZHTSwgYnVmLCBhdF9sZW4pOwogfQogCi12b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9hdGQoY2hhciAqbnVtYmVyLCBVSU5UMzIgbWVtb3J5KQordm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfYXRkKGNoYXIgKm51bWJlciwgdWludDMyX3QgbWVtb3J5KQogewogICAgIGNoYXIgYnVmW0JUQV9IRl9DTElFTlRfQVRfTUFYX0xFTl07CiAgICAgaW50IGF0X2xlbjsKIAotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKIAogICAgIGlmIChudW1iZXJbMF0gIT0gJ1wwJykgewogICAgICAgICBhdF9sZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiQVREJXM7XHIiLCBudW1iZXIpOwpAQCAtMTc2Miw3ICsxNzYyLDcgQEAKIHsKICAgICBjaGFyICpidWY7CiAKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7CiAKICAgICBidWYgPSAiQVQrQkxETlxyIjsKIApAQCAtMTc3Myw3ICsxNzczLDcgQEAKIHsKICAgICBjaGFyICpidWY7CiAKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7CiAKICAgICBidWYgPSAiQVRBXHIiOwogCkBAIC0xNzg0LDIxICsxNzg0LDIxIEBACiB7CiAgICAgY2hhciAqYnVmOwogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwogCiAgICAgYnVmID0gIkFUK0NIVVBcciI7CiAKICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXQoQlRBX0hGX0NMSUVOVF9BVF9DSFVQLCBidWYsIHN0cmxlbihidWYpKTsKIH0KIAotdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfYnRyaChCT09MRUFOIHF1ZXJ5LCBVSU5UMzIgdmFsKQordm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfYnRyaChib29sIHF1ZXJ5LCB1aW50MzJfdCB2YWwpCiB7CiAgICAgY2hhciBidWZbQlRBX0hGX0NMSUVOVF9BVF9NQVhfTEVOXTsKICAgICBpbnQgYXRfbGVuOwogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwogCi0gICAgaWYgKHF1ZXJ5ID09IFRSVUUpCisgICAgaWYgKHF1ZXJ5ID09IHRydWUpCiAgICAgewogICAgICAgICBhdF9sZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiQVQrQlRSSD9cciIpOwogICAgIH0KQEAgLTE4MjEsNyArMTgyMSw3IEBACiAgICAgY2hhciBidWZbQlRBX0hGX0NMSUVOVF9BVF9NQVhfTEVOXTsKICAgICBpbnQgYXRfbGVuOwogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwogCiAgICAgYXRfbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkFUK1ZUUz0lY1xyIiwgY29kZSk7CiAKQEAgLTE4MzgsNyArMTgzOCw3IEBACiB7CiAgICAgY2hhciAqYnVmOwogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwogCiAgICAgYnVmID0gIkFUK0JDQ1xyIjsKIApAQCAtMTg0OSw3ICsxODQ5LDcgQEAKIHsKICAgICBjaGFyICpidWY7CiAKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7CiAKICAgICBidWYgPSAiQVQrQ05VTVxyIjsKIApAQCAtMTg2MCwxMSArMTg2MCwxMSBAQAogewogICAgIGNoYXIgKmJ1ZjsKIAotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKIAogICAgIGlmICghKGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnBlZXJfZmVhdHVyZXMgJiBCVEFfSEZfQ0xJRU5UX1BFRVJfRkVBVF9FQ05SKSkKICAgICB7Ci0gICAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBSZW1vdGUgZG9lcyBub3Qgc3VwcG9ydCBOUkVDLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBSZW1vdGUgZG9lcyBub3Qgc3VwcG9ydCBOUkVDLiIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMTg3MywxMiArMTg3MywxMiBAQAogICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdChCVEFfSEZfQ0xJRU5UX0FUX05SRUMsIGJ1Ziwgc3RybGVuKGJ1ZikpOwogfQogCi12b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9iaW5wKFVJTlQzMiBhY3Rpb24pCit2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9iaW5wKHVpbnQzMl90IGFjdGlvbikKIHsKICAgICBjaGFyIGJ1ZltCVEFfSEZfQ0xJRU5UX0FUX01BWF9MRU5dOwogICAgIGludCBhdF9sZW47CiAKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7CiAKICAgICBhdF9sZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiQVQrQklOUD0ldVxyIiwgYWN0aW9uKTsKIApAQCAtMTg5Nyw3ICsxODk3LDcgQEAKICAgICBpbnQgYXRfbGVuOwogICAgIGludCBpOwogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwogICAgIGlmIChidGFfaGZfY2xpZW50X2NiLnNjYi5wZWVyX3ZlcnNpb24gPCBIRlBfVkVSU0lPTl8xXzYpCiAgICAgewogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJSZW1vdGUgZG9lcyBub3QgU3VwcG9ydCBBVCtCSUEiKTsKZGlmZiAtLWdpdCBhL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9hdC5oIGIvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2F0LmgKaW5kZXggNzhiNWQ2My4uYWQxMDEzNSAxMDA2NDQKLS0tIGEvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2F0LmgKKysrIGIvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2F0LmgKQEAgLTI4LDE4ICsyOCwxOCBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBjb25zdCBjaGFyICAqcF9jbWQ7ICAgICAgICAgLyogQVQgY29tbWFuZCBzdHJpbmcgKi8KLSAgICBVSU5UOCAgICAgICBhcmdfdHlwZTsgICAgICAgLyogYWxsb3dhYmxlIGFyZ3VtZW50IHR5cGUgc3ludGF4ICovCi0gICAgVUlOVDggICAgICAgZm10OyAgICAgICAgICAgIC8qIHdoZXRoZXIgYXJnIGlzIGludCBvciBzdHJpbmcgKi8KLSAgICBVSU5UOCAgICAgICBtaW47ICAgICAgICAgICAgLyogbWluaW11bSB2YWx1ZSBmb3IgaW50IGFyZyAqLwotICAgIElOVDE2ICAgICAgIG1heDsgICAgICAgICAgICAvKiBtYXhpbXVtIHZhbHVlIGZvciBpbnQgYXJnICovCisgICAgdWludDhfdCAgICAgICBhcmdfdHlwZTsgICAgICAgLyogYWxsb3dhYmxlIGFyZ3VtZW50IHR5cGUgc3ludGF4ICovCisgICAgdWludDhfdCAgICAgICBmbXQ7ICAgICAgICAgICAgLyogd2hldGhlciBhcmcgaXMgaW50IG9yIHN0cmluZyAqLworICAgIHVpbnQ4X3QgICAgICAgbWluOyAgICAgICAgICAgIC8qIG1pbmltdW0gdmFsdWUgZm9yIGludCBhcmcgKi8KKyAgICBpbnQxNl90ICAgICAgIG1heDsgICAgICAgICAgICAvKiBtYXhpbXVtIHZhbHVlIGZvciBpbnQgYXJnICovCiB9IHRCVEFfQUdfQVRfQ01EOwogCiAvKiBjYWxsYmFjayBmdW5jdGlvbiBleGVjdXRlZCB3aGVuIGNvbW1hbmQgaXMgcGFyc2VkICovCi10eXBlZGVmIHZvaWQgKHRCVEFfQUdfQVRfQ01EX0NCQUNLKSh2b2lkICpwX3VzZXIsIFVJTlQxNiBjbWQsIFVJTlQ4IGFyZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcF9hcmcsIElOVDE2IGludF9hcmcpOwordHlwZWRlZiB2b2lkICh0QlRBX0FHX0FUX0NNRF9DQkFDSykodm9pZCAqcF91c2VyLCB1aW50MTZfdCBjbWQsIHVpbnQ4X3QgYXJnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwX2FyZywgaW50MTZfdCBpbnRfYXJnKTsKIAogLyogY2FsbGJhY2sgZnVuY3Rpb24gZXhlY3V0ZWQgdG8gc2VuZCAiRVJST1IiIHJlc3VsdCBjb2RlICovCi10eXBlZGVmIHZvaWQgKHRCVEFfQUdfQVRfRVJSX0NCQUNLKSh2b2lkICpwX3VzZXIsIEJPT0xFQU4gdW5rbm93biwgY2hhciAqcF9hcmcpOwordHlwZWRlZiB2b2lkICh0QlRBX0FHX0FUX0VSUl9DQkFDSykodm9pZCAqcF91c2VyLCBib29sIHVua25vd24sIGNoYXIgKnBfYXJnKTsKIAogZW51bQogewpAQCAtNzIsNyArNzIsNyBAQAogICAgIEJUQV9IRl9DTElFTlRfQVRfQklOUCwKIH07CiAKLXR5cGVkZWYgVUlOVDggdEJUQV9IRl9DTElFTlRfQVRfQ01EOwordHlwZWRlZiB1aW50OF90IHRCVEFfSEZfQ0xJRU5UX0FUX0NNRDsKIAogLyogTWF4aW11bSBjb21iaW5lZCBidWZmZXIgZm9yIHJlY2VpdmVkIEFUIGV2ZW50cyBzdHJpbmcgKi8KICNkZWZpbmUgQlRBX0hGX0NMSUVOVF9BVF9QQVJTRVJfTUFYX0xFTiAgICAgICAgNDA5NgpAQCAtODEsNyArODEsNyBAQAogc3RydWN0IHF1ZXVlZF9hdF9jbWR7CiAgICAgdEJUQV9IRl9DTElFTlRfQVRfQ01EIGNtZDsKICAgICBjaGFyIGJ1ZltCVEFfSEZfQ0xJRU5UX0FUX01BWF9MRU5dOwotICAgIFVJTlQxNiBidWZfbGVuOworICAgIHVpbnQxNl90IGJ1Zl9sZW47CiAgICAgc3RydWN0IHF1ZXVlZF9hdF9jbWQgKm5leHQ7CiB9OwogdHlwZWRlZiBzdHJ1Y3QgcXVldWVkX2F0X2NtZCB0QlRBX0hGX0NMSUVOVF9BVF9RQ01EOwpkaWZmIC0tZ2l0IGEvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2NtZC5jIGIvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2NtZC5jCmluZGV4IDU5ZDdiNWYuLmY4ZTZiNWIgMTAwNjQ0Ci0tLSBhL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9jbWQuYworKysgYi9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfY21kLmMKQEAgLTMxLDcgKzMxLDcgQEAKICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF92dHMoKGNoYXIpcF92YWwtPnVpbnQzMl92YWwxKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEJUQV9IRl9DTElFTlRfQVRfQ01EX0JUUkg6Ci0gICAgICAgICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXRfYnRyaChGQUxTRSwgcF92YWwtPnVpbnQzMl92YWwxKTsKKyAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9idHJoKGZhbHNlLCBwX3ZhbC0+dWludDMyX3ZhbDEpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9BVF9DTURfQ0hVUDoKICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jaHVwKCk7CkBAIC01MCw3ICs1MCw3IEBACiAgICAgICAgICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXRfYXRhKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9DT1BTOgotICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NvcHMoVFJVRSk7CisgICAgICAgICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXRfY29wcyh0cnVlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEJUQV9IRl9DTElFTlRfQVRfQ01EX0FURDoKICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9hdGQocF92YWwtPnN0ciwgcF92YWwtPnVpbnQzMl92YWwxKTsKQEAgLTYyLDcgKzYyLDcgQEAKICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF92Z3MocF92YWwtPnVpbnQzMl92YWwxKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEJUQV9IRl9DTElFTlRfQVRfQ01EX0JWUkE6Ci0gICAgICAgICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXRfYnZyYShwX3ZhbC0+dWludDMyX3ZhbDEgPT0gMCA/IEZBTFNFIDogVFJVRSk7CisgICAgICAgICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXRfYnZyYShwX3ZhbC0+dWludDMyX3ZhbDEgPT0gMCA/IGZhbHNlIDogdHJ1ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9DTENDOgogICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NsY2MoKTsKZGlmZiAtLWdpdCBhL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9pbnQuaCBiL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9pbnQuaAppbmRleCBhMmRiZGUyLi5jYzhjNTVkIDEwMDY0NAotLS0gYS9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfaW50LmgKKysrIGIvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2ludC5oCkBAIC0xMDEsMjQgKzEwMSwyNCBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICAgICAgaGRyOwotICAgIFVJTlQxNiAgICAgICAgICBzdGF0dXM7CisgICAgdWludDE2X3QgICAgICAgICAgc3RhdHVzOwogfSB0QlRBX0hGX0NMSUVOVF9ESVNDX1JFU1VMVDsKIAogLyogZGF0YSB0eXBlIGZvciBSRkNPTU0gZXZlbnRzICovCiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJUX0hEUiAgICAgICAgICBoZHI7Ci0gICAgVUlOVDE2ICAgICAgICAgIHBvcnRfaGFuZGxlOworICAgIHVpbnQxNl90ICAgICAgICAgIHBvcnRfaGFuZGxlOwogfSB0QlRBX0hGX0NMSUVOVF9SRkM7CiAKIC8qIGdlbmVyaWMgcHVycG9zZSBkYXRhIHR5cGUgZm9yIG90aGVyIGV2ZW50cyAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICAgICAgaGRyOwotICAgIEJPT0xFQU4gICAgICAgICBib29sX3ZhbDsKLSAgICBVSU5UOCAgICAgICAgICAgdWludDhfdmFsOwotICAgIFVJTlQzMiAgICAgICAgICB1aW50MzJfdmFsMTsKLSAgICBVSU5UMzIgICAgICAgICAgdWludDMyX3ZhbDI7CisgICAgYm9vbCAgICAgICAgIGJvb2xfdmFsOworICAgIHVpbnQ4X3QgICAgICAgICAgIHVpbnQ4X3ZhbDsKKyAgICB1aW50MzJfdCAgICAgICAgICB1aW50MzJfdmFsMTsKKyAgICB1aW50MzJfdCAgICAgICAgICB1aW50MzJfdmFsMjsKICAgICBjaGFyICAgICAgICAgICAgc3RyW0JUQV9IRl9DTElFTlRfTlVNQkVSX0xFTiArIDFdOwogfSB0QlRBX0hGX0NMSUVOVF9EQVRBX1ZBTDsKIApAQCAtMTM4LDI3ICsxMzgsMjcgQEAKIC8qIHR5cGUgZm9yIGVhY2ggc2VydmljZSBjb250cm9sIGJsb2NrICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQxNiAgICAgICAgICAgICAgc2Vydl9oYW5kbGU7ICAgIC8qIFJGQ09NTSBzZXJ2ZXIgaGFuZGxlICovCisgICAgdWludDE2X3QgICAgICAgICAgICAgIHNlcnZfaGFuZGxlOyAgICAvKiBSRkNPTU0gc2VydmVyIGhhbmRsZSAqLwogICAgIEJEX0FERFIgICAgICAgICAgICAgcGVlcl9hZGRyOyAgICAgIC8qIHBlZXIgYmQgYWRkcmVzcyAqLwogICAgIHRTRFBfRElTQ09WRVJZX0RCICAgKnBfZGlzY19kYjsgICAgIC8qIHBvaW50ZXIgdG8gZGlzY292ZXJ5IGRhdGFiYXNlICovCi0gICAgVUlOVDE2ICAgICAgICAgICAgICBjb25uX2hhbmRsZTsgICAgLyogUkZDT01NIGhhbmRsZSBvZiBjb25uZWN0ZWQgc2VydmljZSAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBjb25uX2hhbmRsZTsgICAgLyogUkZDT01NIGhhbmRsZSBvZiBjb25uZWN0ZWQgc2VydmljZSAqLwogICAgIHRCVEFfU0VDICAgICAgICAgICAgc2Vydl9zZWNfbWFzazsgIC8qIHNlcnZlciBzZWN1cml0eSBtYXNrICovCiAgICAgdEJUQV9TRUMgICAgICAgICAgICBjbGlfc2VjX21hc2s7ICAgLyogY2xpZW50IHNlY3VyaXR5IG1hc2sgKi8KICAgICB0QlRBX0hGX0NMSUVOVF9GRUFUICAgICAgICBmZWF0dXJlczsgICAgICAgLyogZmVhdHVyZXMgcmVnaXN0ZXJlZCBieSBhcHBsaWNhdGlvbiAqLwogICAgIHRCVEFfSEZfQ0xJRU5UX1BFRVJfRkVBVCAgIHBlZXJfZmVhdHVyZXM7ICAvKiBwZWVyIGRldmljZSBmZWF0dXJlcyAqLwogICAgIHRCVEFfSEZfQ0xJRU5UX0NITERfRkVBVCAgIGNobGRfZmVhdHVyZXM7ICAvKiBjYWxsIGhhbmRsaW5nIGZlYXR1cmVzICovCi0gICAgVUlOVDE2ICAgICAgICAgICAgICBwZWVyX3ZlcnNpb247ICAgLyogcHJvZmlsZSB2ZXJzaW9uIG9mIHBlZXIgZGV2aWNlICovCi0gICAgVUlOVDggICAgICAgICAgICAgICBwZWVyX3NjbjsgICAgICAgLyogcGVlciBzY24gKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIHJvbGU7ICAgICAgICAgICAvKiBpbml0aWF0b3IvYWNjZXB0b3Igcm9sZSAqLwotICAgIFVJTlQxNiAgICAgICAgICAgICAgc2NvX2lkeDsgICAgICAgIC8qIFNDTyBoYW5kbGUgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIHNjb19zdGF0ZTsgICAgICAvKiBTQ08gc3RhdGUgdmFyaWFibGUgKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgIHNjb19jbG9zZV9yZmM7ICAgLyogVFJVRSBpZiBhbHNvIGNsb3NlIFJGQ09NTSBhZnRlciBTQ08gKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgIHJldHJ5X3dpdGhfc2NvX29ubHk7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBkZXJlZ2lzdGVyOyAgICAgLyogVFJVRSBpZiBzZXJ2aWNlIHNodXR0aW5nIGRvd24gKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgIHN2Y19jb25uOyAgICAgICAvKiBzZXQgdG8gVFJVRSB3aGVuIHNlcnZpY2UgbGV2ZWwgY29ubmVjdGlvbiBpcyB1cCAqLwotICAgIEJPT0xFQU4gICAgICAgICAgICAgc2VuZF9hdF9yZXBseTsgIC8qIHNldCB0byBUUlVFIHRvIG5vdGlmeSBmcmFtZXdvcmsgYWJvdXQgQVQgcmVzdWx0cyAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBwZWVyX3ZlcnNpb247ICAgLyogcHJvZmlsZSB2ZXJzaW9uIG9mIHBlZXIgZGV2aWNlICovCisgICAgdWludDhfdCAgICAgICAgICAgICAgIHBlZXJfc2NuOyAgICAgICAvKiBwZWVyIHNjbiAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICByb2xlOyAgICAgICAgICAgLyogaW5pdGlhdG9yL2FjY2VwdG9yIHJvbGUgKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgc2NvX2lkeDsgICAgICAgIC8qIFNDTyBoYW5kbGUgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgc2NvX3N0YXRlOyAgICAgIC8qIFNDTyBzdGF0ZSB2YXJpYWJsZSAqLworICAgIGJvb2wgICAgICAgICAgICAgc2NvX2Nsb3NlX3JmYzsgICAvKiB0cnVlIGlmIGFsc28gY2xvc2UgUkZDT01NIGFmdGVyIFNDTyAqLworICAgIGJvb2wgICAgICAgICAgICAgcmV0cnlfd2l0aF9zY29fb25seTsKKyAgICBib29sICAgICAgICAgICAgIGRlcmVnaXN0ZXI7ICAgICAvKiB0cnVlIGlmIHNlcnZpY2Ugc2h1dHRpbmcgZG93biAqLworICAgIGJvb2wgICAgICAgICAgICAgc3ZjX2Nvbm47ICAgICAgIC8qIHNldCB0byB0cnVlIHdoZW4gc2VydmljZSBsZXZlbCBjb25uZWN0aW9uIGlzIHVwICovCisgICAgYm9vbCAgICAgICAgICAgICBzZW5kX2F0X3JlcGx5OyAgLyogc2V0IHRvIHRydWUgdG8gbm90aWZ5IGZyYW1ld29yayBhYm91dCBBVCByZXN1bHRzICovCiAgICAgdEJUQV9IRl9DTElFTlRfQVRfQ0IgYXRfY2I7ICAgICAgICAgLyogQVQgUGFyc2VyIGNvbnRyb2wgYmxvY2sgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIHN0YXRlOyAgICAgICAgICAvKiBzdGF0ZSBtYWNoaW5lIHN0YXRlICovCisgICAgdWludDhfdCAgICAgICAgICAgICAgIHN0YXRlOyAgICAgICAgICAvKiBzdGF0ZSBtYWNoaW5lIHN0YXRlICovCiAgICAgdEJUTV9TQ09fQ09ERUNfVFlQRSBuZWdvdGlhdGVkX2NvZGVjOyAvKiBuZWdvdGlhdGVkIGNvZGVjICovCiAgICAgYWxhcm1fdCAgICAgICAgICAgICAqY29sbGlzaW9uX3RpbWVyOyAvKiBDb2xsaXNpb24gdGltZXIgKi8KIH0gdEJUQV9IRl9DTElFTlRfU0NCOwpAQCAtMTgwLDEwICsxODAsMTAgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgdEJUQV9IRl9DTElFTlRfU0NCICAgICAgICAgc2NiOyAgICAgICAgICAgICAvKiBzZXJ2aWNlIGNvbnRyb2wgYmxvY2sgKi8KLSAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICBzZHBfaGFuZGxlOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgIHNjbjsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgIHNkcF9oYW5kbGU7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICBzY247CiAgICAgdEJUQV9IRl9DTElFTlRfQ0JBQ0sgICAgICAgKnBfY2JhY2s7ICAgICAgICAvKiBhcHBsaWNhdGlvbiBjYWxsYmFjayAqLwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgIG1zYmNfZW5hYmxlZDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBtc2JjX2VuYWJsZWQ7CiB9IHRCVEFfSEZfQ0xJRU5UX0NCOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIwMCwyNiArMjAwLDI2IEBACiAvKiBtYWluIGZ1bmN0aW9ucyAqLwogZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zY2JfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2NiX2Rpc2FibGUodm9pZCk7Ci1leHRlcm4gQk9PTEVBTiBidGFfaGZfY2xpZW50X2hkbF9ldmVudChCVF9IRFIgKnBfbXNnKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc21fZXhlY3V0ZShVSU5UMTYgZXZlbnQsCitleHRlcm4gYm9vbCBidGFfaGZfY2xpZW50X2hkbF9ldmVudChCVF9IRFIgKnBfbXNnKTsKK2V4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc21fZXhlY3V0ZSh1aW50MTZfdCBldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hGX0NMSUVOVF9EQVRBICpwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zbGNfc2VxKEJPT0xFQU4gZXJyb3IpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9jb2xsaXNpb25fY2JhY2sgKHRCVEFfU1lTX0NPTk5fU1RBVFVTIHN0YXR1cywgVUlOVDggaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKTsKK2V4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2xjX3NlcShib29sIGVycm9yKTsKK2V4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfY29sbGlzaW9uX2NiYWNrICh0QlRBX1NZU19DT05OX1NUQVRVUyBzdGF0dXMsIHVpbnQ4X3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpOwogZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9yZXN1bWVfb3BlbiAoKTsKIAogLyogU0RQIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIEJPT0xFQU4gYnRhX2hmX2NsaWVudF9hZGRfcmVjb3JkKGNoYXIgKnBfc2VydmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4IHNjbiwgdEJUQV9IRl9DTElFTlRfRkVBVCBmZWF0dXJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgc2RwX2hhbmRsZSk7CitleHRlcm4gYm9vbCBidGFfaGZfY2xpZW50X2FkZF9yZWNvcmQoY2hhciAqcF9zZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY24sIHRCVEFfSEZfQ0xJRU5UX0ZFQVQgZmVhdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2RwX2hhbmRsZSk7CiBleHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X2NyZWF0ZV9yZWNvcmQodEJUQV9IRl9DTElFTlRfREFUQSAqcF9kYXRhKTsKIGV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfZGVsX3JlY29yZCh0QlRBX0hGX0NMSUVOVF9EQVRBICpwX2RhdGEpOwotZXh0ZXJuIEJPT0xFQU4gYnRhX2hmX2NsaWVudF9zZHBfZmluZF9hdHRyKHZvaWQpOworZXh0ZXJuIGJvb2wgYnRhX2hmX2NsaWVudF9zZHBfZmluZF9hdHRyKHZvaWQpOwogZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9kb19kaXNjKHZvaWQpOwogZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9mcmVlX2RiKHRCVEFfSEZfQ0xJRU5UX0RBVEEgKnBfZGF0YSk7CiAKIC8qIFJGQ09NTSBmdW5jdGlvbnMgKi8KLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2V0dXBfcG9ydChVSU5UMTYgaGFuZGxlKTsKK2V4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2V0dXBfcG9ydCh1aW50MTZfdCBoYW5kbGUpOwogZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zdGFydF9zZXJ2ZXIodm9pZCk7CiBleHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X2Nsb3NlX3NlcnZlcih2b2lkKTsKIGV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfcmZjX2RvX29wZW4odEJUQV9IRl9DTElFTlRfREFUQSAqcF9kYXRhKTsKQEAgLTIzMiwzNCArMjMyLDM0IEBACiBleHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3Njb19jb25uX2Nsb3NlKHRCVEFfSEZfQ0xJRU5UX0RBVEEgKnBfZGF0YSk7CiBleHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3Njb19vcGVuKHRCVEFfSEZfQ0xJRU5UX0RBVEEgKnBfZGF0YSk7CiBleHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3Njb19jbG9zZSh0QlRBX0hGX0NMSUVOVF9EQVRBICpwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9jYmFja19zY28oVUlOVDggZXZlbnQpOworZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9jYmFja19zY28odWludDhfdCBldmVudCk7CiAKIC8qIEFUIGNvbW1hbmQgZnVuY3Rpb25zICovCiBleHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X2F0X3BhcnNlKGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbik7CiBleHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfYnJzZih2b2lkKTsKIGV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9iYWModm9pZCk7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfY2luZChCT09MRUFOIHN0YXR1cyk7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfY21lcihCT09MRUFOIGFjdGl2YXRlKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jaGxkKGNoYXIgY21kLCBVSU5UMzIgaWR4KTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jbGlwKEJPT0xFQU4gYWN0aXZhdGUpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2Njd2EoQk9PTEVBTiBhY3RpdmF0ZSk7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfY21lZShCT09MRUFOIGFjdGl2YXRlKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jb3BzKEJPT0xFQU4gcXVlcnkpOworZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NpbmQoYm9vbCBzdGF0dXMpOworZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NtZXIoYm9vbCBhY3RpdmF0ZSk7CitleHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfY2hsZChjaGFyIGNtZCwgdWludDMyX3QgaWR4KTsKK2V4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jbGlwKGJvb2wgYWN0aXZhdGUpOworZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2Njd2EoYm9vbCBhY3RpdmF0ZSk7CitleHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfY21lZShib29sIGFjdGl2YXRlKTsKK2V4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jb3BzKGJvb2wgcXVlcnkpOwogZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NsY2Modm9pZCk7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfYnZyYShCT09MRUFOIGVuYWJsZSk7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfdmdzKFVJTlQzMiB2b2x1bWUpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X3ZnbShVSU5UMzIgdm9sdW1lKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9hdGQoY2hhciAqbnVtYmVyLCBVSU5UMzIgbWVtb3J5KTsKK2V4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9idnJhKGJvb2wgZW5hYmxlKTsKK2V4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF92Z3ModWludDMyX3Qgdm9sdW1lKTsKK2V4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF92Z20odWludDMyX3Qgdm9sdW1lKTsKK2V4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9hdGQoY2hhciAqbnVtYmVyLCB1aW50MzJfdCBtZW1vcnkpOwogZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2JsZG4odm9pZCk7CiBleHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfYXRhKHZvaWQpOwogZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NodXAodm9pZCk7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfYnRyaChCT09MRUFOIHF1ZXJ5LCBVSU5UMzIgdmFsKTsKK2V4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9idHJoKGJvb2wgcXVlcnksIHVpbnQzMl90IHZhbCk7CiBleHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfdnRzKGNoYXIgY29kZSk7CiBleHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfYmNjKHZvaWQpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2JjcyhVSU5UMzIgY29kZWMpOworZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2Jjcyh1aW50MzJfdCBjb2RlYyk7CiBleHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfY251bSh2b2lkKTsKIGV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9ucmVjKHZvaWQpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2JpbnAoVUlOVDMyIGFjdGlvbik7CitleHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfYmlucCh1aW50MzJfdCBhY3Rpb24pOwogZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2JpYSh2b2lkKTsKIAogLyogQWN0aW9uIGZ1bmN0aW9ucyAqLwpAQCAtMjc4LDE0ICsyNzgsMTQgQEAKIGV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfcmZjX2RhdGEodEJUQV9IRl9DTElFTlRfREFUQSAqcF9kYXRhKTsKIGV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfZGlzY19pbnRfcmVzKHRCVEFfSEZfQ0xJRU5UX0RBVEEgKnBfZGF0YSk7CiBleHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3N2Y19jb25uX29wZW4odEJUQV9IRl9DTElFTlRfREFUQSAqcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfaW5kKHRCVEFfSEZfQ0xJRU5UX0lORF9UWVBFIHR5cGUsIFVJTlQxNiB2YWx1ZSk7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X2V2dF92YWwodEJUQV9IRl9DTElFTlRfRVZUIHR5cGUsIFVJTlQxNiB2YWx1ZSk7CitleHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X2luZCh0QlRBX0hGX0NMSUVOVF9JTkRfVFlQRSB0eXBlLCB1aW50MTZfdCB2YWx1ZSk7CitleHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X2V2dF92YWwodEJUQV9IRl9DTElFTlRfRVZUIHR5cGUsIHVpbnQxNl90IHZhbHVlKTsKIGV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfb3BlcmF0b3JfbmFtZShjaGFyICpuYW1lKTsKIGV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfY2xpcChjaGFyICpudW1iZXIpOwogZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9jY3dhKGNoYXIgKm51bWJlcik7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X2F0X3Jlc3VsdCh0QlRBX0hGX0NMSUVOVF9BVF9SRVNVTFRfVFlQRSB0eXBlLCBVSU5UMTYgY21lKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfY2xjYyhVSU5UMzIgaWR4LCBCT09MRUFOIGluY29taW5nLCBVSU5UOCBzdGF0dXMsIEJPT0xFQU4gbXB0eSwgY2hhciAqbnVtYmVyKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfY251bShjaGFyICpudW1iZXIsIFVJTlQxNiBzZXJ2aWNlKTsKK2V4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfYXRfcmVzdWx0KHRCVEFfSEZfQ0xJRU5UX0FUX1JFU1VMVF9UWVBFIHR5cGUsIHVpbnQxNl90IGNtZSk7CitleHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X2NsY2ModWludDMyX3QgaWR4LCBib29sIGluY29taW5nLCB1aW50OF90IHN0YXR1cywgYm9vbCBtcHR5LCBjaGFyICpudW1iZXIpOworZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9jbnVtKGNoYXIgKm51bWJlciwgdWludDE2X3Qgc2VydmljZSk7CiBleHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X2JpbnAoY2hhciAqbnVtYmVyKTsKIAogLyogQ29tbWFuZHMgaGFuZGxpbmcgZnVuY3Rpb25zICovCmRpZmYgLS1naXQgYS9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfbWFpbi5jIGIvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X21haW4uYwppbmRleCA1ZGY0MThiLi45NmE3ODc2IDEwMDY0NAotLS0gYS9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfbWFpbi5jCisrKyBiL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9tYWluLmMKQEAgLTI5LDE3ICsyOSwxNyBAQAogI2luY2x1ZGUgImJ0YV9oZl9jbGllbnRfaW50LmgiCiAKIC8qIHVuY29tbWVudCB0byBlbmFibGUgZXh0cmEgZGVidWcgKi8KLS8qICNkZWZpbmUgQlRBX0hGX0NMSUVOVF9ERUJVRyBUUlVFICovCisvKiAjZGVmaW5lIEJUQV9IRl9DTElFTlRfREVCVUcgdHJ1ZSAqLwogCiAjaWZuZGVmIEJUQV9IRl9DTElFTlRfREVCVUcKLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9ERUJVRyBGQUxTRQorI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0RFQlVHIGZhbHNlCiAjZW5kaWYKIAogZXh0ZXJuIGZpeGVkX3F1ZXVlX3QgKmJ0dV9idGFfYWxhcm1fcXVldWU7CiAKLSNpZiBCVEFfSEZfQ0xJRU5UX0RFQlVHID09IFRSVUUKLXN0YXRpYyBjaGFyICpidGFfaGZfY2xpZW50X2V2dF9zdHIoVUlOVDE2IGV2ZW50KTsKLXN0YXRpYyBjaGFyICpidGFfaGZfY2xpZW50X3N0YXRlX3N0cihVSU5UOCBzdGF0ZSk7CisjaWYgKEJUQV9IRl9DTElFTlRfREVCVUcgPT0gVFJVRSkKK3N0YXRpYyBjaGFyICpidGFfaGZfY2xpZW50X2V2dF9zdHIodWludDE2X3QgZXZlbnQpOworc3RhdGljIGNoYXIgKmJ0YV9oZl9jbGllbnRfc3RhdGVfc3RyKHVpbnQ4X3Qgc3RhdGUpOwogI2VuZGlmCiAKIC8qIHN0YXRlIG1hY2hpbmUgc3RhdGVzICovCkBAIC0xMjMsNyArMTIzLDcgQEAKICNkZWZpbmUgQlRBX0hGX0NMSUVOVF9OVU1fQ09MUyAgICAgICAgICAgICAzICAgICAgIC8qIG51bWJlciBvZiBjb2x1bW5zIGluIHN0YXRlIHRhYmxlcyAqLwogCiAvKiBzdGF0ZSB0YWJsZSBmb3IgaW5pdCBzdGF0ZSAqLwotY29uc3QgVUlOVDggYnRhX2hmX2NsaWVudF9zdF9pbml0W11bQlRBX0hGX0NMSUVOVF9OVU1fQ09MU10gPQorY29uc3QgdWludDhfdCBidGFfaGZfY2xpZW50X3N0X2luaXRbXVtCVEFfSEZfQ0xJRU5UX05VTV9DT0xTXSA9CiB7CiAvKiBFdmVudCAgICAgICAgICAgICAgICAgICAgQWN0aW9uIDEgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAyICAgICAgICAgICAgICAgICAgICAgICBOZXh0IHN0YXRlICovCiAvKiBBUElfUkVHSVNURVJfRVZUICovICAgICAge0JUQV9IRl9DTElFTlRfUkVHSVNURVIsICAgICAgIEJUQV9IRl9DTElFTlRfSUdOT1JFLCAgICAgICAgICBCVEFfSEZfQ0xJRU5UX0lOSVRfU1R9LApAQCAtMTQ2LDcgKzE0Niw3IEBACiB9OwogCiAvKiBzdGF0ZSB0YWJsZSBmb3Igb3BlbmluZyBzdGF0ZSAqLwotY29uc3QgVUlOVDggYnRhX2hmX2NsaWVudF9zdF9vcGVuaW5nW11bQlRBX0hGX0NMSUVOVF9OVU1fQ09MU10gPQorY29uc3QgdWludDhfdCBidGFfaGZfY2xpZW50X3N0X29wZW5pbmdbXVtCVEFfSEZfQ0xJRU5UX05VTV9DT0xTXSA9CiB7CiAvKiBFdmVudCAgICAgICAgICAgICAgICAgICAgQWN0aW9uIDEgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAyICAgICAgICAgICAgICAgICAgICAgICBOZXh0IHN0YXRlICovCiAvKiBBUElfUkVHSVNURVJfRVZUICovICAgICAge0JUQV9IRl9DTElFTlRfSUdOT1JFLCAgICAgICAgIEJUQV9IRl9DTElFTlRfSUdOT1JFLCAgICAgICAgICBCVEFfSEZfQ0xJRU5UX09QRU5JTkdfU1R9LApAQCAtMTY5LDcgKzE2OSw3IEBACiB9OwogCiAvKiBzdGF0ZSB0YWJsZSBmb3Igb3BlbiBzdGF0ZSAqLwotY29uc3QgVUlOVDggYnRhX2hmX2NsaWVudF9zdF9vcGVuW11bQlRBX0hGX0NMSUVOVF9OVU1fQ09MU10gPQorY29uc3QgdWludDhfdCBidGFfaGZfY2xpZW50X3N0X29wZW5bXVtCVEFfSEZfQ0xJRU5UX05VTV9DT0xTXSA9CiB7CiAvKiBFdmVudCAgICAgICAgICAgICAgICAgICAgQWN0aW9uIDEgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAyICAgICAgICAgICAgICAgICAgICAgICBOZXh0IHN0YXRlICovCiAvKiBBUElfUkVHSVNURVJfRVZUICovICAgICAge0JUQV9IRl9DTElFTlRfSUdOT1JFLCAgICAgICAgIEJUQV9IRl9DTElFTlRfSUdOT1JFLCAgICAgICAgICBCVEFfSEZfQ0xJRU5UX09QRU5fU1R9LApAQCAtMTkyLDcgKzE5Miw3IEBACiB9OwogCiAvKiBzdGF0ZSB0YWJsZSBmb3IgY2xvc2luZyBzdGF0ZSAqLwotY29uc3QgVUlOVDggYnRhX2hmX2NsaWVudF9zdF9jbG9zaW5nW11bQlRBX0hGX0NMSUVOVF9OVU1fQ09MU10gPQorY29uc3QgdWludDhfdCBidGFfaGZfY2xpZW50X3N0X2Nsb3NpbmdbXVtCVEFfSEZfQ0xJRU5UX05VTV9DT0xTXSA9CiB7CiAvKiBFdmVudCAgICAgICAgICAgICAgICAgICAgQWN0aW9uIDEgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAyICAgICAgICAgICAgICAgICAgICAgICBOZXh0IHN0YXRlICovCiAvKiBBUElfUkVHSVNURVJfRVZUICovICAgICAge0JUQV9IRl9DTElFTlRfSUdOT1JFLCAgICAgICAgIEJUQV9IRl9DTElFTlRfSUdOT1JFLCAgICAgICAgICBCVEFfSEZfQ0xJRU5UX0NMT1NJTkdfU1R9LApAQCAtMjE1LDcgKzIxNSw3IEBACiB9OwogCiAvKiB0eXBlIGZvciBzdGF0ZSB0YWJsZSAqLwotdHlwZWRlZiBjb25zdCBVSU5UOCAoKnRCVEFfSEZfQ0xJRU5UX1NUX1RCTClbQlRBX0hGX0NMSUVOVF9OVU1fQ09MU107Cit0eXBlZGVmIGNvbnN0IHVpbnQ4X3QgKCp0QlRBX0hGX0NMSUVOVF9TVF9UQkwpW0JUQV9IRl9DTElFTlRfTlVNX0NPTFNdOwogCiAvKiBzdGF0ZSB0YWJsZSAqLwogY29uc3QgdEJUQV9IRl9DTElFTlRfU1RfVEJMIGJ0YV9oZl9jbGllbnRfc3RfdGJsW10gPQpAQCAtMjQxLDcgKzI0MSw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfaGZfY2xpZW50X3NjYl9pbml0KHZvaWQpCiB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwogCiAgICAgYWxhcm1fZnJlZShidGFfaGZfY2xpZW50X2NiLnNjYi5jb2xsaXNpb25fdGltZXIpOwogICAgIGFsYXJtX2ZyZWUoYnRhX2hmX2NsaWVudF9jYi5zY2IuYXRfY2IucmVzcF90aW1lcik7CkBAIC0yNjUsNyArMjY1LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9oZl9jbGllbnRfc2NiX2Rpc2FibGUodm9pZCkKIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7CiAKICAgICBidGFfaGZfY2xpZW50X3NjYl9pbml0KCk7CiAKQEAgLTI4NCw3ICsyODQsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2hmX2NsaWVudF9yZXN1bWVfb3BlbiAodm9pZCkKIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHICgiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIEFQUExfVFJBQ0VfREVCVUcgKCIlcyIsIF9fZnVuY19fKTsKIAogICAgIC8qIHJlc3VtZSBvcGVuaW5nIHByb2Nlc3MuICAqLwogICAgIGlmIChidGFfaGZfY2xpZW50X2NiLnNjYi5zdGF0ZSA9PSBCVEFfSEZfQ0xJRU5UX0lOSVRfU1QpCkBAIC0zMDYsNyArMzA2LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2NvbGxpc2lvbl90aW1lcl9jYmFjayhVTlVTRURfQVRUUiB2b2lkICpkYXRhKQogewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKIAogICAgIC8qIElmIHRoZSBwZWVyIGhhdmVuJ3Qgb3BlbmVkIGNvbm5lY3Rpb24sIHJlc3RhcnQgb3BlbmluZyBwcm9jZXNzICovCiAgICAgYnRhX2hmX2NsaWVudF9yZXN1bWVfb3BlbigpOwpAQCAtMzIyLDggKzMyMiw4IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGZfY2xpZW50X2NvbGxpc2lvbl9jYmFjayAodEJUQV9TWVNfQ09OTl9TVEFUVVMgc3RhdHVzLCBVSU5UOCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpCit2b2lkIGJ0YV9oZl9jbGllbnRfY29sbGlzaW9uX2NiYWNrICh0QlRBX1NZU19DT05OX1NUQVRVUyBzdGF0dXMsIHVpbnQ4X3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpCiB7CiAgICAgVU5VU0VEKHN0YXR1cyk7CiAgICAgVU5VU0VEKGFwcF9pZCk7CkBAIC0zOTAsNyArMzkwLDcgQEAKICAgICBvc2lfcHJvcGVydHlfZ2V0KCJyby5ibHVldG9vdGguaGZwLnZlciIsIHZhbHVlLCAiMCIpOwogICAgIGlmIChzdHJjbXAodmFsdWUsIjEuNiIpID09IDApCiAgICAgewotICAgICAgIGJ0YV9oZl9jbGllbnRfY2IubXNiY19lbmFibGVkID0gVFJVRTsKKyAgICAgICBidGFfaGZfY2xpZW50X2NiLm1zYmNfZW5hYmxlZCA9IHRydWU7CiAgICAgfQogCiAgICAgYnRhX2hmX2NsaWVudF9jYi5zY2IubmVnb3RpYXRlZF9jb2RlYyA9IEJUTV9TQ09fQ09ERUNfQ1ZTRDsKQEAgLTQzNywxMiArNDM3LDEyIEBACiAqKiBEZXNjcmlwdGlvbiAgICAgIERhdGEgSEYgQ2xpZW50IG1haW4gZXZlbnQgaGFuZGxpbmcgZnVuY3Rpb24uCiAqKgogKioKLSoqIFJldHVybnMgICAgICAgICAgQk9PTEVBTgorKiogUmV0dXJucyAgICAgICAgICBib29sCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX2hmX2NsaWVudF9oZGxfZXZlbnQoQlRfSERSICpwX21zZykKK2Jvb2wgYnRhX2hmX2NsaWVudF9oZGxfZXZlbnQoQlRfSERSICpwX21zZykKIHsKLSNpZiBCVEFfSEZfQ0xJRU5UX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hGX0NMSUVOVF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9oZl9jbGllbnRfaGRsX2V2ZW50ICVzICgweCV4KSIsIGJ0YV9oZl9jbGllbnRfZXZ0X3N0cihwX21zZy0+ZXZlbnQpLCBwX21zZy0+ZXZlbnQpOwogI2VuZGlmCiAKQEAgLTQ2Miw3ICs0NjIsNyBAQAogICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc21fZXhlY3V0ZShwX21zZy0+ZXZlbnQsICh0QlRBX0hGX0NMSUVOVF9EQVRBICopIHBfbXNnKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQ3NSwxNSArNDc1LDE1IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGZfY2xpZW50X3NtX2V4ZWN1dGUoVUlOVDE2IGV2ZW50LCB0QlRBX0hGX0NMSUVOVF9EQVRBICpwX2RhdGEpCit2b2lkIGJ0YV9oZl9jbGllbnRfc21fZXhlY3V0ZSh1aW50MTZfdCBldmVudCwgdEJUQV9IRl9DTElFTlRfREFUQSAqcF9kYXRhKQogewogICAgIHRCVEFfSEZfQ0xJRU5UX1NUX1RCTCAgICAgIHN0YXRlX3RhYmxlOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgYWN0aW9uOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBhY3Rpb247CiAgICAgaW50ICAgICAgICAgICAgICAgICBpOwogCi0jaWYgQlRBX0hGX0NMSUVOVF9ERUJVRyA9PSBUUlVFCi0gICAgVUlOVDE2ICBpbl9ldmVudCA9IGV2ZW50OwotICAgIFVJTlQ4IGluX3N0YXRlID0gIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnN0YXRlOworI2lmIChCVEFfSEZfQ0xJRU5UX0RFQlVHID09IFRSVUUpCisgICAgdWludDE2X3QgIGluX2V2ZW50ID0gZXZlbnQ7CisgICAgdWludDhfdCBpbl9zdGF0ZSA9ICBidGFfaGZfY2xpZW50X2NiLnNjYi5zdGF0ZTsKIAogICAgIC8qIElnbm9yZSBkaXNwbGF5aW5nIG9mIEFUIHJlc3VsdHMgd2hlbiBub3QgY29ubmVjdGVkIChJZ25vcmVkIGluIHN0YXRlIG1hY2hpbmUpICovCiAgICAgaWYgKGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnN0YXRlID09IEJUQV9IRl9DTElFTlRfT1BFTl9TVCkKQEAgLTUyMSw3ICs1MjEsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0jaWYgQlRBX0hGX0NMSUVOVF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9IRl9DTElFTlRfREVCVUcgPT0gVFJVRSkKICAgICBpZiAoYnRhX2hmX2NsaWVudF9jYi5zY2Iuc3RhdGUgIT0gaW5fc3RhdGUpCiAgICAgewogICAgICAgICBBUFBMX1RSQUNFX0VWRU5UKCJCVEEgSEYgQ2xpZW50IFN0YXRlIENoYW5nZTogWyVzXSAtPiBbJXNdIGFmdGVyIEV2ZW50IFslc10iLApAQCAtNTM3LDExICs1MzcsMTEgQEAKICAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5hdF9jYi5jdXJyZW50X2NtZCA9IEJUQV9IRl9DTElFTlRfQVRfTk9ORTsKIAogICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9iaWEoKTsKLSAgICBidGFfaGZfY2xpZW50X3NlbmRfYXRfY2N3YShUUlVFKTsKLSAgICBidGFfaGZfY2xpZW50X3NlbmRfYXRfY21lZShUUlVFKTsKLSAgICBidGFfaGZfY2xpZW50X3NlbmRfYXRfY29wcyhGQUxTRSk7Ci0gICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2J0cmgoVFJVRSwgMCk7Ci0gICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NsaXAoVFJVRSk7CisgICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2Njd2EodHJ1ZSk7CisgICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NtZWUodHJ1ZSk7CisgICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NvcHMoZmFsc2UpOworICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9idHJoKHRydWUsIDApOworICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jbGlwKHRydWUpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNTU0LDcgKzU1NCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGZfY2xpZW50X3NsY19zZXEoQk9PTEVBTiBlcnJvcikKK3ZvaWQgYnRhX2hmX2NsaWVudF9zbGNfc2VxKGJvb2wgZXJyb3IpCiB7CiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hmX2NsaWVudF9zbGNfc2VxIGNtZDogJXUiLCBidGFfaGZfY2xpZW50X2NiLnNjYi5hdF9jYi5jdXJyZW50X2NtZCk7CiAKQEAgLTU4NCwxOSArNTg0LDE5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jaW5kKEZBTFNFKTsKKyAgICAgICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NpbmQoZmFsc2UpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9BVF9CQUM6Ci0gICAgICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jaW5kKEZBTFNFKTsKKyAgICAgICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NpbmQoZmFsc2UpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9BVF9DSU5EOgotICAgICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXRfY2luZChUUlVFKTsKKyAgICAgICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NpbmQodHJ1ZSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0FUX0NJTkRfU1RBVFVTOgotICAgICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXRfY21lcihUUlVFKTsKKyAgICAgICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NtZXIodHJ1ZSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0FUX0NNRVI6CkBAIC02MjcsMTMgKzYyNywxMyBAQAogICAgIH0KIH0KIAotI2lmIEJUQV9IRl9DTElFTlRfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSEZfQ0xJRU5UX0RFQlVHID09IFRSVUUpCiAKICNpZm5kZWYgQ0FTRV9SRVRVUk5fU1RSCiAjZGVmaW5lIENBU0VfUkVUVVJOX1NUUihjb25zdCkgY2FzZSBjb25zdDogcmV0dXJuICNjb25zdDsKICNlbmRpZgogCi1zdGF0aWMgY2hhciAqYnRhX2hmX2NsaWVudF9ldnRfc3RyKFVJTlQxNiBldmVudCkKK3N0YXRpYyBjaGFyICpidGFfaGZfY2xpZW50X2V2dF9zdHIodWludDE2X3QgZXZlbnQpCiB7CiAgICAgc3dpdGNoIChldmVudCkKICAgICB7CkBAIC02NjEsNyArNjYxLDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBjaGFyICpidGFfaGZfY2xpZW50X3N0YXRlX3N0cihVSU5UOCBzdGF0ZSkKK3N0YXRpYyBjaGFyICpidGFfaGZfY2xpZW50X3N0YXRlX3N0cih1aW50OF90IHN0YXRlKQogewogICAgIHN3aXRjaCAoc3RhdGUpCiAgICAgewpkaWZmIC0tZ2l0IGEvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X3JmYy5jIGIvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X3JmYy5jCmluZGV4IGRjNDIyYWUuLjA4NTQ2YTcgMTAwNjQ0Ci0tLSBhL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9yZmMuYworKysgYi9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfcmZjLmMKQEAgLTQwLDcgKzQwLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X3BvcnRfY2JhY2soVUlOVDMyIGNvZGUsIFVJTlQxNiBwb3J0X2hhbmRsZSkKK3N0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfcG9ydF9jYmFjayh1aW50MzJfdCBjb2RlLCB1aW50MTZfdCBwb3J0X2hhbmRsZSkKIHsKICAgICBVTlVTRUQoY29kZSk7CiAKQEAgLTY4LDkgKzY4LDkgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X21nbXRfY2JhY2soVUlOVDMyIGNvZGUsIFVJTlQxNiBwb3J0X2hhbmRsZSkKK3N0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfbWdtdF9jYmFjayh1aW50MzJfdCBjb2RlLCB1aW50MTZfdCBwb3J0X2hhbmRsZSkKIHsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBldmVudDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIGV2ZW50OwogCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hmX2NsaWVudF9tZ210X2NiYWNrIDogY29kZSA9ICVkLCBwb3J0X2hhbmRsZSA9ICVkLCBjb25uX2hhbmRsZSA9ICVkLCBzZXJ2X2hhbmRsZSA9ICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsIHBvcnRfaGFuZGxlLCBidGFfaGZfY2xpZW50X2NiLnNjYi5jb25uX2hhbmRsZSwgYnRhX2hmX2NsaWVudF9jYi5zY2Iuc2Vydl9oYW5kbGUpOwpAQCAtMTIzLDcgKzEyMyw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGZfY2xpZW50X3NldHVwX3BvcnQoVUlOVDE2IGhhbmRsZSkKK3ZvaWQgYnRhX2hmX2NsaWVudF9zZXR1cF9wb3J0KHVpbnQxNl90IGhhbmRsZSkKIHsKICAgICBQT1JUX1NldEV2ZW50TWFzayhoYW5kbGUsIFBPUlRfRVZfUlhDSEFSKTsKICAgICBQT1JUX1NldEV2ZW50Q2FsbGJhY2soaGFuZGxlLCBidGFfaGZfY2xpZW50X3BvcnRfY2JhY2spOwpAQCAtMTQ1LDE1ICsxNDUsMTUgQEAKIAogICAgIGlmIChidGFfaGZfY2xpZW50X2NiLnNjYi5zZXJ2X2hhbmRsZSA+IDApCiAgICAgewotICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBhbHJlYWR5IHN0YXJ0ZWQsIGhhbmRsZTogJWQiLCBfX0ZVTkNUSU9OX18sIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnNlcnZfaGFuZGxlKTsKKyAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgYWxyZWFkeSBzdGFydGVkLCBoYW5kbGU6ICVkIiwgX19mdW5jX18sIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnNlcnZfaGFuZGxlKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIEJUTV9TZXRTZWN1cml0eUxldmVsKEZBTFNFLCAiIiwgQlRNX1NFQ19TRVJWSUNFX0hGX0hBTkRTRlJFRSwgYnRhX2hmX2NsaWVudF9jYi5zY2Iuc2Vydl9zZWNfbWFzaywKKyAgICBCVE1fU2V0U2VjdXJpdHlMZXZlbChmYWxzZSwgIiIsIEJUTV9TRUNfU0VSVklDRV9IRl9IQU5EU0ZSRUUsIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnNlcnZfc2VjX21hc2ssCiAgICAgICAgIEJUX1BTTV9SRkNPTU0sIEJUTV9TRUNfUFJPVE9fUkZDT01NLCBidGFfaGZfY2xpZW50X2NiLnNjbik7CiAKICAgICBwb3J0X3N0YXR1cyA9ICBSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbihVVUlEX1NFUlZDTEFTU19IRl9IQU5EU0ZSRUUsIGJ0YV9oZl9jbGllbnRfY2Iuc2NuLAotICAgICAgICBUUlVFLCBCVEFfSEZfQ0xJRU5UX01UVSwgKFVJTlQ4ICopIGJkX2FkZHJfYW55LCAmKGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnNlcnZfaGFuZGxlKSwKKyAgICAgICAgdHJ1ZSwgQlRBX0hGX0NMSUVOVF9NVFUsICh1aW50OF90ICopIGJkX2FkZHJfYW55LCAmKGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnNlcnZfaGFuZGxlKSwKICAgICAgICAgYnRhX2hmX2NsaWVudF9tZ210X2NiYWNrKTsKIAogICAgIGlmIChwb3J0X3N0YXR1cyAgPT0gUE9SVF9TVUNDRVNTKQpAQCAtMTgxLDExICsxODEsMTEgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9oZl9jbGllbnRfY2xvc2Vfc2VydmVyKHZvaWQpCiB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgJWQiLCBfX0ZVTkNUSU9OX18sIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnNlcnZfaGFuZGxlKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAlZCIsIF9fZnVuY19fLCBidGFfaGZfY2xpZW50X2NiLnNjYi5zZXJ2X2hhbmRsZSk7CiAKICAgICBpZiAoYnRhX2hmX2NsaWVudF9jYi5zY2Iuc2Vydl9oYW5kbGUgPT0gMCkKICAgICB7Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIGFscmVhZHkgc3RvcHBlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIGFscmVhZHkgc3RvcHBlZCIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMjA1LDEyICsyMDUsMTIgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9oZl9jbGllbnRfcmZjX2RvX29wZW4odEJUQV9IRl9DTElFTlRfREFUQSAqcF9kYXRhKQogewotICAgIEJUTV9TZXRTZWN1cml0eUxldmVsKFRSVUUsICIiLCBCVE1fU0VDX1NFUlZJQ0VfSEZfSEFORFNGUkVFLAorICAgIEJUTV9TZXRTZWN1cml0eUxldmVsKHRydWUsICIiLCBCVE1fU0VDX1NFUlZJQ0VfSEZfSEFORFNGUkVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLmNsaV9zZWNfbWFzaywgQlRfUFNNX1JGQ09NTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVE1fU0VDX1BST1RPX1JGQ09NTSwgYnRhX2hmX2NsaWVudF9jYi5zY2IucGVlcl9zY24pOwogCiAgICAgaWYgKFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uKFVVSURfU0VSVkNMQVNTX0hGX0hBTkRTRlJFRSwgYnRhX2hmX2NsaWVudF9jYi5zY2IucGVlcl9zY24sCi0gICAgICAgICAgICBGQUxTRSwgQlRBX0hGX0NMSUVOVF9NVFUsIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnBlZXJfYWRkciwgJihidGFfaGZfY2xpZW50X2NiLnNjYi5jb25uX2hhbmRsZSksCisgICAgICAgICAgICBmYWxzZSwgQlRBX0hGX0NMSUVOVF9NVFUsIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnBlZXJfYWRkciwgJihidGFfaGZfY2xpZW50X2NiLnNjYi5jb25uX2hhbmRsZSksCiAgICAgICAgICAgICBidGFfaGZfY2xpZW50X21nbXRfY2JhY2spID09IFBPUlRfU1VDQ0VTUykKICAgICB7CiAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2V0dXBfcG9ydChidGFfaGZfY2xpZW50X2NiLnNjYi5jb25uX2hhbmRsZSk7CmRpZmYgLS1naXQgYS9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfc2NvLmMgYi9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfc2NvLmMKaW5kZXggMWJlODJhNS4uMTRjOTIwMSAxMDA2NDQKLS0tIGEvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X3Njby5jCisrKyBiL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9zY28uYwpAQCAtODMsMjcgKzgzLDI3IEBACiAqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZl9jbGllbnRfcmVtb3ZlX3NjbwogKioKICoqIERlc2NyaXB0aW9uICAgICAgUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIFNDTyBmcm9tIHRoZSBzeXN0ZW0uCi0qKiAgICAgICAgICAgICAgICAgIElmIG9ubHlfYWN0aXZlIGlzIFRSVUUsIHRoZW4gU0NPIGlzIG9ubHkgcmVtb3ZlZCBpZiBjb25uZWN0ZWQKKyoqICAgICAgICAgICAgICAgICAgSWYgb25seV9hY3RpdmUgaXMgdHJ1ZSwgdGhlbiBTQ08gaXMgb25seSByZW1vdmVkIGlmIGNvbm5lY3RlZAogKioKLSoqIFJldHVybnMgICAgICAgICAgQk9PTEVBTiAgIC0gVFJVRSBpZiBTY28gcmVtb3ZhbCB3YXMgc3RhcnRlZAorKiogUmV0dXJucyAgICAgICAgICBib29sICAgLSB0cnVlIGlmIFNjbyByZW1vdmFsIHdhcyBzdGFydGVkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBCT09MRUFOIGJ0YV9oZl9jbGllbnRfc2NvX3JlbW92ZShCT09MRUFOIG9ubHlfYWN0aXZlKQorc3RhdGljIGJvb2wgYnRhX2hmX2NsaWVudF9zY29fcmVtb3ZlKGJvb2wgb25seV9hY3RpdmUpCiB7Ci0gICAgQk9PTEVBTiAgICAgcmVtb3ZlZF9zdGFydGVkID0gRkFMU0U7CisgICAgYm9vbCAgICAgcmVtb3ZlZF9zdGFydGVkID0gZmFsc2U7CiAgICAgdEJUTV9TVEFUVVMgc3RhdHVzOwogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgJWQiLCBfX0ZVTkNUSU9OX18sIG9ubHlfYWN0aXZlKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAlZCIsIF9fZnVuY19fLCBvbmx5X2FjdGl2ZSk7CiAKICAgICBpZiAoYnRhX2hmX2NsaWVudF9jYi5zY2Iuc2NvX2lkeCAhPSBCVE1fSU5WQUxJRF9TQ09fSU5ERVgpCiAgICAgewogICAgICAgICBzdGF0dXMgPSBCVE1fUmVtb3ZlU2NvKGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnNjb19pZHgpOwogCi0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIGlkeCAweCUwNHgsIHN0YXR1czoweCV4IiwgX19GVU5DVElPTl9fLCBidGFfaGZfY2xpZW50X2NiLnNjYi5zY29faWR4LCBzdGF0dXMpOworICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBpZHggMHglMDR4LCBzdGF0dXM6MHgleCIsIF9fZnVuY19fLCBidGFfaGZfY2xpZW50X2NiLnNjYi5zY29faWR4LCBzdGF0dXMpOwogCiAgICAgICAgIGlmIChzdGF0dXMgPT0gQlRNX0NNRF9TVEFSVEVEKQogICAgICAgICB7Ci0gICAgICAgICAgICByZW1vdmVkX3N0YXJ0ZWQgPSBUUlVFOworICAgICAgICAgICAgcmVtb3ZlZF9zdGFydGVkID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICAvKiBJZiBubyBjb25uZWN0aW9uIHJlc2V0IHRoZSBzY28gaGFuZGxlICovCiAgICAgICAgIGVsc2UgaWYgKCAoc3RhdHVzID09IEJUTV9TVUNDRVNTKSB8fCAoc3RhdHVzID09IEJUTV9VTktOT1dOX0FERFIpICkKQEAgLTEyNCw3ICsxMjQsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hmX2NsaWVudF9jYmFja19zY28oVUlOVDggZXZlbnQpCit2b2lkIGJ0YV9oZl9jbGllbnRfY2JhY2tfc2NvKHVpbnQ4X3QgZXZlbnQpCiB7CiAgICAgdEJUQV9IRl9DTElFTlQgICAgZXZ0OwogCkBAIC0xNDcsOSArMTQ3LDkgQEAKIHN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfc2NvX2Nvbm5fcnNwKHRCVE1fRVNDT19DT05OX1JFUV9FVlRfREFUQSAqcF9kYXRhKQogewogICAgIHRCVE1fRVNDT19QQVJBTVMgICAgcmVzcDsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGhjaV9zdGF0dXMgPSBIQ0lfU1VDQ0VTUzsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgaGNpX3N0YXR1cyA9IEhDSV9TVUNDRVNTOwogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwogCiAgICAgaWYgKGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnNjb19zdGF0ZSA9PSBCVEFfSEZfQ0xJRU5UX1NDT19MSVNURU5fU1QpCiAgICAgewpAQCAtMTg1LDcgKzE4NSw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9lc2NvX2Nvbm5yZXFfY2JhY2sodEJUTV9FU0NPX0VWVCBldmVudCwgdEJUTV9FU0NPX0VWVF9EQVRBICpwX2RhdGEpCiB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgJWQiLCBfX0ZVTkNUSU9OX18sIGV2ZW50KTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAlZCIsIF9fZnVuY19fLCBldmVudCk7CiAKICAgICBpZiAoZXZlbnQgIT0gQlRNX0VTQ09fQ09OTl9SRVFfRVZUKQogICAgIHsKQEAgLTIxMiwxMSArMjEyLDExIEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9zY29fY29ubl9jYmFjayhVSU5UMTYgc2NvX2lkeCkKK3N0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfc2NvX2Nvbm5fY2JhY2sodWludDE2X3Qgc2NvX2lkeCkKIHsKLSAgICBVSU5UOCAqcmVtX2JkOworICAgIHVpbnQ4X3QgKnJlbV9iZDsKIAotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzICVkIiwgX19GVU5DVElPTl9fLCBzY29faWR4KTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAlZCIsIF9fZnVuY19fLCBzY29faWR4KTsKIAogICAgIHJlbV9iZCA9IEJUTV9SZWFkU2NvQmRBZGRyKHNjb19pZHgpOwogCkBAIC0yNDYsNyArMjQ2LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X3Njb19kaXNjX2NiYWNrKFVJTlQxNiBzY29faWR4KQorc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9zY29fZGlzY19jYmFjayh1aW50MTZfdCBzY29faWR4KQogewogICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzICVkIiwgX19mdW5jX18sIHNjb19pZHgpOwogCkBAIC0yNjgsMTggKzI2OCwxOCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfc2NvX2NyZWF0ZShCT09MRUFOIGlzX29yaWcpCitzdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X3Njb19jcmVhdGUoYm9vbCBpc19vcmlnKQogewogICAgIHRCVE1fU1RBVFVTICAgICAgIHN0YXR1czsKLSAgICBVSU5UOCAgICAgICAgICAgICpwX2JkX2FkZHIgPSBOVUxMOworICAgIHVpbnQ4X3QgICAgICAgICAgICAqcF9iZF9hZGRyID0gTlVMTDsKICAgICB0QlRNX0VTQ09fUEFSQU1TIHBhcmFtczsKIAotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzICVkIiwgX19GVU5DVElPTl9fLCBpc19vcmlnKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAlZCIsIF9fZnVuY19fLCBpc19vcmlnKTsKIAogICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHNjbyBoYW5kbGUgaXMgbm90IGFscmVhZHkgaW4gdXNlICovCiAgICAgaWYgKGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnNjb19pZHggIT0gQlRNX0lOVkFMSURfU0NPX0lOREVYKQogICAgIHsKLSAgICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogSW5kZXggMHglMDR4IGFscmVhZHkgaW4gdXNlIiwgX19GVU5DVElPTl9fLAorICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBJbmRleCAweCUwNHggYWxyZWFkeSBpbiB1c2UiLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5zY29faWR4KTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTI5NywxNSArMjk3LDE1IEBACiAgICAgICAgICAgICBpZigocGFyYW1zLnBhY2tldF90eXBlcyAmIEJUTV9FU0NPX0xJTktfT05MWV9NQVNLKQogICAgICAgICAgICAgICAgfHwhKChwYXJhbXMucGFja2V0X3R5cGVzICYgfihCVE1fRVNDT19MSU5LX09OTFlfTUFTSyB8IEJUTV9TQ09fTElOS19PTkxZX01BU0spKSBeIEJUQV9IRl9DTElFTlRfTk9fRURSX0VTQ08pKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnJldHJ5X3dpdGhfc2NvX29ubHkgPSBUUlVFOwotICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfQVBJKCJTZXR0aW5nIHJldHJ5X3dpdGhfc2NvX29ubHkgdG8gVFJVRSIpOworICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnJldHJ5X3dpdGhfc2NvX29ubHkgPSB0cnVlOworICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfQVBJKCJTZXR0aW5nIHJldHJ5X3dpdGhfc2NvX29ubHkgdG8gdHJ1ZSIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICAgaWYoYnRhX2hmX2NsaWVudF9jYi5zY2IucmV0cnlfd2l0aF9zY29fb25seSkKICAgICAgICAgICAgICAgICBBUFBMX1RSQUNFX0FQSSgicmV0cnlpbmcgd2l0aCBTQ08gb25seSIpOwotICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9jYi5zY2IucmV0cnlfd2l0aF9zY29fb25seSA9IEZBTFNFOworICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9jYi5zY2IucmV0cnlfd2l0aF9zY29fb25seSA9IGZhbHNlOwogCiAgICAgICAgICAgICBCVE1fU2V0RVNjb01vZGUoQlRNX0xJTktfVFlQRV9TQ08sICZwYXJhbXMpOwogICAgICAgICB9CkBAIC0zMTUsNyArMzE1LDcgQEAKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgYnRhX2hmX2NsaWVudF9jYi5zY2IucmV0cnlfd2l0aF9zY29fb25seSA9IEZBTFNFOworICAgICAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5yZXRyeV93aXRoX3Njb19vbmx5ID0gZmFsc2U7CiAgICAgfQogCiAgICAgcF9iZF9hZGRyID0gYnRhX2hmX2NsaWVudF9jYi5zY2IucGVlcl9hZGRyOwpAQCAtMzI2LDExICszMjYsMTEgQEAKICAgICBpZiAoc3RhdHVzID09IEJUTV9DTURfU1RBUlRFRCAmJiAhaXNfb3JpZykKICAgICB7CiAgICAgICAgIGlmKCFCVE1fUmVnRm9yRVNjb0V2dHMoYnRhX2hmX2NsaWVudF9jYi5zY2Iuc2NvX2lkeCwgYnRhX2hmX2NsaWVudF9lc2NvX2Nvbm5yZXFfY2JhY2spKQotICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgU0NPIHJlZ2lzdHJhdGlvbiBzdWNjZXNzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIFNDTyByZWdpc3RyYXRpb24gc3VjY2VzcyIsIF9fZnVuY19fKTsKICAgICB9CiAKICAgICBBUFBMX1RSQUNFX0FQSSgiJXM6IG9yaWcgJWQsIGlueCAweCUwNHgsIHN0YXR1cyAweCV4LCBwa3QgdHlwZXMgMHglMDR4IiwKLSAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlzX29yaWcsIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnNjb19pZHgsCisgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGlzX29yaWcsIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnNjb19pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBwYXJhbXMucGFja2V0X3R5cGVzKTsKIH0KIApAQCAtMzQ1LDkgKzM0NSw5IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9zY29fZXZlbnQoVUlOVDggZXZlbnQpCitzdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X3Njb19ldmVudCh1aW50OF90IGV2ZW50KQogewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIHN0YXRlOiAlZCBldmVudDogJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgc3RhdGU6ICVkIGV2ZW50OiAlZCIsIF9fZnVuY19fLAogICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9jYi5zY2Iuc2NvX3N0YXRlLCBldmVudCk7CiAKICAgICBzd2l0Y2ggKGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnNjb19zdGF0ZSkKQEAgLTM1Nyw3ICszNTcsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9TQ09fTElTVEVOX0U6CiAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBzY28gbGlzdGVuIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9zY29fY3JlYXRlKEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9zY29fY3JlYXRlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9jYi5zY2Iuc2NvX3N0YXRlID0gQlRBX0hGX0NMSUVOVF9TQ09fTElTVEVOX1NUOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtMzcyLDIxICszNzIsMjEgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBjYXNlIEJUQV9IRl9DTElFTlRfU0NPX0xJU1RFTl9FOgogICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgc2NvIGxpc3RlbiBjb25uZWN0aW9uIChBZGRpdGlvbmFsIGNoYW5uZWwpICovCi0gICAgICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2NvX2NyZWF0ZShGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2NvX2NyZWF0ZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgY2FzZSBCVEFfSEZfQ0xJRU5UX1NDT19PUEVOX0U6CiAgICAgICAgICAgICAgICAgICAgIC8qIHJlbW92ZSBsaXN0ZW5pbmcgY29ubmVjdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X3Njb19yZW1vdmUoRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X3Njb19yZW1vdmUoZmFsc2UpOwogCiAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBzY28gY29ubmVjdGlvbiB0byBwZWVyICovCi0gICAgICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2NvX2NyZWF0ZShUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9zY29fY3JlYXRlKHRydWUpOwogICAgICAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5zY29fc3RhdGUgPSBCVEFfSEZfQ0xJRU5UX1NDT19PUEVOSU5HX1NUOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9TQ09fU0hVVERPV05fRToKICAgICAgICAgICAgICAgICAgICAgLyogcmVtb3ZlIGxpc3RlbmluZyBjb25uZWN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2NvX3JlbW92ZShGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2NvX3JlbW92ZShmYWxzZSk7CiAKICAgICAgICAgICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9jYi5zY2Iuc2NvX3N0YXRlID0gQlRBX0hGX0NMSUVOVF9TQ09fU0hVVERPV05fU1Q7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzk5LDcgKzM5OSw3IEBACiAKICAgICAgICAgICAgICAgICBjYXNlIEJUQV9IRl9DTElFTlRfU0NPX0NPTk5fQ0xPU0VfRToKICAgICAgICAgICAgICAgICAgICAgLyogc2NvIGZhaWxlZDsgY3JlYXRlIHNjbyBsaXN0ZW4gY29ubmVjdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X3Njb19jcmVhdGUoRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X3Njb19jcmVhdGUoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5zY29fc3RhdGUgPSBCVEFfSEZfQ0xJRU5UX1NDT19MSVNURU5fU1Q7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC00MjYsNyArNDI2LDcgQEAKIAogICAgICAgICAgICAgICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9TQ09fQ09OTl9DTE9TRV9FOgogICAgICAgICAgICAgICAgICAgICAvKiBzY28gZmFpbGVkOyBjcmVhdGUgc2NvIGxpc3RlbiBjb25uZWN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2NvX2NyZWF0ZShGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2NvX2NyZWF0ZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnNjb19zdGF0ZSA9IEJUQV9IRl9DTElFTlRfU0NPX0xJU1RFTl9TVDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTQ0OSw3ICs0NDksNyBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBCVEFfSEZfQ0xJRU5UX1NDT19DT05OX09QRU5fRToKICAgICAgICAgICAgICAgICAgICAgLyogY2xvc2Ugc2NvIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9zY29fcmVtb3ZlKFRSVUUpOworICAgICAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X3Njb19yZW1vdmUodHJ1ZSk7CiAKICAgICAgICAgICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9jYi5zY2Iuc2NvX3N0YXRlID0gQlRBX0hGX0NMSUVOVF9TQ09fQ0xPU0lOR19TVDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC00NzEsNyArNDcxLDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBjYXNlIEJUQV9IRl9DTElFTlRfU0NPX0NMT1NFX0U6CiAgICAgICAgICAgICAgICAgICAgIC8qIGNsb3NlIHNjbyBjb25uZWN0aW9uIGlmIGFjdGl2ZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoYnRhX2hmX2NsaWVudF9zY29fcmVtb3ZlKFRSVUUpKQorICAgICAgICAgICAgICAgICAgICBpZiAoYnRhX2hmX2NsaWVudF9zY29fcmVtb3ZlKHRydWUpKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5zY29fc3RhdGUgPSBCVEFfSEZfQ0xJRU5UX1NDT19DTE9TSU5HX1NUOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC00NzksMTQgKzQ3OSwxNCBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBCVEFfSEZfQ0xJRU5UX1NDT19TSFVURE9XTl9FOgogICAgICAgICAgICAgICAgICAgICAvKiByZW1vdmUgYWxsIGxpc3RlbmluZyBjb25uZWN0aW9ucyAqLwotICAgICAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X3Njb19yZW1vdmUoRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X3Njb19yZW1vdmUoZmFsc2UpOwogCiAgICAgICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnNjb19zdGF0ZSA9IEJUQV9IRl9DTElFTlRfU0NPX1NIVVRUSU5HX1NUOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9TQ09fQ09OTl9DTE9TRV9FOgogICAgICAgICAgICAgICAgICAgICAvKiBwZWVyIGNsb3NlZCBzY287IGNyZWF0ZSBzY28gbGlzdGVuIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9zY29fY3JlYXRlKEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9zY29fY3JlYXRlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9jYi5zY2Iuc2NvX3N0YXRlID0gQlRBX0hGX0NMSUVOVF9TQ09fTElTVEVOX1NUOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtNTA5LDcgKzUwOSw3IEBACiAKICAgICAgICAgICAgICAgICBjYXNlIEJUQV9IRl9DTElFTlRfU0NPX0NPTk5fQ0xPU0VfRToKICAgICAgICAgICAgICAgICAgICAgLyogcGVlciBjbG9zZWQgc2NvOyBjcmVhdGUgc2NvIGxpc3RlbiBjb25uZWN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2NvX2NyZWF0ZShGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2NvX2NyZWF0ZShmYWxzZSk7CiAKICAgICAgICAgICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9jYi5zY2Iuc2NvX3N0YXRlID0gQlRBX0hGX0NMSUVOVF9TQ09fTElTVEVOX1NUOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTUzMyw3ICs1MzMsNyBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBCVEFfSEZfQ0xJRU5UX1NDT19DT05OX0NMT1NFX0U6CiAgICAgICAgICAgICAgICAgICAgIC8qIG9wZW4gc2NvIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9zY29fY3JlYXRlKFRSVUUpOworICAgICAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X3Njb19jcmVhdGUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnNjb19zdGF0ZSA9IEJUQV9IRl9DTElFTlRfU0NPX09QRU5JTkdfU1Q7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC01NDgsNyArNTQ4LDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBjYXNlIEJUQV9IRl9DTElFTlRfU0NPX0NPTk5fT1BFTl9FOgogICAgICAgICAgICAgICAgICAgICAvKiBjbG9zZSBzY28gY29ubmVjdGlvbjsgd2FpdCBmb3IgY29ubiBjbG9zZSBldmVudCAqLwotICAgICAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X3Njb19yZW1vdmUoVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2NvX3JlbW92ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICBjYXNlIEJUQV9IRl9DTElFTlRfU0NPX0NPTk5fQ0xPU0VfRToKQEAgLTU4NCw3ICs1ODQsNyBAQAogewogICAgIFVOVVNFRChwX2RhdGEpOwogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwogCiAgICAgYnRhX2hmX2NsaWVudF9zY29fZXZlbnQoQlRBX0hGX0NMSUVOVF9TQ09fTElTVEVOX0UpOwogfQpAQCAtNjAzLDcgKzYwMyw3IEBACiB7CiAgICAgVU5VU0VEKHBfZGF0YSk7CiAKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7CiAKICAgICBidGFfaGZfY2xpZW50X3Njb19ldmVudChCVEFfSEZfQ0xJRU5UX1NDT19TSFVURE9XTl9FKTsKIH0KQEAgLTYyMiw3ICs2MjIsNyBAQAogewogICAgIFVOVVNFRChwX2RhdGEpOwogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwogCiAgICAgYnRhX2hmX2NsaWVudF9zY29fZXZlbnQoQlRBX0hGX0NMSUVOVF9TQ09fQ09OTl9PUEVOX0UpOwogCkBAIC02MzcsNyArNjM3LDcgQEAKICAgICAgICAgYnRhX2hmX2NsaWVudF9jYmFja19zY28oQlRBX0hGX0NMSUVOVF9BVURJT19PUEVOX0VWVCk7CiAgICAgfQogCi0gICAgYnRhX2hmX2NsaWVudF9jYi5zY2IucmV0cnlfd2l0aF9zY29fb25seSA9IEZBTFNFOworICAgIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnJldHJ5X3dpdGhfc2NvX29ubHkgPSBmYWxzZTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTY1Miw3ICs2NTIsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2hmX2NsaWVudF9zY29fY29ubl9jbG9zZSh0QlRBX0hGX0NMSUVOVF9EQVRBICpwX2RhdGEpCiB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwogCiAgICAgLyogY2xlYXIgY3VycmVudCBzY2IgKi8KICAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5zY29faWR4ID0gQlRNX0lOVkFMSURfU0NPX0lOREVYOwpAQCAtNjYxLDcgKzY2MSw3IEBACiAgICAgKiogYW5kIEhGQ2xpZW50IGlzIGZpcnN0IHRyeWluZyB0byBlc3RhYmxpc2ggYW4gZVNDTyBjb25uZWN0aW9uICovCiAgICAgaWYgKGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnJldHJ5X3dpdGhfc2NvX29ubHkgJiYgYnRhX2hmX2NsaWVudF9jYi5zY2Iuc3ZjX2Nvbm4pCiAgICAgewotICAgICAgICBidGFfaGZfY2xpZW50X3Njb19jcmVhdGUoVFJVRSk7CisgICAgICAgIGJ0YV9oZl9jbGllbnRfc2NvX2NyZWF0ZSh0cnVlKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKQEAgLTY3NCwxMyArNjc0LDEzIEBACiAgICAgICAgIC8qIGNhbGwgYXBwIGNhbGxiYWNrICovCiAgICAgICAgIGJ0YV9oZl9jbGllbnRfY2JhY2tfc2NvKEJUQV9IRl9DTElFTlRfQVVESU9fQ0xPU0VfRVZUKTsKIAotICAgICAgICBpZiAoYnRhX2hmX2NsaWVudF9jYi5zY2Iuc2NvX2Nsb3NlX3JmYyA9PSBUUlVFKQorICAgICAgICBpZiAoYnRhX2hmX2NsaWVudF9jYi5zY2Iuc2NvX2Nsb3NlX3JmYyA9PSB0cnVlKQogICAgICAgICB7Ci0gICAgICAgICAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5zY29fY2xvc2VfcmZjID0gRkFMU0U7CisgICAgICAgICAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5zY29fY2xvc2VfcmZjID0gZmFsc2U7CiAgICAgICAgICAgICBidGFfaGZfY2xpZW50X3JmY19kb19jbG9zZShwX2RhdGEpOwogICAgICAgICB9CiAgICAgfQotICAgIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnJldHJ5X3dpdGhfc2NvX29ubHkgPSBGQUxTRTsKKyAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5yZXRyeV93aXRoX3Njb19vbmx5ID0gZmFsc2U7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC02OTcsNyArNjk3LDcgQEAKIHsKICAgICBVTlVTRUQocF9kYXRhKTsKIAotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKIAogICAgIGJ0YV9oZl9jbGllbnRfc2NvX2V2ZW50KEJUQV9IRl9DTElFTlRfU0NPX09QRU5fRSk7CiB9CkBAIC03MTYsNyArNzE2LDcgQEAKIHsKICAgICBVTlVTRUQocF9kYXRhKTsKIAotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzICAweCV4IiwgX19GVU5DVElPTl9fLCBidGFfaGZfY2xpZW50X2NiLnNjYi5zY29faWR4KTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAgMHgleCIsIF9fZnVuY19fLCBidGFfaGZfY2xpZW50X2NiLnNjYi5zY29faWR4KTsKIAogICAgIGlmIChidGFfaGZfY2xpZW50X2NiLnNjYi5zY29faWR4ICE9IEJUTV9JTlZBTElEX1NDT19JTkRFWCkKICAgICB7CmRpZmYgLS1naXQgYS9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfc2RwLmMgYi9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfc2RwLmMKaW5kZXggODIyZmU5Ny4uMWNkOTIzNCAxMDA2NDQKLS0tIGEvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X3NkcC5jCisrKyBiL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9zZHAuYwpAQCAtNDcsOSArNDcsOSBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfc2RwX2NiYWNrKFVJTlQxNiBzdGF0dXMpCitzdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X3NkcF9jYmFjayh1aW50MTZfdCBzdGF0dXMpCiB7Ci0gICAgVUlOVDE2IGV2ZW50OworICAgIHVpbnQxNl90IGV2ZW50OwogICAgIHRCVEFfSEZfQ0xJRU5UX0RJU0NfUkVTVUxUICpwX2J1ZiA9CiAgICAgICAgICh0QlRBX0hGX0NMSUVOVF9ESVNDX1JFU1VMVCAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfSEZfQ0xJRU5UX0RJU0NfUkVTVUxUKSk7CiAKQEAgLTc2LDIxICs3NiwyMSBAQAogKiogICAgICAgICAgICAgICAgICBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gdGhlIGFwcGxpY2F0aW9uIG11c3QgY2FsbAogKiogICAgICAgICAgICAgICAgICBTRFBfQ3JlYXRlUmVjb3JkKCkgdG8gY3JlYXRlIGFuIFNEUCByZWNvcmQuCiAqKgotKiogUmV0dXJucyAgICAgICAgICBUUlVFIGlmIGZ1bmN0aW9uIGV4ZWN1dGlvbiBzdWNjZWVkZWQsCi0qKiAgICAgICAgICAgICAgICAgIEZBTFNFIGlmIGZ1bmN0aW9uIGV4ZWN1dGlvbiBmYWlsZWQuCisqKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgZnVuY3Rpb24gZXhlY3V0aW9uIHN1Y2NlZWRlZCwKKyoqICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgZnVuY3Rpb24gZXhlY3V0aW9uIGZhaWxlZC4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9oZl9jbGllbnRfYWRkX3JlY29yZChjaGFyICpwX3NlcnZpY2VfbmFtZSwgVUlOVDggc2NuLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hGX0NMSUVOVF9GRUFUIGZlYXR1cmVzLCBVSU5UMzIgc2RwX2hhbmRsZSkKK2Jvb2wgYnRhX2hmX2NsaWVudF9hZGRfcmVjb3JkKGNoYXIgKnBfc2VydmljZV9uYW1lLCB1aW50OF90IHNjbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9IRl9DTElFTlRfRkVBVCBmZWF0dXJlcywgdWludDMyX3Qgc2RwX2hhbmRsZSkKIHsKICAgICB0U0RQX1BST1RPQ09MX0VMRU0gIHByb3RvX2VsZW1fbGlzdFtCVEFfSEZfQ0xJRU5UX05VTV9QUk9UT19FTEVNU107Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBzdmNfY2xhc3NfaWRfbGlzdFtCVEFfSEZfQ0xJRU5UX05VTV9TVkNfRUxFTVNdOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgYnJvd3NlX2xpc3RbXSA9IHtVVUlEX1NFUlZDTEFTU19QVUJMSUNfQlJPV1NFX0dST1VQfTsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIHZlcnNpb247Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBwcm9maWxlX3V1aWQ7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICByZXN1bHQgPSBUUlVFOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgYnVmWzJdOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgc2RwX2ZlYXR1cmVzID0gMDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgc3ZjX2NsYXNzX2lkX2xpc3RbQlRBX0hGX0NMSUVOVF9OVU1fU1ZDX0VMRU1TXTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgYnJvd3NlX2xpc3RbXSA9IHtVVUlEX1NFUlZDTEFTU19QVUJMSUNfQlJPV1NFX0dST1VQfTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgdmVyc2lvbjsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgcHJvZmlsZV91dWlkOworICAgIGJvb2wgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgYnVmWzJdOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBzZHBfZmVhdHVyZXMgPSAwOwogCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hmX2NsaWVudF9hZGRfcmVjb3JkIik7CiAKQEAgLTExOSw3ICsxMTksNyBAQAogICAgIGlmIChwX3NlcnZpY2VfbmFtZSAhPSBOVUxMICYmIHBfc2VydmljZV9uYW1lWzBdICE9IDApCiAgICAgewogICAgICAgICByZXN1bHQgJj0gU0RQX0FkZEF0dHJpYnV0ZShzZHBfaGFuZGxlLCBBVFRSX0lEX1NFUlZJQ0VfTkFNRSwgVEVYVF9TVFJfREVTQ19UWVBFLAotICAgICAgICAgICAgICAgICAgICAoVUlOVDMyKShzdHJsZW4ocF9zZXJ2aWNlX25hbWUpKzEpLCAoVUlOVDggKikgcF9zZXJ2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKHN0cmxlbihwX3NlcnZpY2VfbmFtZSkrMSksICh1aW50OF90ICopIHBfc2VydmljZV9uYW1lKTsKICAgICB9CiAKICAgICAvKiBhZGQgZmVhdHVyZXMgKi8KQEAgLTIxMSwyMCArMjExLDIwIEBACiAqKiBEZXNjcmlwdGlvbiAgICAgIFByb2Nlc3MgU0RQIGRpc2NvdmVyeSByZXN1bHRzIHRvIGZpbmQgcmVxdWVzdGVkIGF0dHJpYnV0ZQogKioKICoqCi0qKiBSZXR1cm5zICAgICAgICAgIFRSVUUgaWYgcmVzdWx0cyBmb3VuZCwgRkFMU0Ugb3RoZXJ3aXNlLgorKiogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHJlc3VsdHMgZm91bmQsIGZhbHNlIG90aGVyd2lzZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfaGZfY2xpZW50X3NkcF9maW5kX2F0dHIodm9pZCkKK2Jvb2wgYnRhX2hmX2NsaWVudF9zZHBfZmluZF9hdHRyKHZvaWQpCiB7CiAgICAgdFNEUF9ESVNDX1JFQyAgICAgICAqcF9yZWMgPSBOVUxMOwogICAgIHRTRFBfRElTQ19BVFRSICAgICAgKnBfYXR0cjsKICAgICB0U0RQX1BST1RPQ09MX0VMRU0gIHBlOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgYm9vbCAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKIAogICAgIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnBlZXJfdmVyc2lvbiA9IEhGUF9WRVJTSU9OXzFfMTsgICAvKiBEZWZhdWx0IHZlcnNpb24gKi8KIAogICAgIC8qIGxvb3AgdGhyb3VnaCBhbGwgcmVjb3JkcyB3ZSBmb3VuZCAqLwotICAgIHdoaWxlIChUUlVFKQorICAgIHdoaWxlICh0cnVlKQogICAgIHsKICAgICAgICAgLyogZ2V0IG5leHQgcmVjb3JkOyBpZiBub25lIGZvdW5kLCB3ZSdyZSBkb25lICovCiAgICAgICAgIGlmICgocF9yZWMgPSBTRFBfRmluZFNlcnZpY2VJbkRiKGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnBfZGlzY19kYiwgVVVJRF9TRVJWQ0xBU1NfQUdfSEFORFNGUkVFLCBwX3JlYykpID09IE5VTEwpCkBAIC0yMzcsNyArMjM3LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYgKFNEUF9GaW5kUHJvdG9jb2xMaXN0RWxlbUluUmVjKHBfcmVjLCBVVUlEX1BST1RPQ09MX1JGQ09NTSwgJnBlKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X2NiLnNjYi5wZWVyX3NjbiA9IChVSU5UOCkgcGUucGFyYW1zWzBdOworICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnBlZXJfc2NuID0gKHVpbnQ4X3QpIHBlLnBhcmFtc1swXTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKQEAgLTI3NywxMiArMjc3LDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICAvKiBmb3VuZCB3aGF0IHdlIG5lZWRlZCAqLwotICAgICAgICByZXN1bHQgPSBUUlVFOworICAgICAgICByZXN1bHQgPSB0cnVlOwogICAgICAgICBicmVhazsKICAgICB9CiAKICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBwZWVyX3ZlcnNpb249MHgleCBwZWVyX2ZlYXR1cmVzPTB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnRhX2hmX2NsaWVudF9jYi5zY2IucGVlcl92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBidGFfaGZfY2xpZW50X2NiLnNjYi5wZWVyX3ZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9jYi5zY2IucGVlcl9mZWF0dXJlcyk7CiAKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMzAxLDEwICszMDEsMTAgQEAKIHZvaWQgYnRhX2hmX2NsaWVudF9kb19kaXNjKHZvaWQpCiB7CiAgICAgdFNEUF9VVUlEICAgICAgIHV1aWRfbGlzdFsyXTsKLSAgICBVSU5UMTYgICAgICAgICAgbnVtX3V1aWQgPSAxOwotICAgIFVJTlQxNiAgICAgICAgICBhdHRyX2xpc3RbNF07Ci0gICAgVUlOVDggICAgICAgICAgIG51bV9hdHRyOwotICAgIEJPT0xFQU4gICAgICAgICBkYl9pbml0ZWQgPSBGQUxTRTsKKyAgICB1aW50MTZfdCAgICAgICAgICBudW1fdXVpZCA9IDE7CisgICAgdWludDE2X3QgICAgICAgICAgYXR0cl9saXN0WzRdOworICAgIHVpbnQ4X3QgICAgICAgICAgIG51bV9hdHRyOworICAgIGJvb2wgICAgICAgICBkYl9pbml0ZWQgPSBmYWxzZTsKIAogICAgIC8qIGluaXRpYXRvcjsgZ2V0IHByb3RvIGxpc3QgYW5kIGZlYXR1cmVzICovCiAgICAgaWYgKGJ0YV9oZl9jbGllbnRfY2Iuc2NiLnJvbGUgPT0gQlRBX0hGX0NMSUVOVF9JTlQpCmRpZmYgLS1naXQgYS9idGEvaGgvYnRhX2hoX2FjdC5jYyBiL2J0YS9oaC9idGFfaGhfYWN0LmNjCmluZGV4IDQxYzFlNTAuLjc2NmZhMDcgMTAwNjQ0Ci0tLSBhL2J0YS9oaC9idGFfaGhfYWN0LmNjCisrKyBiL2J0YS9oaC9idGFfaGhfYWN0LmNjCkBAIC0yNCw3ICsyNCw3IEBACiAKICNpbmNsdWRlICJidF90YXJnZXQuaCIKIAotI2lmIGRlZmluZWQoQlRBX0hIX0lOQ0xVREVEKSAmJiAoQlRBX0hIX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9ISF9JTkNMVURFRCA9PSBUUlVFKQogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKQEAgLTQzLDEzICs0MywxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKiAgTG9jYWwgRnVuY3Rpb24gcHJvdG90eXBlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGhfY2JhY2sgKFVJTlQ4IGRldl9oYW5kbGUsIEJEX0FERFIgYWRkciwgVUlOVDggZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGRhdGEsIEJUX0hEUiAqcGRhdGEpOwotc3RhdGljIHRCVEFfSEhfU1RBVFVTIGJ0YV9oaF9nZXRfdHJhbnNfc3RhdHVzKFVJTlQzMiByZXN1bHQpOworc3RhdGljIHZvaWQgYnRhX2hoX2NiYWNrICh1aW50OF90IGRldl9oYW5kbGUsIEJEX0FERFIgYWRkciwgdWludDhfdCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhLCBCVF9IRFIgKnBkYXRhKTsKK3N0YXRpYyB0QlRBX0hIX1NUQVRVUyBidGFfaGhfZ2V0X3RyYW5zX3N0YXR1cyh1aW50MzJfdCByZXN1bHQpOwogCi0jaWYgQlRBX0hIX0RFQlVHCi1zdGF0aWMgY29uc3QgY2hhciogYnRhX2hoX2dldF93NF9ldmVudChVSU5UMTYgZXZlbnQpOwotc3RhdGljIGNvbnN0IGNoYXIgKiBidGFfaGhfaGlkX2V2ZW50X25hbWUoVUlOVDE2IGV2ZW50KTsKKyNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCitzdGF0aWMgY29uc3QgY2hhciogYnRhX2hoX2dldF93NF9ldmVudCh1aW50MTZfdCBldmVudCk7CitzdGF0aWMgY29uc3QgY2hhciAqIGJ0YV9oaF9oaWRfZXZlbnRfbmFtZSh1aW50MTZfdCBldmVudCk7CiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC02OCw3ICs2OCw3IEBACiB2b2lkIGJ0YV9oaF9hcGlfZW5hYmxlKHRCVEFfSEhfREFUQSAqcF9kYXRhKQogewogICAgIHRCVEFfSEhfU1RBVFVTICAgICAgc3RhdHVzID0gQlRBX0hIX0VSUjsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIHh4OworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICB4eDsKIAogICAgIC8qIGluaXRpYWxpemUgQlRFIEhJRCAqLwogICAgIEhJRF9Ib3N0SW5pdCgpOwpAQCAtMTE5LDcgKzExOSw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfaGhfYXBpX2Rpc2FibGUodm9pZCkKIHsKLSAgICBVSU5UOCB4eDsKKyAgICB1aW50OF90IHh4OwogCiAgICAgLyogc2VydmljZSBpcyBub3QgZW5hYmxlZCAqLwogICAgIGlmIChidGFfaGhfY2IucF9jYmFjayA9PSBOVUxMKQpAQCAtMTMyLDcgKzEzMiw3IEBACiAgICAgfQogICAgIGVsc2UgLyogb3RoZXJ3aXNlLCBkaXNjb25uZWN0IGFsbCBsaXZlIGNvbm5lY3Rpb25zICovCiAgICAgewotICAgICAgICBidGFfaGhfY2IudzRfZGlzYWJsZSA9IFRSVUU7CisgICAgICAgIGJ0YV9oaF9jYi53NF9kaXNhYmxlID0gdHJ1ZTsKIAogICAgICAgICBmb3IoeHggPSAwOyB4eCA8IEJUQV9ISF9NQVhfREVWSUNFOyB4eCArKykKICAgICAgICAgewpAQCAtMTg1LDExICsxODUsMTEgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGhfc2RwX2NiYWNrKFVJTlQxNiByZXN1bHQsIFVJTlQxNiBhdHRyX21hc2ssCitzdGF0aWMgdm9pZCBidGFfaGhfc2RwX2NiYWNrKHVpbnQxNl90IHJlc3VsdCwgdWludDE2X3QgYXR0cl9tYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRISURfREVWX1NEUF9JTkZPICpzZHBfcmVjICkKIHsKICAgICB0QlRBX0hIX0RFVl9DQiAgICAgKnBfY2IgPSBidGFfaGhfY2IucF9jdXI7Ci0gICAgVUlOVDggICAgICAgICAgICAgIGhkbCA9IDA7CisgICAgdWludDhfdCAgICAgICAgICAgICAgaGRsID0gMDsKICAgICB0QlRBX0hIX1NUQVRVUyAgICBzdGF0dXMgPSBCVEFfSEhfRVJSX1NEUDsKIAogICAgIC8qIG1ha2Ugc3VyZSBzZHAgc3VjY2VlZGVkIGFuZCBoaCBoYXMgbm90IGJlZW4gZGlzYWJsZWQgKi8KQEAgLTE5OSw3ICsxOTksNyBAQAogICAgICAgICBpZiAocF9jYi0+c2VjX21hc2spCiAgICAgICAgICAgICBhdHRyX21hc2sgfD0gSElEX1NFQ19SRVFVSVJFRDsKIAotI2lmIEJUQV9ISF9ERUJVRworI2lmIChCVEFfSEhfREVCVUcgPT0gVFJVRSkKICAgICAgICAgQVBQTF9UUkFDRV9FVkVOVCgiYnRhX2hoX3NkcF9jYmFjazogcF9jYjogJWQgcmVzdWx0IDB4JTAyeCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJfbWFzayAweCUwMngsIGhhbmRsZSAleCIsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NiLCByZXN1bHQsIGF0dHJfbWFzayxwX2NiLT5oaWRfaGFuZGxlKTsKQEAgLTI2NiwxMyArMjY2LDEzIEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2hoX2RpX3NkcF9jYmFjayhVSU5UMTYgcmVzdWx0KQorc3RhdGljIHZvaWQgYnRhX2hoX2RpX3NkcF9jYmFjayh1aW50MTZfdCByZXN1bHQpCiB7CiAgICAgdEJUQV9ISF9ERVZfQ0IgICAgICpwX2NiID0gYnRhX2hoX2NiLnBfY3VyOwogICAgIHRCVEFfSEhfU1RBVFVTICAgICAgICAgc3RhdHVzID0gQlRBX0hIX0VSUl9TRFA7CiAgICAgdFNEUF9ESV9HRVRfUkVDT1JEICBkaV9yZWM7CiAgICAgdEhJRF9TVEFUVVMgcmV0OwotI2lmIEJUQV9ISF9ERUJVRworI2lmIChCVEFfSEhfREVCVUcgPT0gVFJVRSkKICAgICBBUFBMX1RSQUNFX0VWRU5UKCJidGFfaGhfZGlfc2RwX2NiYWNrOiBwX2NiOiAlZCByZXN1bHQgMHglMDJ4IiwgcF9jYiwgcmVzdWx0KTsKICNlbmRpZgogCkBAIC0zMDUsNyArMzA1LDcgQEAKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSNpZiBCVEFfSEhfREVCVUcKKyNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCiAgICAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHICgiYnRhX2hoX2RpX3NkcF9jYmFjazogIEhJRF9Ib3N0R2V0U0RQUmVjb3JkIGZhaWxlZDogU3RhdHVzIDB4JTJ4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQpOwogI2VuZGlmCkBAIC0zMzgsNyArMzM4LDcgQEAKIHZvaWQgYnRhX2hoX3N0YXJ0X3NkcCh0QlRBX0hIX0RFVl9DQiAqcF9jYiwgdEJUQV9ISF9EQVRBICpwX2RhdGEpCiB7CiAgICAgdEJUQV9ISF9TVEFUVVMgICAgICAgICAgc3RhdHVzID0gQlRBX0hIX0VSUl9TRFA7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgaGRsOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgaGRsOwogCiAgICAgcF9jYi0+c2VjX21hc2sgID0gcF9kYXRhLT5hcGlfY29ubi5zZWNfbWFzazsKICAgICBwX2NiLT5tb2RlICAgICAgPSBwX2RhdGEtPmFwaV9jb25uLm1vZGU7CkBAIC0zNTYsNyArMzU2LDcgQEAKICAgICBpZiAocF9jYi0+YXBwX2lkKQogICAgIHsKICAgICAgICAgc3RhdHVzID0gQlRBX0hIX09LOwotI2lmIEJUQV9ISF9ERUJVRworI2lmIChCVEFfSEhfREVCVUcgPT0gVFJVRSkKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hoX3N0YXJ0X3NkcDo6IHNraXAgU0RQIGZvciBrbm93biBkZXZpY2VzIik7CiAjZW5kaWYKICAgICAgICAgaWYgKHBfY2ItPmhpZF9oYW5kbGUgPT0gQlRBX0hIX0lOVkFMSURfSEFORExFKQpAQCAtMzkwLDcgKzM5MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfaGhfY2IucF9kaXNjX2RiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idGFfaGhfY2ZnLT5zZHBfZGJfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9oaF9kaV9zZHBfY2JhY2spICE9IFNEUF9TVUNDRVNTKSB7Ci0jaWYgQlRBX0hIX0RFQlVHCisjaWYgKEJUQV9ISF9ERUJVRyA9PSBUUlVFKQogICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hoX3N0YXJ0X3NkcDogIFNEUF9EaURpc2NvdmVyIGZhaWxlZDogXAogICAgICAgICAgICAgICAgICAgICBTdGF0dXMgMHglMlgiLHN0YXR1cyk7CiAjZW5kaWYKQEAgLTQzMSw3ICs0MzEsNyBAQAogICAgIHRCVEFfSEhfQ09OTiAgICAgICAgICAgIGNvbm5fZGF0OwogICAgIHRCVEFfSEhfU1RBVFVTICAgICAgICAgIHN0YXR1cyA9IHBfZGF0YS0+c3RhdHVzOwogCi0jaWYgQlRBX0hIX0RFQlVHCisjaWYgKEJUQV9ISF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcgKCJidGFfaGhfc2RwX2NtcGw6ICBzdGF0dXMgMHglMlgiLHBfZGF0YS0+c3RhdHVzKTsKICNlbmRpZgogCkBAIC00NjcsNyArNDY3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSNpZiBCVEFfSEhfREVCVUcKKyNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCiAgICAgICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRyAoIiVzOiBISURfSG9zdE9wZW5EZXYgZmFpbGVkOiBTdGF0dXMgMHglMlgiLCBfX2Z1bmNfXywgcmV0KTsKICNlbmRpZgogICAgICAgICAgICAgICAgIC8qIG9wZW4gZmFpbCwgcmVtb3ZlIGRldmljZSBmcm9tIG1hbmFnZW1lbnQgZGV2aWNlIGxpc3QgKi8KQEAgLTUwNiw3ICs1MDYsNyBAQAogICAgICAgICAgICAgLyogY2xlYW4gdXAgZGV2aWNlIGNvbnRyb2wgYmxvY2sgKi8KICAgICAgICAgICAgIGJ0YV9oaF9jbGVhbl91cF9rZGV2KHBfY2IpOwogICAgICAgICB9Ci0jaWYgQlRBX0hIX0RFQlVHCisjaWYgKEJUQV9ISF9ERUJVRyA9PSBUUlVFKQogICAgICAgICBidGFfaGhfdHJhY2VfZGV2X2RiKCk7CiAjZW5kaWYKICAgICB9CkBAIC01MjgsMTQgKzUyOCwxNCBAQAogICAgIHRCVEFfSEhfQ0JEQVRBICAgIGRpc2NfZGF0OwogICAgIHRISURfU1RBVFVTICAgICBzdGF0dXM7CiAKLSNpZiBCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRSkKICAgICBpZiAocF9jYi0+aXNfbGVfZGV2aWNlKQogICAgICAgICBidGFfaGhfbGVfYXBpX2Rpc2NfYWN0KHBfY2IpOwogICAgIGVsc2UKICNlbmRpZgogICAgIHsKICAgICAgICAgLyogZm91bmQgYW4gYWN0aXZlIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgZGlzY19kYXQuaGFuZGxlID0gcF9kYXRhID8oVUlOVDgpcF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWMgOnBfY2ItPmhpZF9oYW5kbGU7CisgICAgICAgIGRpc2NfZGF0LmhhbmRsZSA9IHBfZGF0YSA/KHVpbnQ4X3QpcF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWMgOnBfY2ItPmhpZF9oYW5kbGU7CiAgICAgICAgIGRpc2NfZGF0LnN0YXR1cyA9IEJUQV9ISF9FUlI7CiAKICAgICAgICAgc3RhdHVzID0gSElEX0hvc3RDbG9zZURldihkaXNjX2RhdC5oYW5kbGUpOwpAQCAtNTYwLDcgKzU2MCw3IEBACiB2b2lkIGJ0YV9oaF9vcGVuX2NtcGxfYWN0KHRCVEFfSEhfREVWX0NCICpwX2NiLCB0QlRBX0hIX0RBVEEgKnBfZGF0YSkKIHsKICAgICB0QlRBX0hIX0NPTk4gICAgICAgIGNvbm4gOwotICAgIFVJTlQ4ICAgZGV2X2hhbmRsZSA9IHBfZGF0YSA/IChVSU5UOClwX2RhdGEtPmhpZF9jYmFjay5oZHIubGF5ZXJfc3BlY2lmaWMgOiBcCisgICAgdWludDhfdCAgIGRldl9oYW5kbGUgPSBwX2RhdGEgPyAodWludDhfdClwX2RhdGEtPmhpZF9jYmFjay5oZHIubGF5ZXJfc3BlY2lmaWMgOiBcCiAgICAgICAgICAgICAgICAgICAgICAgICBwX2NiLT5oaWRfaGFuZGxlOwogCiAgICAgbWVtc2V0KCh2b2lkICopJmNvbm4sIDAsIHNpemVvZiAodEJUQV9ISF9DT05OKSk7CkBAIC02MTAsNyArNjEwLDcgQEAKICAgICBlbHNlCiAgICAgICAgICgqIGJ0YV9oaF9jYi5wX2NiYWNrKShCVEFfSEhfT1BFTl9FVlQsICh0QlRBX0hIICopJmNvbm4pOwogCi0gICAgcF9jYi0+aW5jb21pbmdfY29ubiA9IEZBTFNFOworICAgIHBfY2ItPmluY29taW5nX2Nvbm4gPSBmYWxzZTsKICAgICBwX2NiLT5pbmNvbWluZ19oaWRfaGFuZGxlID0gQlRBX0hIX0lOVkFMSURfSEFORExFOwogCiB9CkBAIC02MjgsMTAgKzYyOCwxMCBAQAogewogICAgIHRCVEFfSEhfQVBJX0NPTk4gICAgY29ubl9kYXRhOwogCi0gICAgVUlOVDggICBkZXZfaGFuZGxlID0gcF9kYXRhID8gKFVJTlQ4KXBfZGF0YS0+aGlkX2NiYWNrLmhkci5sYXllcl9zcGVjaWZpYyA6IFwKKyAgICB1aW50OF90ICAgZGV2X2hhbmRsZSA9IHBfZGF0YSA/ICh1aW50OF90KXBfZGF0YS0+aGlkX2NiYWNrLmhkci5sYXllcl9zcGVjaWZpYyA6IFwKICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2ItPmhpZF9oYW5kbGU7CiAKLSNpZiBCVEFfSEhfREVCVUcKKyNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCiAgICAgQVBQTF9UUkFDRV9FVkVOVCAoImJ0YV9oaF9vcGVuX2FjdDogIERldmljZVslZF0gY29ubmVjdGVkIiwgZGV2X2hhbmRsZSk7CiAjZW5kaWYKIApAQCAtNjQ0LDcgKzY0NCw3IEBACiAgICAgLyogIGFwcF9pZCA9PSAwIGluZGljYXRlcyBhbiBpbmNvbWluZyBjb25lbmN0aW9uIHJlcXVlc3QgYXJyaXZlcyB3aXRob3V0IFNEUAogICAgICAgICBwZXJmb3JtZWQsIGRvIGl0IGZpcnN0ICovCiAgICAgewotICAgICAgICBwX2NiLT5pbmNvbWluZ19jb25uID0gVFJVRTsKKyAgICAgICAgcF9jYi0+aW5jb21pbmdfY29ubiA9IHRydWU7CiAgICAgICAgIC8qIHN0b3JlIHRoZSBoYW5kbGUgaGVyZSBpbiBjYXNlIHNkcCBmYWlscyAtIG5lZWQgdG8gZGlzY29ubmVjdCAqLwogICAgICAgICBwX2NiLT5pbmNvbWluZ19oaWRfaGFuZGxlID0gZGV2X2hhbmRsZTsKIApAQCAtNjcwLDkgKzY3MCw5IEBACiB2b2lkIGJ0YV9oaF9kYXRhX2FjdCh0QlRBX0hIX0RFVl9DQiAqcF9jYiwgdEJUQV9ISF9EQVRBICogcF9kYXRhKQogewogICAgIEJUX0hEUiAgKnBkYXRhID0gcF9kYXRhLT5oaWRfY2JhY2sucF9kYXRhOwotICAgIFVJTlQ4ICAgKnBfcnB0ID0gKFVJTlQ4ICopKHBkYXRhICsgMSkgKyBwZGF0YS0+b2Zmc2V0OworICAgIHVpbnQ4X3QgICAqcF9ycHQgPSAodWludDhfdCAqKShwZGF0YSArIDEpICsgcGRhdGEtPm9mZnNldDsKIAotICAgIGJ0YV9oaF9jb19kYXRhKChVSU5UOClwX2RhdGEtPmhpZF9jYmFjay5oZHIubGF5ZXJfc3BlY2lmaWMsIHBfcnB0LCBwZGF0YS0+bGVuLAorICAgIGJ0YV9oaF9jb19kYXRhKCh1aW50OF90KXBfZGF0YS0+aGlkX2NiYWNrLmhkci5sYXllcl9zcGVjaWZpYywgcF9ycHQsIHBkYXRhLT5sZW4sCiAgICAgICAgICAgICAgICAgICAgIHBfY2ItPm1vZGUsIHBfY2ItPnN1Yl9jbGFzcywgcF9jYi0+ZHNjcF9pbmZvLmN0cnlfY29kZSwgcF9jYi0+YWRkciwgcF9jYi0+YXBwX2lkKTsKIAogICAgIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCAqKikmcGRhdGEpOwpAQCAtNjk1LDcgKzY5NSw3IEBACiAgICAgdEJUQV9ISF9IU0RBVEEgIGhzX2RhdGE7CiAgICAgdEJUQV9ISF9DT05OICAgIGNvbm4gOwogCi0jaWYgQlRBX0hIX0RFQlVHCisjaWYgKEJUQV9ISF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoIkhBTkRTSEFLRSByZWNlaXZlZCBmb3I6IGV2ZW50ID0gJXMgZGF0YT0gJWQiLAogICAgICAgICBidGFfaGhfZ2V0X3c0X2V2ZW50KHBfY2ItPnc0X2V2dCksIHBfZGF0YS0+aGlkX2NiYWNrLmRhdGEpOwogI2VuZGlmCkBAIC03MzYsNyArNzM2LDcgQEAKICAgICAgICAgICAgIGNvbm4uaGFuZGxlID0gcF9jYi0+aGlkX2hhbmRsZTsKICAgICAgICAgICAgIGJkY3B5KGNvbm4uYmRhLCBwX2NiLT5hZGRyKTsKICAgICAgICAgICAgICgqIGJ0YV9oaF9jYi5wX2NiYWNrKShwX2NiLT53NF9ldnQsICh0QlRBX0hIICopJmNvbm4pOwotI2lmIEJUQV9ISF9ERUJVRworI2lmIChCVEFfSEhfREVCVUcgPT0gVFJVRSkKICAgICAgICAgICAgIGJ0YV9oaF90cmFjZV9kZXZfZGIoKTsKICNlbmRpZgogICAgICAgICAgICAgcF9jYi0+dzRfZXZ0ID0gMDsKQEAgLTc2NSwxMCArNzY1LDEwIEBACiB2b2lkIGJ0YV9oaF9jdHJsX2RhdF9hY3QodEJUQV9ISF9ERVZfQ0IgKnBfY2IsIHRCVEFfSEhfREFUQSAqIHBfZGF0YSkKIHsKICAgICBCVF9IRFIgICAgICAgICAgKnBkYXRhID0gcF9kYXRhLT5oaWRfY2JhY2sucF9kYXRhOwotICAgIFVJTlQ4ICAgICAgICAgICAqZGF0YSA9IChVSU5UOCAqKShwZGF0YSArIDEpICsgcGRhdGEtPm9mZnNldDsKKyAgICB1aW50OF90ICAgICAgICAgICAqZGF0YSA9ICh1aW50OF90ICopKHBkYXRhICsgMSkgKyBwZGF0YS0+b2Zmc2V0OwogICAgIHRCVEFfSEhfSFNEQVRBICAgIGhzX2RhdGE7CiAKLSNpZiBCVEFfSEhfREVCVUcKKyNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiQ3RybCBEQVRBIHJlY2VpdmVkIHc0OiBldmVudFslc10iLAogICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2hoX2dldF93NF9ldmVudChwX2NiLT53NF9ldnQpKTsKICNlbmRpZgpAQCAtNzg3LDcgKzc4Nyw3IEBACiAgICAgICAgIC8qIG1hdGNoIHVwIEJURS9CVEEgcmVwb3J0L2Jvb3QgbW9kZSBkZWYqLwogICAgICAgICBoc19kYXRhLnJzcF9kYXRhLnByb3RvX21vZGUgPSAoKCpkYXRhKSA9PSBISURfUEFSX1BST1RPQ09MX1JFUE9SVCk/IFwKICAgICAgICAgICAgICAgICAgICAgQlRBX0hIX1BST1RPX1JQVF9NT0RFIDogQlRBX0hIX1BST1RPX0JPT1RfTU9ERTsKLSNpZiBCVEFfSEhfREVCVUcKKyNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIkdFVF9QUk9UT0NPTCBNb2RlID0gWyVzXSIsCiAgICAgICAgICAgICAoaHNfZGF0YS5yc3BfZGF0YS5wcm90b19tb2RlID09IEJUQV9ISF9QUk9UT19SUFRfTU9ERSk/ICJSZXBvcnQiIDogIkJvb3QiKTsKICNlbmRpZgpAQCAtODAwLDcgKzgwMCw3IEBACiAgICAgY2FzZSBCVEFfSEhfU0VUX0lETEVfRVZUIDoKICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCiAgICAgZGVmYXVsdDoKLSNpZiBCVEFfSEhfREVCVUcKKyNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImludmFsaWQgIHRyYW5zYWN0aW9uIHR5cGUgZm9yIERBVEEgcGF5bG9hZDogNF9ldnRbJXNdIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9oaF9nZXRfdzRfZXZlbnQocF9jYi0+dzRfZXZ0KSk7CiAjZW5kaWYKQEAgLTgzMiw3ICs4MzIsNyBAQAogdm9pZCBidGFfaGhfb3Blbl9mYWlsdXJlKHRCVEFfSEhfREVWX0NCICpwX2NiLCB0QlRBX0hIX0RBVEEgKnBfZGF0YSkKIHsKICAgICB0QlRBX0hIX0NPTk4gICAgICAgICAgICBjb25uX2RhdCA7Ci0gICAgVUlOVDMyICAgICAgICAgICAgICAgICAgcmVhc29uID0gcF9kYXRhLT5oaWRfY2JhY2suZGF0YTsgICAgLyogUmVhc29uIGZvciBjbG9zaW5nICgzMi1iaXQpICovCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICByZWFzb24gPSBwX2RhdGEtPmhpZF9jYmFjay5kYXRhOyAgICAvKiBSZWFzb24gZm9yIGNsb3NpbmcgKDMyLWJpdCkgKi8KIAogICAgIG1lbXNldCgmY29ubl9kYXQsIDAsIHNpemVvZih0QlRBX0hIX0NPTk4pKTsKICAgICAgY29ubl9kYXQuaGFuZGxlID0gcF9jYi0+aGlkX2hhbmRsZTsKQEAgLTg0NCwxMSArODQ0LDExIEBACiAgICAgIC8qIFJlcG9ydCBPUEVOIGZhaWwgZXZlbnQgKi8KICAgICAgKCpidGFfaGhfY2IucF9jYmFjaykoQlRBX0hIX09QRU5fRVZULCAodEJUQV9ISCAqKSZjb25uX2RhdCk7CiAKLSNpZiBCVEFfSEhfREVCVUcKKyNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCiAgICAgYnRhX2hoX3RyYWNlX2Rldl9kYigpOwogI2VuZGlmCiAgICAgLyogY2xlYW4gdXAgY29udHJvbCBibG9jaywgYnV0IHJldGFpbiBTRFAgaW5mbyBhbmQgZGV2aWNlIGhhbmRsZSAqLwotICAgIHBfY2ItPnZwICAgICAgICAgICAgPSBGQUxTRTsKKyAgICBwX2NiLT52cCAgICAgICAgICAgID0gZmFsc2U7CiAgICAgcF9jYi0+dzRfZXZ0ICAgICAgICA9IDA7CiAKICAgICAvKiBpZiBubyBjb25uZWN0aW9uIGlzIGFjdGl2ZSBhbmQgSEggZGlzYWJsZSBpcyBzaWduYWxlZCwgZGlzYWJsZSBzZXJ2aWNlICovCkBAIC04NTgsNyArODU4LDcgQEAKICAgICB9CiAKICAgICAvKiBFcnJvciBpbiBvcGVuaW5nIGhpZCBjb25uZWN0aW9uLCByZXNldCBmbGFncyAqLwotICAgIHBfY2ItPmluY29taW5nX2Nvbm4gPSBGQUxTRTsKKyAgICBwX2NiLT5pbmNvbWluZ19jb25uID0gZmFsc2U7CiAgICAgcF9jYi0+aW5jb21pbmdfaGlkX2hhbmRsZSA9IEJUQV9ISF9JTlZBTElEX0hBTkRMRTsKIH0KIApAQCAtODc2LDEwICs4NzYsMTAgQEAKIHsKICAgICB0QlRBX0hIX0NPTk4gICAgICAgICAgICBjb25uX2RhdCA7CiAgICAgdEJUQV9ISF9DQkRBVEEgICAgICAgICAgZGlzY19kYXQgPSB7QlRBX0hIX09LLCAwfTsKLSAgICBVSU5UMzIgICAgICAgICAgICAgICAgICByZWFzb24gPSBwX2RhdGEtPmhpZF9jYmFjay5kYXRhOyAgICAvKiBSZWFzb24gZm9yIGNsb3NpbmcgKDMyLWJpdCkgKi8KKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgIHJlYXNvbiA9IHBfZGF0YS0+aGlkX2NiYWNrLmRhdGE7ICAgIC8qIFJlYXNvbiBmb3IgY2xvc2luZyAoMzItYml0KSAqLwogCiAgICAgLyogaWYgSElEX0hERVZfRVZUX1ZDX1VOUExVRyB3YXMgcmVjZWl2ZWQsIHJlcG9ydCBCVEFfSEhfVkNfVU5QTFVHX0VWVCAqLwotICAgIFVJTlQxNiAgICAgZXZlbnQgPSBwX2NiLT52cCA/IEJUQV9ISF9WQ19VTlBMVUdfRVZUIDogQlRBX0hIX0NMT1NFX0VWVDsKKyAgICB1aW50MTZfdCAgICAgZXZlbnQgPSBwX2NiLT52cCA/IEJUQV9ISF9WQ19VTlBMVUdfRVZUIDogQlRBX0hIX0NMT1NFX0VWVDsKIAogICAgIGRpc2NfZGF0LmhhbmRsZSA9IHBfY2ItPmhpZF9oYW5kbGU7CiAgICAgZGlzY19kYXQuc3RhdHVzID0gcF9kYXRhLT5oaWRfY2JhY2suZGF0YTsKQEAgLTg5OCw3ICs4OTgsNyBAQAogICAgICAgICAvKiBSZXBvcnQgT1BFTiBmYWlsIGV2ZW50ICovCiAgICAgICAgICgqYnRhX2hoX2NiLnBfY2JhY2spKEJUQV9ISF9PUEVOX0VWVCwgKHRCVEFfSEggKikmY29ubl9kYXQpOwogCi0jaWYgQlRBX0hIX0RFQlVHCisjaWYgKEJUQV9ISF9ERUJVRyA9PSBUUlVFKQogICAgICAgICBidGFfaGhfdHJhY2VfZGV2X2RiKCk7CiAjZW5kaWYKICAgICAgICAgcmV0dXJuOwpAQCAtOTI1LDEzICs5MjUsMTMgQEAKICAgICAgICAgICAgIGJ0YV9oaF9jbGVhbl91cF9rZGV2KHBfY2IpOwogICAgICAgICB9CiAKLSNpZiBCVEFfSEhfREVCVUcKKyNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCiAgICAgICAgIGJ0YV9oaF90cmFjZV9kZXZfZGIoKTsKICNlbmRpZgogICAgIH0KIAogICAgIC8qIGNsZWFuIHVwIGNvbnRyb2wgYmxvY2ssIGJ1dCByZXRhaW4gU0RQIGluZm8gYW5kIGRldmljZSBoYW5kbGUgKi8KLSAgICBwX2NiLT52cCAgICAgICAgICAgID0gRkFMU0U7CisgICAgcF9jYi0+dnAgICAgICAgICAgICA9IGZhbHNlOwogICAgIHBfY2ItPnc0X2V2dCAgICAgICAgPSAwOwogCiAgICAgLyogaWYgbm8gY29ubmVjdGlvbiBpcyBhY3RpdmUgYW5kIEhIIGRpc2FibGUgaXMgc2lnbmFsZWQsIGRpc2FibGUgc2VydmljZSAqLwpAQCAtOTgxLDcgKzk4MSw3IEBACiB7CiAgICAgdEJUQV9ISF9NQUlOVF9ERVYgICAgICAgKnBfZGV2X2luZm8gPSAmcF9kYXRhLT5hcGlfbWFpbnRkZXY7CiAgICAgdEJUQV9ISF9ERVZfSU5GTyAgICAgICAgZGV2X2luZm8gOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIGRldl9oYW5kbGU7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBkZXZfaGFuZGxlOwogCiAgICAgZGV2X2luZm8uc3RhdHVzID0gQlRBX0hIX0VSUjsKICAgICBkZXZfaW5mby5oYW5kbGUgPSBCVEFfSEhfSU5WQUxJRF9IQU5ETEU7CkBAIC0xMDA4LDcgKzEwMDgsNyBAQAogICAgICAgICAgICAgICAgIGRldl9pbmZvLmhhbmRsZSAgID0gZGV2X2hhbmRsZTsKICAgICAgICAgICAgICAgICBkZXZfaW5mby5zdGF0dXMgICA9IEJUQV9ISF9PSzsKIAotI2lmIChkZWZpbmVkIEJUQV9ISF9MRV9JTkNMVURFRCAmJiBCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRSkKKyNpZiAoQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUpCiAgICAgICAgICAgICAgICAgLyogdXBkYXRlIERJIGluZm9ybWF0aW9uICovCiAgICAgICAgICAgICAgICAgYnRhX2hoX3VwZGF0ZV9kaV9pbmZvKHBfY2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGV2X2luZm8tPmRzY3BfaW5mby52ZW5kb3JfaWQsCkBAIC0xMDQwLDE2ICsxMDQwLDE2IEBACiAgICAgICAgICAgICBkZXZfaW5mby5oYW5kbGUgPSBwX2NiLT5oaWRfaGFuZGxlOwogICAgICAgICAgICAgZGV2X2luZm8uc3RhdHVzID0gQlRBX0hIX09LOwogICAgICAgICB9Ci0jaWYgQlRBX0hIX0RFQlVHCisjaWYgKEJUQV9ISF9ERUJVRyA9PSBUUlVFKQogICAgICAgICBidGFfaGhfdHJhY2VfZGV2X2RiKCk7CiAjZW5kaWYKIAogICAgICAgICBicmVhazsKICAgICBjYXNlIEJUQV9ISF9STVZfREVWX0VWVDogICAgLyogcmVtb3ZlIGRldmljZSAqLwotICAgICAgICBkZXZfaW5mby5oYW5kbGUgPSAoVUlOVDgpcF9kZXZfaW5mby0+aGRyLmxheWVyX3NwZWNpZmljOworICAgICAgICBkZXZfaW5mby5oYW5kbGUgPSAodWludDhfdClwX2Rldl9pbmZvLT5oZHIubGF5ZXJfc3BlY2lmaWM7CiAgICAgICAgIGJkY3B5KGRldl9pbmZvLmJkYSwgcF9jYi0+YWRkcik7CiAKLSNpZiBCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRSkKICAgICAgICAgaWYgKHBfY2ItPmlzX2xlX2RldmljZSkKICAgICAgICAgewogICAgICAgICAgICAgYnRhX2hoX2xlX3JlbW92ZV9kZXZfYmdfY29ubihwX2NiKTsKQEAgLTEwODgsMTAgKzEwODgsMTAgQEAKIHZvaWQgYnRhX2hoX3dyaXRlX2Rldl9hY3QodEJUQV9ISF9ERVZfQ0IgKnBfY2IsIHRCVEFfSEhfREFUQSAqcF9kYXRhKQogewogICAgIHRCVEFfSEhfQ0JEQVRBICAgICBjYmRhdGEgPSB7QlRBX0hIX09LLCAwfTsKLSAgICBVSU5UMTYgIGV2ZW50ID0gKHBfZGF0YS0+YXBpX3NuZGNtZC50X3R5cGUgLSBCVEFfSEhfRlNUX0JURV9UUkFOU19FVlQpICsKKyAgICB1aW50MTZfdCAgZXZlbnQgPSAocF9kYXRhLT5hcGlfc25kY21kLnRfdHlwZSAtIEJUQV9ISF9GU1RfQlRFX1RSQU5TX0VWVCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hIX0ZTVF9UUkFOU19DQl9FVlQ7CiAKLSNpZiBCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRSkKICAgICBpZiAocF9jYi0+aXNfbGVfZGV2aWNlKQogICAgICAgICBidGFfaGhfbGVfd3JpdGVfZGV2X2FjdChwX2NiLCBwX2RhdGEpOwogICAgIGVsc2UKQEAgLTExNDcsNyArMTE0Nyw3IEBACiAgICAgICAgICAgICAvKiBubyBoYW5kc2hha2UgZXZlbnQgd2lsbCBiZSBnZW5lcmF0ZWQgKi8KICAgICAgICAgICAgIC8qIGlmIFZDX1VOUExVRyBpcyBpc3N1ZWQsIHNldCBmbGFnICovCiAgICAgICAgICAgICBpZiAocF9kYXRhLT5hcGlfc25kY21kLnBhcmFtID09IEJUQV9ISF9DVFJMX1ZJUlRVQUxfQ0FCTEVfVU5QTFVHKQotICAgICAgICAgICAgICAgIHBfY2ItPnZwID0gVFJVRTsKKyAgICAgICAgICAgICAgICBwX2NiLT52cCA9IHRydWU7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAvKiBjdXJyZW50bHkgbm90IGV4cGVjdGVkICovCkBAIC0xMTkyLDEzICsxMTkyLDEzIEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2hoX2NiYWNrIChVSU5UOCBkZXZfaGFuZGxlLCBCRF9BRERSIGFkZHIsIFVJTlQ4IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGRhdGEsIEJUX0hEUiAqcGRhdGEpCitzdGF0aWMgdm9pZCBidGFfaGhfY2JhY2sgKHVpbnQ4X3QgZGV2X2hhbmRsZSwgQkRfQUREUiBhZGRyLCB1aW50OF90IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YSwgQlRfSERSICpwZGF0YSkKIHsKLSAgICBVSU5UMTYgIHNtX2V2ZW50ID0gQlRBX0hIX0lOVkFMSURfRVZUOwotICAgIFVJTlQ4ICAgeHggPSAwOworICAgIHVpbnQxNl90ICBzbV9ldmVudCA9IEJUQV9ISF9JTlZBTElEX0VWVDsKKyAgICB1aW50OF90ICAgeHggPSAwOwogCi0jaWYgQlRBX0hIX0RFQlVHCisjaWYgKEJUQV9ISF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9oaF9jYmFjazo6SElEX2V2ZW50IFslc10iLCBidGFfaGhfaGlkX2V2ZW50X25hbWUoZXZlbnQpKTsKICNlbmRpZgogCkBAIC0xMjMxLDcgKzEyMzEsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoYnRhX2hoX2NiLmtkZXZbeHhdLmhpZF9oYW5kbGUgPT0gZGV2X2hhbmRsZSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGJ0YV9oaF9jYi5rZGV2W3h4XS52cCA9IFRSVUU7CisgICAgICAgICAgICAgICBidGFfaGhfY2Iua2Rldlt4eF0udnAgPSB0cnVlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEyNDMsNyArMTI0Myw3IEBACiAgICAgICAgICAgICAodEJUQV9ISF9DQkFDS19EQVRBICopb3NpX21hbGxvYyhzaXplb2YodEJUQV9ISF9DQkFDS19EQVRBKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQlRfSERSKSk7CiAgICAgICAgIHBfYnVmLT5oZHIuZXZlbnQgPSBzbV9ldmVudDsKLSAgICAgICAgcF9idWYtPmhkci5sYXllcl9zcGVjaWZpYyA9IChVSU5UMTYpZGV2X2hhbmRsZTsKKyAgICAgICAgcF9idWYtPmhkci5sYXllcl9zcGVjaWZpYyA9ICh1aW50MTZfdClkZXZfaGFuZGxlOwogICAgICAgICBwX2J1Zi0+ZGF0YSA9IGRhdGE7CiAgICAgICAgIGJkY3B5KHBfYnVmLT5hZGRyLCBhZGRyKTsKICAgICAgICAgcF9idWYtPnBfZGF0YSA9IHBkYXRhOwpAQCAtMTI2MCw3ICsxMjYwLDcgQEAKICoqICAgICAgICAgICAgICAgICAgc3RhdHVzIGNvZGUKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRCVEFfSEhfU1RBVFVTIGJ0YV9oaF9nZXRfdHJhbnNfc3RhdHVzKFVJTlQzMiByZXN1bHQpCitzdGF0aWMgdEJUQV9ISF9TVEFUVVMgYnRhX2hoX2dldF90cmFuc19zdGF0dXModWludDMyX3QgcmVzdWx0KQogewogICAgIHN3aXRjaChyZXN1bHQpCiAgICAgewpAQCAtMTI4Miw4ICsxMjgyLDggQEAKICoqICBEZWJ1ZyBGdW5jdGlvbnMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWYgKGRlZmluZWQgQlRBX0hIX0RFQlVHICYmIEJUQV9ISF9ERUJVRyA9PSBUUlVFKQotc3RhdGljIGNvbnN0IGNoYXIqIGJ0YV9oaF9nZXRfdzRfZXZlbnQoVUlOVDE2IGV2ZW50KQorI2lmIChCVEFfSEhfREVCVUcgPT0gVFJVRSkKK3N0YXRpYyBjb25zdCBjaGFyKiBidGFfaGhfZ2V0X3c0X2V2ZW50KHVpbnQxNl90IGV2ZW50KQogewogICAgIHN3aXRjaCAoZXZlbnQpCiAgICAgewpAQCAtMTMwNyw3ICsxMzA3LDcgQEAKIAogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqIGJ0YV9oaF9oaWRfZXZlbnRfbmFtZShVSU5UMTYgZXZlbnQpCitzdGF0aWMgY29uc3QgY2hhciAqIGJ0YV9oaF9oaWRfZXZlbnRfbmFtZSh1aW50MTZfdCBldmVudCkKIHsKICAgICBzd2l0Y2ggKGV2ZW50KQogICAgIHsKZGlmZiAtLWdpdCBhL2J0YS9oaC9idGFfaGhfYXBpLmNjIGIvYnRhL2hoL2J0YV9oaF9hcGkuY2MKaW5kZXggNTA0MjRiNi4uN2ZiNWNkNyAxMDA2NDQKLS0tIGEvYnRhL2hoL2J0YV9oaF9hcGkuY2MKKysrIGIvYnRhL2hoL2J0YV9oaF9hcGkuY2MKQEAgLTI4LDcgKzI4LDcgQEAKIAogI2luY2x1ZGUgImJ0X3RhcmdldC5oIgogCi0jaWYgZGVmaW5lZChCVEFfSEhfSU5DTFVERUQpICYmIChCVEFfSEhfSU5DTFVERUQgPT0gVFJVRSkKKyNpZiAoQlRBX0hIX0lOQ0xVREVEID09IFRSVUUpCiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMTA5LDEyICsxMDksMTIgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9IaENsb3NlKFVJTlQ4IGRldl9oYW5kbGUpCit2b2lkIEJUQV9IaENsb3NlKHVpbnQ4X3QgZGV2X2hhbmRsZSkKIHsKICAgICBCVF9IRFIgKnBfYnVmID0gKEJUX0hEUiAqKW9zaV9jYWxsb2Moc2l6ZW9mKEJUX0hEUikpOwogCiAgICAgcF9idWYtPmV2ZW50ID0gQlRBX0hIX0FQSV9DTE9TRV9FVlQ7Ci0gICAgcF9idWYtPmxheWVyX3NwZWNpZmljID0gKFVJTlQxNilkZXZfaGFuZGxlOworICAgIHBfYnVmLT5sYXllcl9zcGVjaWZpYyA9ICh1aW50MTZfdClkZXZfaGFuZGxlOwogCiAgICAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKIH0KQEAgLTE0OCwxNCArMTQ4LDE0IEBACiAqKiBGdW5jdGlvbiAgYnRhX2hoX3NuZF93cml0ZV9kZXYKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2hoX3NuZF93cml0ZV9kZXYoVUlOVDggZGV2X2hhbmRsZSwgVUlOVDggdF90eXBlLCBVSU5UOCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBkYXRhLCBVSU5UOCBycHRfaWQsIEJUX0hEUiAgKnBfZGF0YSkKK3N0YXRpYyB2b2lkIGJ0YV9oaF9zbmRfd3JpdGVfZGV2KHVpbnQ4X3QgZGV2X2hhbmRsZSwgdWludDhfdCB0X3R5cGUsIHVpbnQ4X3QgcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBkYXRhLCB1aW50OF90IHJwdF9pZCwgQlRfSERSICAqcF9kYXRhKQogewogICAgIHRCVEFfSEhfQ01EX0RBVEEgKnBfYnVmID0KICAgICAgICAgKHRCVEFfSEhfQ01EX0RBVEEgKilvc2lfY2FsbG9jKHNpemVvZih0QlRBX0hIX0NNRF9EQVRBKSk7CiAKICAgICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0hIX0FQSV9XUklURV9ERVZfRVZUOwotICAgIHBfYnVmLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSAoVUlOVDE2KWRldl9oYW5kbGU7CisgICAgcF9idWYtPmhkci5sYXllcl9zcGVjaWZpYyA9ICh1aW50MTZfdClkZXZfaGFuZGxlOwogICAgIHBfYnVmLT50X3R5cGUgPSB0X3R5cGU7CiAgICAgcF9idWYtPmRhdGEgPSBkYXRhOwogICAgIHBfYnVmLT5wYXJhbSA9IHBhcmFtOwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfSGhTZXRSZXBvcnQoVUlOVDggZGV2X2hhbmRsZSwgdEJUQV9ISF9SUFRfVFlQRSByX3R5cGUsIEJUX0hEUiAqcF9kYXRhKQordm9pZCBCVEFfSGhTZXRSZXBvcnQodWludDhfdCBkZXZfaGFuZGxlLCB0QlRBX0hIX1JQVF9UWVBFIHJfdHlwZSwgQlRfSERSICpwX2RhdGEpCiB7CiAgICAgYnRhX2hoX3NuZF93cml0ZV9kZXYoZGV2X2hhbmRsZSwgSElEX1RSQU5TX1NFVF9SRVBPUlQsIHJfdHlwZSwgMCwgMCwgcF9kYXRhKTsKIH0KQEAgLTE5MCw5ICsxOTAsOSBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0hoR2V0UmVwb3J0KFVJTlQ4IGRldl9oYW5kbGUsIHRCVEFfSEhfUlBUX1RZUEUgcl90eXBlLCBVSU5UOCBycHRfaWQsIFVJTlQxNiBidWZfc2l6ZSkKK3ZvaWQgQlRBX0hoR2V0UmVwb3J0KHVpbnQ4X3QgZGV2X2hhbmRsZSwgdEJUQV9ISF9SUFRfVFlQRSByX3R5cGUsIHVpbnQ4X3QgcnB0X2lkLCB1aW50MTZfdCBidWZfc2l6ZSkKIHsKLSAgICBVSU5UOCBwYXJhbSA9IChidWZfc2l6ZSkgPyAocl90eXBlIHwgMHgwOCkgOiByX3R5cGU7CisgICAgdWludDhfdCBwYXJhbSA9IChidWZfc2l6ZSkgPyAocl90eXBlIHwgMHgwOCkgOiByX3R5cGU7CiAKICAgICBidGFfaGhfc25kX3dyaXRlX2RldihkZXZfaGFuZGxlLCBISURfVFJBTlNfR0VUX1JFUE9SVCwgcGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSwgcnB0X2lkLCBOVUxMKTsKQEAgLTIwNiw5ICsyMDYsOSBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0hoU2V0UHJvdG9Nb2RlKFVJTlQ4IGRldl9oYW5kbGUsIHRCVEFfSEhfUFJPVE9fTU9ERSBwX3R5cGUpCit2b2lkIEJUQV9IaFNldFByb3RvTW9kZSh1aW50OF90IGRldl9oYW5kbGUsIHRCVEFfSEhfUFJPVE9fTU9ERSBwX3R5cGUpCiB7Ci0gICAgYnRhX2hoX3NuZF93cml0ZV9kZXYoZGV2X2hhbmRsZSwgSElEX1RSQU5TX1NFVF9QUk9UT0NPTCwgKFVJTlQ4KXBfdHlwZSwKKyAgICBidGFfaGhfc25kX3dyaXRlX2RldihkZXZfaGFuZGxlLCBISURfVFJBTlNfU0VUX1BST1RPQ09MLCAodWludDhfdClwX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBOVUxMKTsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMjAsNyArMjIwLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9IaEdldFByb3RvTW9kZShVSU5UOCBkZXZfaGFuZGxlKQordm9pZCBCVEFfSGhHZXRQcm90b01vZGUodWludDhfdCBkZXZfaGFuZGxlKQogewogICAgIGJ0YV9oaF9zbmRfd3JpdGVfZGV2KGRldl9oYW5kbGUsIEhJRF9UUkFOU19HRVRfUFJPVE9DT0wsIDAsIDAsIDAsIE5VTEwpOwogfQpAQCAtMjMzLDcgKzIzMyw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfSGhTZXRJZGxlKFVJTlQ4IGRldl9oYW5kbGUsIFVJTlQxNiBpZGxlX3JhdGUpCit2b2lkIEJUQV9IaFNldElkbGUodWludDhfdCBkZXZfaGFuZGxlLCB1aW50MTZfdCBpZGxlX3JhdGUpCiB7CiAgICAgYnRhX2hoX3NuZF93cml0ZV9kZXYoZGV2X2hhbmRsZSwgSElEX1RSQU5TX1NFVF9JRExFLCAwLCBpZGxlX3JhdGUsIDAsIE5VTEwpOwogfQpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfSGhHZXRJZGxlKFVJTlQ4IGRldl9oYW5kbGUpCit2b2lkIEJUQV9IaEdldElkbGUodWludDhfdCBkZXZfaGFuZGxlKQogewogICAgIGJ0YV9oaF9zbmRfd3JpdGVfZGV2KGRldl9oYW5kbGUsIEhJRF9UUkFOU19HRVRfSURMRSwgMCwgMCwgMCwgTlVMTCk7CiB9CkBAIC0yNjAsOSArMjYwLDkgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9IaFNlbmRDdHJsKFVJTlQ4IGRldl9oYW5kbGUsIHRCVEFfSEhfVFJBTlNfQ1RSTF9UWVBFIGNfdHlwZSkKK3ZvaWQgQlRBX0hoU2VuZEN0cmwodWludDhfdCBkZXZfaGFuZGxlLCB0QlRBX0hIX1RSQU5TX0NUUkxfVFlQRSBjX3R5cGUpCiB7Ci0gICAgYnRhX2hoX3NuZF93cml0ZV9kZXYoZGV2X2hhbmRsZSwgSElEX1RSQU5TX0NPTlRST0wsIChVSU5UOCljX3R5cGUsIDAsIDAsIE5VTEwpOworICAgIGJ0YV9oaF9zbmRfd3JpdGVfZGV2KGRldl9oYW5kbGUsIEhJRF9UUkFOU19DT05UUk9MLCAodWludDhfdCljX3R5cGUsIDAsIDAsIE5VTEwpOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0yNzUsMjQgKzI3NSwyNCBAQAogKiogICAgICAgICAgICAgICAgICBwX2RhdGE6IGRhdGEgdG8gYmUgc2VudCBpbiB0aGUgREFUQSB0cmFuc2FjdGlvbjsgb3IKICoqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGF0YSB0byBiZSB3cml0ZSBpbnRvIHRoZSBPdXRwdXQgUmVwb3J0IG9mIGEgTEUgSElECiAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLiBUaGUgcmVwb3J0IGlzIGlkZW50aWZpZWQgdGhlIHJlcG9ydCBJRCB3aGljaCBpcwotKiogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgYnl0ZSAoVUlOVDggKikocF9idWYgKyAxKSArIHBfYnVmLT5vZmZzZXQuCisqKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBieXRlICh1aW50OF90ICopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0LgogKiogICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+bGF5ZXJfc3BlY2lmaWMgbmVlZHMgdG8gYmUgc2V0IHRvIHRoZSByZXBvcnQgdHlwZSwKICoqICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBjYW4gYmUgT1VUUFVUIHJlcG9ydCwgb3IgRkVBVFVSRSByZXBvcnQuCiAqKgogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0hoU2VuZERhdGEoVUlOVDggZGV2X2hhbmRsZSwgQkRfQUREUiBkZXZfYmRhLCBCVF9IRFIgICpwX2RhdGEpCit2b2lkIEJUQV9IaFNlbmREYXRhKHVpbnQ4X3QgZGV2X2hhbmRsZSwgQkRfQUREUiBkZXZfYmRhLCBCVF9IRFIgICpwX2RhdGEpCiB7CiAgICAgVU5VU0VEKGRldl9iZGEpOwotI2lmIChkZWZpbmVkIEJUQV9ISF9MRV9JTkNMVURFRCAmJiBCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRSkKKyNpZiAoQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUpCiAgICAgaWYgKHBfZGF0YS0+bGF5ZXJfc3BlY2lmaWMgIT0gQlRBX0hIX1JQVFRfT1VUUFVUKQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigiRVJST1IhIFdyb25nIHJlcG9ydCB0eXBlISBXcml0ZSBDb21tYW5kIG9ubHkgdmFsaWQgZm9yIG91dHB1dCByZXBvcnQhIik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAjZW5kaWYKLSAgICBidGFfaGhfc25kX3dyaXRlX2RldihkZXZfaGFuZGxlLCBISURfVFJBTlNfREFUQSwgKFVJTlQ4KXBfZGF0YS0+bGF5ZXJfc3BlY2lmaWMsIDAsIDAsIHBfZGF0YSk7CisgICAgYnRhX2hoX3NuZF93cml0ZV9kZXYoZGV2X2hhbmRsZSwgSElEX1RSQU5TX0RBVEEsICh1aW50OF90KXBfZGF0YS0+bGF5ZXJfc3BlY2lmaWMsIDAsIDAsIHBfZGF0YSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMDQsMTIgKzMwNCwxMiBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0hoR2V0RHNjcEluZm8oVUlOVDggZGV2X2hhbmRsZSkKK3ZvaWQgQlRBX0hoR2V0RHNjcEluZm8odWludDhfdCBkZXZfaGFuZGxlKQogewogICAgIEJUX0hEUiAqcF9idWYgPSAoQlRfSERSICopb3NpX2NhbGxvYyhzaXplb2YoQlRfSERSKSk7CiAKICAgICBwX2J1Zi0+ZXZlbnQgPSBCVEFfSEhfQVBJX0dFVF9EU0NQX0VWVDsKLSAgICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSAoVUlOVDE2KWRldl9oYW5kbGU7CisgICAgcF9idWYtPmxheWVyX3NwZWNpZmljID0gKHVpbnQxNl90KWRldl9oYW5kbGU7CiAKICAgICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwogfQpAQCAtMzI2LDggKzMyNiw4IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfSGhBZGREZXYoQkRfQUREUiBiZGEsIHRCVEFfSEhfQVRUUl9NQVNLIGF0dHJfbWFzaywgVUlOVDggc3ViX2NsYXNzLAotICAgICAgICAgICAgICAgICAgVUlOVDggYXBwX2lkLCB0QlRBX0hIX0RFVl9EU0NQX0lORk8gZHNjcF9pbmZvKQordm9pZCBCVEFfSGhBZGREZXYoQkRfQUREUiBiZGEsIHRCVEFfSEhfQVRUUl9NQVNLIGF0dHJfbWFzaywgdWludDhfdCBzdWJfY2xhc3MsCisgICAgICAgICAgICAgICAgICB1aW50OF90IGFwcF9pZCwgdEJUQV9ISF9ERVZfRFNDUF9JTkZPIGRzY3BfaW5mbykKIHsKICAgICBzaXplX3QgbGVuID0gc2l6ZW9mKHRCVEFfSEhfTUFJTlRfREVWKSArIGRzY3BfaW5mby5kZXNjcmlwdG9yLmRsX2xlbjsKICAgICB0QlRBX0hIX01BSU5UX0RFViAqcF9idWYgPSAodEJUQV9ISF9NQUlOVF9ERVYgKilvc2lfY2FsbG9jKGxlbik7CkBAIC0zMzYsNyArMzM2LDcgQEAKICAgICBwX2J1Zi0+c3ViX2V2ZW50ID0gQlRBX0hIX0FERF9ERVZfRVZUOwogICAgIHBfYnVmLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSBCVEFfSEhfSU5WQUxJRF9IQU5ETEU7CiAKLSAgICBwX2J1Zi0+YXR0cl9tYXNrID0gKFVJTlQxNikgYXR0cl9tYXNrOworICAgIHBfYnVmLT5hdHRyX21hc2sgPSAodWludDE2X3QpIGF0dHJfbWFzazsKICAgICBwX2J1Zi0+c3ViX2NsYXNzID0gc3ViX2NsYXNzOwogICAgIHBfYnVmLT5hcHBfaWQgPSBhcHBfaWQ7CiAgICAgYmRjcHkocF9idWYtPmJkYSwgYmRhKTsKQEAgLTM0NCw3ICszNDQsNyBAQAogICAgIG1lbWNweSgmcF9idWYtPmRzY3BfaW5mbywgJmRzY3BfaW5mbywgc2l6ZW9mKHRCVEFfSEhfREVWX0RTQ1BfSU5GTykpOwogICAgIGlmICggZHNjcF9pbmZvLmRlc2NyaXB0b3IuZGxfbGVuICE9IDAgJiYgZHNjcF9pbmZvLmRlc2NyaXB0b3IuZHNjX2xpc3QpIHsKICAgICAgICAgcF9idWYtPmRzY3BfaW5mby5kZXNjcmlwdG9yLmRsX2xlbiA9ICBkc2NwX2luZm8uZGVzY3JpcHRvci5kbF9sZW47Ci0gICAgICAgIHBfYnVmLT5kc2NwX2luZm8uZGVzY3JpcHRvci5kc2NfbGlzdCA9IChVSU5UOCAqKShwX2J1ZiArIDEpOworICAgICAgICBwX2J1Zi0+ZHNjcF9pbmZvLmRlc2NyaXB0b3IuZHNjX2xpc3QgPSAodWludDhfdCAqKShwX2J1ZiArIDEpOwogICAgICAgICBtZW1jcHkocF9idWYtPmRzY3BfaW5mby5kZXNjcmlwdG9yLmRzY19saXN0LAogICAgICAgICAgICAgICAgZHNjcF9pbmZvLmRlc2NyaXB0b3IuZHNjX2xpc3QsCiAgICAgICAgICAgICAgICBkc2NwX2luZm8uZGVzY3JpcHRvci5kbF9sZW4pOwpAQCAtMzY1LDE0ICszNjUsMTQgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9IaFJlbW92ZURldihVSU5UOCBkZXZfaGFuZGxlICkKK3ZvaWQgQlRBX0hoUmVtb3ZlRGV2KHVpbnQ4X3QgZGV2X2hhbmRsZSApCiB7CiAgICAgdEJUQV9ISF9NQUlOVF9ERVYgKnBfYnVmID0KICAgICAgICAgKHRCVEFfSEhfTUFJTlRfREVWICopb3NpX2NhbGxvYyhzaXplb2YodEJUQV9ISF9NQUlOVF9ERVYpKTsKIAogICAgIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfSEhfQVBJX01BSU5UX0RFVl9FVlQ7CiAgICAgcF9idWYtPnN1Yl9ldmVudCA9IEJUQV9ISF9STVZfREVWX0VWVDsKLSAgICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gKFVJTlQxNilkZXZfaGFuZGxlOworICAgIHBfYnVmLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSAodWludDE2X3QpZGV2X2hhbmRsZTsKIAogICAgIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7CiB9CkBAIC0zOTYsOCArMzk2LDggQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9IaFBhcnNlQm9vdFJwdCh0QlRBX0hIX0JPT1RfUlBUICpwX2RhdGEsIFVJTlQ4ICpwX3JlcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiByZXBvcnRfbGVuKQordm9pZCBCVEFfSGhQYXJzZUJvb3RScHQodEJUQV9ISF9CT09UX1JQVCAqcF9kYXRhLCB1aW50OF90ICpwX3JlcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlcG9ydF9sZW4pCiB7CiAgICAgcF9kYXRhLT5kZXZfdHlwZSA9IEJUQV9ISF9ERVZUX1VOS05PV047CiAKQEAgLTQwOCwxMiArNDA4LDEyIEBACiAgICAgICAgIHsKICAgICAgICAgY2FzZSBCVEFfSEhfS0VZQkRfUlBUX0lEOiAvKiBrZXkgYm9hcmQgcmVwb3J0IElEICovCiAgICAgICAgICAgICBwX2RhdGEtPmRldl90eXBlID0gcF9yZXBvcnRbMF07Ci0gICAgICAgICAgICBidGFfaGhfcGFyc2Vfa2V5YmRfcnB0KHBfZGF0YSwgcF9yZXBvcnQgKyAxLCAoVUlOVDE2KShyZXBvcnRfbGVuIC0xKSk7CisgICAgICAgICAgICBidGFfaGhfcGFyc2Vfa2V5YmRfcnB0KHBfZGF0YSwgcF9yZXBvcnQgKyAxLCAodWludDE2X3QpKHJlcG9ydF9sZW4gLTEpKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgQlRBX0hIX01PVVNFX1JQVF9JRDogLyogbW91c2UgcmVwb3J0IElEICovCiAgICAgICAgICAgICBwX2RhdGEtPmRldl90eXBlID0gcF9yZXBvcnRbMF07Ci0gICAgICAgICAgICBidGFfaGhfcGFyc2VfbWljZV9ycHQocF9kYXRhLCBwX3JlcG9ydCArIDEsIChVSU5UMTYpKHJlcG9ydF9sZW4gLSAxKSk7CisgICAgICAgICAgICBidGFfaGhfcGFyc2VfbWljZV9ycHQocF9kYXRhLCBwX3JlcG9ydCArIDEsICh1aW50MTZfdCkocmVwb3J0X2xlbiAtIDEpKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9idGEvaGgvYnRhX2hoX2ludC5oIGIvYnRhL2hoL2J0YV9oaF9pbnQuaAppbmRleCA1MTg5NGQ3Li4wNjRiMTg2IDEwMDY0NAotLS0gYS9idGEvaGgvYnRhX2hoX2ludC5oCisrKyBiL2J0YS9oaC9idGFfaGhfaW50LmgKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlICJ1dGwuaCIKICNpbmNsdWRlICJidGFfaGhfYXBpLmgiCiAKLSNpZiBCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRSkKICNpbmNsdWRlICJidGFfZ2F0dF9hcGkuaCIKICNlbmRpZgogCkBAIC00Miw3ICs0Miw3IEBACiAKICNpZiAoQlRBX0dBVFRfSU5DTFVERUQgPT0gRkFMU0UgfHwgQkxFX0lOQ0xVREVEID09IEZBTFNFKQogI3VuZGVmIEJUQV9ISF9MRV9JTkNMVURFRAotI2RlZmluZSBCVEFfSEhfTEVfSU5DTFVERUQgICAgICBGQUxTRQorI2RlZmluZSBCVEFfSEhfTEVfSU5DTFVERUQgICAgICBmYWxzZQogI2VuZGlmCiAKIC8qIHN0YXRlIG1hY2hpbmUgZXZlbnRzLCB0aGVzZSBldmVudHMgYXJlIGhhbmRsZWQgYnkgdGhlIHN0YXRlIG1hY2hpbmUgKi8KQEAgLTYwLDcgKzYwLDcgQEAKICAgICBCVEFfSEhfQVBJX0dFVF9EU0NQX0VWVCwKICAgICBCVEFfSEhfQVBJX01BSU5UX0RFVl9FVlQsCiAgICAgQlRBX0hIX09QRU5fQ01QTF9FVlQsCi0jaWYgKGRlZmluZWQgQlRBX0hIX0xFX0lOQ0xVREVEICYmIEJUQV9ISF9MRV9JTkNMVURFRCA9PSBUUlVFKQorI2lmIChCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRSkKICAgICBCVEFfSEhfR0FUVF9DTE9TRV9FVlQsCiAgICAgQlRBX0hIX0dBVFRfT1BFTl9FVlQsCiAgICAgQlRBX0hIX1NUQVJUX0VOQ19FVlQsCkBAIC03Nyw3ICs3Nyw3IEBACiAgICAgQlRBX0hIX0FQSV9ESVNBQkxFX0VWVCwKICAgICBCVEFfSEhfRElTQ19DTVBMX0VWVAogfTsKLXR5cGVkZWYgVUlOVDE2IHRCVEFfSEhfSU5UX0VWVDsgICAgICAgICAvKiBISUQgaG9zdCBpbnRlcm5hbCBldmVudHMgKi8KK3R5cGVkZWYgdWludDE2X3QgdEJUQV9ISF9JTlRfRVZUOyAgICAgICAgIC8qIEhJRCBob3N0IGludGVybmFsIGV2ZW50cyAqLwogCiAjZGVmaW5lIEJUQV9ISF9JTlZBTElEX0VWVCAgICAgIChCVEFfSEhfRElTQ19DTVBMX0VWVCArIDEpCiAKQEAgLTk2LDI1ICs5NiwyNSBAQAogICAgIEJUQV9ISF9JRExFX1NULAogICAgIEJUQV9ISF9XNF9DT05OX1NULAogICAgIEJUQV9ISF9DT05OX1NUCi0jaWYgKGRlZmluZWQgQlRBX0hIX0xFX0lOQ0xVREVEICYmIEJUQV9ISF9MRV9JTkNMVURFRCA9PSBUUlVFKQorI2lmIChCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRSkKICAgICAsQlRBX0hIX1c0X1NFQwogI2VuZGlmCiAgICAgLEJUQV9ISF9JTlZBTElEX1NUICAgIC8qIFVzZWQgdG8gY2hlY2sgaW52YWxpZCBzdGF0ZXMgYmVmb3JlIGV4ZWN1dGluZyBTTSBmdW5jdGlvbiAqLwogCiB9OwotdHlwZWRlZiBVSU5UOCB0QlRBX0hIX1NUQVRFOwordHlwZWRlZiB1aW50OF90IHRCVEFfSEhfU1RBVEU7CiAKIC8qIGRhdGEgc3RydWN0dXJlIHVzZWQgdG8gc2VuZCBhIGNvbW1hbmQvZGF0YSB0byBISUQgZGV2aWNlICovCiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJUX0hEUiAgICAgICAgICAgaGRyOwotICAgIFVJTlQ4ICAgICAgICAgICAgdF90eXBlOwotICAgIFVJTlQ4ICAgICAgICAgICAgcGFyYW07Ci0gICAgVUlOVDggICAgICAgICAgICBycHRfaWQ7Ci0jaWYgKGRlZmluZWQgQlRBX0hIX0xFX0lOQ0xVREVEICYmIEJUQV9ISF9MRV9JTkNMVURFRCA9PSBUUlVFKQotICAgIFVJTlQ4ICAgICAgICAgICAgc3J2Y19pZDsKKyAgICB1aW50OF90ICAgICAgICAgICAgdF90eXBlOworICAgIHVpbnQ4X3QgICAgICAgICAgICBwYXJhbTsKKyAgICB1aW50OF90ICAgICAgICAgICAgcnB0X2lkOworI2lmIChCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRSkKKyAgICB1aW50OF90ICAgICAgICAgICAgc3J2Y19pZDsKICNlbmRpZgotICAgIFVJTlQxNiAgICAgICAgICAgZGF0YTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgZGF0YTsKICAgICBCVF9IRFIgICAgICAgICAgICpwX2RhdGE7CiB9dEJUQV9ISF9DTURfREFUQTsKIApAQCAtMTIyLDggKzEyMiw4IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJUX0hEUiAgICAgICAgICAgICAgaGRyOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgc2VjX21hc2s7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVbQlRBX1NFUlZJQ0VfTkFNRV9MRU4rMV07CisgICAgdWludDhfdCAgICAgICAgICAgICAgIHNlY19tYXNrOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVbQlRBX1NFUlZJQ0VfTkFNRV9MRU4rMV07CiAgICAgdEJUQV9ISF9DQkFDSyAgICpwX2NiYWNrOwogfSB0QlRBX0hIX0FQSV9FTkFCTEU7CiAKQEAgLTEzMSw3ICsxMzEsNyBAQAogewogICAgIEJUX0hEUiAgICAgICAgICBoZHI7CiAgICAgQkRfQUREUiAgICAgICAgIGJkX2FkZHI7Ci0gICAgVUlOVDggICAgICAgICAgIHNlY19tYXNrOworICAgIHVpbnQ4X3QgICAgICAgICAgIHNlY19tYXNrOwogICAgIHRCVEFfSEhfUFJPVE9fTU9ERSAgbW9kZTsKIH10QlRBX0hIX0FQSV9DT05OOwogCkBAIC0xNDAsNyArMTQwLDcgQEAKIHsKICAgICBCVF9IRFIgICAgICAgICAgaGRyOwogICAgIEJEX0FERFIgICAgICAgICBhZGRyOwotICAgIFVJTlQzMiAgICAgICAgICBkYXRhOworICAgIHVpbnQzMl90ICAgICAgICAgIGRhdGE7CiAgICAgQlRfSERSICAgICAgICAgICpwX2RhdGE7CiB9dEJUQV9ISF9DQkFDS19EQVRBOwogCkBAIC0xNDgsMTggKzE0OCwxOCBAQAogewogICAgIEJUX0hEUiAgICAgICAgICAgICAgaGRyOwogICAgIEJEX0FERFIgICAgICAgICAgICAgYmRhOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgYXR0cl9tYXNrOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgc3ViX2V2ZW50OwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgc3ViX2NsYXNzOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgYXBwX2lkOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBhdHRyX21hc2s7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIHN1Yl9ldmVudDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgc3ViX2NsYXNzOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBhcHBfaWQ7CiAgICAgdEJUQV9ISF9ERVZfRFNDUF9JTkZPICAgICAgZHNjcF9pbmZvOwogfXRCVEFfSEhfTUFJTlRfREVWOwogCi0jaWYgQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUpCiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJUX0hEUiAgICAgICAgICAgICAgaGRyOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgY29ubl9pZDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgY29ubl9pZDsKICAgICB0QlRBX0dBVFRfUkVBU09OICAgIHJlYXNvbjsgICAgICAgICAvKiBkaXNjb25uZWN0IHJlYXNvbiBjb2RlLCBub3QgdXNlZnVsIHdoZW4gY29ubmVjdCBldmVudCBpcyByZXBvcnRlZCAqLwogCiB9dEJUQV9ISF9MRV9DTE9TRTsKQEAgLTE2Nyw4ICsxNjcsOCBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICAgICAgICAgIGhkcjsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIHNjYW5faW50OwotICAgIFVJTlQxNiAgICAgICAgICAgICAgc2Nhbl93aW47CisgICAgdWludDE2X3QgICAgICAgICAgICAgIHNjYW5faW50OworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBzY2FuX3dpbjsKIH10QlRBX0hIX1NDUFBfVVBEQVRFOwogI2VuZGlmCiAvKiB1bmlvbiBvZiBhbGwgZXZlbnQgZGF0YSB0eXBlcyAqLwpAQCAtMTgxLDcgKzE4MSw3IEBACiAgICAgdEJUQV9ISF9DQkFDS19EQVRBICAgICAgIGhpZF9jYmFjazsKICAgICB0QlRBX0hIX1NUQVRVUyAgICAgICAgICAgc3RhdHVzOwogICAgIHRCVEFfSEhfTUFJTlRfREVWICAgICAgICBhcGlfbWFpbnRkZXY7Ci0jaWYgQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUpCiAgICAgdEJUQV9ISF9MRV9DTE9TRSAgICAgICAgIGxlX2Nsb3NlOwogICAgIHRCVEFfR0FUVENfT1BFTiAgICAgICAgICBsZV9vcGVuOwogICAgIHRCVEFfSEhfU0NQUF9VUERBVEUgICAgICBsZV9zY3BwX3VwZGF0ZTsKQEAgLTE4OSwxOCArMTg5LDE4IEBACiAjZW5kaWYKIH0gdEJUQV9ISF9EQVRBOwogCi0jaWYgKGRlZmluZWQgQlRBX0hIX0xFX0lOQ0xVREVEICYmIEJUQV9ISF9MRV9JTkNMVURFRCA9PSBUUlVFKQorI2lmIChCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRSkKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgaW5kZXg7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgaW5fdXNlOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIHNydmNfaW5zdF9pZDsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBjaGFyX2luc3RfaWQ7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBpbmRleDsKKyAgICBib29sICAgICAgICAgICAgICAgICBpbl91c2U7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBzcnZjX2luc3RfaWQ7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBjaGFyX2luc3RfaWQ7CiAgICAgdEJUQV9ISF9SUFRfVFlQRSAgICAgICAgcnB0X3R5cGU7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgdXVpZDsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBycHRfaWQ7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgY2xpZW50X2NmZ19leGlzdDsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBjbGllbnRfY2ZnX3ZhbHVlOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgdXVpZDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIHJwdF9pZDsKKyAgICBib29sICAgICAgICAgICAgICAgICBjbGllbnRfY2ZnX2V4aXN0OworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgY2xpZW50X2NmZ192YWx1ZTsKIH10QlRBX0hIX0xFX1JQVDsKIAogI2lmbmRlZiBCVEFfSEhfTEVfUlBUX01BWApAQCAtMjA5LDI2ICsyMDksMjYgQEAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICBpbl91c2U7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgc3J2Y19pbnN0X2lkOworICAgIGJvb2wgICAgICAgICAgICAgICAgIGluX3VzZTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIHNydmNfaW5zdF9pZDsKICAgICB0QlRBX0hIX0xFX1JQVCAgICAgICAgICByZXBvcnRbQlRBX0hIX0xFX1JQVF9NQVhdOwogCi0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgcHJvdG9fbW9kZV9oYW5kbGU7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgY29udHJvbF9wb2ludF9oYW5kbGU7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICBwcm90b19tb2RlX2hhbmRsZTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIGNvbnRyb2xfcG9pbnRfaGFuZGxlOwogCi0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgZXhwbF9pbmNsX3NydmM7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgaW5jbF9zcnZjX2luc3Q7IC8qIGFzc3VtaW5nIG9ubHkgb25lIGluY2x1ZGVkIHNlcnZpY2UgOiBiYXR0ZXJ5IHNlcnZpY2UgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBjdXJfZXhwbF9jaGFyX2lkeDsgLyogY3VycmVudGx5IGRpc2NvdmVyaW5nIHNlcnZpY2UgaW5kZXggKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAqcnB0X21hcDsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBleHRfcnB0X3JlZjsKKyAgICBib29sICAgICAgICAgICAgICAgICBleHBsX2luY2xfc3J2YzsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIGluY2xfc3J2Y19pbnN0OyAvKiBhc3N1bWluZyBvbmx5IG9uZSBpbmNsdWRlZCBzZXJ2aWNlIDogYmF0dGVyeSBzZXJ2aWNlICovCisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBjdXJfZXhwbF9jaGFyX2lkeDsgLyogY3VycmVudGx5IGRpc2NvdmVyaW5nIHNlcnZpY2UgaW5kZXggKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICpycHRfbWFwOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgZXh0X3JwdF9yZWY7CiAgICAgdEJUQV9ISF9ERVZfREVTQ1IgICAgICAgZGVzY3JpcHRvcjsKIAogfXRCVEFfSEhfTEVfSElEX1NSVkM7CiAKIC8qIGNvbnZlcnQgYSBISUQgaGFuZGxlIHRvIHRoZSBMRSBDQiBpbmRleCAqLwogI2RlZmluZSBCVEFfSEhfR0VUX0xFX0NCX0lEWCh4KSAgICAgICAgICgoKHgpID4+IDQpIC0gMSkKLS8qIGNvbnZlcnQgYSBHQVRUIGNvbm5lY3Rpb24gSUQgdG8gSElEIGRldmljZSBoYW5kbGUsIGl0IGlzIHRoZSBoaSA0IGJpdHMgb2YgYSBVSU5UOCAqLwotI2RlZmluZSBCVEFfSEhfR0VUX0xFX0RFVl9IREwoeCkgICAgICAgIChVSU5UOCkoKCh4KSAgKyAxKSA8PCA0KQorLyogY29udmVydCBhIEdBVFQgY29ubmVjdGlvbiBJRCB0byBISUQgZGV2aWNlIGhhbmRsZSwgaXQgaXMgdGhlIGhpIDQgYml0cyBvZiBhIHVpbnQ4X3QgKi8KKyNkZWZpbmUgQlRBX0hIX0dFVF9MRV9ERVZfSERMKHgpICAgICAgICAodWludDhfdCkoKCh4KSAgKyAxKSA8PCA0KQogLyogY2hlY2sgdG8gc2VlIGlmIHRoIGVkZXZpY2UgaGFuZGxlIGlzIGEgTEUgZGV2aWNlIGhhbmRsZSAqLwogI2RlZmluZSBCVEFfSEhfSVNfTEVfREVWX0hETCh4KSAgICAgICAgKCh4KSAmIDB4ZjApCiAjZGVmaW5lIEJUQV9ISF9JU19MRV9ERVZfSERMX1ZBTElEKHgpICAoKCh4KT4+NCkgPD0gQlRBX0hIX0xFX01BWF9LTk9XTikKQEAgLTIzOSwxOSArMjM5LDE5IEBACiB7CiAgICAgdEJUQV9ISF9ERVZfRFNDUF9JTkZPICBkc2NwX2luZm87ICAgICAgLyogcmVwb3J0IGRlc2NyaXB0b3IgYW5kIERJIGluZm9ybWF0aW9uICovCiAgICAgQkRfQUREUiAgICAgICAgICAgICBhZGRyOyAgICAgICAgICAgLyogQkQtQWRkciBvZiB0aGUgSElEIGRldmljZSAqLwotICAgIFVJTlQxNiAgICAgICAgICAgICAgYXR0cl9tYXNrOyAgICAgIC8qIGF0dHJpYnV0ZSBtYXNrICovCi0gICAgVUlOVDE2ICAgICAgICAgICAgICB3NF9ldnQ7ICAgICAgICAgLyogVzRfaGFuZHNoYWtlIGV2ZW50IG5hbWUgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIGluZGV4OyAgICAgICAgICAvKiBpbmRleCBudW1iZXIgcmVmZXJlbmNlZCB0byBoYW5kbGUgaW5kZXggKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIHN1Yl9jbGFzczsgICAgICAvKiBDb2Qgc3ViIGNsYXNzICovCi0gICAgVUlOVDggICAgICAgICAgICAgICBzZWNfbWFzazsgICAgICAgLyogc2VjdXJpdHkgbWFzayAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgYXBwX2lkOyAgICAgICAgIC8qIGFwcGxpY2F0aW9uIElEIGZvciB0aGlzIGNvbm5lY3Rpb24gKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIGhpZF9oYW5kbGU7ICAgICAvKiBkZXZpY2UgaGFuZGxlIDogbG93IDQgYml0cyBmb3IgcmVndWxhciBISUQ6IEhJRF9IT1NUX01BWF9ERVZJQ0VTIGNhbiBub3QgZXhjZWVkIDE1OworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBhdHRyX21hc2s7ICAgICAgLyogYXR0cmlidXRlIG1hc2sgKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgdzRfZXZ0OyAgICAgICAgIC8qIFc0X2hhbmRzaGFrZSBldmVudCBuYW1lICovCisgICAgdWludDhfdCAgICAgICAgICAgICAgIGluZGV4OyAgICAgICAgICAvKiBpbmRleCBudW1iZXIgcmVmZXJlbmNlZCB0byBoYW5kbGUgaW5kZXggKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgc3ViX2NsYXNzOyAgICAgIC8qIENvZCBzdWIgY2xhc3MgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgc2VjX21hc2s7ICAgICAgIC8qIHNlY3VyaXR5IG1hc2sgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgYXBwX2lkOyAgICAgICAgIC8qIGFwcGxpY2F0aW9uIElEIGZvciB0aGlzIGNvbm5lY3Rpb24gKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgaGlkX2hhbmRsZTsgICAgIC8qIGRldmljZSBoYW5kbGUgOiBsb3cgNCBiaXRzIGZvciByZWd1bGFyIEhJRDogSElEX0hPU1RfTUFYX0RFVklDRVMgY2FuIG5vdCBleGNlZWQgMTU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoIDQgYml0cyBmb3IgTEUgSElEOiBHQVRUX01BWF9QSFlfQ0hBTk5FTCBjYW4gbm90IGV4Y2VlZCAxNSAqLwotICAgIEJPT0xFQU4gICAgICAgICAgICAgdnA7ICAgICAgICAgICAgIC8qIHZpcnR1YWxseSB1bnBsdWcgZmxhZyAqLwotICAgIEJPT0xFQU4gICAgICAgICAgICAgaW5fdXNlOyAgICAgICAgIC8qIGNvbnRyb2wgYmxvY2sgY3VycmVudGx5IGluIHVzZSAqLwotICAgIEJPT0xFQU4gICAgICAgICAgICAgaW5jb21pbmdfY29ubjsgIC8qIGlzIGluY29taW5nIGNvbm5lY3Rpb24/ICovCi0gICAgVUlOVDggICAgICAgICAgICAgICBpbmNvbWluZ19oaWRfaGFuZGxlOyAgLyogdGVtcG9yYXJ5IGhhbmRsZSBmb3IgaW5jb21pbmcgY29ubmVjdGlvbj8gKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgIG9wZW5lZDsgICAgICAgICAvKiBUUlVFIGlmIGRldmljZSBzdWNjZXNzZnVsbHkgb3BlbmVkIEhJRCBjb25uZWN0aW9uICovCisgICAgYm9vbCAgICAgICAgICAgICB2cDsgICAgICAgICAgICAgLyogdmlydHVhbGx5IHVucGx1ZyBmbGFnICovCisgICAgYm9vbCAgICAgICAgICAgICBpbl91c2U7ICAgICAgICAgLyogY29udHJvbCBibG9jayBjdXJyZW50bHkgaW4gdXNlICovCisgICAgYm9vbCAgICAgICAgICAgICBpbmNvbWluZ19jb25uOyAgLyogaXMgaW5jb21pbmcgY29ubmVjdGlvbj8gKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgaW5jb21pbmdfaGlkX2hhbmRsZTsgIC8qIHRlbXBvcmFyeSBoYW5kbGUgZm9yIGluY29taW5nIGNvbm5lY3Rpb24/ICovCisgICAgYm9vbCAgICAgICAgICAgICBvcGVuZWQ7ICAgICAgICAgLyogdHJ1ZSBpZiBkZXZpY2Ugc3VjY2Vzc2Z1bGx5IG9wZW5lZCBISUQgY29ubmVjdGlvbiAqLwogICAgIHRCVEFfSEhfUFJPVE9fTU9ERSAgbW9kZTsgICAgICAgICAgIC8qIHByb3RvY29sIG1vZGUgKi8KICAgICB0QlRBX0hIX1NUQVRFICAgICAgIHN0YXRlOyAgICAgICAgICAvKiBDQiBzdGF0ZSAqLwogCkBAIC0yNjEsMzMgKzI2MSwzMyBAQAogI2RlZmluZSBCVEFfSEhfTEVfRElTQ19ESVMgICAgICAweDAyCiAjZGVmaW5lIEJUQV9ISF9MRV9ESVNDX1NDUFMgICAgIDB4MDQKIAotICAgIFVJTlQ4ICAgICAgICAgICAgICAgZGlzY19hY3RpdmU7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIGRpc2NfYWN0aXZlOwogICAgIHRCVEFfSEhfU1RBVFVTICAgICAgc3RhdHVzOwogICAgIHRCVEFfR0FUVF9SRUFTT04gICAgcmVhc29uOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgaXNfbGVfZGV2aWNlOworICAgIGJvb2wgICAgICAgICAgICAgaXNfbGVfZGV2aWNlOwogICAgIHRCVEFfSEhfTEVfSElEX1NSVkMgaGlkX3NydmM7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBjb25uX2lkOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgaW5fYmdfY29ubjsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGNsdF9jZmdfaWR4OwotICAgIFVJTlQxNiAgICAgICAgICAgICAgc2Nhbl9yZWZyZXNoX2NoYXJfaGFuZGxlOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgc2Nwc19zdXBwb3J0ZWQ7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIGNvbm5faWQ7CisgICAgYm9vbCAgICAgICAgICAgICBpbl9iZ19jb25uOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBjbHRfY2ZnX2lkeDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgc2Nhbl9yZWZyZXNoX2NoYXJfaGFuZGxlOworICAgIGJvb2wgICAgICAgICAgICAgc2Nwc19zdXBwb3J0ZWQ7CiAKICNkZWZpbmUgQlRBX0hIX0xFX1NDUFNfTk9USUZZX05PTkUgICAgMAogI2RlZmluZSBCVEFfSEhfTEVfU0NQU19OT1RJRllfU1BUICAweDAxCiAjZGVmaW5lIEJUQV9ISF9MRV9TQ1BTX05PVElGWV9FTkIgIDB4MDIKLSAgICBVSU5UOCAgICAgICAgICAgICAgIHNjcHNfbm90aWZ5OyAgIC8qIHNjYW4gcmVmcmVzaCBzdXBwb3J0ZWQvbm90aWZpY2F0aW9uIGVuYWJsZWQgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgc2Nwc19ub3RpZnk7ICAgLyogc2NhbiByZWZyZXNoIHN1cHBvcnRlZC9ub3RpZmljYXRpb24gZW5hYmxlZCAqLwogI2VuZGlmCiAKLSAgICBCT09MRUFOICAgICAgICAgICAgIHNlY3VyaXR5X3BlbmRpbmc7CisgICAgYm9vbCAgICAgICAgICAgICBzZWN1cml0eV9wZW5kaW5nOwogfSB0QlRBX0hIX0RFVl9DQjsKIAogLyoga2V5IGJvYXJkIHBhcnNpbmcgY29udHJvbCBibG9jayAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBCT09MRUFOICAgICAgICAgICAgIG1vZF9rZXlbNF07IC8qIGN0cmwsIHNoaWZ0KHVwcGVyKSwgQWx0LCBHVUkgKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgIG51bV9sb2NrOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgY2Fwc19sb2NrOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgbGFzdF9yZXBvcnRbQlRBX0hIX01BWF9SUFRfQ0hBUlNdOworICAgIGJvb2wgICAgICAgICAgICAgbW9kX2tleVs0XTsgLyogY3RybCwgc2hpZnQodXBwZXIpLCBBbHQsIEdVSSAqLworICAgIGJvb2wgICAgICAgICAgICAgbnVtX2xvY2s7CisgICAgYm9vbCAgICAgICAgICAgICBjYXBzX2xvY2s7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIGxhc3RfcmVwb3J0W0JUQV9ISF9NQVhfUlBUX0NIQVJTXTsKIH0gdEJUQV9ISF9LQl9DQjsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzAyLDIxICszMDIsMjEgQEAKICAgICB0QlRBX0hIX0RFVl9DQiAgICAgICAgICBrZGV2W0JUQV9ISF9NQVhfREVWSUNFXTsgLyogZGV2aWNlIGNvbnRyb2wgYmxvY2sgKi8KICAgICB0QlRBX0hIX0RFVl9DQiogICAgICAgICBwX2N1cjsgICAgICAgICAgICAgIC8qIGN1cnJlbnQgZGV2aWNlIGNvbnRyb2wKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayBpZHgsIHVzZWQgaW4gc2RwICovCi0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgY2JfaW5kZXhbQlRBX0hIX01BWF9LTk9XTl07IC8qIG1haW50YWluIGEgQ0IgaW5kZXgKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIGNiX2luZGV4W0JUQV9ISF9NQVhfS05PV05dOyAvKiBtYWludGFpbiBhIENCIGluZGV4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCB0byBkZXYgaGFuZGxlICovCi0jaWYgKGRlZmluZWQgQlRBX0hIX0xFX0lOQ0xVREVEICYmIEJUQV9ISF9MRV9JTkNMVURFRCA9PSBUUlVFKQotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIGxlX2NiX2luZGV4W0JUQV9ISF9NQVhfREVWSUNFXTsgLyogbWFpbnRhaW4gYSBDQiBpbmRleCBtYXAgdG8gTEUgZGV2IGhhbmRsZSAqLworI2lmIChCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRSkKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIGxlX2NiX2luZGV4W0JUQV9ISF9NQVhfREVWSUNFXTsgLyogbWFpbnRhaW4gYSBDQiBpbmRleCBtYXAgdG8gTEUgZGV2IGhhbmRsZSAqLwogICAgIHRCVEFfR0FUVENfSUYgICAgICAgICAgIGdhdHRfaWY7CiAjZW5kaWYKICAgICB0QlRBX0hIX0NCQUNLICAgICAgICpwX2NiYWNrOyAgICAgICAgICAgICAgIC8qIEFwcGxpY2F0aW9uIGNhbGxiYWNrcyAqLwogICAgIHRTRFBfRElTQ09WRVJZX0RCKiAgICAgIHBfZGlzY19kYjsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICB0cmFjZV9sZXZlbDsgICAgICAgICAgICAvKiB0cmFjaW5nIGxldmVsICovCi0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgY250X251bTsgICAgICAgICAgICAgICAgLyogY29ubmVjdGVkIGRldmljZSBudW1iZXIgKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICB3NF9kaXNhYmxlOyAgICAgICAgICAgICAvKiB3NCBkaXNhYmxlIGZsYWcgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIHRyYWNlX2xldmVsOyAgICAgICAgICAgIC8qIHRyYWNpbmcgbGV2ZWwgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIGNudF9udW07ICAgICAgICAgICAgICAgIC8qIGNvbm5lY3RlZCBkZXZpY2UgbnVtYmVyICovCisgICAgYm9vbCAgICAgICAgICAgICAgICAgdzRfZGlzYWJsZTsgICAgICAgICAgICAgLyogdzQgZGlzYWJsZSBmbGFnICovCiB9CiB0QlRBX0hIX0NCOwogCi0jaWYgQlRBX0RZTkFNSUNfTUVNT1JZID09IEZBTFNFCisjaWYgKEJUQV9EWU5BTUlDX01FTU9SWSA9PSBGQUxTRSkKIGV4dGVybiB0QlRBX0hIX0NCICBidGFfaGhfY2I7CiAjZWxzZQogZXh0ZXJuIHRCVEFfSEhfQ0IgKmJ0YV9oaF9jYl9wdHI7CkBAIC0zMjksOCArMzI5LDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiogIEZ1bmN0aW9uIHByb3RvdHlwZXMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIEJPT0xFQU4gYnRhX2hoX2hkbF9ldmVudChCVF9IRFIgKnBfbXNnKTsKLWV4dGVybiB2b2lkIGJ0YV9oaF9zbV9leGVjdXRlKHRCVEFfSEhfREVWX0NCICpwX2NiLCBVSU5UMTYgZXZlbnQsCitleHRlcm4gYm9vbCBidGFfaGhfaGRsX2V2ZW50KEJUX0hEUiAqcF9tc2cpOworZXh0ZXJuIHZvaWQgYnRhX2hoX3NtX2V4ZWN1dGUodEJUQV9ISF9ERVZfQ0IgKnBfY2IsIHVpbnQxNl90IGV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ISF9EQVRBICpwX2RhdGEpOwogCiAvKiBhY3Rpb24gZnVuY3Rpb25zICovCkBAIC0zNDksNDEgKzM0OSw0MSBAQAogZXh0ZXJuIHZvaWQgYnRhX2hoX29wZW5fZmFpbHVyZSh0QlRBX0hIX0RFVl9DQiAqcF9jYiwgdEJUQV9ISF9EQVRBICpwX2RhdGEpOwogCiAvKiB1dGlsaXR5IGZ1bmN0aW9ucyAqLwotZXh0ZXJuIFVJTlQ4ICBidGFfaGhfZmluZF9jYihCRF9BRERSIGJkYSk7CitleHRlcm4gdWludDhfdCAgYnRhX2hoX2ZpbmRfY2IoQkRfQUREUiBiZGEpOwogZXh0ZXJuIHZvaWQgYnRhX2hoX3BhcnNlX2tleWJkX3JwdCh0QlRBX0hIX0JPT1RfUlBUICpwX2tiX2RhdGEsCi0gICAgICAgICAgICAgVUlOVDggKnBfcmVwb3J0LCBVSU5UMTYgcmVwb3J0X2xlbik7CisgICAgICAgICAgICAgdWludDhfdCAqcF9yZXBvcnQsIHVpbnQxNl90IHJlcG9ydF9sZW4pOwogZXh0ZXJuIHZvaWQgYnRhX2hoX3BhcnNlX21pY2VfcnB0KHRCVEFfSEhfQk9PVF9SUFQgKnBfa2JfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9yZXBvcnQsIFVJTlQxNiByZXBvcnRfbGVuKTsKLWV4dGVybiBCT09MRUFOIGJ0YV9oaF90b2Rfc3B0KHRCVEFfSEhfREVWX0NCICpwX2NiLFVJTlQ4IHN1Yl9jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9yZXBvcnQsIHVpbnQxNl90IHJlcG9ydF9sZW4pOworZXh0ZXJuIGJvb2wgYnRhX2hoX3RvZF9zcHQodEJUQV9ISF9ERVZfQ0IgKnBfY2IsdWludDhfdCBzdWJfY2xhc3MpOwogZXh0ZXJuIHZvaWQgYnRhX2hoX2NsZWFuX3VwX2tkZXYodEJUQV9ISF9ERVZfQ0IgKnBfY2IpOwogCi1leHRlcm4gdm9pZCBidGFfaGhfYWRkX2RldmljZV90b19saXN0KHRCVEFfSEhfREVWX0NCICpwX2NiLCBVSU5UOCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBhdHRyX21hc2ssCitleHRlcm4gdm9pZCBidGFfaGhfYWRkX2RldmljZV90b19saXN0KHRCVEFfSEhfREVWX0NCICpwX2NiLCB1aW50OF90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYXR0cl9tYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SElEX0RFVl9EU0NQX0lORk8gKnBfZHNjcF9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBzdWJfY2xhc3MsIFVJTlQxNiBtYXhfbGF0ZW5jeSwgVUlOVDE2IG1pbl90b3V0LCBVSU5UOCBhcHBfaWQpOwotZXh0ZXJuIHZvaWQgYnRhX2hoX3VwZGF0ZV9kaV9pbmZvKHRCVEFfSEhfREVWX0NCICpwX2NiLCBVSU5UMTYgdmVuZG9yX2lkLCBVSU5UMTYgcHJvZHVjdF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiB2ZXJzaW9uLCBVSU5UOCBmbGFnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzdWJfY2xhc3MsIHVpbnQxNl90IG1heF9sYXRlbmN5LCB1aW50MTZfdCBtaW5fdG91dCwgdWludDhfdCBhcHBfaWQpOworZXh0ZXJuIHZvaWQgYnRhX2hoX3VwZGF0ZV9kaV9pbmZvKHRCVEFfSEhfREVWX0NCICpwX2NiLCB1aW50MTZfdCB2ZW5kb3JfaWQsIHVpbnQxNl90IHByb2R1Y3RfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB2ZXJzaW9uLCB1aW50OF90IGZsYWcpOwogZXh0ZXJuIHZvaWQgYnRhX2hoX2NsZWFudXBfZGlzYWJsZSh0QlRBX0hIX1NUQVRVUyBzdGF0dXMpOwogCi1leHRlcm4gVUlOVDggYnRhX2hoX2Rldl9oYW5kbGVfdG9fY2JfaWR4KFVJTlQ4IGRldl9oYW5kbGUpOworZXh0ZXJuIHVpbnQ4X3QgYnRhX2hoX2Rldl9oYW5kbGVfdG9fY2JfaWR4KHVpbnQ4X3QgZGV2X2hhbmRsZSk7CiAKIC8qIGFjdGlvbiBmdW5jdGlvbnMgdXNlZCBvdXRzaWRlIHN0YXRlIG1hY2hpbmUgKi8KIGV4dGVybiB2b2lkIGJ0YV9oaF9hcGlfZW5hYmxlKHRCVEFfSEhfREFUQSAqcF9kYXRhKTsKIGV4dGVybiB2b2lkIGJ0YV9oaF9hcGlfZGlzYWJsZSh2b2lkKTsKIGV4dGVybiB2b2lkIGJ0YV9oaF9kaXNjX2NtcGwodm9pZCk7CiAKLWV4dGVybiB0QlRBX0hIX1NUQVRVUyBidGFfaGhfcmVhZF9zc3JfcGFyYW0oQkRfQUREUiBiZF9hZGRyLCBVSU5UMTYgKnBfbWF4X3Nzcl9sYXQsIFVJTlQxNiAqcF9taW5fc3NyX3RvdXQpOworZXh0ZXJuIHRCVEFfSEhfU1RBVFVTIGJ0YV9oaF9yZWFkX3Nzcl9wYXJhbShCRF9BRERSIGJkX2FkZHIsIHVpbnQxNl90ICpwX21heF9zc3JfbGF0LCB1aW50MTZfdCAqcF9taW5fc3NyX3RvdXQpOwogCiAvKiBmdW5jdGlvbnMgZm9yIExFIEhJRCAqLwogZXh0ZXJuIHZvaWQgYnRhX2hoX2xlX2VuYWJsZSh2b2lkKTsKLWV4dGVybiBCT09MRUFOIGJ0YV9oaF9sZV9pc19oaF9nYXR0X2lmKHRCVEFfR0FUVENfSUYgY2xpZW50X2lmKTsKK2V4dGVybiBib29sIGJ0YV9oaF9sZV9pc19oaF9nYXR0X2lmKHRCVEFfR0FUVENfSUYgY2xpZW50X2lmKTsKIGV4dGVybiB2b2lkIGJ0YV9oaF9sZV9kZXJlZ2lzdGVyKHZvaWQpOwotZXh0ZXJuIEJPT0xFQU4gYnRhX2hoX2lzX2xlX2RldmljZSh0QlRBX0hIX0RFVl9DQiAqcF9jYiwgQkRfQUREUiByZW1vdGVfYmRhKTsKK2V4dGVybiBib29sIGJ0YV9oaF9pc19sZV9kZXZpY2UodEJUQV9ISF9ERVZfQ0IgKnBfY2IsIEJEX0FERFIgcmVtb3RlX2JkYSk7CiBleHRlcm4gdm9pZCBidGFfaGhfbGVfb3Blbl9jb25uKHRCVEFfSEhfREVWX0NCICpwX2NiLCBCRF9BRERSIHJlbW90ZV9iZGEpOwogZXh0ZXJuIHZvaWQgYnRhX2hoX2xlX2FwaV9kaXNjX2FjdCh0QlRBX0hIX0RFVl9DQiAqcF9jYik7CiBleHRlcm4gdm9pZCBidGFfaGhfbGVfZ2V0X2RzY3BfYWN0KHRCVEFfSEhfREVWX0NCICpwX2NiKTsKIGV4dGVybiB2b2lkIGJ0YV9oaF9sZV93cml0ZV9kZXZfYWN0KHRCVEFfSEhfREVWX0NCICpwX2NiLCB0QlRBX0hIX0RBVEEgKnBfZGF0YSk7Ci1leHRlcm4gVUlOVDggYnRhX2hoX2xlX2FkZF9kZXZpY2UodEJUQV9ISF9ERVZfQ0IgKnBfY2IsIHRCVEFfSEhfTUFJTlRfREVWICpwX2Rldl9pbmZvKTsKK2V4dGVybiB1aW50OF90IGJ0YV9oaF9sZV9hZGRfZGV2aWNlKHRCVEFfSEhfREVWX0NCICpwX2NiLCB0QlRBX0hIX01BSU5UX0RFViAqcF9kZXZfaW5mbyk7CiBleHRlcm4gdm9pZCBidGFfaGhfbGVfcmVtb3ZlX2Rldl9iZ19jb25uKHRCVEFfSEhfREVWX0NCICpwX2NiKTsKIGV4dGVybiB2b2lkIGJ0YV9oaF9sZV9vcGVuX2ZhaWwodEJUQV9ISF9ERVZfQ0IgKnBfY2IsIHRCVEFfSEhfREFUQSAqcF9kYXRhKTsKIGV4dGVybiB2b2lkIGJ0YV9oaF9nYXR0X29wZW4odEJUQV9ISF9ERVZfQ0IgKnBfY2IsIHRCVEFfSEhfREFUQSAqcF9kYXRhKTsKQEAgLTQwMiw3ICs0MDIsNyBAQAogZXh0ZXJuIHZvaWQgYnRhX2hoX2xlX25vdGlmeV9lbmNfY21wbCh0QlRBX0hIX0RFVl9DQiAqcF9jYiwgdEJUQV9ISF9EQVRBICpwX2RhdGEpOwogZXh0ZXJuIHZvaWQgYnRhX2hoX2NpX2xvYWRfcnB0ICh0QlRBX0hIX0RFVl9DQiAqcF9jYiwgdEJUQV9ISF9EQVRBICpwX2J1Zik7CiAKLSNpZiBCVEFfSEhfREVCVUcKKyNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCiBleHRlcm4gdm9pZCBidGFfaGhfdHJhY2VfZGV2X2RiKHZvaWQpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2J0YS9oaC9idGFfaGhfbGUuY2MgYi9idGEvaGgvYnRhX2hoX2xlLmNjCmluZGV4IDFhOGFmYmUuLjc1MjIzN2QgMTAwNjQ0Ci0tLSBhL2J0YS9oaC9idGFfaGhfbGUuY2MKKysrIGIvYnRhL2hoL2J0YV9oaF9sZS5jYwpAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgImJ0YV9hcGkuaCIKICNpbmNsdWRlICJidGFfaGhfaW50LmgiCiAKLSNpZiAoZGVmaW5lZCBCVEFfSEhfTEVfSU5DTFVERUQgJiYgQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9ISF9MRV9JTkNMVURFRCA9PSBUUlVFKQogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKQEAgLTQ0LDcgKzQ0LDcgQEAKIHVzaW5nIHN0ZDo6dmVjdG9yOwogCiAjaWZuZGVmIEJUQV9ISF9MRV9SRUNPTk4KLSNkZWZpbmUgQlRBX0hIX0xFX1JFQ09OTiAgICBUUlVFCisjZGVmaW5lIEJUQV9ISF9MRV9SRUNPTk4gICAgdHJ1ZQogI2VuZGlmCiAKICNkZWZpbmUgQlRBX0hIX0FQUF9JRF9MRSAgICAgICAgICAgIDB4ZmYKQEAgLTU1LDcgKzU1LDcgQEAKICNkZWZpbmUgQlRBX0hIX0xFX1BST1RPX1JFUE9SVF9NT0RFICAgICAgMHgwMQogCiAjZGVmaW5lIEJUQV9MRV9ISURfUlRQX1VVSURfTUFYICAgICA1Ci1zdGF0aWMgY29uc3QgVUlOVDE2IGJ0YV9oaF91dWlkX3RvX3J0cF90eXBlW0JUQV9MRV9ISURfUlRQX1VVSURfTUFYXVsyXSA9CitzdGF0aWMgY29uc3QgdWludDE2X3QgYnRhX2hoX3V1aWRfdG9fcnRwX3R5cGVbQlRBX0xFX0hJRF9SVFBfVVVJRF9NQVhdWzJdID0KIHsKICAgICB7R0FUVF9VVUlEX0hJRF9SRVBPUlQsICAgICAgIEJUQV9ISF9SUFRUX0lOUFVUfSwKICAgICB7R0FUVF9VVUlEX0hJRF9CVF9LQl9JTlBVVCwgIEJUQV9ISF9SUFRUX0lOUFVUfSwKQEAgLTY2LDExICs2NiwxMSBAQAogCiAKIHN0YXRpYyB2b2lkIGJ0YV9oaF9nYXR0Y19jYWxsYmFjayh0QlRBX0dBVFRDX0VWVCBldmVudCwgdEJUQV9HQVRUQyAqcF9kYXRhKTsKLXN0YXRpYyB2b2lkIGJ0YV9oaF9sZV9hZGRfZGV2X2JnX2Nvbm4odEJUQV9ISF9ERVZfQ0IgKnBfY2IsIEJPT0xFQU4gY2hlY2tfYm9uZCk7CitzdGF0aWMgdm9pZCBidGFfaGhfbGVfYWRkX2Rldl9iZ19jb25uKHRCVEFfSEhfREVWX0NCICpwX2NiLCBib29sIGNoZWNrX2JvbmQpOwogLy9UT0RPKGpwYXdsb3dza2kpOiB1bmNvbW1lbnQgd2hlbiBmaXhlZAogLy8gc3RhdGljIHZvaWQgYnRhX2hoX3Byb2Nlc3NfY2FjaGVfcnB0ICh0QlRBX0hIX0RFVl9DQiAqcF9jYiwKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ISF9SUFRfQ0FDSEVfRU5UUlkgKnBfcnB0X2NhY2hlLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBudW1fcnB0KTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fcnB0KTsKIAogI2RlZmluZSBHQVRUX1JFQURfQ0hBUiAwCiAjZGVmaW5lIEdBVFRfUkVBRF9ERVNDIDEKQEAgLTc5LDggKzc5LDggQEAKIAogLyogSG9sZHMgcGVuZGluZyBHQVRUIG9wZXJhdGlvbnMgKi8KIHN0cnVjdCBnYXR0X29wZXJhdGlvbiB7Ci0gICAgVUlOVDggdHlwZTsKLSAgICBVSU5UMTYgaGFuZGxlOworICAgIHVpbnQ4X3QgdHlwZTsKKyAgICB1aW50MTZfdCBoYW5kbGU7CiAKICAgICAvKiB3cml0ZS1zcGVjaWZpYyBmaWVsZHMgKi8KICAgICB0QlRBX0dBVFRDX1dSSVRFX1RZUEUgd3JpdGVfdHlwZTsKQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgIGdhdHRfb3BfcXVldWVfZXhlY3V0aW5nLmVyYXNlKGNvbm5faWQpOwogfQogCi1zdGF0aWMgdm9pZCBnYXR0X2V4ZWN1dGVfbmV4dF9vcChVSU5UMTYgY29ubl9pZCkgeworc3RhdGljIHZvaWQgZ2F0dF9leGVjdXRlX25leHRfb3AodWludDE2X3QgY29ubl9pZCkgewogICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiIsIF9fZnVuY19fLCBjb25uX2lkKTsKICAgICBpZiAoZ2F0dF9vcF9xdWV1ZS5lbXB0eSgpKSB7CiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBvcCBxdWV1ZSBpcyBlbXB0eSIsIF9fZnVuY19fKTsKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICAgIGdhdHRfb3BzLnBvcF9mcm9udCgpOwogfQogCi1zdGF0aWMgdm9pZCBnYXR0X3F1ZXVlX3JlYWRfb3AoVUlOVDggb3BfdHlwZSwgVUlOVDE2IGNvbm5faWQsIFVJTlQxNiBoYW5kbGUpIHsKK3N0YXRpYyB2b2lkIGdhdHRfcXVldWVfcmVhZF9vcCh1aW50OF90IG9wX3R5cGUsIHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSkgewogICBnYXR0X29wZXJhdGlvbiBvcDsKICAgb3AudHlwZSA9IG9wX3R5cGU7CiAgIG9wLmhhbmRsZSA9IGhhbmRsZTsKQEAgLTE1NSw3ICsxNTUsNyBAQAogICBnYXR0X2V4ZWN1dGVfbmV4dF9vcChjb25uX2lkKTsKIH0KIAotc3RhdGljIHZvaWQgZ2F0dF9xdWV1ZV93cml0ZV9vcChVSU5UOCBvcF90eXBlLCBVSU5UMTYgY29ubl9pZCwgVUlOVDE2IGhhbmRsZSwKK3N0YXRpYyB2b2lkIGdhdHRfcXVldWVfd3JpdGVfb3AodWludDhfdCBvcF90eXBlLCB1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rvcjx1aW50OF90PiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9HQVRUQ19XUklURV9UWVBFIHdyaXRlX3R5cGUpIHsKICAgZ2F0dF9vcGVyYXRpb24gb3A7CkBAIC0xNjgsNyArMTY4LDcgQEAKICAgZ2F0dF9leGVjdXRlX25leHRfb3AoY29ubl9pZCk7CiB9CiAKLSNpZiBCVEFfSEhfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSEhfREVCVUcgPT0gVFJVRSkKIHN0YXRpYyBjb25zdCBjaGFyICpidGFfaGhfbGVfcnB0X25hbWVbNF0gPQogewogICAgICJVTktOT1dOIiwKQEAgLTIzMiw3ICsyMzIsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBjb25zdCBjaGFyICpidGFfaGhfdXVpZF90b19zdHIoVUlOVDE2IHV1aWQpCitzdGF0aWMgY29uc3QgY2hhciAqYnRhX2hoX3V1aWRfdG9fc3RyKHVpbnQxNl90IHV1aWQpCiB7CiAgICAgc3dpdGNoKHV1aWQpCiAgICAgewpAQCAtMjc4LDcgKzI3OCw3IEBACiB7CiAgICAgY2hhciAgICAgICBhcHBfbmFtZVtMRU5fVVVJRF8xMjggKyAxXTsKICAgICB0QlRfVVVJRCAgICBhcHBfdXVpZCA9IHtMRU5fVVVJRF8xMjgsezB9fTsKLSAgICBVSU5UOCAgICAgICB4eDsKKyAgICB1aW50OF90ICAgICAgIHh4OwogCiAgICAgYnRhX2hoX2NiLmdhdHRfaWYgPSBCVEFfR0FUVFNfSU5WQUxJRF9JRjsKIApAQCAtMzMwLDcgKzMzMCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHdoZXRoZXIgaXQgaXMgSEggR0FUVCBJRgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9oaF9sZV9pc19oaF9nYXR0X2lmKHRCVEFfR0FUVENfSUYgY2xpZW50X2lmKQorYm9vbCBidGFfaGhfbGVfaXNfaGhfZ2F0dF9pZih0QlRBX0dBVFRDX0lGIGNsaWVudF9pZikKIHsKICAgICByZXR1cm4gKGJ0YV9oaF9jYi5nYXR0X2lmID09IGNsaWVudF9pZik7CiB9CkBAIC0zNTksNyArMzU5LDcgQEAKICoqIFBhcmFtZXRlcnM6CiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX2hoX2lzX2xlX2RldmljZSh0QlRBX0hIX0RFVl9DQiAqcF9jYiwgQkRfQUREUiByZW1vdGVfYmRhKQorYm9vbCBidGFfaGhfaXNfbGVfZGV2aWNlKHRCVEFfSEhfREVWX0NCICpwX2NiLCBCRF9BRERSIHJlbW90ZV9iZGEpCiB7CiAgICAgcF9jYi0+aXNfbGVfZGV2aWNlID0gQlRNX1VzZUxlTGluayAocmVtb3RlX2JkYSk7CiAKQEAgLTM4MSw5ICszODEsOSBAQAogICAgIHBfY2ItPmhpZF9oYW5kbGUgPSBCVEFfSEhfR0VUX0xFX0RFVl9IREwocF9jYi0+aW5kZXgpOwogICAgIG1lbWNweShwX2NiLT5hZGRyLCByZW1vdGVfYmRhLCBCRF9BRERSX0xFTik7CiAgICAgYnRhX2hoX2NiLmxlX2NiX2luZGV4W0JUQV9ISF9HRVRfTEVfQ0JfSURYKHBfY2ItPmhpZF9oYW5kbGUpXSA9IHBfY2ItPmluZGV4OwotICAgIHBfY2ItPmluX3VzZSA9IFRSVUU7CisgICAgcF9jYi0+aW5fdXNlID0gdHJ1ZTsKIAotICAgIEJUQV9HQVRUQ19PcGVuKGJ0YV9oaF9jYi5nYXR0X2lmLCByZW1vdGVfYmRhLCBUUlVFLCBCVEFfR0FUVF9UUkFOU1BPUlRfTEUpOworICAgIEJUQV9HQVRUQ19PcGVuKGJ0YV9oaF9jYi5nYXR0X2lmLCByZW1vdGVfYmRhLCB0cnVlLCBCVEFfR0FUVF9UUkFOU1BPUlRfTEUpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzkzLDkgKzM5Myw5IEBACiAqKiBEZXNjcmlwdGlvbiAgICAgIFV0aWxpdHkgZnVuY3Rpb24gZmluZCBhIGRldmljZSBjb250cm9sIGJsb2NrIGJ5IGNvbm5lY3Rpb24gSUQuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSEhfREVWX0NCICogYnRhX2hoX2xlX2ZpbmRfZGV2X2NiX2J5X2Nvbm5faWQoVUlOVDE2IGNvbm5faWQpCit0QlRBX0hIX0RFVl9DQiAqIGJ0YV9oaF9sZV9maW5kX2Rldl9jYl9ieV9jb25uX2lkKHVpbnQxNl90IGNvbm5faWQpCiB7Ci0gICAgVUlOVDggICBpOworICAgIHVpbnQ4X3QgICBpOwogICAgIHRCVEFfSEhfREVWX0NCICpwX2Rldl9jYiA9ICZidGFfaGhfY2Iua2RldlswXTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBCVEFfSEhfTUFYX0RFVklDRTsgaSArKywgcF9kZXZfY2IgKyspCkBAIC00MTUsNyArNDE1LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB0QlRBX0hIX0RFVl9DQiAqIGJ0YV9oaF9sZV9maW5kX2Rldl9jYl9ieV9iZGEoQkRfQUREUiBiZGEpCiB7Ci0gICAgVUlOVDggICBpOworICAgIHVpbnQ4X3QgICBpOwogICAgIHRCVEFfSEhfREVWX0NCICpwX2Rldl9jYiA9ICZidGFfaGhfY2Iua2RldlswXTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBCVEFfSEhfTUFYX0RFVklDRTsgaSArKywgcF9kZXZfY2IgKyspCkBAIC00MzQsNyArNDM0LDcgQEAKICoqIERlc2NyaXB0aW9uICAgICAgZmluZCBISUQgc2VydmljZSBpbnN0YW5jZSBJRCBieSBiYXR0ZXJ5IHNlcnZpY2UgaW5zdGFuY2UgSUQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVUlOVDggYnRhX2hoX2xlX2ZpbmRfc2VydmljZV9pbnN0X2J5X2JhdHRlcnlfaW5zdF9pZCh0QlRBX0hIX0RFVl9DQiAqcF9jYiwgVUlOVDggYmFfaW5zdF9pZCkKK3VpbnQ4X3QgYnRhX2hoX2xlX2ZpbmRfc2VydmljZV9pbnN0X2J5X2JhdHRlcnlfaW5zdF9pZCh0QlRBX0hIX0RFVl9DQiAqcF9jYiwgdWludDhfdCBiYV9pbnN0X2lkKQogewogICAgIGlmIChwX2NiLT5oaWRfc3J2Yy5pbl91c2UgJiYKICAgICAgICAgcF9jYi0+aGlkX3NydmMuaW5jbF9zcnZjX2luc3QgPT0gYmFfaW5zdF9pZCkKQEAgLTQ1MywxMiArNDUzLDEyIEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHRCVEFfSEhfTEVfUlBUICogYnRhX2hoX2xlX2ZpbmRfcmVwb3J0X2VudHJ5KHRCVEFfSEhfREVWX0NCICpwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggIHNydmNfaW5zdF9pZCwgIC8qIHNlcnZpY2UgaW5zdGFuY2UgSUQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBycHRfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4ICBjaGFyX2luc3RfaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICBzcnZjX2luc3RfaWQsICAvKiBzZXJ2aWNlIGluc3RhbmNlIElEICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBycHRfdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgIGNoYXJfaW5zdF9pZCkKIHsKLSAgICBVSU5UOCAgIGk7Ci0gICAgVUlOVDggICBoaWRfaW5zdF9pZCA9IHNydmNfaW5zdF9pZDsKKyAgICB1aW50OF90ICAgaTsKKyAgICB1aW50OF90ICAgaGlkX2luc3RfaWQgPSBzcnZjX2luc3RfaWQ7CiAgICAgdEJUQV9ISF9MRV9SUFQgKnBfcnB0OwogCiAgICAgaWYgKHJwdF91dWlkID09IEdBVFRfVVVJRF9CQVRURVJZX0xFVkVMKQpAQCAtNDk0LDEzICs0OTQsMTMgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0hIX0xFX1JQVCAqIGJ0YV9oaF9sZV9maW5kX3JwdF9ieV9pZHR5cGUodEJUQV9ISF9MRV9SUFQqcF9oZWFkLCBVSU5UOCBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSEhfUlBUX1RZUEUgcl90eXBlLCBVSU5UOCBycHRfaWQpCit0QlRBX0hIX0xFX1JQVCAqIGJ0YV9oaF9sZV9maW5kX3JwdF9ieV9pZHR5cGUodEJUQV9ISF9MRV9SUFQqcF9oZWFkLCB1aW50OF90IG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ISF9SUFRfVFlQRSByX3R5cGUsIHVpbnQ4X3QgcnB0X2lkKQogewogICAgIHRCVEFfSEhfTEVfUlBUICpwX3JwdCA9IHBfaGVhZDsKLSAgICBVSU5UOCAgIGk7CisgICAgdWludDhfdCAgIGk7CiAKLSNpZiBCVEFfSEhfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSEhfREVCVUcgPT0gVFJVRSkKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGhfbGVfZmluZF9ycHRfYnlfaWR0eXBlOiByX3R5cGU6ICVkIHJwdF9pZDogJWQiLCByX3R5cGUsIHJwdF9pZCk7CiAjZW5kaWYKIApAQCAtNTMxLDExICs1MzEsMTEgQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdEJUQV9ISF9MRV9SUFQgKiBidGFfaGhfbGVfZmluZF9hbGxvY19yZXBvcnRfZW50cnkodEJUQV9ISF9ERVZfQ0IgKnBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBzcnZjX2luc3RfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgcnB0X3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAgaW5zdF9pZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3J2Y19pbnN0X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcnB0X3V1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICBpbnN0X2lkKQogewotICAgIFVJTlQ4ICAgaSwgaGlkX2luc3RfaWQgPSBzcnZjX2luc3RfaWQ7CisgICAgdWludDhfdCAgIGksIGhpZF9pbnN0X2lkID0gc3J2Y19pbnN0X2lkOwogICAgIHRCVEFfSEhfTEVfUlBUICpwX3JwdDsKIAogICAgIGlmIChycHRfdXVpZCA9PSBHQVRUX1VVSURfQkFUVEVSWV9MRVZFTCkKQEAgLTU1Niw3ICs1NTYsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIXBfcnB0LT5pbl91c2UpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcF9ycHQtPmluX3VzZSAgID0gVFJVRTsKKyAgICAgICAgICAgICAgICBwX3JwdC0+aW5fdXNlICAgPSB0cnVlOwogICAgICAgICAgICAgICAgIHBfcnB0LT5pbmRleCAgICA9IGk7CiAgICAgICAgICAgICAgICAgcF9ycHQtPnNydmNfaW5zdF9pZCA9IHNydmNfaW5zdF9pZDsKICAgICAgICAgICAgICAgICBwX3JwdC0+Y2hhcl9pbnN0X2lkID0gaW5zdF9pZDsKQEAgLTU4NSw5ICs1ODUsOSBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdEJUQV9HQVRUQ19ERVNDUklQVE9SICpmaW5kX2Rlc2NyaXB0b3JfYnlfc2hvcnRfdXVpZChVSU5UMTYgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IGNoYXJfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgc2hvcnRfdXVpZCkgeworc3RhdGljIHRCVEFfR0FUVENfREVTQ1JJUFRPUiAqZmluZF9kZXNjcmlwdG9yX2J5X3Nob3J0X3V1aWQodWludDE2X3QgY29ubl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY2hhcl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNob3J0X3V1aWQpIHsKICAgICBjb25zdCB0QlRBX0dBVFRDX0NIQVJBQ1RFUklTVElDICpwX2NoYXIgPQogICAgICAgICAgICAgICAgIEJUQV9HQVRUQ19HZXRDaGFyYWN0ZXJpc3RpYyhjb25uX2lkLCBjaGFyX2hhbmRsZSk7CiAKQEAgLTYxOCw3ICs2MTgsNyBAQAogKiogRGVzY3JpcHRpb24gICAgICByZWFkIGNoYXJhY3RlcmlzdGljIGRlc2NyaXB0b3IKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRCVEFfSEhfU1RBVFVTIGJ0YV9oaF9sZV9yZWFkX2NoYXJfZHNjcnB0KHRCVEFfSEhfREVWX0NCICpwX2NiLCBVSU5UMTYgY2hhcl9oYW5kbGUsIFVJTlQxNiBzaG9ydF91dWlkKQorc3RhdGljIHRCVEFfSEhfU1RBVFVTIGJ0YV9oaF9sZV9yZWFkX2NoYXJfZHNjcnB0KHRCVEFfSEhfREVWX0NCICpwX2NiLCB1aW50MTZfdCBjaGFyX2hhbmRsZSwgdWludDE2X3Qgc2hvcnRfdXVpZCkKIHsKICAgICBjb25zdCB0QlRBX0dBVFRDX0RFU0NSSVBUT1IgKnBfZGVzYyA9IGZpbmRfZGVzY3JpcHRvcl9ieV9zaG9ydF91dWlkKHBfY2ItPmNvbm5faWQsIGNoYXJfaGFuZGxlLCBzaG9ydF91dWlkKTsKICAgICBpZiAoIXBfZGVzYykKQEAgLTY0NCw3ICs2NDQsNyBAQAogICAgIGlmIChwX2RhdGEtPnN0YXR1cyA9PSBCVEFfR0FUVF9PSyAmJgogICAgICAgICBwX2RhdGEtPnBfdmFsdWUgJiYgcF9kYXRhLT5wX3ZhbHVlLT5sZW4gPT0gMikKICAgICB7Ci0gICAgICAgIFVJTlQ4ICpwcCA9IHBfZGF0YS0+cF92YWx1ZS0+cF92YWx1ZTsKKyAgICAgICAgdWludDhfdCAqcHAgPSBwX2RhdGEtPnBfdmFsdWUtPnBfdmFsdWU7CiAKICAgICAgICAgU1RSRUFNX1RPX1VJTlQ4KHBfcnB0LT5ycHRfaWQsIHBwKTsKICAgICAgICAgU1RSRUFNX1RPX1VJTlQ4KHBfcnB0LT5ycHRfdHlwZSwgcHApOwpAQCAtNjUyLDcgKzY1Miw3IEBACiAgICAgICAgIGlmIChwX3JwdC0+cnB0X3R5cGUgPiBCVEFfSEhfUlBUVF9GRUFUVVJFKSAvKiBpbnZhbGlkIHJlcG9ydCB0eXBlICovCiAgICAgICAgICAgICBwX3JwdC0+cnB0X3R5cGUgPSBCVEFfSEhfUlBUVF9SRVNSVjsKIAotI2lmIEJUQV9ISF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ISF9ERUJVRyA9PSBUUlVFKQogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcmVwb3J0IElEOiAlZCIsIF9fZnVuY19fLCBwX3JwdC0+cnB0X2lkKTsKICNlbmRpZgogICAgICAgICB0QlRBX0hIX1JQVF9DQUNIRV9FTlRSWSBycHRfZW50cnk7CkBAIC02OTcsMTAgKzY5NywxMCBAQAogICAgICAgYXNzdW1lIGl0J3MgYSAxNiBiaXRzIFVVSUQgKi8KICAgICBpZiAocF9kYXRhLT5zdGF0dXMgPT0gQlRBX0dBVFRfT0sgJiYKICAgICAgICAgcF9kYXRhLT5wX3ZhbHVlICYmIHBfZGF0YS0+cF92YWx1ZS0+bGVuID09IDIpIHsKLSAgICAgICAgVUlOVDggKnBwID0gcF9kYXRhLT5wX3ZhbHVlLT5wX3ZhbHVlOworICAgICAgICB1aW50OF90ICpwcCA9IHBfZGF0YS0+cF92YWx1ZS0+cF92YWx1ZTsKICAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihwX2Rldl9jYi0+aGlkX3NydmMuZXh0X3JwdF9yZWYsIHBwKTsKIAotI2lmIEJUQV9ISF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ISF9ERUJVRyA9PSBUUlVFKQogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogRXh0ZXJuYWwgUmVwb3J0IFJlZmVyZW5jZSBVVUlEIDB4JTA0eCIsIF9fZnVuY19fLAogICAgICAgICAgICAgICAgICAgICBwX2Rldl9jYi0+aGlkX3NydmMuZXh0X3JwdF9yZWYpOwogI2VuZGlmCkBAIC03MTcsMTEgKzcxNywxMSBAQAogKiogUGFyYW1ldGVyczoKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGhfbGVfcmVnaXN0ZXJfaW5wdXRfbm90aWYodEJUQV9ISF9ERVZfQ0IgKnBfZGV2X2NiLCBVSU5UOCBwcm90b19tb2RlLCBCT09MRUFOIHJlZ2lzdGVyX2JhKQordm9pZCBidGFfaGhfbGVfcmVnaXN0ZXJfaW5wdXRfbm90aWYodEJUQV9ISF9ERVZfQ0IgKnBfZGV2X2NiLCB1aW50OF90IHByb3RvX21vZGUsIGJvb2wgcmVnaXN0ZXJfYmEpCiB7CiAgICAgdEJUQV9ISF9MRV9SUFQgICpwX3JwdCA9ICZwX2Rldl9jYi0+aGlkX3NydmMucmVwb3J0WzBdOwogCi0jaWYgQlRBX0hIX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGJ0YV9oaF9sZV9yZWdpc3Rlcl9pbnB1dF9ub3RpZiBtb2RlOiAlZCIsIF9fZnVuY19fLCBwcm90b19tb2RlKTsKICNlbmRpZgogCkBAIC03OTAsMTYgKzc5MCwxNiBAQAogewogICAgIGlmICggcF9jYi0+ZGlzY19hY3RpdmUgPT0gQlRBX0hIX0xFX0RJU0NfTk9ORSkKICAgICB7Ci0jaWYgQlRBX0hIX0RFQlVHCisjaWYgKEJUQV9ISF9ERUJVRyA9PSBUUlVFKQogICAgICAgICBidGFfaGhfbGVfaGlkX3JlcG9ydF9kYmcocF9jYik7CiAjZW5kaWYKLSAgICAgICAgYnRhX2hoX2xlX3JlZ2lzdGVyX2lucHV0X25vdGlmKHBfY2IsIHBfY2ItPm1vZGUsIFRSVUUpOworICAgICAgICBidGFfaGhfbGVfcmVnaXN0ZXJfaW5wdXRfbm90aWYocF9jYiwgcF9jYi0+bW9kZSwgdHJ1ZSk7CiAgICAgICAgIGJ0YV9oaF9zbV9leGVjdXRlKHBfY2IsIEJUQV9ISF9PUEVOX0NNUExfRVZULCBOVUxMKTsKIAogI2lmIChCVEFfSEhfTEVfUkVDT05OID09IFRSVUUpCiAgICAgICAgIGlmIChwX2NiLT5zdGF0dXMgPT0gQlRBX0hIX09LKQogICAgICAgICB7Ci0gICAgICAgICAgICBidGFfaGhfbGVfYWRkX2Rldl9iZ19jb25uKHBfY2IsIFRSVUUpOworICAgICAgICAgICAgYnRhX2hoX2xlX2FkZF9kZXZfYmdfY29ubihwX2NiLCB0cnVlKTsKICAgICAgICAgfQogI2VuZGlmCiAgICAgfQpAQCAtODEzLDE0ICs4MTMsMTQgQEAKICoqICAgICAgICAgICAgICAgICAgYSBjaGFyYWN0ZXJpc3RpYwogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9oaF9sZV93cml0ZV9jaGFyX2NsdF9jZmcodEJUQV9ISF9ERVZfQ0IgKnBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggY2hhcl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IGNsdF9jZmdfdmFsdWUpCitib29sIGJ0YV9oaF9sZV93cml0ZV9jaGFyX2NsdF9jZmcodEJUQV9ISF9ERVZfQ0IgKnBfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjaGFyX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjbHRfY2ZnX3ZhbHVlKQogewogICAgIHRCVEFfR0FUVENfREVTQ1JJUFRPUiAqcF9kZXNjID0gZmluZF9kZXNjcmlwdG9yX2J5X3Nob3J0X3V1aWQocF9jYi0+Y29ubl9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfaGFuZGxlLCBHQVRUX1VVSURfQ0hBUl9DTElFTlRfQ09ORklHKTsKICAgICBpZiAoIXBfZGVzYykKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICB2ZWN0b3I8dWludDhfdD4gdmFsdWUoMik7CiAgICAgdWludDhfdCogcHRyID0gdmFsdWUuZGF0YSgpOwpAQCAtODI4LDcgKzgyOCw3IEBACiAKICAgICBnYXR0X3F1ZXVlX3dyaXRlX29wKEdBVFRfV1JJVEVfREVTQywgcF9jYi0+Y29ubl9pZCwgcF9kZXNjLT5oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUodmFsdWUpLCBCVEFfR0FUVENfVFlQRV9XUklURSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC04MzksOSArODM5LDkgQEAKICoqICAgICAgICAgICAgICAgICAgZW5hYmxlIGFsbCBpbnB1dCBub3RpZmljYXRpb24gdXBvbiBjb25uZWN0aW9uIG9wZW4uCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX2hoX2xlX3dyaXRlX3JwdF9jbHRfY2ZnKHRCVEFfSEhfREVWX0NCICpwX2NiLCBVSU5UOCBzcnZjX2luc3RfaWQpCitib29sIGJ0YV9oaF9sZV93cml0ZV9ycHRfY2x0X2NmZyh0QlRBX0hIX0RFVl9DQiAqcF9jYiwgdWludDhfdCBzcnZjX2luc3RfaWQpCiB7Ci0gICAgVUlOVDggICAgICAgICAgIGk7CisgICAgdWludDhfdCAgICAgICAgICAgaTsKICAgICB0QlRBX0hIX0xFX1JQVCAgKnBfcnB0ID0gJnBfY2ItPmhpZF9zcnZjLnJlcG9ydFtwX2NiLT5jbHRfY2ZnX2lkeF07CiAKICAgICBmb3IgKGkgPSBwX2NiLT5jbHRfY2ZnX2lkeDsgaSA8IEJUQV9ISF9MRV9SUFRfTUFYICYmIHBfcnB0LT5pbl91c2U7IGkgKyssIHBfcnB0ICsrKQpAQCAtODU0LDcgKzg1NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfR0FUVF9DTFRfQ09ORklHX05PVElGSUNBVElPTikpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcF9jYi0+Y2x0X2NmZ19pZHggPSBpOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtODY3LDcgKzg2Nyw3IEBACiAKICAgICAgICAgYnRhX2hoX2xlX29wZW5fY21wbChwX2NiKTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTg3Nyw3ICs4NzcsNyBAQAogKiogRGVzY3JpcHRpb24gICAgICBTZXQgcmVtb3RlIGRldmljZSBwcm90b2NvbCBtb2RlLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9oaF9sZV9zZXRfcHJvdG9jb2xfbW9kZSh0QlRBX0hIX0RFVl9DQiAqcF9jYiwgdEJUQV9ISF9QUk9UT19NT0RFIG1vZGUpCitib29sIGJ0YV9oaF9sZV9zZXRfcHJvdG9jb2xfbW9kZSh0QlRBX0hIX0RFVl9DQiAqcF9jYiwgdEJUQV9ISF9QUk9UT19NT0RFIG1vZGUpCiB7CiAgICAgdEJUQV9ISF9DQkRBVEEgICAgICBjYmFja19kYXRhOwogCkBAIC04OTgsNyArODk4LDcgQEAKICAgICAgICAgZWxzZQogICAgICAgICB7CiAgICAgICAgICAgICAvKiBpZiBzZXQgdG8gcmVwb3J0IG1vZGUsIG5lZWQgdG8gZGUtcmVnaXN0ZXIgYWxsIGlucHV0IHJlcG9ydCBub3RpZmljYXRpb24gKi8KLSAgICAgICAgICAgIGJ0YV9oaF9sZV9yZWdpc3Rlcl9pbnB1dF9ub3RpZihwX2NiLCBwX2NiLT5tb2RlLCBGQUxTRSk7CisgICAgICAgICAgICBidGFfaGhfbGVfcmVnaXN0ZXJfaW5wdXRfbm90aWYocF9jYiwgcF9jYi0+bW9kZSwgZmFsc2UpOwogICAgICAgICAgICAgY2JhY2tfZGF0YS5zdGF0dXMgPSBCVEFfSEhfT0s7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBfY2ItPnN0YXRlID09IEJUQV9ISF9XNF9DT05OX1NUKQpAQCAtOTY4LDcgKzk2OCw3IEBACiAgICAgLyogcGx1ZyBpbiB0aGUgUG5QIGluZm8gZm9yIHRoaXMgZGV2aWNlICovCiAgICAgaWYgKHBfZGlzX3ZhbHVlLT5hdHRyX21hc2sgJiBESVNfQVRUUl9QTlBfSURfQklUKQogICAgIHsKLSNpZiBCVEFfSEhfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSEhfREVCVUcgPT0gVFJVRSkKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiUGx1ZyBpbiBQblAgaW5mbzogcHJvZHVjdF9pZCA9ICUwMngsIHZlbmRvcl9pZCA9ICUwNHgsIHZlcnNpb24gPSAlMDR4IiwKICAgICAgICAgICAgICAgICBwX2Rpc192YWx1ZS0+cG5wX2lkLnByb2R1Y3RfaWQsCiAgICAgICAgICAgICAgICAgcF9kaXNfdmFsdWUtPnBucF9pZC52ZW5kb3JfaWQsCkBAIC0xMDI2LDcgKzEwMjYsNyBAQAogdm9pZCBidGFfaGhfbGVfZW5jcnlwdF9jYmFjayhCRF9BRERSIGJkX2FkZHIsIHRCVEFfR0FUVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcF9yZWZfZGF0YSwgdEJUTV9TVEFUVVMgcmVzdWx0KQogewotICAgIFVJTlQ4ICAgaWR4ID0gYnRhX2hoX2ZpbmRfY2IoYmRfYWRkcik7CisgICAgdWludDhfdCAgIGlkeCA9IGJ0YV9oaF9maW5kX2NiKGJkX2FkZHIpOwogICAgIHRCVEFfSEhfREVWX0NCICpwX2Rldl9jYjsKICAgICBVTlVTRUQocF9yZWZfZGF0YSk7CiAgICAgVU5VU0VEICh0cmFuc3BvcnQpOwpAQCAtMTA2OCw3ICsxMDY4LDcgQEAKICAgICAgICAgICAgIC8qIHN0YXJ0IGxvYWRpbmcgdGhlIGNhY2hlIGlmIG5vdCBpbiBzdGFjayAqLwogICAgICAgICAgICAgLy9UT0RPKGpwYXdsb3dza2kpOiBjYWNoZSBzdG9yYWdlIGlzIGJyb2tlbiwgZml4IGl0CiAgICAgICAgICAgICAvLyB0QlRBX0hIX1JQVF9DQUNIRV9FTlRSWSAgICAgKnBfcnB0X2NhY2hlOwotICAgICAgICAgICAgLy8gVUlOVDggICAgICAgICAgICAgICAgICAgICAgIG51bV9ycHQgPSAwOworICAgICAgICAgICAgLy8gdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgbnVtX3JwdCA9IDA7CiAgICAgICAgICAgICAvLyBpZiAoKHBfcnB0X2NhY2hlID0gYnRhX2hoX2xlX2NvX2NhY2hlX2xvYWQocF9jYi0+YWRkciwgJm51bV9ycHQsIHBfY2ItPmFwcF9pZCkpICE9IE5VTEwpCiAgICAgICAgICAgICAvLyB7CiAgICAgICAgICAgICAvLyAgICAgYnRhX2hoX3Byb2Nlc3NfY2FjaGVfcnB0KHBfY2IsIHBfcnB0X2NhY2hlLCBudW1fcnB0KTsKQEAgLTEwNzksNyArMTA3OSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBkaXNjb3ZlcnkgaGFzIGJlZW4gZG9uZSBmb3IgSElEIHNlcnZpY2UiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAvKiBjb25maWd1cmUgcHJvdG9jb2wgbW9kZSAqLwotICAgICAgICAgICAgaWYgKGJ0YV9oaF9sZV9zZXRfcHJvdG9jb2xfbW9kZShwX2NiLCBwX2NiLT5tb2RlKSA9PSBGQUxTRSkKKyAgICAgICAgICAgIGlmIChidGFfaGhfbGVfc2V0X3Byb3RvY29sX21vZGUocF9jYiwgcF9jYi0+bW9kZSkgPT0gZmFsc2UpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYnRhX2hoX2xlX29wZW5fY21wbChwX2NiKTsKICAgICAgICAgICAgIH0KQEAgLTEwOTQsNyArMTA5NCw3IEBACiAgICAgZWxzZQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigiJXMoKSAtIGVuY3J5cHRpb24gZmFpbGVkOyBzdGF0dXM9MHglMDR4LCByZWFzb249MHglMDR4IiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBfY2ItPnN0YXR1cywgcF9jYi0+cmVhc29uKTsKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9jYi0+c3RhdHVzLCBwX2NiLT5yZWFzb24pOwogICAgICAgICBpZiAoIShwX2NiLT5zdGF0dXMgPT0gQlRBX0hIX0VSUl9TRUMgJiYgcF9jYi0+cmVhc29uID09IEJUTV9FUlJfUFJPQ0VTU0lORykpCiAgICAgICAgICAgICBidGFfaGhfbGVfYXBpX2Rpc2NfYWN0KHBfY2IpOwogICAgIH0KQEAgLTExMTEsMTMgKzExMTEsMTMgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9oaF9sZV9ub3RpZnlfZW5jX2NtcGwodEJUQV9ISF9ERVZfQ0IgKnBfY2IsIHRCVEFfSEhfREFUQSAqcF9idWYpCiB7Ci0gICAgaWYgKHBfY2IgPT0gTlVMTCB8fCBwX2NiLT5zZWN1cml0eV9wZW5kaW5nID09IEZBTFNFIHx8CisgICAgaWYgKHBfY2IgPT0gTlVMTCB8fCBwX2NiLT5zZWN1cml0eV9wZW5kaW5nID09IGZhbHNlIHx8CiAgICAgICAgIHBfYnVmID09IE5VTEwgfHwgcF9idWYtPmxlX2VuY19jbXBsLmNsaWVudF9pZiAhPSBidGFfaGhfY2IuZ2F0dF9pZikKICAgICB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBwX2NiLT5zZWN1cml0eV9wZW5kaW5nID0gRkFMU0U7CisgICAgcF9jYi0+c2VjdXJpdHlfcGVuZGluZyA9IGZhbHNlOwogICAgIGJ0YV9oaF9zdGFydF9zZWN1cml0eShwX2NiLCBOVUxMKTsKIH0KIApAQCAtMTE1Miw3ICsxMTUyLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9oaF9zdGFydF9zZWN1cml0eSh0QlRBX0hIX0RFVl9DQiAqcF9jYiwgdEJUQV9ISF9EQVRBICpwX2J1ZikKIHsKLSAgICBVSU5UOCAgICAgICAgICAgc2VjX2ZsYWc9MDsKKyAgICB1aW50OF90ICAgICAgICAgICBzZWNfZmxhZz0wOwogICAgIHRCVE1fU0VDX0RFVl9SRUMgICpwX2Rldl9yZWM7CiAgICAgVU5VU0VEKHBfYnVmKTsKIApAQCAtMTE2Myw3ICsxMTYzLDcgQEAKICAgICAgICAgICAgIHBfZGV2X3JlYy0+c2VjX3N0YXRlID09IEJUTV9TRUNfU1RBVEVfQVVUSEVOVElDQVRJTkcpCiAgICAgICAgIHsKICAgICAgICAgICAgIC8qIGlmIHNlY3VyaXR5IGNvbGxpc2lvbiBoYXBwZW5lZCwgd2FpdCBmb3IgZW5jcnlwdGlvbiBkb25lICovCi0gICAgICAgICAgICBwX2NiLT5zZWN1cml0eV9wZW5kaW5nID0gVFJVRTsKKyAgICAgICAgICAgIHBfY2ItPnNlY3VyaXR5X3BlbmRpbmcgPSB0cnVlOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQpAQCAtMTIxMiw3ICsxMjEyLDcgQEAKIHZvaWQgYnRhX2hoX2dhdHRfb3Blbih0QlRBX0hIX0RFVl9DQiAqcF9jYiwgdEJUQV9ISF9EQVRBICpwX2J1ZikKIHsKICAgICB0QlRBX0dBVFRDX09QRU4gKnBfZGF0YSA9ICZwX2J1Zi0+bGVfb3BlbjsKLSAgICBVSU5UOCAgICAgICAgICAgKnAyOworICAgIHVpbnQ4X3QgICAgICAgICAgICpwMjsKICAgICB0SElEX1NUQVRVUyAgICAgc3RhdHVzID0gQlRBX0hIX0VSUjsKIAogICAgIC8qIGlmIHJlY2VpdmVkIGludmFsaWQgY2FsbGJhY2sgZGF0YSAsIGlnbm9yZSBpdCAqLwpAQCAtMTIyNyw4ICsxMjI3LDggQEAKIAogICAgIGlmIChwX2RhdGEtPnN0YXR1cyA9PSBCVEFfR0FUVF9PSykKICAgICB7Ci0gICAgICAgIHBfY2ItPmlzX2xlX2RldmljZSAgPSBUUlVFOwotICAgICAgICBwX2NiLT5pbl91c2UgICAgPSBUUlVFOworICAgICAgICBwX2NiLT5pc19sZV9kZXZpY2UgID0gdHJ1ZTsKKyAgICAgICAgcF9jYi0+aW5fdXNlICAgID0gdHJ1ZTsKICAgICAgICAgcF9jYi0+Y29ubl9pZCAgID0gcF9kYXRhLT5jb25uX2lkOwogICAgICAgICBwX2NiLT5oaWRfaGFuZGxlID0gQlRBX0hIX0dFVF9MRV9ERVZfSERMKHBfY2ItPmluZGV4KTsKIApAQCAtMTIzNiw3ICsxMjM2LDcgQEAKIAogICAgICAgICBnYXR0X29wX3F1ZXVlX2NsZWFuKHBfY2ItPmNvbm5faWQpOwogCi0jaWYgQlRBX0hIX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImhpZF9oYW5kbGUgPSAlMnggY29ubl9pZCA9ICUwNHggY2JfaW5kZXggPSAlZCIsIHBfY2ItPmhpZF9oYW5kbGUsIHBfY2ItPmNvbm5faWQsIHBfY2ItPmluZGV4KTsKICNlbmRpZgogCkBAIC0xMjYzLDE4ICsxMjYzLDE4IEBACiB2b2lkIGJ0YV9oaF9sZV9jbG9zZSh0QlRBX0dBVFRDX0NMT1NFICogcF9kYXRhKQogewogICAgIHRCVEFfSEhfREVWX0NCICpwX2Rldl9jYiA9IGJ0YV9oaF9sZV9maW5kX2Rldl9jYl9ieV9iZGEocF9kYXRhLT5yZW1vdGVfYmRhKTsKLSAgICBVSU5UMTYgIHNtX2V2ZW50ID0gQlRBX0hIX0dBVFRfQ0xPU0VfRVZUOworICAgIHVpbnQxNl90ICBzbV9ldmVudCA9IEJUQV9ISF9HQVRUX0NMT1NFX0VWVDsKIAogICAgIGlmIChwX2Rldl9jYiAhPSBOVUxMKSB7CiAgICAgICAgIHRCVEFfSEhfTEVfQ0xPU0UgKnBfYnVmID0KICAgICAgICAgICAgICh0QlRBX0hIX0xFX0NMT1NFICopb3NpX21hbGxvYyhzaXplb2YodEJUQV9ISF9MRV9DTE9TRSkpOwogICAgICAgICBwX2J1Zi0+aGRyLmV2ZW50ID0gc21fZXZlbnQ7Ci0gICAgICAgIHBfYnVmLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSAoVUlOVDE2KXBfZGV2X2NiLT5oaWRfaGFuZGxlOworICAgICAgICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gKHVpbnQxNl90KXBfZGV2X2NiLT5oaWRfaGFuZGxlOwogICAgICAgICBwX2J1Zi0+Y29ubl9pZCA9IHBfZGF0YS0+Y29ubl9pZDsKICAgICAgICAgcF9idWYtPnJlYXNvbiA9IHBfZGF0YS0+cmVhc29uOwogCiAgICAgICAgIHBfZGV2X2NiLT5jb25uX2lkID0gQlRBX0dBVFRfSU5WQUxJRF9DT05OX0lEOwotICAgICAgICBwX2Rldl9jYi0+c2VjdXJpdHlfcGVuZGluZyA9IEZBTFNFOworICAgICAgICBwX2Rldl9jYi0+c2VjdXJpdHlfcGVuZGluZyA9IGZhbHNlOwogICAgICAgICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwogICAgIH0KIH0KQEAgLTE0NzEsNyArMTQ3MSw3IEBACiAgICAgICAgICAgICBoYXZlX2hpZCA9IHRydWU7CiAKICAgICAgICAgICAgIC8qIGZvdW5kIEhJRCBwcmltYW1yeSBzZXJ2aWNlICovCi0gICAgICAgICAgICBwX2Rldl9jYi0+aGlkX3NydmMuaW5fdXNlID0gVFJVRTsKKyAgICAgICAgICAgIHBfZGV2X2NiLT5oaWRfc3J2Yy5pbl91c2UgPSB0cnVlOwogICAgICAgICAgICAgcF9kZXZfY2ItPmhpZF9zcnZjLnNydmNfaW5zdF9pZCA9IHNlcnZpY2UtPmhhbmRsZTsKICAgICAgICAgICAgIHBfZGV2X2NiLT5oaWRfc3J2Yy5wcm90b19tb2RlX2hhbmRsZSA9IDA7CiAgICAgICAgICAgICBwX2Rldl9jYi0+aGlkX3NydmMuY29udHJvbF9wb2ludF9oYW5kbGUgPSAwOwpAQCAtMTUyOCwxMSArMTUyOCwxMSBAQAogKiogUGFyYW1ldGVyczoKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGhfcmVhZF9iYXR0ZXJ5X2xldmVsX2NtcGwoVUlOVDggc3RhdHVzLCB0QlRBX0hIX0RFVl9DQiAqcF9kZXZfY2IsIHRCVEFfR0FUVENfUkVBRCAqcF9kYXRhKQordm9pZCBidGFfaGhfcmVhZF9iYXR0ZXJ5X2xldmVsX2NtcGwodWludDhfdCBzdGF0dXMsIHRCVEFfSEhfREVWX0NCICpwX2Rldl9jYiwgdEJUQV9HQVRUQ19SRUFEICpwX2RhdGEpCiB7CiAgICAgVU5VU0VEKHN0YXR1cyk7CiAgICAgVU5VU0VEKHBfZGF0YSk7Ci0gICAgcF9kZXZfY2ItPmhpZF9zcnZjLmV4cGxfaW5jbF9zcnZjID0gVFJVRTsKKyAgICBwX2Rldl9jYi0+aGlkX3NydmMuZXhwbF9pbmNsX3NydmMgPSB0cnVlOwogfQogCiAKQEAgLTE1NTIsMTEgKzE1NTIsMTEgQEAKICAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQgKiopJnBfc3J2Yy0+cnB0X21hcCk7CiAKICAgICBpZiAocF9kYXRhLT5wX3ZhbHVlLT5sZW4gPiAwKQotICAgICAgICBwX3NydmMtPnJwdF9tYXAgPSAoVUlOVDggKilvc2lfbWFsbG9jKHBfZGF0YS0+cF92YWx1ZS0+bGVuKTsKKyAgICAgICAgcF9zcnZjLT5ycHRfbWFwID0gKHVpbnQ4X3QgKilvc2lfbWFsbG9jKHBfZGF0YS0+cF92YWx1ZS0+bGVuKTsKIAogICAgIGlmIChwX3NydmMtPnJwdF9tYXAgIT0gTlVMTCkKICAgICB7Ci0gICAgICAgIFVJTlQ4ICpwcCA9IHBfZGF0YS0+cF92YWx1ZS0+cF92YWx1ZTsKKyAgICAgICAgdWludDhfdCAqcHAgPSBwX2RhdGEtPnBfdmFsdWUtPnBfdmFsdWU7CiAgICAgICAgIFNUUkVBTV9UT19BUlJBWShwX3NydmMtPnJwdF9tYXAsIHBwLCBwX2RhdGEtPnBfdmFsdWUtPmxlbik7CiAgICAgICAgIHBfc3J2Yy0+ZGVzY3JpcHRvci5kbF9sZW4gPSBwX2RhdGEtPnBfdmFsdWUtPmxlbjsKICAgICAgICAgcF9zcnZjLT5kZXNjcmlwdG9yLmRzY19saXN0ID0gcF9kZXZfY2ItPmhpZF9zcnZjLnJwdF9tYXA7CkBAIC0xNTc4LDcgKzE1NzgsNyBAQAogICAgIEJUX0hEUiAgICAgICAgICAgICAgKnBfYnVmID0gTlVMTDsKICAgICB0QlRBX0hIX0xFX1JQVCAgICAgICpwX3JwdDsKICAgICB0QlRBX0hIX0hTREFUQSAgICAgIGhzX2RhdGE7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAqcHAgOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAqcHAgOwogCiAgICAgaWYgKHBfZGV2X2NiLT53NF9ldnQgIT0gQlRBX0hIX0dFVF9SUFRfRVZUKQogICAgIHsKQEAgLTE2MDksNyArMTYwOSw3IEBACiAgICAgICAgICAgICBwX2J1Zi0+b2Zmc2V0ID0gMDsKIAogICAgICAgICAgICAgLyogYXR0YWNoIHJlcG9ydCBJRCBhcyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgcmVwb3J0IGJlZm9yZSBzZW5kaW5nIGl0IHRvIFVTQiBISUQgZHJpdmVyICovCi0gICAgICAgICAgICBwcCA9IChVSU5UOCopKHBfYnVmICsgMSk7CisgICAgICAgICAgICBwcCA9ICh1aW50OF90KikocF9idWYgKyAxKTsKICAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgcF9ycHQtPnJwdF9pZCk7CiAgICAgICAgICAgICBtZW1jcHkocHAsIHBfZGF0YS0+cF92YWx1ZS0+cF92YWx1ZSwgcF9kYXRhLT5wX3ZhbHVlLT5sZW4pOwogCkBAIC0xNjUyLDcgKzE2NTIsNyBAQAogCiAgICAgICAgIHBfZGV2X2NiLT5tb2RlID0gaHNfZGF0YS5yc3BfZGF0YS5wcm90b19tb2RlOwogICAgIH0KLSNpZiBCVEFfSEhfREVCVUcKKyNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiTEUgR0VUX1BST1RPQ09MIE1vZGUgPSBbJXNdIiwKICAgICAgICAgICAgICAgICAgICAgICAgIChoc19kYXRhLnJzcF9kYXRhLnByb3RvX21vZGUgPT0gQlRBX0hIX1BST1RPX1JQVF9NT0RFKT8gIlJlcG9ydCIgOiAiQm9vdCIpOwogI2VuZGlmCkBAIC0xNjc0LDExICsxNjc0LDExIEBACiB2b2lkIGJ0YV9oaF93NF9sZV9yZWFkX2NoYXJfY21wbCh0QlRBX0hIX0RFVl9DQiAqcF9kZXZfY2IsIHRCVEFfSEhfREFUQSAqcF9idWYpCiB7CiAgICAgdEJUQV9HQVRUQ19SRUFEICAgICAqIHBfZGF0YSA9ICh0QlRBX0dBVFRDX1JFQUQgKilwX2J1ZjsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICpwcCA7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICpwcCA7CiAKICAgICBjb25zdCB0QlRBX0dBVFRDX0NIQVJBQ1RFUklTVElDICpwX2NoYXIgPSBCVEFfR0FUVENfR2V0Q2hhcmFjdGVyaXN0aWMocF9kZXZfY2ItPmNvbm5faWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+aGFuZGxlKTsKLSAgICBVSU5UMTYgY2hhcl91dWlkID0gcF9jaGFyLT51dWlkLnV1LnV1aWQxNjsKKyAgICB1aW50MTZfdCBjaGFyX3V1aWQgPSBwX2NoYXItPnV1aWQudXUudXVpZDE2OwogCiAgICAgaWYgKGNoYXJfdXVpZCA9PSBHQVRUX1VVSURfQkFUVEVSWV9MRVZFTCkKICAgICB7CkBAIC0xNjg3LDggKzE2ODcsOCBAQAogICAgIGVsc2UgaWYgKGNoYXJfdXVpZCA9PSBHQVRUX1VVSURfR0FQX1BSRUZfQ09OTl9QQVJBTSkKICAgICB7CiAgICAgICAgIC8vVE9ETyhqcGF3bG93c2tpKTogdGhpcyBzaG91bGQgYmUgZG9uZSBieSBHQVAgcHJvZmlsZSwgcmVtb3ZlIHdoZW4gR0FQIGlzIGZpeGVkLgotICAgICAgICBVSU5UOCAqcHAgPSBwX2RhdGEtPnBfdmFsdWUtPnBfdmFsdWU7Ci0gICAgICAgIFVJTlQxNiBtaW4sIG1heCwgbGF0ZW5jeSwgdG91dDsKKyAgICAgICAgdWludDhfdCAqcHAgPSBwX2RhdGEtPnBfdmFsdWUtPnBfdmFsdWU7CisgICAgICAgIHVpbnQxNl90IG1pbiwgbWF4LCBsYXRlbmN5LCB0b3V0OwogICAgICAgICBTVFJFQU1fVE9fVUlOVDE2IChtaW4sIHBwKTsKICAgICAgICAgU1RSRUFNX1RPX1VJTlQxNiAobWF4LCBwcCk7CiAgICAgICAgIFNUUkVBTV9UT19VSU5UMTYgKGxhdGVuY3ksIHBwKTsKQEAgLTE3MjcsNyArMTcyNyw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogCiAgICAgICAgICAgICBkZWZhdWx0OgotI2lmIEJUQV9ISF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ISF9ERUJVRyA9PSBUUlVFKQogICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfRVJST1IoIlVuZXhwZWN0ZWQgcmVhZCAlcygweCUwNHgpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2hoX3V1aWRfdG9fc3RyKGNoYXJfdXVpZCksIGNoYXJfdXVpZCk7CiAjZW5kaWYKQEAgLTE3MzYsNyArMTczNiw3IEBACiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7Ci0jaWYgQlRBX0hIX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCiAgICAgICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKCJyZWFkIHV1aWQgJXNbMHglMDR4XSBlcnJvcjogJWQiLCBidGFfaGhfdXVpZF90b19zdHIoY2hhcl91dWlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl91dWlkLCBwX2RhdGEtPnN0YXR1cyk7CiAjZWxzZQpAQCAtMTc2Miw3ICsxNzYyLDcgQEAKIAogICAgIGNvbnN0IHRCVEFfR0FUVENfQ0hBUkFDVEVSSVNUSUMgKnBfY2hhciA9IEJUQV9HQVRUQ19HZXRDaGFyYWN0ZXJpc3RpYyhwX2Rldl9jYi0+Y29ubl9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5oYW5kbGUpOwotICAgIFVJTlQxNiBjaGFyX3V1aWQgPSBwX2NoYXItPnV1aWQudXUudXVpZDE2OworICAgIHVpbnQxNl90IGNoYXJfdXVpZCA9IHBfY2hhci0+dXVpZC51dS51dWlkMTY7CiAKICAgICBzd2l0Y2ggKGNoYXJfdXVpZCkKICAgICB7CkBAIC0xNzk5LDcgKzE3OTksNyBAQAogewogICAgIHRCVEFfSEhfTEVfUlBUICAqcF9ycHQ7CiAgICAgdEJUQV9HQVRUQ19SRUFEICogcF9kYXRhID0gKHRCVEFfR0FUVENfUkVBRCAqKXBfYnVmOwotICAgIFVJTlQ4ICAgKnBwOworICAgIHVpbnQ4X3QgICAqcHA7CiAKICAgICBjb25zdCB0QlRBX0dBVFRDX0RFU0NSSVBUT1IgKnBfZGVzYyA9IEJUQV9HQVRUQ19HZXREZXNjcmlwdG9yKHBfZGF0YS0+Y29ubl9pZCwgcF9kYXRhLT5oYW5kbGUpOwogCkBAIC0xODMyLDcgKzE4MzIsNyBAQAogewogICAgIHRCVEFfSEhfTEVfUlBUICAqcF9ycHQ7CiAgICAgdEJUQV9HQVRUQ19SRUFEICogcF9kYXRhID0gKHRCVEFfR0FUVENfUkVBRCAqKXBfYnVmOwotICAgIFVJTlQxNiBjaGFyX3V1aWQxNjsKKyAgICB1aW50MTZfdCBjaGFyX3V1aWQxNjsKIAogICAgIGlmIChwX2RhdGEgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuOwpAQCAtMTg0Niw3ICsxODQ2LDcgQEAKIAogICAgIGNoYXJfdXVpZDE2ID0gcF9kZXNjLT5jaGFyYWN0ZXJpc3RpYy0+dXVpZC51dS51dWlkMTY7CiAKLSNpZiBCVEFfSEhfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSEhfREVCVUcgPT0gVFJVRSkKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGhfdzRfbGVfcmVhZF9kZXNjcl9jbXBsIHV1aWQ6ICVzKDB4JTA0eCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2hoX3V1aWRfdG9fc3RyKHBfZGVzYy0+dXVpZC51dS51dWlkMTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgcF9kZXNjLT51dWlkLnV1LnV1aWQxNik7CkBAIC0xOTIxLDcgKzE5MjEsNyBAQAogewogICAgIHRCVEFfR0FUVENfV1JJVEUgICAgKnBfZGF0YSA9ICh0QlRBX0dBVFRDX1dSSVRFICopcF9idWY7CiAgICAgdEJUQV9ISF9DQkRBVEEgICAgICBjYmFja19kYXRhIDsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIGNiX2V2dCA9IHBfZGV2X2NiLT53NF9ldnQ7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIGNiX2V2dCA9IHBfZGV2X2NiLT53NF9ldnQ7CiAKICAgICBpZiAocF9kYXRhID09IE5VTEwgIHx8IGNiX2V2dCA9PSAwKQogICAgICAgICByZXR1cm47CkBAIC0xOTI5LDcgKzE5MjksNyBAQAogICAgIGNvbnN0IHRCVEFfR0FUVENfQ0hBUkFDVEVSSVNUSUMgKnBfY2hhciA9IEJUQV9HQVRUQ19HZXRDaGFyYWN0ZXJpc3RpYyhwX2Rldl9jYi0+Y29ubl9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5oYW5kbGUpOwogCi0jaWYgQlRBX0hIX0RFQlVHCisjaWYgKEJUQV9ISF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9oaF9sZV93cml0ZV9jbXBsIHc0X2V2dDogJWQiLCBwX2Rldl9jYi0+dzRfZXZ0KTsKICNlbmRpZgogICAgIHN3aXRjaCAocF9jaGFyLT51dWlkLnV1LnV1aWQxNikKQEAgLTE5MzksNyArMTkzOSw3IEBACiAgICAgICAgIGNiYWNrX2RhdGEuaGFuZGxlICA9IHBfZGV2X2NiLT5oaWRfaGFuZGxlOwogICAgICAgICBpZiAocF9kYXRhLT5zdGF0dXMgPT0gQlRBX0dBVFRfT0spCiAgICAgICAgIHsKLSAgICAgICAgICAgIGJ0YV9oaF9sZV9yZWdpc3Rlcl9pbnB1dF9ub3RpZihwX2Rldl9jYiwgcF9kZXZfY2ItPm1vZGUsIEZBTFNFKTsKKyAgICAgICAgICAgIGJ0YV9oaF9sZV9yZWdpc3Rlcl9pbnB1dF9ub3RpZihwX2Rldl9jYiwgcF9kZXZfY2ItPm1vZGUsIGZhbHNlKTsKICAgICAgICAgICAgIGNiYWNrX2RhdGEuc3RhdHVzID0gQlRBX0hIX09LOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKQEAgLTE5NzcsMTMgKzE5NzcsMTMgQEAKIHZvaWQgYnRhX2hoX2xlX3dyaXRlX2NoYXJfZGVzY3JfY21wbCh0QlRBX0hIX0RFVl9DQiAqcF9kZXZfY2IsIHRCVEFfSEhfREFUQSAqcF9idWYpCiB7CiAgICAgdEJUQV9HQVRUQ19XUklURSAgICAqcF9kYXRhID0gKHRCVEFfR0FUVENfV1JJVEUgKilwX2J1ZjsKLSAgICBVSU5UOCAgIHNydmNfaW5zdF9pZCwgaGlkX2luc3RfaWQ7CisgICAgdWludDhfdCAgIHNydmNfaW5zdF9pZCwgaGlkX2luc3RfaWQ7CiAKICAgICBjb25zdCB0QlRBX0dBVFRDX0RFU0NSSVBUT1IgKnBfZGVzYyA9IEJUQV9HQVRUQ19HZXREZXNjcmlwdG9yKHBfZGV2X2NiLT5jb25uX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmhhbmRsZSk7CiAKLSAgICBVSU5UMTYgZGVzY191dWlkID0gcF9kZXNjLT51dWlkLnV1LnV1aWQxNjsKLSAgICBVSU5UMTYgY2hhcl91dWlkID0gcF9kZXNjLT5jaGFyYWN0ZXJpc3RpYy0+dXVpZC51dS51dWlkMTY7CisgICAgdWludDE2X3QgZGVzY191dWlkID0gcF9kZXNjLT51dWlkLnV1LnV1aWQxNjsKKyAgICB1aW50MTZfdCBjaGFyX3V1aWQgPSBwX2Rlc2MtPmNoYXJhY3RlcmlzdGljLT51dWlkLnV1LnV1aWQxNjsKICAgICAvKiBvbmx5IHdyaXRlIGNsaWVudCBjb25maWd1cmF0aW9uIHBvc3NpYmxlICovCiAgICAgaWYgKGRlc2NfdXVpZCA9PSBHQVRUX1VVSURfQ0hBUl9DTElFTlRfQ09ORklHKQogICAgIHsKQEAgLTIwMTEsNyArMjAxMSw3IEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0jaWYgQlRBX0hIX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCiAgICAgICAgIEFQUExfVFJBQ0VfRVJST1IoIlVuZXhwZWN0ZWQgd3JpdGUgdG8gJXMoMHglMDR4KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2hoX3V1aWRfdG9fc3RyKGRlc2NfdXVpZCksIGRlc2NfdXVpZCk7CiAjZWxzZQpAQCAtMjAzMyw4ICsyMDMzLDggQEAKIHZvaWQgYnRhX2hoX2xlX2lucHV0X3JwdF9ub3RpZnkodEJUQV9HQVRUQ19OT1RJRlkgKnBfZGF0YSkKIHsKICAgICB0QlRBX0hIX0RFVl9DQiAgICAgICAqcF9kZXZfY2IgPSBidGFfaGhfbGVfZmluZF9kZXZfY2JfYnlfY29ubl9pZChwX2RhdGEtPmNvbm5faWQpOwotICAgIFVJTlQ4ICAgICAgICAgICBhcHBfaWQ7Ci0gICAgVUlOVDggICAgICAgICAgICpwX2J1ZjsKKyAgICB1aW50OF90ICAgICAgICAgICBhcHBfaWQ7CisgICAgdWludDhfdCAgICAgICAgICAgKnBfYnVmOwogICAgIHRCVEFfSEhfTEVfUlBUICAqcF9ycHQ7CiAKICAgICBpZiAocF9kZXZfY2IgPT0gTlVMTCkKQEAgLTIwNjgsNyArMjA2OCw3IEBACiAgICAgLyogbmVlZCB0byBhcHBlbmQgcmVwb3J0IElEIHRvIHRoZSBoZWFkIG9mIGRhdGEgKi8KICAgICBpZiAocF9ycHQtPnJwdF9pZCAhPSAwKQogICAgIHsKLSAgICAgICAgcF9idWYgPSAoVUlOVDggKilvc2lfbWFsbG9jKHBfZGF0YS0+bGVuICsgMSk7CisgICAgICAgIHBfYnVmID0gKHVpbnQ4X3QgKilvc2lfbWFsbG9jKHBfZGF0YS0+bGVuICsgMSk7CiAKICAgICAgICAgcF9idWZbMF0gPSBwX3JwdC0+cnB0X2lkOwogICAgICAgICBtZW1jcHkoJnBfYnVmWzFdLCBwX2RhdGEtPnZhbHVlLCBwX2RhdGEtPmxlbik7CkBAIC0yMDc3LDcgKzIwNzcsNyBAQAogICAgICAgICBwX2J1ZiA9IHBfZGF0YS0+dmFsdWU7CiAgICAgfQogCi0gICAgYnRhX2hoX2NvX2RhdGEoKFVJTlQ4KXBfZGV2X2NiLT5oaWRfaGFuZGxlLAorICAgIGJ0YV9oaF9jb19kYXRhKCh1aW50OF90KXBfZGV2X2NiLT5oaWRfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICBwX2J1ZiwKICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5sZW4sCiAgICAgICAgICAgICAgICAgICAgIHBfZGV2X2NiLT5tb2RlLApAQCAtMjExMyw3ICsyMTEzLDcgQEAKICAgICAvKiBGYWlsdXJlIGluIG9wZW5pbmcgY29ubmVjdGlvbiBvciBHQVRUIGRpc2NvdmVyeSBmYWlsdXJlICovCiAgICAgY29ubl9kYXQuaGFuZGxlID0gcF9jYi0+aGlkX2hhbmRsZTsKICAgICBtZW1jcHkoY29ubl9kYXQuYmRhLCBwX2NiLT5hZGRyLCBCRF9BRERSX0xFTik7Ci0gICAgY29ubl9kYXQubGVfaGlkID0gVFJVRTsKKyAgICBjb25uX2RhdC5sZV9oaWQgPSB0cnVlOwogICAgIGNvbm5fZGF0LnNjcHNfc3VwcG9ydGVkID0gcF9jYi0+c2Nwc19zdXBwb3J0ZWQ7CiAKICAgICBpZiAocF9jYi0+c3RhdHVzID09IEJUQV9ISF9PSykKQEAgLTIxNTksNyArMjE1OSw3IEBACiAjaWYgKEJUQV9ISF9MRV9SRUNPTk4gPT0gVFJVRSkKICAgICBpZiAocF9kYXRhLT5sZV9jbG9zZS5yZWFzb24gPT0gQlRBX0dBVFRfQ09OTl9USU1FT1VUKQogICAgIHsKLSAgICAgICAgYnRhX2hoX2xlX2FkZF9kZXZfYmdfY29ubihwX2NiLCBGQUxTRSk7CisgICAgICAgIGJ0YV9oaF9sZV9hZGRfZGV2X2JnX2Nvbm4ocF9jYiwgZmFsc2UpOwogICAgIH0KICNlbmRpZgogICAgIH0KQEAgLTIxOTgsNyArMjE5OCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGhfbGVfZ2V0X3JwdCh0QlRBX0hIX0RFVl9DQiAqcF9jYiwgdEJUQV9ISF9SUFRfVFlQRSByX3R5cGUsIFVJTlQ4IHJwdF9pZCkKK3ZvaWQgYnRhX2hoX2xlX2dldF9ycHQodEJUQV9ISF9ERVZfQ0IgKnBfY2IsIHRCVEFfSEhfUlBUX1RZUEUgcl90eXBlLCB1aW50OF90IHJwdF9pZCkKIHsKICAgICB0QlRBX0hIX0xFX1JQVCAgKnBfcnB0ID0gYnRhX2hoX2xlX2ZpbmRfcnB0X2J5X2lkdHlwZShwX2NiLT5oaWRfc3J2Yy5yZXBvcnQsIHBfY2ItPm1vZGUsIHJfdHlwZSwgcnB0X2lkKTsKIApAQCAtMjIyMiwxMCArMjIyMiwxMCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2hoX2xlX3dyaXRlX3JwdCh0QlRBX0hIX0RFVl9DQiAqcF9jYiwKICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hIX1JQVF9UWVBFIHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIgKnBfYnVmLCBVSU5UMTYgdzRfZXZ0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIgKnBfYnVmLCB1aW50MTZfdCB3NF9ldnQgKQogewogICAgIHRCVEFfSEhfTEVfUlBUICAqcF9ycHQ7Ci0gICAgVUlOVDggcnB0X2lkOworICAgIHVpbnQ4X3QgcnB0X2lkOwogCiAgICAgaWYgKHBfYnVmID09IE5VTEwgfHwgcF9idWYtPmxlbiA9PSAwKQogICAgIHsKQEAgLTIyMzQsNyArMjIzNCw3IEBACiAgICAgfQogCiAgICAgLyogc3RyaXAgcmVwb3J0IElEIGZyb20gdGhlIGRhdGEgKi8KLSAgICB1aW50OF90ICp2ZWNfc3RhcnQgPSAoVUlOVDggKikocF9idWYgKyAxKSArIHBfYnVmLT5vZmZzZXQ7CisgICAgdWludDhfdCAqdmVjX3N0YXJ0ID0gKHVpbnQ4X3QgKikocF9idWYgKyAxKSArIHBfYnVmLT5vZmZzZXQ7CiAgICAgU1RSRUFNX1RPX1VJTlQ4KHJwdF9pZCwgdmVjX3N0YXJ0KTsKICAgICB2ZWN0b3I8dWludDhfdD4gdmFsdWUodmVjX3N0YXJ0LCB2ZWNfc3RhcnQgKyBwX2J1Zi0+bGVuIC0gMSk7CiAKQEAgLTIzNjQsMTAgKzIzNjQsMTAgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGhfbGVfYWRkX2Rldl9iZ19jb25uKHRCVEFfSEhfREVWX0NCICpwX2NiLCBCT09MRUFOIGNoZWNrX2JvbmQpCitzdGF0aWMgdm9pZCBidGFfaGhfbGVfYWRkX2Rldl9iZ19jb25uKHRCVEFfSEhfREVWX0NCICpwX2NiLCBib29sIGNoZWNrX2JvbmQpCiB7Ci0gICAgVUlOVDggICAgICAgICAgIHNlY19mbGFnPTA7Ci0gICAgQk9PTEVBTiAgICAgICAgIHRvX2FkZCA9IFRSVUU7CisgICAgdWludDhfdCAgICAgICAgICAgc2VjX2ZsYWc9MDsKKyAgICBib29sICAgICAgICAgdG9fYWRkID0gdHJ1ZTsKIAogICAgIGlmIChjaGVja19ib25kKQogICAgIHsKQEAgLTIzNzYsMTUgKzIzNzYsMTUgQEAKICAgICAgICAgQlRNX0dldFNlY3VyaXR5RmxhZ3NCeVRyYW5zcG9ydChwX2NiLT5hZGRyLCAmc2VjX2ZsYWcsIEJUX1RSQU5TUE9SVF9MRSk7CiAKICAgICAgICAgaWYgKChzZWNfZmxhZyAmIEJUTV9TRUNfRkxBR19MS0VZX0tOT1dOKSA9PSAwKQotICAgICAgICAgICAgdG9fYWRkID0gRkFMU0U7CisgICAgICAgICAgICB0b19hZGQgPSBmYWxzZTsKICAgICB9CiAKICAgICBpZiAoLypwX2NiLT5kc2NwX2luZm8uZmxhZyAmIEJUQV9ISF9MRV9OT1JNQUxfQ09OTiAmJiovCiAgICAgICAgICFwX2NiLT5pbl9iZ19jb25uICYmIHRvX2FkZCkKICAgICB7CiAgICAgICAgIC8qIGFkZCBkZXZpY2UgaW50byBCRyBjb25uZWN0aW9uIHRvIGFjY2VwdCByZW1vdGUgaW5pdGlhdGVkIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgQlRBX0dBVFRDX09wZW4oYnRhX2hoX2NiLmdhdHRfaWYsIHBfY2ItPmFkZHIsIEZBTFNFLCBCVEFfR0FUVF9UUkFOU1BPUlRfTEUpOwotICAgICAgICBwX2NiLT5pbl9iZ19jb25uID0gVFJVRTsKKyAgICAgICAgQlRBX0dBVFRDX09wZW4oYnRhX2hoX2NiLmdhdHRfaWYsIHBfY2ItPmFkZHIsIGZhbHNlLCBCVEFfR0FUVF9UUkFOU1BPUlRfTEUpOworICAgICAgICBwX2NiLT5pbl9iZ19jb25uID0gdHJ1ZTsKIAogICAgICAgICBCVEFfRG1CbGVTZXRCZ0Nvbm5UeXBlKEJUQV9ETV9CTEVfQ09OTl9BVVRPLCBOVUxMKTsKICAgICB9CkBAIC0yNDAxLDcgKzI0MDEsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVVJTlQ4IGJ0YV9oaF9sZV9hZGRfZGV2aWNlKHRCVEFfSEhfREVWX0NCICpwX2NiLCB0QlRBX0hIX01BSU5UX0RFViAqcF9kZXZfaW5mbykKK3VpbnQ4X3QgYnRhX2hoX2xlX2FkZF9kZXZpY2UodEJUQV9ISF9ERVZfQ0IgKnBfY2IsIHRCVEFfSEhfTUFJTlRfREVWICpwX2Rldl9pbmZvKQogewogICAgIHBfY2ItPmhpZF9oYW5kbGUgPSBCVEFfSEhfR0VUX0xFX0RFVl9IREwocF9jYi0+aW5kZXgpOwogICAgIGJ0YV9oaF9jYi5sZV9jYl9pbmRleFtCVEFfSEhfR0VUX0xFX0NCX0lEWChwX2NiLT5oaWRfaGFuZGxlKV0gPSBwX2NiLT5pbmRleDsKQEAgLTI0MjIsNyArMjQyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Rldl9pbmZvLT5kc2NwX2luZm8uc3NyX21pbl90b3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kZXZfaW5mby0+YXBwX2lkKTsKIAotICAgIGJ0YV9oaF9sZV9hZGRfZGV2X2JnX2Nvbm4ocF9jYiwgRkFMU0UpOworICAgIGJ0YV9oaF9sZV9hZGRfZGV2X2JnX2Nvbm4ocF9jYiwgZmFsc2UpOwogCiAgICAgcmV0dXJuIHBfY2ItPmhpZF9oYW5kbGU7CiB9CkBAIC0yNDQwLDkgKzI0NDAsOSBAQAogewogICAgIGlmIChwX2Rldl9jYi0+aW5fYmdfY29ubikKICAgICB7Ci0gICAgICAgIHBfZGV2X2NiLT5pbl9iZ19jb25uID0gRkFMU0U7CisgICAgICAgIHBfZGV2X2NiLT5pbl9iZ19jb25uID0gZmFsc2U7CiAKLSAgICAgICAgQlRBX0dBVFRDX0NhbmNlbE9wZW4oYnRhX2hoX2NiLmdhdHRfaWYsIHBfZGV2X2NiLT5hZGRyLCBGQUxTRSk7CisgICAgICAgIEJUQV9HQVRUQ19DYW5jZWxPcGVuKGJ0YV9oaF9jYi5nYXR0X2lmLCBwX2Rldl9jYi0+YWRkciwgZmFsc2UpOwogICAgIH0KIH0KIApAQCAtMjQ1OCw4ICsyNDU4LDggQEAKIHN0YXRpYyB2b2lkIGJ0YV9oaF9nYXR0Y19jYWxsYmFjayh0QlRBX0dBVFRDX0VWVCBldmVudCwgdEJUQV9HQVRUQyAqcF9kYXRhKQogewogICAgIHRCVEFfSEhfREVWX0NCICpwX2Rldl9jYjsKLSAgICBVSU5UMTYgICAgICAgICAgZXZ0OwotI2lmIEJUQV9ISF9ERUJVRworICAgIHVpbnQxNl90ICAgICAgICAgIGV2dDsKKyNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hoX2dhdHRjX2NhbGxiYWNrIGV2ZW50ID0gJWQiLCBldmVudCk7CiAjZW5kaWYKICAgICBpZiAocF9kYXRhID09IE5VTEwpCkBAIC0yNTQyLDExICsyNTQyLDExIEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGhfbGVfaGlkX3JlYWRfcnB0X2NsdF9jZmcoQkRfQUREUiBiZF9hZGRyLCBVSU5UOCBycHRfaWQpCit2b2lkIGJ0YV9oaF9sZV9oaWRfcmVhZF9ycHRfY2x0X2NmZyhCRF9BRERSIGJkX2FkZHIsIHVpbnQ4X3QgcnB0X2lkKQogewogICAgIHRCVEFfSEhfREVWX0NCICpwX2NiID0gTlVMTDsKICAgICB0QlRBX0hIX0xFX1JQVCAqcF9ycHQgOwotICAgIFVJTlQ4ICAgICAgICAgICBpbmRleCA9IEJUQV9ISF9JRFhfSU5WQUxJRDsKKyAgICB1aW50OF90ICAgICAgICAgICBpbmRleCA9IEJUQV9ISF9JRFhfSU5WQUxJRDsKIAogICAgIGluZGV4ID0gYnRhX2hoX2ZpbmRfY2IoYmRfYWRkcik7CiAgICAgaWYgKChpbmRleCA9IGJ0YV9oaF9maW5kX2NiKGJkX2FkZHIpKT09IEJUQV9ISF9JRFhfSU5WQUxJRCkKQEAgLTI1ODEsMTQgKzI1ODEsMTQgQEAKIC8vVE9ETyhqcGF3bG93c2tpKTogdW5jb21tZW50IHdoZW4gZml4ZWQKIC8vIHN0YXRpYyB2b2lkIGJ0YV9oaF9wcm9jZXNzX2NhY2hlX3JwdCAodEJUQV9ISF9ERVZfQ0IgKnBfY2IsCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSEhfUlBUX0NBQ0hFX0VOVFJZICpwX3JwdF9jYWNoZSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggbnVtX3JwdCkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fcnB0KQogLy8gewotLy8gICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICBpID0gMDsKKy8vICAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICBpID0gMDsKIC8vICAgICB0QlRBX0hIX0xFX1JQVCAgICAgICAgICAgICAgKnBfcnB0OwogCiAvLyAgICAgaWYgKG51bV9ycHQgIT0gMCkgIC8qIG5vIGNhY2hlIGlzIGZvdW5kICovCiAvLyAgICAgewotLy8gICAgICAgICBwX2NiLT5oaWRfc3J2Yy5pbl91c2UgPSBUUlVFOworLy8gICAgICAgICBwX2NiLT5oaWRfc3J2Yy5pbl91c2UgPSB0cnVlOwogCiAvLyAgICAgICAgIC8qIHNldCB0aGUgZGVzY3JpcHRvciBpbmZvICovCiAvLyAgICAgICAgIHBfY2ItPmhpZF9zcnZjLmRlc2NyaXB0b3IuZGxfbGVuID0KZGlmZiAtLWdpdCBhL2J0YS9oaC9idGFfaGhfbWFpbi5jYyBiL2J0YS9oaC9idGFfaGhfbWFpbi5jYwppbmRleCBiZDE5NjU5Li4xZDU2NWUwIDEwMDY0NAotLS0gYS9idGEvaGgvYnRhX2hoX21haW4uY2MKKysrIGIvYnRhL2hoL2J0YV9oaF9tYWluLmNjCkBAIC0yNCw3ICsyNCw3IEBACiAKICNpbmNsdWRlICJidF90YXJnZXQuaCIKIAotI2lmIGRlZmluZWQoQlRBX0hIX0lOQ0xVREVEKSAmJiAoQlRBX0hIX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9ISF9JTkNMVURFRCA9PSBUUlVFKQogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKQEAgLTUyLDcgKzUyLDcgQEAKICAgICBCVEFfSEhfTUFJTlRfREVWX0FDVCwKICAgICBCVEFfSEhfT1BFTl9DTVBMX0FDVCwKICAgICBCVEFfSEhfT1BFTl9GQUlMVVJFLAotI2lmIChkZWZpbmVkIEJUQV9ISF9MRV9JTkNMVURFRCAmJiBCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRSkKKyNpZiAoQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUpCiAgICAgQlRBX0hIX0dBVFRfQ0xPU0UsCiAgICAgQlRBX0hIX0xFX09QRU5fRkFJTCwKICAgICBCVEFfSEhfR0FUVF9PUEVOLApAQCAtOTEsNyArOTEsNyBAQAogICAgIGJ0YV9oaF9tYWludF9kZXZfYWN0LAogICAgIGJ0YV9oaF9vcGVuX2NtcGxfYWN0LAogICAgIGJ0YV9oaF9vcGVuX2ZhaWx1cmUKLSNpZiAoZGVmaW5lZCBCVEFfSEhfTEVfSU5DTFVERUQgJiYgQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9ISF9MRV9JTkNMVURFRCA9PSBUUlVFKQogICAgICxidGFfaGhfZ2F0dF9jbG9zZQogICAgICxidGFfaGhfbGVfb3Blbl9mYWlsCiAgICAgLGJ0YV9oaF9nYXR0X29wZW4KQEAgLTExNCw3ICsxMTQsNyBAQAogI2RlZmluZSBCVEFfSEhfTlVNX0NPTFMgICAgICAgICAgICAgICAgIDIgICAgICAgLyogbnVtYmVyIG9mIGNvbHVtbnMgKi8KIAogLyogc3RhdGUgdGFibGUgZm9yIGlkbGUgc3RhdGUgKi8KLWNvbnN0IFVJTlQ4IGJ0YV9oaF9zdF9pZGxlW11bQlRBX0hIX05VTV9DT0xTXSA9Citjb25zdCB1aW50OF90IGJ0YV9oaF9zdF9pZGxlW11bQlRBX0hIX05VTV9DT0xTXSA9CiB7CiAvKiBFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICAgICBOZXh0IHN0YXRlICovCiAvKiBCVEFfSEhfQVBJX09QRU5fRVZUICAgICAgKi8gICAge0JUQV9ISF9TVEFSVF9TRFAsICAgICBCVEFfSEhfVzRfQ09OTl9TVCB9LApAQCAtMTI5LDcgKzEyOSw3IEBACiAvKiBCVEFfSEhfQVBJX0dFVF9EU0NQX0VWVCAgKi8gICAge0JUQV9ISF9JR05PUkUsICAgICAgICBCVEFfSEhfSURMRV9TVCAgICB9LAogLyogQlRBX0hIX0FQSV9NQUlOVF9ERVZfRVZUICovICAgIHtCVEFfSEhfTUFJTlRfREVWX0FDVCwgQlRBX0hIX0lETEVfU1QgICAgfSwKIC8qIEJUQV9ISF9PUEVOX0NNUExfRVZUICAgICAgICAqLyAge0JUQV9ISF9PUEVOX0NNUExfQUNULCBCVEFfSEhfQ09OTl9TVCAgICB9Ci0jaWYgKGRlZmluZWQgQlRBX0hIX0xFX0lOQ0xVREVEICYmIEJUQV9ISF9MRV9JTkNMVURFRCA9PSBUUlVFKQorI2lmIChCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRSkKIC8qIEJUQV9ISF9HQVRUX0NMT1NFX0VWVCAgICAqLyAgICx7QlRBX0hIX0lHTk9SRSwgICAgICAgICBCVEFfSEhfSURMRV9TVCAgICB9CiAvKiBCVEFfSEhfR0FUVF9PUEVOX0VWVCAgICAqLyAgICAse0JUQV9ISF9HQVRUX09QRU4sICAgICAgQlRBX0hIX1c0X0NPTk5fU1QgfQogLyogQlRBX0hIX1NUQVJUX0VOQ19FVlQgICAgKi8gICAgLHtCVEFfSEhfSUdOT1JFLCAgICAgICAgIEJUQV9ISF9JRExFX1NUICAgIH0KQEAgLTE0NCw3ICsxNDQsNyBAQAogfTsKIAogCi1jb25zdCBVSU5UOCBidGFfaGhfc3RfdzRfY29ubltdW0JUQV9ISF9OVU1fQ09MU10gPQorY29uc3QgdWludDhfdCBidGFfaGhfc3RfdzRfY29ubltdW0JUQV9ISF9OVU1fQ09MU10gPQogewogLyogRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgTmV4dCBzdGF0ZSAqLwogLyogQlRBX0hIX0FQSV9PUEVOX0VWVCAgICAgICovICAgIHtCVEFfSEhfSUdOT1JFLCAgICAgICAgQlRBX0hIX1c0X0NPTk5fU1QgfSwKQEAgLTE1OSw3ICsxNTksNyBAQAogLyogQlRBX0hIX0FQSV9HRVRfRFNDUF9FVlQgICovICAgIHtCVEFfSEhfSUdOT1JFLCAgICAgICAgQlRBX0hIX1c0X0NPTk5fU1QgfSwKIC8qIEJUQV9ISF9BUElfTUFJTlRfREVWX0VWVCAqLyAgICB7QlRBX0hIX01BSU5UX0RFVl9BQ1QsIEJUQV9ISF9JRExFX1NUICAgIH0sCiAvKiBCVEFfSEhfT1BFTl9DTVBMX0VWVCAgICAgKi8gICAge0JUQV9ISF9PUEVOX0NNUExfQUNULCBCVEFfSEhfQ09OTl9TVCAgICB9Ci0jaWYgKGRlZmluZWQgQlRBX0hIX0xFX0lOQ0xVREVEICYmIEJUQV9ISF9MRV9JTkNMVURFRCA9PSBUUlVFKQorI2lmIChCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRSkKIC8qIEJUQV9ISF9HQVRUX0NMT1NFX0VWVCAgICAqLyAgICx7QlRBX0hIX0xFX09QRU5fRkFJTCwgIEJUQV9ISF9JRExFX1NUICAgIH0KIC8qIEJUQV9ISF9HQVRUX09QRU5fRVZUICAgICovICAgICx7QlRBX0hIX0dBVFRfT1BFTiwgICAgIEJUQV9ISF9XNF9DT05OX1NUIH0KIC8qIEJUQV9ISF9TVEFSVF9FTkNfRVZUICAgICovICAgICx7QlRBX0hIX1NUQVJUX1NFQywgICAgIEJUQV9ISF9XNF9TRUMgICAgIH0KQEAgLTE3Myw3ICsxNzMsNyBAQAogfTsKIAogCi1jb25zdCBVSU5UOCBidGFfaGhfc3RfY29ubmVjdGVkW11bQlRBX0hIX05VTV9DT0xTXSA9Citjb25zdCB1aW50OF90IGJ0YV9oaF9zdF9jb25uZWN0ZWRbXVtCVEFfSEhfTlVNX0NPTFNdID0KIHsKIC8qIEV2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgIE5leHQgc3RhdGUgKi8KIC8qIEJUQV9ISF9BUElfT1BFTl9FVlQgICAgICAqLyAgICB7QlRBX0hIX0lHTk9SRSwgICAgICAgIEJUQV9ISF9DT05OX1NUICAgIH0sCkBAIC0xODgsNyArMTg4LDcgQEAKIC8qIEJUQV9ISF9BUElfR0VUX0RTQ1BfRVZUICAqLyAgICB7QlRBX0hIX0dFVF9EU0NQX0FDVCwgIEJUQV9ISF9DT05OX1NUICAgIH0sCiAvKiBCVEFfSEhfQVBJX01BSU5UX0RFVl9FVlQgKi8gICAge0JUQV9ISF9NQUlOVF9ERVZfQUNULCBCVEFfSEhfQ09OTl9TVCAgICB9LAogLyogQlRBX0hIX09QRU5fQ01QTF9FVlQgICAgICAgICovICAgIHtCVEFfSEhfSUdOT1JFLCAgICAgICAgIEJUQV9ISF9DT05OX1NUICAgIH0KLSNpZiAoZGVmaW5lZCBCVEFfSEhfTEVfSU5DTFVERUQgJiYgQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9ISF9MRV9JTkNMVURFRCA9PSBUUlVFKQogLyogQlRBX0hIX0dBVFRfQ0xPU0VfRVZUICAgICovICAgICx7QlRBX0hIX0dBVFRfQ0xPU0UsICAgIEJUQV9ISF9JRExFX1NUICAgIH0KIC8qIEJUQV9ISF9HQVRUX09QRU5fRVZUICAgICovICAgICx7QlRBX0hIX0lHTk9SRSwgICAgICAgIEJUQV9ISF9DT05OX1NUICAgIH0KIC8qIEJUQV9ISF9TVEFSVF9FTkNfRVZUICAgICovICAgICx7QlRBX0hIX0lHTk9SRSwgICAgICAgIEJUQV9ISF9DT05OX1NUICAgICB9CkBAIC0yMDAsOCArMjAwLDggQEAKIC8qIEJUQV9ISF9HQVRUX0VOQ19DTVBMX0VWVCAqLyAgICx7QlRBX0hIX0lHTk9SRSwgICAgICAgIEJUQV9ISF9DT05OX1NUICAgICB9CiAjZW5kaWYKIH07Ci0jaWYgKGRlZmluZWQgQlRBX0hIX0xFX0lOQ0xVREVEICYmIEJUQV9ISF9MRV9JTkNMVURFRCA9PSBUUlVFKQotY29uc3QgVUlOVDggYnRhX2hoX3N0X3c0X3NlY1tdW0JUQV9ISF9OVU1fQ09MU10gPQorI2lmIChCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRSkKK2NvbnN0IHVpbnQ4X3QgYnRhX2hoX3N0X3c0X3NlY1tdW0JUQV9ISF9OVU1fQ09MU10gPQogewogLyogRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgTmV4dCBzdGF0ZSAqLwogLyogQlRBX0hIX0FQSV9PUEVOX0VWVCAgICAgICovICAgIHtCVEFfSEhfSUdOT1JFLCAgICAgICAgQlRBX0hIX1c0X1NFQyAgfSwKQEAgLTIyOSw3ICsyMjksNyBAQAogI2VuZGlmCiAKIC8qIHR5cGUgZm9yIHN0YXRlIHRhYmxlICovCi10eXBlZGVmIGNvbnN0IFVJTlQ4ICgqdEJUQV9ISF9TVF9UQkwpW0JUQV9ISF9OVU1fQ09MU107Cit0eXBlZGVmIGNvbnN0IHVpbnQ4X3QgKCp0QlRBX0hIX1NUX1RCTClbQlRBX0hIX05VTV9DT0xTXTsKIAogLyogc3RhdGUgdGFibGUgKi8KIGNvbnN0IHRCVEFfSEhfU1RfVEJMIGJ0YV9oaF9zdF90YmxbXSA9CkBAIC0yMzcsNyArMjM3LDcgQEAKICAgICBidGFfaGhfc3RfaWRsZSwKICAgICBidGFfaGhfc3RfdzRfY29ubiwKICAgICBidGFfaGhfc3RfY29ubmVjdGVkCi0jaWYgKGRlZmluZWQgQlRBX0hIX0xFX0lOQ0xVREVEICYmIEJUQV9ISF9MRV9JTkNMVURFRCA9PSBUUlVFKQorI2lmIChCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRSkKICAgICAsYnRhX2hoX3N0X3c0X3NlYwogI2VuZGlmCiB9OwpAQCAtMjQ1LDEzICsyNDUsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiogR2xvYmFsIGRhdGEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIEJUQV9EWU5BTUlDX01FTU9SWSA9PSBGQUxTRQorI2lmIChCVEFfRFlOQU1JQ19NRU1PUlkgPT0gRkFMU0UpCiB0QlRBX0hIX0NCICBidGFfaGhfY2I7CiAjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiogU3RhdGljIGZ1bmN0aW9ucwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgQlRBX0hIX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCiBzdGF0aWMgY29uc3QgY2hhciAqYnRhX2hoX2V2dF9jb2RlKHRCVEFfSEhfSU5UX0VWVCBldnRfY29kZSk7CiBzdGF0aWMgY29uc3QgY2hhciAqYnRhX2hoX3N0YXRlX2NvZGUodEJUQV9ISF9TVEFURSBzdGF0ZV9jb2RlKTsKICNlbmRpZgpAQCAtMjY2LDE1ICsyNjYsMTUgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oaF9zbV9leGVjdXRlKHRCVEFfSEhfREVWX0NCICpwX2NiLCBVSU5UMTYgZXZlbnQsIHRCVEFfSEhfREFUQSAqIHBfZGF0YSkKK3ZvaWQgYnRhX2hoX3NtX2V4ZWN1dGUodEJUQV9ISF9ERVZfQ0IgKnBfY2IsIHVpbnQxNl90IGV2ZW50LCB0QlRBX0hIX0RBVEEgKiBwX2RhdGEpCiB7CiAgICAgdEJUQV9ISF9TVF9UQkwgIHN0YXRlX3RhYmxlOwotICAgIFVJTlQ4ICAgICAgICAgICBhY3Rpb247CisgICAgdWludDhfdCAgICAgICAgICAgYWN0aW9uOwogICAgIHRCVEFfSEggICAgICAgICBjYmFja19kYXRhOwogICAgIHRCVEFfSEhfRVZUICAgICBjYmFja19ldmVudCA9IDA7Ci0jaWYgQlRBX0hIX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCiAgICAgdEJUQV9ISF9TVEFURSAgIGluX3N0YXRlIDsKLSAgICBVSU5UMTYgICAgICAgICAgZGVidWdfZXZlbnQgPSBldmVudDsKKyAgICB1aW50MTZfdCAgICAgICAgICBkZWJ1Z19ldmVudCA9IGV2ZW50OwogI2VuZGlmCiAKICAgICBtZW1zZXQoJmNiYWNrX2RhdGEsIDAsIHNpemVvZih0QlRBX0hIKSk7CkBAIC0zMDgsNyArMzA4LDcgQEAKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBjYmFja19kYXRhLmRldl9pbmZvLnN0YXR1cyAgICA9IEJUQV9ISF9FUlJfSERMOwotICAgICAgICAgICAgICAgICAgICBjYmFja19kYXRhLmRldl9pbmZvLmhhbmRsZSAgICA9IChVSU5UOClwX2RhdGEtPmFwaV9tYWludGRldi5oZHIubGF5ZXJfc3BlY2lmaWM7CisgICAgICAgICAgICAgICAgICAgIGNiYWNrX2RhdGEuZGV2X2luZm8uaGFuZGxlICAgID0gKHVpbnQ4X3QpcF9kYXRhLT5hcGlfbWFpbnRkZXYuaGRyLmxheWVyX3NwZWNpZmljOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQlRBX0hIX0FQSV9XUklURV9ERVZfRVZUOgpAQCAtMzIwLDEyICszMjAsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5hcGlfc25kY21kLnRfdHlwZSA9PSBISURfVFJBTlNfU0VUX0lETEUpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBjYmFja19kYXRhLmRldl9zdGF0dXMuc3RhdHVzID0gQlRBX0hIX0VSUl9IREw7Ci0gICAgICAgICAgICAgICAgICAgIGNiYWNrX2RhdGEuZGV2X3N0YXR1cy5oYW5kbGUgPSAoVUlOVDgpcF9kYXRhLT5hcGlfc25kY21kLmhkci5sYXllcl9zcGVjaWZpYzsKKyAgICAgICAgICAgICAgICAgICAgY2JhY2tfZGF0YS5kZXZfc3RhdHVzLmhhbmRsZSA9ICh1aW50OF90KXBfZGF0YS0+YXBpX3NuZGNtZC5oZHIubGF5ZXJfc3BlY2lmaWM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBfZGF0YS0+YXBpX3NuZGNtZC50X3R5cGUgIT0gSElEX1RSQU5TX0RBVEEgJiYKICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5hcGlfc25kY21kLnRfdHlwZSAhPSBISURfVFJBTlNfQ09OVFJPTCkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNiYWNrX2RhdGEuaHNfZGF0YS5oYW5kbGUgPSAoVUlOVDgpcF9kYXRhLT5hcGlfc25kY21kLmhkci5sYXllcl9zcGVjaWZpYzsKKyAgICAgICAgICAgICAgICAgICAgY2JhY2tfZGF0YS5oc19kYXRhLmhhbmRsZSA9ICh1aW50OF90KXBfZGF0YS0+YXBpX3NuZGNtZC5oZHIubGF5ZXJfc3BlY2lmaWM7CiAgICAgICAgICAgICAgICAgICAgIGNiYWNrX2RhdGEuaHNfZGF0YS5zdGF0dXMgPSBCVEFfSEhfRVJSX0hETDsKICAgICAgICAgICAgICAgICAgICAgLyogaHNfZGF0YS5yc3BfZGF0YSB3aWxsIGJlIGFsbCB6ZXJvLCB3aGljaCBpcyBub3QgdmFsaWQgdmFsdWUgKi8KICAgICAgICAgICAgICAgICB9CkBAIC0zNDMsNyArMzQzLDcgQEAKICAgICAgICAgICAgICAgICBjYmFja19ldmVudCA9IEJUQV9ISF9DTE9TRV9FVlQ7CiAKICAgICAgICAgICAgICAgICBjYmFja19kYXRhLmRldl9zdGF0dXMuc3RhdHVzID0gQlRBX0hIX0VSUl9IREw7Ci0gICAgICAgICAgICAgICAgY2JhY2tfZGF0YS5kZXZfc3RhdHVzLmhhbmRsZSA9IChVSU5UOClwX2RhdGEtPmFwaV9zbmRjbWQuaGRyLmxheWVyX3NwZWNpZmljOworICAgICAgICAgICAgICAgIGNiYWNrX2RhdGEuZGV2X3N0YXR1cy5oYW5kbGUgPSAodWludDhfdClwX2RhdGEtPmFwaV9zbmRjbWQuaGRyLmxheWVyX3NwZWNpZmljOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtMzYxLDcgKzM2MSw3IEBACiAgICAgLyogY29ycmVzcG9uZGluZyBDQiBpcyBmb3VuZCwgZ28gdG8gc3RhdGUgbWFjaGluZSAqLwogICAgIGVsc2UKICAgICB7Ci0jaWYgQlRBX0hIX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCiAgICAgICAgIGluX3N0YXRlID0gcF9jYi0+c3RhdGU7CiAgICAgICAgIEFQUExfVFJBQ0VfRVZFTlQoImJ0YV9oaF9zbV9leGVjdXRlOiBTdGF0ZSAweCUwMnggWyVzXSwgRXZlbnQgWyVzXSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX3N0YXRlLCBidGFfaGhfc3RhdGVfY29kZShpbl9zdGF0ZSksCkBAIC0zODUsNyArMzg1LDcgQEAKICAgICAgICAgICAgICgqYnRhX2hoX2FjdGlvblthY3Rpb25dKShwX2NiLCBwX2RhdGEpOwogICAgICAgICB9CiAKLSNpZiBCVEFfSEhfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSEhfREVCVUcgPT0gVFJVRSkKICAgICAgICAgaWYgKGluX3N0YXRlICE9IHBfY2ItPnN0YXRlKQogICAgICAgICB7CiAgICAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJISCBTdGF0ZSBDaGFuZ2U6IFslc10gLT4gWyVzXSBhZnRlciBFdmVudCBbJXNdIiwKQEAgLTQwOCw5ICs0MDgsOSBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX2hoX2hkbF9ldmVudChCVF9IRFIgKnBfbXNnKQorYm9vbCBidGFfaGhfaGRsX2V2ZW50KEJUX0hEUiAqcF9tc2cpCiB7Ci0gICAgVUlOVDggICAgICAgICAgIGluZGV4ID0gQlRBX0hIX0lEWF9JTlZBTElEOworICAgIHVpbnQ4X3QgICAgICAgICAgIGluZGV4ID0gQlRBX0hIX0lEWF9JTlZBTElEOwogICAgIHRCVEFfSEhfREVWX0NCICpwX2NiID0gTlVMTDsKIAogICAgIHN3aXRjaCAocF9tc2ctPmV2ZW50KQpAQCAtNDQzLDE1ICs0NDMsMTUgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSAvKiBlbHNlIHJlbW92ZSBkZXZpY2UgYnkgaGFuZGxlICovCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGJ0YV9oaF9kZXZfaGFuZGxlX3RvX2NiX2lkeCgoVUlOVDgpcF9tc2ctPmxheWVyX3NwZWNpZmljKTsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBidGFfaGhfZGV2X2hhbmRsZV90b19jYl9pZHgoKHVpbnQ4X3QpcF9tc2ctPmxheWVyX3NwZWNpZmljKTsKICAgICAgICAgICAgICAgICAgICAgLyogSWYgQlQgZGlzYWJsZSBpcyBkb25lIHdoaWxlIHRoZSBISUQgZGV2aWNlIGlzIGNvbm5lY3RlZCBhbmQgTGlua19LZXkgdXNlcyB1bmF1dGhlbnRpY2F0ZWQgY29tYmluYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAqIHRoZW4gd2UgY2FuIGdldCBpbnRvIGEgc2l0dWF0aW9uIHdoZXJlIHJlbW92ZV9ib25kaW5nIGlzIGNhbGxlZCB3aXRoIHRoZSBpbmRleCBzZXQgdG8gMCAod2l0aG91dCBnZXR0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgKiBjbGVhbmVkIHVwKS4gT25seSB3aGVuIFZJUlRVQUxfVU5QTFVHIGlzIGNhbGxlZCBkbyB3ZSBjbGVhbnVwIHRoZSBpbmRleCBhbmQgbWFrZSBpdCBNQVhfS05PV04uCi0gICAgICAgICAgICAgICAgICAgICAgKiBTbyBpZiBSRU1PVkVfREVWSUNFIGlzIGNhbGxlZCBhbmQgaW5fdXNlIGlzIEZBTFNFIHRoZW4gd2Ugc2hvdWxkIHRyZWF0IHRoaXMgYXMgYSBOVUxMIHBfY2IuIEhlbmNlIHdlCisgICAgICAgICAgICAgICAgICAgICAgKiBTbyBpZiBSRU1PVkVfREVWSUNFIGlzIGNhbGxlZCBhbmQgaW5fdXNlIGlzIGZhbHNlIHRoZW4gd2Ugc2hvdWxkIHRyZWF0IHRoaXMgYXMgYSBOVUxMIHBfY2IuIEhlbmNlIHdlCiAgICAgICAgICAgICAgICAgICAgICAgKiBmb3JjZSB0aGUgaW5kZXggdG8gYmUgSURYX0lOVkFMSUQKICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICBpZiAoKGluZGV4ICE9IEJUQV9ISF9JRFhfSU5WQUxJRCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChidGFfaGhfY2Iua2RldltpbmRleF0uaW5fdXNlID09IEZBTFNFKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgKGJ0YV9oaF9jYi5rZGV2W2luZGV4XS5pbl91c2UgPT0gZmFsc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IEJUQV9ISF9JRFhfSU5WQUxJRDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTQ2MSwyMyArNDYxLDIzIEBACiAgICAgICAgICAgICAgICAgaW5kZXggPSBidGFfaGhfZmluZF9jYigoKHRCVEFfSEhfQ0JBQ0tfREFUQSAqKXBfbXNnKS0+YWRkcik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgaW5kZXggPSBidGFfaGhfZGV2X2hhbmRsZV90b19jYl9pZHgoKFVJTlQ4KXBfbXNnLT5sYXllcl9zcGVjaWZpYyk7CisgICAgICAgICAgICAgICAgaW5kZXggPSBidGFfaGhfZGV2X2hhbmRsZV90b19jYl9pZHgoKHVpbnQ4X3QpcF9tc2ctPmxheWVyX3NwZWNpZmljKTsKIAogICAgICAgICAgICAgaWYgKGluZGV4ICE9IEJUQV9ISF9JRFhfSU5WQUxJRCkKICAgICAgICAgICAgICAgICBwX2NiID0gJmJ0YV9oaF9jYi5rZGV2W2luZGV4XTsKIAotI2lmIEJUQV9ISF9ERUJVRworI2lmIChCVEFfSEhfREVCVUcgPT0gVFJVRSkKICAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9oaF9oZGxfZXZlbnQ6OiBoYW5kbGUgPSAlZCBkZXZfY2JbJWRdICIsIHBfbXNnLT5sYXllcl9zcGVjaWZpYywgaW5kZXgpOwogI2VuZGlmCiAgICAgICAgICAgICBidGFfaGhfc21fZXhlY3V0ZShwX2NiLCBwX21zZy0+ZXZlbnQsICh0QlRBX0hIX0RBVEEgKikgcF9tc2cpOwogICAgIH0KLSAgICByZXR1cm4gKFRSVUUpOworICAgIHJldHVybiAodHJ1ZSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiogIERlYnVnIEZ1bmN0aW9ucwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgQlRBX0hIX0RFQlVHCisjaWYgKEJUQV9ISF9ERUJVRyA9PSBUUlVFKQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCiAqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9ldnRfY29kZQpAQCAtNTIxLDcgKzUyMSw3IEBACiAgICAgICAgIHJldHVybiAiQlRBX0hIX0FQSV9HRVRfRFNDUF9FVlQiOwogICAgIGNhc2UgQlRBX0hIX09QRU5fQ01QTF9FVlQ6CiAgICAgICAgIHJldHVybiAiQlRBX0hIX09QRU5fQ01QTF9FVlQiOwotI2lmIChkZWZpbmVkIEJUQV9ISF9MRV9JTkNMVURFRCAmJiBCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRSkKKyNpZiAoQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUpCiAgICAgY2FzZSBCVEFfSEhfR0FUVF9DTE9TRV9FVlQ6CiAgICAgICAgIHJldHVybiAiQlRBX0hIX0dBVFRfQ0xPU0VfRVZUIjsKICAgICBjYXNlIEJUQV9ISF9HQVRUX09QRU5fRVZUOgpAQCAtNTY1LDcgKzU2NSw3IEBACiAgICAgICAgIHJldHVybiAiQlRBX0hIX1c0X0NPTk5fU1QiOwogICAgIGNhc2UgQlRBX0hIX0NPTk5fU1Q6CiAgICAgICAgIHJldHVybiAiQlRBX0hIX0NPTk5fU1QiOwotI2lmIChkZWZpbmVkIEJUQV9ISF9MRV9JTkNMVURFRCAmJiBCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRSkKKyNpZiAoQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUpCiAgICAgY2FzZSBCVEFfSEhfVzRfU0VDOgogICAgICAgICByZXR1cm4gIkJUQV9ISF9XNF9TRUMiOwogI2VuZGlmCmRpZmYgLS1naXQgYS9idGEvaGgvYnRhX2hoX3V0aWxzLmNjIGIvYnRhL2hoL2J0YV9oaF91dGlscy5jYwppbmRleCBjOGVhODY0Li4yYTMzNmFhIDEwMDY0NAotLS0gYS9idGEvaGgvYnRhX2hoX3V0aWxzLmNjCisrKyBiL2J0YS9oaC9idGFfaGhfdXRpbHMuY2MKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2lmIGRlZmluZWQoQlRBX0hIX0lOQ0xVREVEKSAmJiAoQlRBX0hIX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9ISF9JTkNMVURFRCA9PSBUUlVFKQogCiAKICNpbmNsdWRlICJidGFfaGhfaW50LmgiCkBAIC00MSw3ICs0MSw3IEBACiAKICNkZWZpbmUgQlRBX0hIX01BWF9SUFRfQ0hBUlMgICAgOAogCi1zdGF0aWMgY29uc3QgVUlOVDggYnRhX2hoX21vZF9rZXlfbWFza1tCVEFfSEhfTU9EX01BWF9LRVldID0KK3N0YXRpYyBjb25zdCB1aW50OF90IGJ0YV9oaF9tb2Rfa2V5X21hc2tbQlRBX0hIX01PRF9NQVhfS0VZXSA9CiB7CiAgICAgQlRBX0hIX0tCX0NUUkxfTUFTSywKICAgICBCVEFfSEhfS0JfU0hJRlRfTUFTSywKQEAgLTYwLDkgKzYwLDkgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1VSU5UOCAgYnRhX2hoX2ZpbmRfY2IoQkRfQUREUiBiZGEpCit1aW50OF90ICBidGFfaGhfZmluZF9jYihCRF9BRERSIGJkYSkKIHsKLSAgICBVSU5UOCB4eDsKKyAgICB1aW50OF90IHh4OwogCiAgICAgLyogU2VlIGhvdyBtYW55IGFjdGl2ZSBkZXZpY2VzIHRoZXJlIGFyZS4gKi8KICAgICBmb3IgKHh4ID0gMDsgeHggPCBCVEFfSEhfTUFYX0RFVklDRTsgeHgrKykKQEAgLTcxLDEzICs3MSwxMyBAQAogICAgICAgICBpZiAoKCFiZGNtcCAoYmRhLCBidGFfaGhfY2Iua2Rldlt4eF0uYWRkcikgJiYKICAgICAgICAgICAgICAgYmRjbXAoYmRhLCBiZF9hZGRyX251bGwpICE9IDApICkKICAgICAgICAgewotI2lmIEJUQV9ISF9ERUJVRworI2lmIChCVEFfSEhfREVCVUcgPT0gVFJVRSkKICAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImZvdW5kIGtkZXZfY2JbJWRdIGhpZF9oYW5kbGUgPSAlZCAiLCB4eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2hoX2NiLmtkZXZbeHhdLmhpZF9oYW5kbGUpCiAjZW5kaWYKICAgICAgICAgICAgIHJldHVybiB4eDsKICAgICAgICAgfQotI2lmIEJUQV9ISF9ERUJVRworI2lmIChCVEFfSEhfREVCVUcgPT0gVFJVRSkKICAgICAgICAgZWxzZQogICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiaW5fdXNlID8gWyVkXSBrZGV2WyVkXS5oaWRfaGFuZGxlID0gJWQgc3RhdGUgPSBbJWRdIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfaGhfY2Iua2Rldlt4eF0uaW5fdXNlLCB4eCwKQEAgLTk2LDcgKzk2LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICAvKiBJZiBkZXZpY2UgbGlzdCBmdWxsLCByZXBvcnQgQlRBX0hIX0lEWF9JTlZBTElEICovCi0jaWYgQlRBX0hIX0RFQlVHCisjaWYgKEJUQV9ISF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9oaF9maW5kX2NiOjogaW5kZXggPSAlZCB3aGlsZSBtYXggPSAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICB4eCwgQlRBX0hIX01BWF9ERVZJQ0UpOwogI2VuZGlmCkBAIC0xMTksMTEgKzExOSwxMSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX2hoX2NsZWFuX3VwX2tkZXYodEJUQV9ISF9ERVZfQ0IgKnBfY2IpCiB7Ci0gICAgVUlOVDggaW5kZXg7CisgICAgdWludDhfdCBpbmRleDsKIAogICAgIGlmIChwX2NiLT5oaWRfaGFuZGxlICE9IEJUQV9ISF9JTlZBTElEX0hBTkRMRSApCiAgICAgewotI2lmIEJUQV9ISF9MRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJUQV9ISF9MRV9JTkNMVURFRCA9PSBUUlVFKQogICAgICAgICBpZiAocF9jYi0+aXNfbGVfZGV2aWNlKQogICAgICAgICAgICAgYnRhX2hoX2NiLmxlX2NiX2luZGV4W0JUQV9ISF9HRVRfTEVfQ0JfSURYKHBfY2ItPmhpZF9oYW5kbGUpXSA9IEJUQV9ISF9JRFhfSU5WQUxJRDsKICAgICAgICAgZWxzZQpAQCAtMTUzLDE3ICsxNTMsMTcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oaF91cGRhdGVfZGlfaW5mbyh0QlRBX0hIX0RFVl9DQiAqcF9jYiwgVUlOVDE2IHZlbmRvcl9pZCwgVUlOVDE2IHByb2R1Y3RfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgdmVyc2lvbiwgVUlOVDggZmxhZykKK3ZvaWQgYnRhX2hoX3VwZGF0ZV9kaV9pbmZvKHRCVEFfSEhfREVWX0NCICpwX2NiLCB1aW50MTZfdCB2ZW5kb3JfaWQsIHVpbnQxNl90IHByb2R1Y3RfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB2ZXJzaW9uLCB1aW50OF90IGZsYWcpCiB7Ci0jaWYgQlRBX0hIX0RFQlVHCisjaWYgKEJUQV9ISF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoInZlbmRvcl9pZCA9IDB4JTJ4IHByb2R1Y3RfaWQgPSAweCUyeCB2ZXJzaW9uID0gMHglMngiLAogICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yX2lkLCBwcm9kdWN0X2lkLCB2ZXJzaW9uKTsKICNlbmRpZgogICAgIHBfY2ItPmRzY3BfaW5mby52ZW5kb3JfaWQgICAgID0gICB2ZW5kb3JfaWQ7CiAgICAgcF9jYi0+ZHNjcF9pbmZvLnByb2R1Y3RfaWQgICAgPSAgIHByb2R1Y3RfaWQ7CiAgICAgcF9jYi0+ZHNjcF9pbmZvLnZlcnNpb24gICAgICAgPSAgIHZlcnNpb247Ci0jaWYgKGRlZmluZWQgQlRBX0hIX0xFX0lOQ0xVREVEICYmIEJUQV9ISF9MRV9JTkNMVURFRCA9PSBUUlVFKQorI2lmIChCVEFfSEhfTEVfSU5DTFVERUQgPT0gVFJVRSkKICAgICBwX2NiLT5kc2NwX2luZm8uZmxhZyAgICAgICAgICA9ICAgZmxhZzsKICNlbHNlCiAgICAgVU5VU0VEKGZsYWcpOwpAQCAtMTc4LDIwICsxNzgsMjAgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oaF9hZGRfZGV2aWNlX3RvX2xpc3QodEJUQV9ISF9ERVZfQ0IgKnBfY2IsIFVJTlQ4IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgYXR0cl9tYXNrLAordm9pZCBidGFfaGhfYWRkX2RldmljZV90b19saXN0KHRCVEFfSEhfREVWX0NCICpwX2NiLCB1aW50OF90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBhdHRyX21hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhJRF9ERVZfRFNDUF9JTkZPICpwX2RzY3BfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBzdWJfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IHNzcl9tYXhfbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgc3NyX21pbl90b3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4IGFwcF9pZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHN1Yl9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzc3JfbWF4X2xhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3NyX21pbl90b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXBwX2lkKQogewotI2lmIEJUQV9ISF9ERUJVRworI2lmIChCVEFfSEhfREVCVUcgPT0gVFJVRSkKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJzdWJjbGFzcyA9IDB4JTJ4Iiwgc3ViX2NsYXNzKTsKICNlbmRpZgogCiAgICAgcF9jYi0+aGlkX2hhbmRsZSA9IGhhbmRsZTsKLSAgICBwX2NiLT5pbl91c2UgPSBUUlVFOworICAgIHBfY2ItPmluX3VzZSA9IHRydWU7CiAgICAgcF9jYi0+YXR0cl9tYXNrID0gYXR0cl9tYXNrOwogCiAgICAgcF9jYi0+c3ViX2NsYXNzID0gc3ViX2NsYXNzOwpAQCAtMjA2LDcgKzIwNiw3IEBACiAKICAgICAgICAgaWYgKHBfZHNjcF9pbmZvLT5kbF9sZW4pIHsKICAgICAgICAgICAgIHBfY2ItPmRzY3BfaW5mby5kZXNjcmlwdG9yLmRzY19saXN0ID0KLSAgICAgICAgICAgICAgKFVJTlQ4ICopb3NpX21hbGxvYyhwX2RzY3BfaW5mby0+ZGxfbGVuKTsKKyAgICAgICAgICAgICAgKHVpbnQ4X3QgKilvc2lfbWFsbG9jKHBfZHNjcF9pbmZvLT5kbF9sZW4pOwogICAgICAgICAgICAgcF9jYi0+ZHNjcF9pbmZvLmRlc2NyaXB0b3IuZGxfbGVuID0gcF9kc2NwX2luZm8tPmRsX2xlbjsKICAgICAgICAgICAgIG1lbWNweShwX2NiLT5kc2NwX2luZm8uZGVzY3JpcHRvci5kc2NfbGlzdCwgcF9kc2NwX2luZm8tPmRzY19saXN0LAogICAgICAgICAgICAgICAgICAgIHBfZHNjcF9pbmZvLT5kbF9sZW4pOwpAQCAtMjIzLDI2ICsyMjMsMjYgQEAKICoqIFJldHVybnMKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfaGhfdG9kX3NwdCh0QlRBX0hIX0RFVl9DQiAqcF9jYixVSU5UOCBzdWJfY2xhc3MpCitib29sIGJ0YV9oaF90b2Rfc3B0KHRCVEFfSEhfREVWX0NCICpwX2NiLHVpbnQ4X3Qgc3ViX2NsYXNzKQogewotICAgIFVJTlQ4ICAgIHh4OwotICAgIFVJTlQ4ICAgIGNvZCA9IChzdWJfY2xhc3MgPj4gMik7IC8qIGxvd2VyIHR3byBiaXRzIGFyZSByZXNlcnZlZCAqLworICAgIHVpbnQ4X3QgICAgeHg7CisgICAgdWludDhfdCAgICBjb2QgPSAoc3ViX2NsYXNzID4+IDIpOyAvKiBsb3dlciB0d28gYml0cyBhcmUgcmVzZXJ2ZWQgKi8KIAogICAgIGZvciAoeHggPSAwIDsgeHggPCBwX2J0YV9oaF9jZmctPm1heF9kZXZ0X3NwdDsgeHggKyspCiAgICAgewotICAgICAgICBpZiAoY29kID09IChVSU5UOCkgcF9idGFfaGhfY2ZnLT5wX2RldnRfbGlzdFt4eF0udG9kKQorICAgICAgICBpZiAoY29kID09ICh1aW50OF90KSBwX2J0YV9oaF9jZmctPnBfZGV2dF9saXN0W3h4XS50b2QpCiAgICAgICAgIHsKICAgICAgICAgICAgIHBfY2ItPmFwcF9pZCA9IHBfYnRhX2hoX2NmZy0+cF9kZXZ0X2xpc3RbeHhdLmFwcF9pZDsKLSNpZiBCVEFfSEhfREVCVUcKKyNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCiAgICAgICAgICAgICBBUFBMX1RSQUNFX0VWRU5UKCJidGFfaGhfdG9kX3NwdCBzdWJfY2xhc3M6MHgleCBzdXBwb3J0ZWQiLCBzdWJfY2xhc3MpOwogI2VuZGlmCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotI2lmIEJUQV9ISF9ERUJVRworI2lmIChCVEFfSEhfREVCVUcgPT0gVFJVRSkKICAgICAgICAgICAgIEFQUExfVFJBQ0VfRVZFTlQoImJ0YV9oaF90b2Rfc3B0IHN1Yl9jbGFzczoweCV4IE5PVCBzdXBwb3J0ZWQiLCBzdWJfY2xhc3MpOwogI2VuZGlmCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogCkBAIC0yNTUsMTcgKzI1NSwxNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hoX3BhcnNlX2tleWJkX3JwdCh0QlRBX0hIX0JPT1RfUlBUICpwX2tiX2RhdGEsIFVJTlQ4ICpwX3JlcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgcmVwb3J0X2xlbikKK3ZvaWQgYnRhX2hoX3BhcnNlX2tleWJkX3JwdCh0QlRBX0hIX0JPT1RfUlBUICpwX2tiX2RhdGEsIHVpbnQ4X3QgKnBfcmVwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlcG9ydF9sZW4pCiB7CiAgICAgdEJUQV9ISF9LQl9DQiAgICAgICAqcF9rYiA9ICZidGFfaGhfY2Iua2JfY2I7CiAgICAgdEJUQV9ISF9LRVlCRF9SUFQgICAqcF9kYXRhID0gJnBfa2JfZGF0YS0+ZGF0YV9ycHQua2V5YmRfcnB0OwogCi0gICAgVUlOVDggICAgICAgIHRoaXNfY2hhciwgY3RsX3NoaWZ0OwotICAgIFVJTlQxNiAgICAgICB4eCwgeXksIGtleV9pZHggPSAwOwotICAgIFVJTlQ4ICAgICAgICB0aGlzX3JlcG9ydFtCVEFfSEhfTUFYX1JQVF9DSEFSU107CisgICAgdWludDhfdCAgICAgICAgdGhpc19jaGFyLCBjdGxfc2hpZnQ7CisgICAgdWludDE2X3QgICAgICAgeHgsIHl5LCBrZXlfaWR4ID0gMDsKKyAgICB1aW50OF90ICAgICAgICB0aGlzX3JlcG9ydFtCVEFfSEhfTUFYX1JQVF9DSEFSU107CiAKLSNpZiBCVEFfSEhfREVCVUcKKyNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hoX3BhcnNlX2tleWJkX3JwdDogIChyZXBvcnQ9JXAsIHJlcG9ydF9sZW49JWQpIGNhbGxlZCIsCiAgICAgICAgICAgICBwX3JlcG9ydCwgcmVwb3J0X2xlbik7CiAjZW5kaWYKQEAgLTI4OSwxMSArMjg5LDExIEBACiAgICAgICAgIGlmIChjdGxfc2hpZnQgJiBidGFfaGhfbW9kX2tleV9tYXNrW3h4XSkKICAgICAgICAgewogICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiTW9kIEtleVslMDJ4XSBwcmVzc2VkIiwgYnRhX2hoX21vZF9rZXlfbWFza1t4eF0gKTsKLSAgICAgICAgICAgIHBfa2ItPm1vZF9rZXlbeHhdID0gVFJVRTsKKyAgICAgICAgICAgIHBfa2ItPm1vZF9rZXlbeHhdID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChwX2tiLT5tb2Rfa2V5W3h4XSkKICAgICAgICAgewotICAgICAgICAgICAgcF9rYi0+bW9kX2tleVt4eF0gPSBGQUxTRTsKKyAgICAgICAgICAgIHBfa2ItPm1vZF9rZXlbeHhdID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgLyogY29udHJvbCBrZXkgZmxhZyBpcyBzZXQgKi8KICAgICAgICAgcF9kYXRhLT5tb2Rfa2V5W3h4XSAgICAgICA9IHBfa2ItPm1vZF9rZXlbeHhdOwpAQCAtMzE3LDIwICszMTcsMjAgQEAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgIGZvciAoeHggPSAwOyB4eCA8IHJlcG9ydF9sZW47IHh4KyspCiAgICAgewotI2lmIEJUQV9ISF9ERUJVRworI2lmIChCVEFfSEhfREVCVUcgPT0gVFJVRSkKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygidGhpc19jaGFyID0gJTAyeCIsIHRoaXNfcmVwb3J0W3h4XSk7CiAjZW5kaWYKICAgICAgICAgaWYgKCh0aGlzX2NoYXIgPSB0aGlzX3JlcG9ydFt4eF0pID09IDApCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgLyogdGFrZSB0aGUga2V5IGNvZGUgYXMgdGhlIHJlcG9ydCBkYXRhICovCiAgICAgICAgIGlmICh0aGlzX3JlcG9ydFt4eF0gPT0gQlRBX0hIX0tCX0NBUFNfTE9DSykKLSAgICAgICAgICAgIHBfa2ItPmNhcHNfbG9jayA9IHBfa2ItPmNhcHNfbG9jayA/IEZBTFNFIDogVFJVRTsKKyAgICAgICAgICAgIHBfa2ItPmNhcHNfbG9jayA9IHBfa2ItPmNhcHNfbG9jayA/IGZhbHNlIDogdHJ1ZTsKICAgICAgICAgZWxzZSBpZiAodGhpc19yZXBvcnRbeHhdID09IEJUQV9ISF9LQl9OVU1fTE9DSykKLSAgICAgICAgICAgIHBfa2ItPm51bV9sb2NrID0gcF9rYi0+bnVtX2xvY2sgPyBGQUxTRSA6IFRSVUU7CisgICAgICAgICAgICBwX2tiLT5udW1fbG9jayA9IHBfa2ItPm51bV9sb2NrID8gZmFsc2UgOiB0cnVlOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBwX2RhdGEtPnRoaXNfY2hhcltrZXlfaWR4ICsrXSA9IHRoaXNfY2hhcjsKIAotI2lmIEJUQV9ISF9ERUJVRworI2lmIChCVEFfSEhfREVCVUcgPT0gVFJVRSkKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiZm91bmQga2V5Y29kZSAlMDJ4ICIsICB0aGlzX3JlcG9ydFt4eF0pOwogI2VuZGlmCiAgICAgICAgIHBfZGF0YS0+Y2Fwc19sb2NrICAgPSBwX2tiLT5jYXBzX2xvY2s7CkBAIC0zNTIsMTIgKzM1MiwxMiBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hoX3BhcnNlX21pY2VfcnB0KHRCVEFfSEhfQk9PVF9SUFQgKnBfbWljZV9kYXRhLCBVSU5UOCAqcF9yZXBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgcmVwb3J0X2xlbikKK3ZvaWQgYnRhX2hoX3BhcnNlX21pY2VfcnB0KHRCVEFfSEhfQk9PVF9SUFQgKnBfbWljZV9kYXRhLCB1aW50OF90ICpwX3JlcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlcG9ydF9sZW4pCiB7CiAgICAgdEJUQV9ISF9NSUNFX1JQVCAgICpwX2RhdGEgPSAmcF9taWNlX2RhdGEtPmRhdGFfcnB0Lm1pY2VfcnB0OwotI2lmIEJUQV9ISF9ERUJVRwotICAgIFVJTlQ4ICAgICAgIHh4OworI2lmIChCVEFfSEhfREVCVUcgPT0gVFJVRSkKKyAgICB1aW50OF90ICAgICAgIHh4OwogCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hoX3BhcnNlX21pY2VfcnB0OiAgYnRhX2tleWJkX3JwdF9yY3ZkKHJlcG9ydD0lcCwgXAogICAgICAgICAgICAgICAgIHJlcG9ydF9sZW49JWQpIGNhbGxlZCIsIHBfcmVwb3J0LCByZXBvcnRfbGVuKTsKQEAgLTM2OSw3ICszNjksNyBAQAogICAgIGlmIChyZXBvcnRfbGVuID4gQlRBX0hIX01BWF9SUFRfQ0hBUlMpCiAgICAgICAgIHJlcG9ydF9sZW4gPSBCVEFfSEhfTUFYX1JQVF9DSEFSUzsKIAotI2lmIEJUQV9ISF9ERUJVRworI2lmIChCVEFfSEhfREVCVUcgPT0gVFJVRSkKICAgICBmb3IgKHh4ID0gMDsgeHggPCByZXBvcnRfbGVuOyB4eCsrKQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygidGhpc19jaGFyID0gJTAyeCIsIHBfcmVwb3J0W3h4XSk7CkBAIC0zODUsNyArMzg1LDcgQEAKICAgICAvKiB5IGRpc3BsYWNlbWVudCAqLwogICAgIHBfZGF0YS0+ZGVsdGFfeSAgICAgPSBwX3JlcG9ydFsyXTsKIAotI2lmIEJUQV9ISF9ERUJVRworI2lmIChCVEFfSEhfREVCVUcgPT0gVFJVRSkKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJtaWNlIGJ1dHRvbjogMHglMngiLCBwX2RhdGEtPm1vdXNlX2J1dHRvbik7CiAgICAgQVBQTF9UUkFDRV9ERUJVRygibWljZSBtb3ZlOiB4ID0gJWQgeSA9ICVkIiwgcF9kYXRhLT5kZWx0YV94LAogICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5kZWx0YV95ICk7CkBAIC00MDQsMTIgKzQwNCwxMiBAQAogKiogUmV0dXJucyAgICAgICAgICB0QlRBX0hIX1NUQVRVUyAgb3BlcmF0aW9uIHN0YXR1cwogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0hIX1NUQVRVUyBidGFfaGhfcmVhZF9zc3JfcGFyYW0oQkRfQUREUiBiZF9hZGRyLCBVSU5UMTYgKnBfbWF4X3Nzcl9sYXQsIFVJTlQxNiAqcF9taW5fc3NyX3RvdXQpCit0QlRBX0hIX1NUQVRVUyBidGFfaGhfcmVhZF9zc3JfcGFyYW0oQkRfQUREUiBiZF9hZGRyLCB1aW50MTZfdCAqcF9tYXhfc3NyX2xhdCwgdWludDE2X3QgKnBfbWluX3Nzcl90b3V0KQogewogICAgIHRCVEFfSEhfU1RBVFVTICBzdGF0dXMgPSBCVEFfSEhfRVJSOwogICAgIHRCVEFfSEhfQ0IgICpwX2NiID0gJmJ0YV9oaF9jYjsKLSAgICBVSU5UOCAgICAgICBpOwotICAgIFVJTlQxNiAgICAgIHNzcl9tYXhfbGF0ZW5jeTsKKyAgICB1aW50OF90ICAgICAgIGk7CisgICAgdWludDE2X3QgICAgICBzc3JfbWF4X2xhdGVuY3k7CiAgICAgZm9yIChpID0gMDsgaSA8IEJUQV9ISF9NQVhfS05PV047IGkgKyspCiAgICAgewogICAgICAgICBpZiAobWVtY21wKHBfY2ItPmtkZXZbaV0uYWRkciwgYmRfYWRkciwgQkRfQUREUl9MRU4pID09IDApCkBAIC00NjAsNyArNDYwLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9oaF9jbGVhbnVwX2Rpc2FibGUodEJUQV9ISF9TVEFUVVMgc3RhdHVzKQogewotICAgIFVJTlQ4ICAgeHg7CisgICAgdWludDhfdCAgIHh4OwogICAgIC8qIGZyZWUgYnVmZmVyIGluIENCIGhvbGRpbmcgcmVwb3J0IGRlc2NyaXB0b3JzICovCiAgICAgZm9yICh4eCA9IDA7IHh4IDwgQlRBX0hIX01BWF9ERVZJQ0U7IHh4ICsrKSB7CiAgICAgICAgIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCAqKikmYnRhX2hoX2NiLmtkZXZbeHhdLmRzY3BfaW5mby5kZXNjcmlwdG9yLmRzY19saXN0KTsKQEAgLTQ3OSwxOSArNDc5LDE5IEBACiAqKiBEZXNjcmlwdGlvbiAgICAgIGNvbnZlcnQgYSBISUQgZGV2aWNlIGhhbmRsZSB0byB0aGUgZGV2aWNlIGNvbnRyb2wgYmxvY2sgaW5kZXguCiAqKgogKioKLSoqIFJldHVybnMgICAgICAgICAgVUlOVDg6IGluZGV4IG9mIHRoZSBkZXZpY2UgY29udHJvbCBibG9jay4KKyoqIFJldHVybnMgICAgICAgICAgdWludDhfdDogaW5kZXggb2YgdGhlIGRldmljZSBjb250cm9sIGJsb2NrLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1VSU5UOCBidGFfaGhfZGV2X2hhbmRsZV90b19jYl9pZHgoVUlOVDggZGV2X2hhbmRsZSkKK3VpbnQ4X3QgYnRhX2hoX2Rldl9oYW5kbGVfdG9fY2JfaWR4KHVpbnQ4X3QgZGV2X2hhbmRsZSkKIHsKLSAgICBVSU5UOCBpbmRleCA9IEJUQV9ISF9JRFhfSU5WQUxJRDsKKyAgICB1aW50OF90IGluZGV4ID0gQlRBX0hIX0lEWF9JTlZBTElEOwogCi0jaWYgQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUpCiAgICAgaWYgKEJUQV9ISF9JU19MRV9ERVZfSERMKGRldl9oYW5kbGUpKQogICAgIHsKICAgICAgICAgaWYgKEJUQV9ISF9JU19MRV9ERVZfSERMX1ZBTElEKGRldl9oYW5kbGUpKQogICAgICAgICAgICAgaW5kZXggPSBidGFfaGhfY2IubGVfY2JfaW5kZXhbQlRBX0hIX0dFVF9MRV9DQl9JRFgoZGV2X2hhbmRsZSldOwotI2lmIEJUQV9ISF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ISF9ERUJVRyA9PSBUUlVFKQogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGhfZGV2X2hhbmRsZV90b19jYl9pZHggZGV2X2hhbmRsZSA9ICVkIGluZGV4ID0gJWQiLCBkZXZfaGFuZGxlLCBpbmRleCk7CiAjZW5kaWYKICAgICB9CkBAIC01MDQsNyArNTA0LDcgQEAKICAgICByZXR1cm4gaW5kZXg7CiAKIH0KLSNpZiBCVEFfSEhfREVCVUcKKyNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKICoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX3RyYWNlX2Rldl9kYgpAQCAtNTE2LDcgKzUxNiw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfaGhfdHJhY2VfZGV2X2RiKHZvaWQpCiB7Ci0gICAgVUlOVDggICAgeHg7CisgICAgdWludDhfdCAgICB4eDsKIAogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9oaF90cmFjZV9kZXZfZGI6OiBEZXZpY2UgREIgbGlzdCoqKioqKioqKioqKioqKioqKioqIik7CiAKZGlmZiAtLWdpdCBhL2J0YS9obC9idGFfaGxfYWN0LmMgYi9idGEvaGwvYnRhX2hsX2FjdC5jCmluZGV4IGZlN2ZjMmMuLmRmMWRhZTkgMTAwNjQ0Ci0tLSBhL2J0YS9obC9idGFfaGxfYWN0LmMKKysrIGIvYnRhL2hsL2J0YV9obF9hY3QuYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogCiAjaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaWYgZGVmaW5lZChITF9JTkNMVURFRCkgJiYgKEhMX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEhMX0lOQ0xVREVEID09IFRSVUUpCiAKICNpbmNsdWRlICJidF9jb21tb24uaCIKICNpbmNsdWRlICJzZHBfYXBpLmgiCkBAIC00MywxOSArNDMsMTkgQEAKICoqICBMb2NhbCBGdW5jdGlvbiBwcm90b3R5cGVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUgJiYgQlRfVFJBQ0VfVkVSQk9TRSA9PSBUUlVFKQotc3RhdGljIGNoYXIgKmJ0YV9obF9tY2FwX2V2dF9jb2RlKFVJTlQ4IGV2dF9jb2RlKTsKK3N0YXRpYyBjaGFyICpidGFfaGxfbWNhcF9ldnRfY29kZSh1aW50OF90IGV2dF9jb2RlKTsKIHN0YXRpYyBjaGFyICpidGFfaGxfZGNoX29wZXJfY29kZSh0QlRBX0hMX0RDSF9PUEVSIG9wZXJfY29kZSk7Ci1zdGF0aWMgY2hhciAqYnRhX2hsX2NiYWNrX2V2dF9jb2RlKFVJTlQ4IGV2dF9jb2RlKTsKK3N0YXRpYyBjaGFyICpidGFfaGxfY2JhY2tfZXZ0X2NvZGUodWludDhfdCBldnRfY29kZSk7CiAjZW5kaWYKLXN0YXRpYyB2b2lkIGJ0YV9obF9zZHBfY2JhY2soVUlOVDggc2RwX29wLCBVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBtZGxfaWR4LCBVSU5UMTYgc3RhdHVzKTsKLXN0YXRpYyB2b2lkIGJ0YV9obF9zZHBfY2JhY2swKFVJTlQxNiBzdGF0dXMpOwotc3RhdGljIHZvaWQgYnRhX2hsX3NkcF9jYmFjazEoVUlOVDE2IHN0YXR1cyk7Ci1zdGF0aWMgdm9pZCBidGFfaGxfc2RwX2NiYWNrMihVSU5UMTYgc3RhdHVzKTsKLXN0YXRpYyB2b2lkIGJ0YV9obF9zZHBfY2JhY2szKFVJTlQxNiBzdGF0dXMpOwotc3RhdGljIHZvaWQgYnRhX2hsX3NkcF9jYmFjazQoVUlOVDE2IHN0YXR1cyk7Ci1zdGF0aWMgdm9pZCBidGFfaGxfc2RwX2NiYWNrNShVSU5UMTYgc3RhdHVzKTsKLXN0YXRpYyB2b2lkIGJ0YV9obF9zZHBfY2JhY2s2KFVJTlQxNiBzdGF0dXMpOworc3RhdGljIHZvaWQgYnRhX2hsX3NkcF9jYmFjayh1aW50OF90IHNkcF9vcCwgdWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWRsX2lkeCwgdWludDE2X3Qgc3RhdHVzKTsKK3N0YXRpYyB2b2lkIGJ0YV9obF9zZHBfY2JhY2swKHVpbnQxNl90IHN0YXR1cyk7CitzdGF0aWMgdm9pZCBidGFfaGxfc2RwX2NiYWNrMSh1aW50MTZfdCBzdGF0dXMpOworc3RhdGljIHZvaWQgYnRhX2hsX3NkcF9jYmFjazIodWludDE2X3Qgc3RhdHVzKTsKK3N0YXRpYyB2b2lkIGJ0YV9obF9zZHBfY2JhY2szKHVpbnQxNl90IHN0YXR1cyk7CitzdGF0aWMgdm9pZCBidGFfaGxfc2RwX2NiYWNrNCh1aW50MTZfdCBzdGF0dXMpOworc3RhdGljIHZvaWQgYnRhX2hsX3NkcF9jYmFjazUodWludDE2X3Qgc3RhdHVzKTsKK3N0YXRpYyB2b2lkIGJ0YV9obF9zZHBfY2JhY2s2KHVpbnQxNl90IHN0YXR1cyk7CiAKIAogc3RhdGljIHRTRFBfRElTQ19DTVBMX0NCICogY29uc3QgYnRhX2hsX3NkcF9jYmFja19hcnJbXSA9CkBAIC04MCw3ICs4MCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGxfZGNoX21jYV9jb25nX2NoYW5nZShVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAordm9pZCBidGFfaGxfZGNoX21jYV9jb25nX2NoYW5nZSh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0RBVEEgKnBfZGF0YSkKIHsKICAgICB0QlRBX0hMX0FQUF9DQiAgICAgICpwX2FjYiAgPSBCVEFfSExfR0VUX0FQUF9DQl9QVFIoYXBwX2lkeCk7CkBAIC0xMTQsNyArMTE0LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9obF9kY2hfZWNob190ZXN0KFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHgsCit2b2lkIGJ0YV9obF9kY2hfZWNob190ZXN0KHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfREFUQSAqcF9kYXRhKQogewogICAgIHRCVEFfSExfQVBQX0NCICAgICAgKnBfYWNiICA9IEJUQV9ITF9HRVRfQVBQX0NCX1BUUihhcHBfaWR4KTsKQEAgLTE0NCw3ICsxNDQsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hsX2RjaF9zZHBfaW5pdChVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAordm9pZCBidGFfaGxfZGNoX3NkcF9pbml0KHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpCiB7CiAgICAgdEJUQV9ITF9NQ0xfQ0IgICAgICAqcF9tY2IgID0gQlRBX0hMX0dFVF9NQ0xfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgpOwpAQCAtMTkwLDcgKzE5MCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGxfZGNoX2Nsb3NlX2VjaG9fdGVzdChVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAordm9pZCBidGFfaGxfZGNoX2Nsb3NlX2VjaG9fdGVzdCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0RBVEEgKnBfZGF0YSkKIHsKICAgICB0QlRBX0hMX01ETF9DQiAgICAgICAgICAqcF9kY2IgID0gQlRBX0hMX0dFVF9NRExfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgsIG1kbF9pZHgpOwpAQCAtMjI5LDcgKzIyOSw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGxfZGNoX21jYV9yY3ZfZGF0YShVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAordm9pZCBidGFfaGxfZGNoX21jYV9yY3ZfZGF0YSh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0RBVEEgKnBfZGF0YSkKIHsKICAgICB0QlRBX0hMX0FQUF9DQiAgICAgICpwX2FjYiAgPSBCVEFfSExfR0VUX0FQUF9DQl9QVFIoYXBwX2lkeCk7CkBAIC0yOTUsNyArMjk1LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9obF9kY2hfY2lfcHV0X2VjaG9fZGF0YShVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAordm9pZCBidGFfaGxfZGNoX2NpX3B1dF9lY2hvX2RhdGEodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfREFUQSAqcF9kYXRhKQogewogICAgIHRCVEFfSExfTURMX0NCICAgICAgKnBfZGNiICA9IEJUQV9ITF9HRVRfTURMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4LCBtZGxfaWR4KTsKQEAgLTMyNCw3ICszMjQsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hsX2RjaF9jaV9nZXRfZWNob19kYXRhKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHgsCit2b2lkIGJ0YV9obF9kY2hfY2lfZ2V0X2VjaG9fZGF0YSh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpCiB7CiAgICAgdEJUQV9ITF9NRExfQ0IgICAgICAqcF9kY2IgID0gQlRBX0hMX0dFVF9NRExfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgsIG1kbF9pZHgpOwpAQCAtMzY2LDcgKzM2Niw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGxfZGNoX2NpX3B1dF9yeF9kYXRhKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHgsCit2b2lkIGJ0YV9obF9kY2hfY2lfcHV0X3J4X2RhdGEodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0RBVEEgKnBfZGF0YSkKIHsKICAgICB0QlRBX0hMX0FQUF9DQiAgICAgICpwX2FjYiAgPSBCVEFfSExfR0VUX0FQUF9DQl9QVFIoYXBwX2lkeCk7CkBAIC00MDcsNyArNDA3LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9obF9kY2hfY2lfZ2V0X3R4X2RhdGEoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgVUlOVDggbWRsX2lkeCwKK3ZvaWQgYnRhX2hsX2RjaF9jaV9nZXRfdHhfZGF0YSh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfREFUQSAqcF9kYXRhKQogewogICAgIHRCVEFfSExfQVBQX0NCICAgICAgKnBfYWNiICA9IEJUQV9ITF9HRVRfQVBQX0NCX1BUUihhcHBfaWR4KTsKQEAgLTQxNSw4ICs0MTUsOCBAQAogICAgIHRCVEFfSExfTURMX0NCICAgICAgKnBfZGNiICA9IEJUQV9ITF9HRVRfTURMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4LCBtZGxfaWR4KTsKICAgICB0TUNBX1JFU1VMVCAgICAgICAgIHJlc3VsdDsKICAgICB0QlRBX0hMX1NUQVRVUyAgICAgIHN0YXR1cyA9IEJUQV9ITF9TVEFUVVNfT0s7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBmcmVlX2J1ZiA9IEZBTFNFOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgY2xvc2VfZGNoID0gRkFMU0U7CisgICAgYm9vbCAgICAgICAgICAgICBmcmVlX2J1ZiA9IGZhbHNlOworICAgIGJvb2wgICAgICAgICAgICAgY2xvc2VfZGNoID0gZmFsc2U7CiAgICAgdEJUQV9ITCAgICAgICAgICAgICBldnRfZGF0YTsKIAogCkBAIC00MjksMTEgKzQyOSwxMSBAQAogICAgIGlmIChwX2RjYi0+Y2xvc2VfcGVuZGluZykKICAgICB7CiAgICAgICAgIHN0YXR1cyA9IEJUQV9ITF9TVEFUVVNfRkFJTDsKLSAgICAgICAgZnJlZV9idWYgPSBUUlVFOworICAgICAgICBmcmVlX2J1ZiA9IHRydWU7CiAKICAgICAgICAgaWYgKCFwX2RjYi0+Y291dF9vcGVyKQogICAgICAgICB7Ci0gICAgICAgICAgICBjbG9zZV9kY2ggPSBUUlVFOworICAgICAgICAgICAgY2xvc2VfZGNoID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlCkBAIC00NDgsNyArNDQ4LDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCVEFfSExfU1RBVFVTX0ZBSUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlX2J1ZiA9IFRSVUU7CisgICAgICAgICAgICBmcmVlX2J1ZiA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CkBAIC00ODIsMTQgKzQ4MiwxNCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hsX2RjaF9zZW5kX2RhdGEoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgVUlOVDggbWRsX2lkeCwKK3ZvaWQgYnRhX2hsX2RjaF9zZW5kX2RhdGEodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpCiB7CiAgICAgdEJUQV9ITF9BUFBfQ0IgICAgICAqcF9hY2IgID0gQlRBX0hMX0dFVF9BUFBfQ0JfUFRSKGFwcF9pZHgpOwogICAgIHRCVEFfSExfTUNMX0NCICAgICAgKnBfbWNiICA9IEJUQV9ITF9HRVRfTUNMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4KTsKICAgICB0QlRBX0hMX01ETF9DQiAgICAgICpwX2RjYiAgPSBCVEFfSExfR0VUX01ETF9DQl9QVFIoYXBwX2lkeCwgbWNsX2lkeCwgbWRsX2lkeCk7CiAgICAgdEJUQV9ITCAgICAgICAgICAgICBldnRfZGF0YTsKLSAgICBCT09MRUFOICAgICAgICAgICAgIHN1Y2Nlc3MgPSBUUlVFOworICAgIGJvb2wgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CiAKICNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hsX2RjaF9zZW5kX2RhdGEiKTsKQEAgLTQ5OCw3ICs0OTgsNyBAQAogICAgIGlmICghKHBfZGNiLT5jb3V0X29wZXIgJiBCVEFfSExfQ09fR0VUX1RYX0RBVEFfTUFTSykpCiAgICAgewogICAgICAgICAvLyBwX2RjYi0+Y2hubF9jZmcuZmNzIG1heSBiZSBCVEFfSExfTUNBX1VTRV9GQ1MgKDB4MTEpIG9yIEJUQV9ITF9NQ0FfTk9fRkNTICgweDEwKSBvciBCVEFfSExfREVGQVVMVF9TT1VSQ0VfRkNTICgxKQotICAgICAgICBCT09MRUFOIGZjc191c2UgPSAoQk9PTEVBTikgKHBfZGNiLT5jaG5sX2NmZy5mY3MgJiBCVEFfSExfTUNBX0ZDU19VU0VfTUFTSyk7CisgICAgICAgIGJvb2wgZmNzX3VzZSA9IChib29sKSAocF9kY2ItPmNobmxfY2ZnLmZjcyAmIEJUQV9ITF9NQ0FfRkNTX1VTRV9NQVNLKTsKICAgICAgICAgaWYgKChwX2RjYi0+cF90eF9wa3QgPSBidGFfaGxfZ2V0X2J1ZihwX2RhdGEtPmFwaV9zZW5kX2RhdGEucGt0X3NpemUsIGZjc191c2UpKSAhPSBOVUxMKQogICAgICAgICB7CiAgICAgICAgICAgICBidGFfaGxfY29fZ2V0X3R4X2RhdGEoIHBfYWNiLT5hcHBfaWQsCkBAIC01MTAsMTIgKzUxMCwxMiBAQAogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgICAgc3VjY2VzcyA9IEZBTFNFOworICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIHN1Y2Nlc3MgPSBGQUxTRTsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwogICAgIH0KIAogICAgIGlmICghc3VjY2VzcykKQEAgLTUzOCw3ICs1MzgsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hsX2RjaF9jbG9zZV9jbXBsKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHgsCit2b2lkIGJ0YV9obF9kY2hfY2xvc2VfY21wbCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpCiB7CiAgICAgdEJUQV9ITF9BUFBfQ0IgICAgICAqcF9hY2IgID0gQlRBX0hMX0dFVF9BUFBfQ0JfUFRSKGFwcF9pZHgpOwpAQCAtNTQ2LDcgKzU0Niw3IEBACiAgICAgdEJUQV9ITF9NRExfQ0IgICAgICAqcF9kY2IgID0gQlRBX0hMX0dFVF9NRExfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgsIG1kbF9pZHgpOwogICAgIHRCVEFfSEwgICAgICAgICAgICAgZXZ0X2RhdGE7CiAgICAgdEJUQV9ITF9FVlQgICAgICAgICBldmVudCA9IDA7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBzZW5kX2V2dD1UUlVFOworICAgIGJvb2wgICAgICAgICAgICAgc2VuZF9ldnQ9dHJ1ZTsKICAgICB0QlRBX0hMX1NUQVRVUyAgICAgIHN0YXR1czsKIAogI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKQEAgLTY0Niw3ICs2NDYsNyBAQAogICAgICAgICAgICAgLyogdGhpcyBpcyBub3JtYWwgZWNobyB0ZXN0IGNsb3NlICovCiAgICAgICAgIGNhc2UgQlRBX0hMX0RDSF9PUF9SRU1PVEVfQ1JFQVRFOgogICAgICAgICBjYXNlIEJUQV9ITF9EQ0hfT1BfUkVNT1RFX1JFQ09OTkVDVDoKLSAgICAgICAgICAgIHNlbmRfZXZ0PUZBTFNFOworICAgICAgICAgICAgc2VuZF9ldnQ9ZmFsc2U7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgpAQCAtNjU3LDE0ICs2NTcsMTQgQEAKICAgICAgICAgICAgIEFQUExfVFJBQ0VfRVJST1IoIkRDSCBvcGVyYXRpb24gbm90IGZvdW5kIG9wZXI9JWQiLCBwX2RjYi0+ZGNoX29wZXIpOwogI2VuZGlmCiAjZW5kaWYKLSAgICAgICAgICAgIHNlbmRfZXZ0PUZBTFNFOworICAgICAgICAgICAgc2VuZF9ldnQ9ZmFsc2U7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKICAgICBpZiAoIHBfZGNiLT5sb2NhbF9tZGVwX2lkID09IEJUQV9ITF9FQ0hPX1RFU1RfTURFUF9JRCApCiAgICAgewotICAgICAgICBwX21jYi0+ZWNob190ZXN0ID0gRkFMU0U7Ci0gICAgICAgIHNlbmRfZXZ0PUZBTFNFOworICAgICAgICBwX21jYi0+ZWNob190ZXN0ID0gZmFsc2U7CisgICAgICAgIHNlbmRfZXZ0PWZhbHNlOwogCiAgICAgICAgIGlmICggcF9kY2ItPmRjaF9vcGVyICE9IEJUQV9ITF9EQ0hfT1BfTE9DQUxfQ0xPU0VfRUNIT19URVNUKQogICAgICAgICB7CkBAIC02NzcsNyArNjc3LDcgQEAKICAgICAgICAgICAgICAgICBjYXNlIEJUQV9ITF9FQ0hPX09QX0xPT1BfQkFDSzoKIAogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCVEFfSExfU1RBVFVTX0ZBSUw7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRfZXZ0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZF9ldnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIEJUQV9ITF9FQ0hPX09QX09QRU5fSU5EOgogICAgICAgICAgICAgICAgIGNhc2UgQlRBX0hMX0VDSE9fT1BfRUNIT19QS1Q6CkBAIC02OTAsNyArNjkwLDcgQEAKICAgICAgICAgZWxzZQogICAgICAgICB7CiAgICAgICAgICAgICBzdGF0dXMgPSBwX2RjYi0+Y2lfcHV0X2VjaG9fZGF0YV9zdGF0dXM7Ci0gICAgICAgICAgICBzZW5kX2V2dCA9IFRSVUU7CisgICAgICAgICAgICBzZW5kX2V2dCA9IHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc2VuZF9ldnQpCkBAIC03MjAsNyArNzIwLDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICAvKiBjaGVjayBjY2ggY2xvc2UgaXMgaW4gcHJvZ3Jlc3Mgb3Igbm90ICovCi0gICAgYnRhX2hsX2NoZWNrX2NjaF9jbG9zZShhcHBfaWR4LCBtY2xfaWR4LCBwX2RhdGEsIEZBTFNFKTsKKyAgICBidGFfaGxfY2hlY2tfY2NoX2Nsb3NlKGFwcF9pZHgsIG1jbF9pZHgsIHBfZGF0YSwgZmFsc2UpOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC03MzEsNyArNzMxLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9obF9kY2hfbWNhX2Nsb3NlX2luZChVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAordm9pZCBidGFfaGxfZGNoX21jYV9jbG9zZV9pbmQodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfREFUQSAqcF9kYXRhKQogewogICAgIHRCVEFfSExfTURMX0NCICAgICAgKnBfZGNiICA9IEJUQV9ITF9HRVRfTURMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4LCBtZGxfaWR4KTsKQEAgLTc0NCwxMCArNzQ0LDEwIEBACiAjZW5kaWYKICNlbmRpZgogCi0gICAgcF9kY2ItPmludGVudGlvbmFsX2Nsb3NlID0gRkFMU0U7CisgICAgcF9kY2ItPmludGVudGlvbmFsX2Nsb3NlID0gZmFsc2U7CiAgICAgaWYgKHBfZGF0YS0+bWNhX2V2dC5tY2FfZGF0YS5jbG9zZV9pbmQucmVhc29uID09IEwyQ0FQX0RJU0NfT0spCiAgICAgewotICAgICAgICBwX2RjYi0+aW50ZW50aW9uYWxfY2xvc2UgPSBUUlVFOworICAgICAgICBwX2RjYi0+aW50ZW50aW9uYWxfY2xvc2UgPSB0cnVlOwogICAgIH0KIAogICAgIGlmICghcF9kY2ItPmNvdXRfb3BlcikKQEAgLTc2MSw3ICs3NjEsNyBAQAogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgICBwX2RjYi0+Y2xvc2VfcGVuZGluZyA9IFRSVUU7CisgICAgICAgIHBfZGNiLT5jbG9zZV9wZW5kaW5nID0gdHJ1ZTsKICAgICB9CiB9CiAKQEAgLTc3NCw3ICs3NzQsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hsX2RjaF9tY2FfY2xvc2VfY2ZtKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHgsCit2b2lkIGJ0YV9obF9kY2hfbWNhX2Nsb3NlX2NmbSh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpCiB7CiAgICAgdEJUQV9ITF9NRExfQ0IgICAgICAqcF9kY2IgID0gQlRBX0hMX0dFVF9NRExfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgsIG1kbF9pZHgpOwpAQCAtODIxLDcgKzgyMSw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGxfZGNoX21jYV9jbG9zZShVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAordm9pZCBidGFfaGxfZGNoX21jYV9jbG9zZSh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0RBVEEgKnBfZGF0YSkKIHsKICAgICB0QlRBX0hMX0FQUF9DQiAgICAgICAgICAqcF9hY2IgID0gQlRBX0hMX0dFVF9BUFBfQ0JfUFRSKGFwcF9pZHgpOwpAQCAtODM1LDcgKzgzNSw3IEBACiAjZW5kaWYKICAgICBpZiAoIXBfZGNiLT5jb3V0X29wZXIpCiAgICAgewotICAgICAgICBwX2RjYi0+Y2xvc2VfcGVuZGluZyA9IEZBTFNFOworICAgICAgICBwX2RjYi0+Y2xvc2VfcGVuZGluZyA9IGZhbHNlOwogICAgICAgICBpZiAoTUNBX0Nsb3NlUmVxKCh0TUNBX0RMKXBfZGNiLT5tZGxfaGFuZGxlKT09IE1DQV9TVUNDRVNTKQogICAgICAgICB7CiAgICAgICAgICAgICBwX2RjYi0+ZGNoX29wZXIgPSBCVEFfSExfRENIX09QX0xPQ0FMX0NMT1NFOwpAQCAtODU4LDcgKzg1OCw3IEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIHBfZGNiLT5jbG9zZV9wZW5kaW5nID0gVFJVRTsKKyAgICAgICAgcF9kY2ItPmNsb3NlX3BlbmRpbmcgPSB0cnVlOwogICAgIH0KIH0KIApAQCAtODcyLDcgKzg3Miw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGxfZGNoX21jYV9vcGVuX2luZChVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAordm9pZCBidGFfaGxfZGNoX21jYV9vcGVuX2luZCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0RBVEEgKnBfZGF0YSkKIHsKICAgICB0QlRBX0hMX0FQUF9DQiAgICAgICpwX2FjYiAgPSBCVEFfSExfR0VUX0FQUF9DQl9QVFIoYXBwX2lkeCk7CkBAIC04ODEsOCArODgxLDggQEAKICAgICB0TUNBX0RMX09QRU4gICAgICAgICpwX29wZW5faW5kID0gJnBfZGF0YS0+bWNhX2V2dC5tY2FfZGF0YS5vcGVuX2luZDsKICAgICB0QlRBX0hMICAgICAgICAgICAgIGV2dF9kYXRhOwogICAgIHRCVEFfSExfRVZUICAgICAgICAgZXZlbnQ7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBvbGRfZGNoX29wZXIgPSBCVEFfSExfRENIX09QX05PTkU7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBzZW5kX2V2ZW50ID0gRkFMU0U7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIG9sZF9kY2hfb3BlciA9IEJUQV9ITF9EQ0hfT1BfTk9ORTsKKyAgICBib29sICAgICAgICAgICAgIHNlbmRfZXZlbnQgPSBmYWxzZTsKIAogCiAjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQpAQCAtOTA3LDcgKzkwNyw3IEBACiAgICAgICAgICAgICBldnRfZGF0YS5kY2hfb3Blbl9pbmQuZGNoX21vZGUgPSBCVEFfSExfRENIX01PREVfUkVMSUFCTEU7CiAgICAgICAgICAgICBpZiAoIWJ0YV9obF9pc190aGVfZmlyc3RfcmVsaWFibGVfZXhpc3RlZChhcHBfaWR4LCBtY2xfaWR4KSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwX2RjYi0+aXNfdGhlX2ZpcnN0X3JlbGlhYmxlID0gVFJVRTsKKyAgICAgICAgICAgICAgICBwX2RjYi0+aXNfdGhlX2ZpcnN0X3JlbGlhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlCkBAIC05MzEsNyArOTMxLDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBidGFfaGxfc2F2ZV9tZGxfY2ZnKGFwcF9pZHgsIG1jbF9pZHgsbWRsX2lkeCk7CiAgICAgICAgICAgICAgICAgZXZlbnQ9IEJUQV9ITF9EQ0hfT1BFTl9JTkRfRVZUOwotICAgICAgICAgICAgICAgIHNlbmRfZXZlbnQ9IFRSVUU7CisgICAgICAgICAgICAgICAgc2VuZF9ldmVudD0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKQEAgLTk0Niw3ICs5NDYsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGJ0YV9obF9zYXZlX21kbF9jZmcoYXBwX2lkeCwgbWNsX2lkeCxtZGxfaWR4KTsKICAgICAgICAgICAgICAgICBldmVudD0gQlRBX0hMX0RDSF9SRUNPTk5FQ1RfSU5EX0VWVDsKLSAgICAgICAgICAgICAgICBzZW5kX2V2ZW50PSBUUlVFOworICAgICAgICAgICAgICAgIHNlbmRfZXZlbnQ9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7CkBAIC05NzksNyArOTc5LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9obF9kY2hfbWNhX29wZW5fY2ZtKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHgsCit2b2lkIGJ0YV9obF9kY2hfbWNhX29wZW5fY2ZtKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfREFUQSAqcF9kYXRhKQogewogICAgIHRCVEFfSExfQVBQX0NCICAgICAgKnBfYWNiICA9IEJUQV9ITF9HRVRfQVBQX0NCX1BUUihhcHBfaWR4KTsKQEAgLTk4OCw5ICs5ODgsOSBAQAogICAgIHRNQ0FfRExfT1BFTiAgICAgICAgKnBfb3Blbl9jZm0gPSAmcF9kYXRhLT5tY2FfZXZ0Lm1jYV9kYXRhLm9wZW5fY2ZtOwogICAgIHRCVEFfSEwgICAgICAgICAgICAgZXZ0X2RhdGE7CiAgICAgdEJUQV9ITF9FVlQgICAgICAgICBldmVudDsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIG9sZF9kY2hfb3BlciA9IEJUQV9ITF9EQ0hfT1BfTk9ORTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgb2xkX2RjaF9vcGVyID0gQlRBX0hMX0RDSF9PUF9OT05FOwogICAgIHRCVEFfSExfRENIX01PREUgICAgZGNoX21vZGUgPSBCVEFfSExfRENIX01PREVfU1RSRUFNSU5HOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgc2VuZF9ldmVudCA9IEZBTFNFOworICAgIGJvb2wgICAgICAgICAgICAgc2VuZF9ldmVudCA9IGZhbHNlOwogCiAKICNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCkBAIC0xMDE0LDcgKzEwMTQsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmICghYnRhX2hsX2lzX3RoZV9maXJzdF9yZWxpYWJsZV9leGlzdGVkKGFwcF9pZHgsIG1jbF9pZHgpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcF9kY2ItPmlzX3RoZV9maXJzdF9yZWxpYWJsZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHBfZGNiLT5pc190aGVfZmlyc3RfcmVsaWFibGUgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTA0Niw3ICsxMDQ2LDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBidGFfaGxfc2F2ZV9tZGxfY2ZnKGFwcF9pZHgsIG1jbF9pZHgsIG1kbF9pZHgpOwogICAgICAgICAgICAgICAgIGV2ZW50PSBCVEFfSExfRENIX09QRU5fQ0ZNX0VWVDsKLSAgICAgICAgICAgICAgICBzZW5kX2V2ZW50PSBUUlVFOworICAgICAgICAgICAgICAgIHNlbmRfZXZlbnQ9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7CkBAIC0xMDY4LDcgKzEwNjgsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGJ0YV9obF9zYXZlX21kbF9jZmcoYXBwX2lkeCwgbWNsX2lkeCxtZGxfaWR4KTsKICAgICAgICAgICAgICAgICBldmVudD0gQlRBX0hMX0RDSF9SRUNPTk5FQ1RfQ0ZNX0VWVDsKLSAgICAgICAgICAgICAgICBzZW5kX2V2ZW50PSBUUlVFOworICAgICAgICAgICAgICAgIHNlbmRfZXZlbnQ9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7CkBAIC0xMTAwLDcgKzExMDAsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hsX2RjaF9tY2FfYWJvcnRfaW5kKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHgsCit2b2lkIGJ0YV9obF9kY2hfbWNhX2Fib3J0X2luZCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpCiB7CiAgICAgdEJUQV9ITF9NRExfQ0IgICAgICAqcF9kY2IgID0gQlRBX0hMX0dFVF9NRExfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgsIG1kbF9pZHgpOwpAQCAtMTEyMyw3ICsxMTIzLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9obF9kY2hfbWNhX2Fib3J0X2NmbShVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAordm9pZCBidGFfaGxfZGNoX21jYV9hYm9ydF9jZm0odWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfREFUQSAqcF9kYXRhKQogewogICAgIHRCVEFfSExfQVBQX0NCICAgICAgKnBfYWNiICA9IEJUQV9ITF9HRVRfQVBQX0NCX1BUUihhcHBfaWR4KTsKQEAgLTExNjgsNyArMTE2OCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGxfZGNoX21jYV9hYm9ydChVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAordm9pZCBidGFfaGxfZGNoX21jYV9hYm9ydCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0RBVEEgKnBfZGF0YSkKIHsKICAgICB0QlRBX0hMX0FQUF9DQiAgICAgICAgICAqcF9hY2IgID0gQlRBX0hMX0dFVF9BUFBfQ0JfUFRSKGFwcF9pZHgpOwpAQCAtMTIwOCw3ICsxMjA4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9ITF9TVEFUVVNfRkFJTCk7CiAgICAgICAgICAgICAgICAgcF9hY2ItPnBfY2JhY2soQlRBX0hMX0RDSF9BQk9SVF9DRk1fRVZUICwodEJUQV9ITCAqKSAmZXZ0X2RhdGEgKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ0YV9obF9jaGVja19jY2hfY2xvc2UoYXBwX2lkeCwgbWNsX2lkeCwgcF9kYXRhLCBGQUxTRSk7CisgICAgICAgICAgICBidGFfaGxfY2hlY2tfY2NoX2Nsb3NlKGFwcF9pZHgsIG1jbF9pZHgsIHBfZGF0YSwgZmFsc2UpOwogICAgICAgICB9CiAKIApAQCAtMTIyOSwxNSArMTIyOSwxNSBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hsX2RjaF9tY2FfcmVjb25uZWN0X2luZChVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAordm9pZCBidGFfaGxfZGNoX21jYV9yZWNvbm5lY3RfaW5kKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpCiB7CiAgICAgdEJUQV9ITF9NQ0xfQ0IgICAgICAqcF9tY2IgID0gQlRBX0hMX0dFVF9NQ0xfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgpOwogICAgIHRCVEFfSExfTURMX0NCICAgICAgKnBfZGNiICA9IEJUQV9ITF9HRVRfTURMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4LCBtZGxfaWR4KTsKICAgICB0QlRBX0hMX01ETF9DRkcgICAgICpwX21kbF9jZmc7CiAgICAgdE1DQV9FVlRfSERSICAgICAgICAqcF9yZWNvbm5lY3RfaW5kID0gJnBfZGF0YS0+bWNhX2V2dC5tY2FfZGF0YS5yZWNvbm5lY3RfaW5kOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgbWRsX2NmZ19pZHgsIGluX3VzZV9tZGxfaWR4LCBtZGVwX2NmZ19pZHg7Ci0gICAgVUlOVDggICAgICAgICAgICAgICByc3BfY29kZSA9IE1DQV9SU1BfU1VDQ0VTUzsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgbWRsX2NmZ19pZHgsIGluX3VzZV9tZGxfaWR4LCBtZGVwX2NmZ19pZHg7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIHJzcF9jb2RlID0gTUNBX1JTUF9TVUNDRVNTOwogCiAKICNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCkBAIC0xMjUyLDcgKzEyNTIsNyBAQAogCiAgICAgICAgICAgICBpZiAoYnRhX2hsX2ZpbmRfbWRlcF9jZmdfaWR4KGFwcF9pZHgsIHBfbWRsX2NmZy0+bG9jYWxfbWRlcF9pZCwgJm1kZXBfY2ZnX2lkeCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcF9kY2ItPmluX3VzZSAgICAgICAgICAgICAgID0gVFJVRTsKKyAgICAgICAgICAgICAgICBwX2RjYi0+aW5fdXNlICAgICAgICAgICAgICAgPSB0cnVlOwogICAgICAgICAgICAgICAgIHBfZGNiLT5kY2hfb3BlciAgICAgICAgICAgICA9IEJUQV9ITF9EQ0hfT1BfUkVNT1RFX1JFQ09OTkVDVDsKICAgICAgICAgICAgICAgICBwX2RjYi0+c2VjX21hc2sgICAgICAgICAgICAgPSAoQlRBX1NFQ19BVVRIRU5USUNBVEUgfCBCVEFfU0VDX0VOQ1JZUFQpOwogICAgICAgICAgICAgICAgIHBfZGNiLT5wZWVyX21kZXBfaWQgICAgICAgICAgICAgPSAweEZGOwpAQCAtMTI2MCw3ICsxMjYwLDcgQEAKICAgICAgICAgICAgICAgICBwX2RjYi0+bG9jYWxfbWRlcF9jZmdfaWR4ICAgPSBtZGVwX2NmZ19pZHg7CiAgICAgICAgICAgICAgICAgcF9kY2ItPmxvY2FsX2NmZyAgICAgICAgICAgID0gQlRBX0hMX0RDSF9DRkdfVU5LTk9XTjsKICAgICAgICAgICAgICAgICBwX2RjYi0+bWRsX2lkICAgICAgICAgICAgICAgPSBwX3JlY29ubmVjdF9pbmQtPm1kbF9pZDsKLSAgICAgICAgICAgICAgICBwX2RjYi0+bWRsX2NmZ19pZHhfaW5jbHVkZWQgPSBUUlVFOworICAgICAgICAgICAgICAgIHBfZGNiLT5tZGxfY2ZnX2lkeF9pbmNsdWRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgcF9kY2ItPm1kbF9jZmdfaWR4ICAgICAgICAgID0gbWRsX2NmZ19pZHg7CiAgICAgICAgICAgICAgICAgcF9kY2ItPmRjaF9tb2RlICAgICAgICAgICAgID0gcF9tZGxfY2ZnLT5kY2hfbW9kZTsKICAgICAgICAgICAgICAgICBidGFfaGxfZmluZF9yeHR4X2FwZHVfc2l6ZShhcHBfaWR4LCBtZGVwX2NmZ19pZHgsCkBAIC0xMzAzLDcgKzEzMDMsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hsX2RjaF9tY2FfcmVjb25uZWN0X2NmbShVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAordm9pZCBidGFfaGxfZGNoX21jYV9yZWNvbm5lY3RfY2ZtKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpCiB7CiAgICAgdEJUQV9ITF9NQ0xfQ0IgICAgICAqcF9tY2IgID0gQlRBX0hMX0dFVF9NQ0xfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgpOwpAQCAtMTM1MiwxMyArMTM1MiwxMyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hsX2RjaF9tY2FfcmVjb25uZWN0KFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHgsCit2b2lkIGJ0YV9obF9kY2hfbWNhX3JlY29ubmVjdCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpCiB7CiAgICAgdEJUQV9ITF9NQ0xfQ0IgICAgICAqcF9tY2IgID0gQlRBX0hMX0dFVF9NQ0xfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgpOwogICAgIHRCVEFfSExfTURMX0NCICAgICAgKnBfZGNiICA9IEJUQV9ITF9HRVRfTURMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4LCBtZGxfaWR4KTsKICAgICB0TUNBX0NITkxfQ0ZHICAgICAgICpwX2NobmxfY2ZnPU5VTEw7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBzZHBfaWR4OworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBzZHBfaWR4OwogCiAjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9kY2hfbWNhX3JlY29ubmVjdCIpOwpAQCAtMTM5MSwxMyArMTM5MSwxMyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hsX2RjaF9jcmVhdGVfcnNwKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHgsCit2b2lkIGJ0YV9obF9kY2hfY3JlYXRlX3JzcCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpCiB7CiAgICAgdEJUQV9ITF9NQ0xfQ0IgICAgICAgICAgICAgICpwX21jYiAgPSBCVEFfSExfR0VUX01DTF9DQl9QVFIoYXBwX2lkeCwgbWNsX2lkeCk7CiAgICAgdEJUQV9ITF9NRExfQ0IgICAgICAgICAgICAgICpwX2RjYiAgPSBCVEFfSExfR0VUX01ETF9DQl9QVFIoYXBwX2lkeCwgbWNsX2lkeCwgbWRsX2lkeCk7CiAgICAgdEJUQV9ITF9BUElfRENIX0NSRUFURV9SU1AgICpwX2NyZWF0ZV9yc3AgPSAmcF9kYXRhLT5hcGlfZGNoX2NyZWF0ZV9yc3A7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgIG1jYV9yc3BfY29kZSA9IE1DQV9SU1BfU1VDQ0VTUzsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICBtY2FfcnNwX2NvZGUgPSBNQ0FfUlNQX1NVQ0NFU1M7CiAKICNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hsX2RjaF9jcmVhdGVfcnNwIik7CkBAIC0xNDM2LDE3ICsxNDM2LDE3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGxfZGNoX21jYV9jcmVhdGVfaW5kKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHgsCit2b2lkIGJ0YV9obF9kY2hfbWNhX2NyZWF0ZV9pbmQodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0RBVEEgKnBfZGF0YSkKIHsKICAgICB0QlRBX0hMX0FQUF9DQiAgICAgICpwX2FjYiAgPSBCVEFfSExfR0VUX0FQUF9DQl9QVFIoYXBwX2lkeCk7CiAgICAgdEJUQV9ITF9NQ0xfQ0IgICAgICAqcF9tY2IgID0gQlRBX0hMX0dFVF9NQ0xfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgpOwogICAgIHRCVEFfSExfTURMX0NCICAgICAgKnBfZGNiICA9IEJUQV9ITF9HRVRfTURMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4LCBtZGxfaWR4KTsKICAgICB0TUNBX0NSRUFURV9JTkQgICAgICpwX2NyZWF0ZV9pbmQgPSAmcF9kYXRhLT5tY2FfZXZ0Lm1jYV9kYXRhLmNyZWF0ZV9pbmQ7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBtZGVwX2NmZ19pZHg7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBjZmdfcnNwOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgcnNwX2NvZGUgPSBNQ0FfUlNQX1NVQ0NFU1M7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBzZW5kX2NyZWF0ZV9pbmRfZXZ0ID0gRkFMU0U7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIG1kZXBfY2ZnX2lkeDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgY2ZnX3JzcDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgcnNwX2NvZGUgPSBNQ0FfUlNQX1NVQ0NFU1M7CisgICAgYm9vbCAgICAgICAgICAgICBzZW5kX2NyZWF0ZV9pbmRfZXZ0ID0gZmFsc2U7CiAgICAgdEJUQV9ITCAgICAgICAgICAgICBldnRfZGF0YTsKICAgICB0QlRBX0hMX0VDSE9fQ0ZHICAgICpwX2VjaG9fY2ZnOwogCkBAIC0xNDYwLDE0ICsxNDYwLDE0IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChidGFfaGxfZmluZF9lY2hvX2NmZ19yc3AoYXBwX2lkeCwgbWNsX2lkeCwgbWRlcF9jZmdfaWR4LHBfY3JlYXRlX2luZC0+Y2ZnLCAmY2ZnX3JzcCApKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBfZGNiLT5pbl91c2UgICAgICAgICAgICAgICA9IFRSVUU7CisgICAgICAgICAgICAgICAgcF9kY2ItPmluX3VzZSAgICAgICAgICAgICAgID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBwX2RjYi0+ZGNoX29wZXIgICAgICAgICAgICAgPSBCVEFfSExfRENIX09QX1JFTU9URV9PUEVOOwogICAgICAgICAgICAgICAgIHBfZGNiLT5sb2NhbF9tZGVwX2lkICAgICAgICA9IHBfY3JlYXRlX2luZC0+ZGVwX2lkICA7CiAgICAgICAgICAgICAgICAgcF9kY2ItPmxvY2FsX21kZXBfY2ZnX2lkeCAgID0gbWRlcF9jZmdfaWR4OwogICAgICAgICAgICAgICAgIHBfZGNiLT5sb2NhbF9jZmcgICAgICAgICAgICA9IGNmZ19yc3A7CiAgICAgICAgICAgICAgICAgcF9kY2ItPnJlbW90ZV9jZmcgICAgICAgICAgID0gcF9jcmVhdGVfaW5kLT5jZmcgOwogICAgICAgICAgICAgICAgIHBfZGNiLT5tZGxfaWQgICAgICAgICAgICAgICA9IHBfY3JlYXRlX2luZC0+bWRsX2lkOwotICAgICAgICAgICAgICAgIHBfZGNiLT5tZGxfY2ZnX2lkeF9pbmNsdWRlZCA9IEZBTFNFOworICAgICAgICAgICAgICAgIHBfZGNiLT5tZGxfY2ZnX2lkeF9pbmNsdWRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHBfZWNob19jZmcgICAgICAgICAgICAgICAgICAgICAgPSBCVEFfSExfR0VUX0VDSE9fQ0ZHX1BUUihhcHBfaWR4KTsKICAgICAgICAgICAgICAgICBwX2RjYi0+bWF4X3J4X2FwZHVfc2l6ZSAgICAgICAgID0gcF9lY2hvX2NmZy0+bWF4X3J4X2FwZHVfc2l6ZTsKICAgICAgICAgICAgICAgICBwX2RjYi0+bWF4X3R4X2FwZHVfc2l6ZSAgICAgICAgID0gcF9lY2hvX2NmZy0+bWF4X3R4X2FwZHVfc2l6ZTsKQEAgLTE0ODIsMTggKzE0ODIsMTggQEAKICAgICAgICAgZWxzZQogCiAgICAgICAgIHsKLSAgICAgICAgICAgIHBfZGNiLT5pbl91c2UgICAgICAgICAgICAgICA9IFRSVUU7CisgICAgICAgICAgICBwX2RjYi0+aW5fdXNlICAgICAgICAgICAgICAgPSB0cnVlOwogICAgICAgICAgICAgcF9kY2ItPmRjaF9vcGVyICAgICAgICAgICAgID0gQlRBX0hMX0RDSF9PUF9SRU1PVEVfQ1JFQVRFOwogICAgICAgICAgICAgcF9kY2ItPmxvY2FsX21kZXBfaWQgICAgICAgID0gcF9jcmVhdGVfaW5kLT5kZXBfaWQgIDsKICAgICAgICAgICAgIHBfZGNiLT5sb2NhbF9tZGVwX2NmZ19pZHggICA9IG1kZXBfY2ZnX2lkeDsKICAgICAgICAgICAgIHBfZGNiLT5sb2NhbF9jZmcgICAgICAgICAgICA9IEJUQV9ITF9EQ0hfQ0ZHX1VOS05PV047CiAgICAgICAgICAgICBwX2RjYi0+cmVtb3RlX2NmZyAgICAgICAgICAgPSBwX2NyZWF0ZV9pbmQtPmNmZzsKICAgICAgICAgICAgIHBfZGNiLT5tZGxfaWQgICAgICAgICAgICAgICA9IHBfY3JlYXRlX2luZC0+bWRsX2lkOwotICAgICAgICAgICAgcF9kY2ItPm1kbF9jZmdfaWR4X2luY2x1ZGVkID0gRkFMU0U7CisgICAgICAgICAgICBwX2RjYi0+bWRsX2NmZ19pZHhfaW5jbHVkZWQgPSBmYWxzZTsKICAgICAgICAgICAgIGJ0YV9obF9maW5kX3J4dHhfYXBkdV9zaXplKGFwcF9pZHgsIG1kZXBfY2ZnX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX2RjYi0+bWF4X3J4X2FwZHVfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX2RjYi0+bWF4X3R4X2FwZHVfc2l6ZSk7Ci0gICAgICAgICAgICBzZW5kX2NyZWF0ZV9pbmRfZXZ0ID0gVFJVRTsKKyAgICAgICAgICAgIHNlbmRfY3JlYXRlX2luZF9ldnQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIGVsc2UKQEAgLTE1MjYsNyArMTUyNiw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChwX2RjYi0+bG9jYWxfbWRlcF9pZCA9PSBCVEFfSExfRUNIT19URVNUX01ERVBfSUQpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcF9tY2ItPmVjaG9fdGVzdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgcF9tY2ItPmVjaG9fdGVzdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgcF9kY2ItPmVjaG9fb3BlciA9IEJUQV9ITF9FQ0hPX09QX09QRU5fSU5EOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNTQyLDcgKzE1NDIsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hsX2RjaF9tY2FfY3JlYXRlX2NmbShVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAordm9pZCBidGFfaGxfZGNoX21jYV9jcmVhdGVfY2ZtKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpCiB7CiAgICAgdEJUQV9ITF9NQ0xfQ0IgICAgICAqcF9tY2IgID0gQlRBX0hMX0dFVF9NQ0xfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgpOwpAQCAtMTYwNiwxNSArMTYwNiwxNSBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hsX2RjaF9tY2FfY3JlYXRlKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHgsCit2b2lkIGJ0YV9obF9kY2hfbWNhX2NyZWF0ZSh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpCiB7CiAgICAgdEJUQV9ITF9NQ0xfQ0IgICAgICAqcF9tY2IgID0gQlRBX0hMX0dFVF9NQ0xfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgpOwogICAgIHRCVEFfSExfTURMX0NCICAgICAgKnBfZGNiICA9IEJUQV9ITF9HRVRfTURMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4LCBtZGxfaWR4KTsKICAgICB0TUNBX1JFU1VMVCAgICAgICAgIHJlc3VsdDsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIHNkcF9pZHg7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIHNkcF9pZHg7CiAKLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGxfZGNoX21jYV9jcmVhdGUiKTsKICNlbmRpZgogCkBAIC0xNjU0LDcgKzE2NTQsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hsX2RjaF9zZHBfZmFpbChVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAordm9pZCBidGFfaGxfZGNoX3NkcF9mYWlsKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpCiB7CiAKQEAgLTE2NzgsOCArMTY3OCw4IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2hsX3NkcF9jYmFjayhVSU5UOCBzZHBfb3BlciwgVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggbWRsX2lkeCwgVUlOVDE2IHN0YXR1cykKK3N0YXRpYyB2b2lkIGJ0YV9obF9zZHBfY2JhY2sodWludDhfdCBzZHBfb3BlciwgdWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWRsX2lkeCwgdWludDE2X3Qgc3RhdHVzKQogewogICAgIHRCVEFfSExfTUNMX0NCICAgICAgICAgICAgICAgICAgKnBfY2IgPSBCVEFfSExfR0VUX01DTF9DQl9QVFIoYXBwX2lkeCwgbWNsX2lkeCk7CiAgICAgdEJUQV9ITF9TRFBfUkVDICAgICAgICAgICAgICAgICAqcF9oZHBfcmVjOwpAQCAtMTY4OCwxNSArMTY4OCwxNSBAQAogICAgIHRTRFBfRElTQ19SRUMgICAgICAgICAgICAgICAgICAgKnBfcmVjID0gTlVMTDsKICAgICB0U0RQX1BST1RPQ09MX0VMRU0gICAgICAgICAgICAgIHBlOwogICAgIHRTRFBfRElTQ19BVFRSICAgICAgICAgICAgICAgICAgKnBfYXR0cjsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHJlY19jbnQ7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHJlY19jbnQ7CiAgICAgdEJUQV9ITF9TVVBfRkVBVFVSRV9MSVNUX0VMRU0gICBzdXBfZmVhdHVyZTsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIHNkcF9wYXJzaW5nX29rID1GQUxTRSwgcmVzdWx0PUZBTFNFOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICBzZHBfcGFyc2luZ19vayA9ZmFsc2UsIHJlc3VsdD1mYWxzZTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ7CiAgICAgdEJUQV9ITF9NRExfQ0IgICAgICAgICAgICAgICAgICAqcF9kY2I7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX3V1aWQ7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2xlbjsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV91dWlkOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2xlbjsKIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9zZHBfY2JhY2sgc3RhdHVzOiVkIHNkcF9vcGVyPSVkIGFwcF9pZHg9JWQsIG1jbF9pZHg9JWQsICAgbWRsX2lkeD0lZCIsCiAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBzZHBfb3BlciwgYXBwX2lkeCwgbWNsX2lkeCwgbWRsX2lkeCk7CiAjZW5kaWYKQEAgLTE3MjEsNyArMTcyMSw3IEBACiAKICAgICAgICAgICAgIGlmIChTRFBfRmluZFByb3RvY29sTGlzdEVsZW1JblJlYyhwX3JlYywgVVVJRF9QUk9UT0NPTF9MMkNBUCwgJnBlKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwX2hkcF9yZWMtPmN0cmxfcHNtICA9IChVSU5UMTYpIHBlLnBhcmFtc1swXTsKKyAgICAgICAgICAgICAgICBwX2hkcF9yZWMtPmN0cmxfcHNtICA9ICh1aW50MTZfdCkgcGUucGFyYW1zWzBdOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewpAQCAtMTczMCw3ICsxNzMwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChTRFBfRmluZEFkZFByb3RvTGlzdHNFbGVtSW5SZWMocF9yZWMsIFVVSURfUFJPVE9DT0xfTDJDQVAsICZwZSkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcF9oZHBfcmVjLT5kYXRhX3BzbSA9IChVSU5UMTYpIHBlLnBhcmFtc1swXTsKKyAgICAgICAgICAgICAgICBwX2hkcF9yZWMtPmRhdGFfcHNtID0gKHVpbnQxNl90KSBwZS5wYXJhbXNbMF07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7CkBAIC0xNzQyLDcgKzE3NDIsNyBAQAogICAgICAgICAgICAgaWYgKChwX2F0dHIgPSBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfcmVjLCBBVFRSX0lEX1NFUlZJQ0VfTkFNRSkpICE9IE5VTEwpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKFNEUF9ESVNDX0FUVFJfTEVOKHBfYXR0ci0+YXR0cl9sZW5fdHlwZSkgPCBCVF9NQVhfU0VSVklDRV9OQU1FX0xFTikKLSAgICAgICAgICAgICAgICAgICAgbmFtZV9sZW4gPSAoVUlOVDE2KVNEUF9ESVNDX0FUVFJfTEVOKHBfYXR0ci0+YXR0cl9sZW5fdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIG5hbWVfbGVuID0gKHVpbnQxNl90KVNEUF9ESVNDX0FUVFJfTEVOKHBfYXR0ci0+YXR0cl9sZW5fdHlwZSk7CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICBuYW1lX2xlbiA9IEJUX01BWF9TRVJWSUNFX05BTUVfTEVOOwogICAgICAgICAgICAgICAgIG1lbWNweShwX2hkcF9yZWMtPnNydl9uYW1lLCBwX2F0dHItPmF0dHJfdmFsdWUudi5hcnJheSwgbmFtZV9sZW4pOwpAQCAtMTc1Miw3ICsxNzUyLDcgQEAKICAgICAgICAgICAgIGlmICgocF9hdHRyID0gU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYyhwX3JlYywgQVRUUl9JRF9TRVJWSUNFX0RFU0NSSVBUSU9OKSkgIT0gTlVMTCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoU0RQX0RJU0NfQVRUUl9MRU4ocF9hdHRyLT5hdHRyX2xlbl90eXBlKSA8IEJUX01BWF9TRVJWSUNFX05BTUVfTEVOKQotICAgICAgICAgICAgICAgICAgICBuYW1lX2xlbiA9IChVSU5UMTYpU0RQX0RJU0NfQVRUUl9MRU4ocF9hdHRyLT5hdHRyX2xlbl90eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgbmFtZV9sZW4gPSAodWludDE2X3QpU0RQX0RJU0NfQVRUUl9MRU4ocF9hdHRyLT5hdHRyX2xlbl90eXBlKTsKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIG5hbWVfbGVuID0gQlRfTUFYX1NFUlZJQ0VfTkFNRV9MRU47CiAgICAgICAgICAgICAgICAgbWVtY3B5KHBfaGRwX3JlYy0+c3J2X2Rlc3AsIHBfYXR0ci0+YXR0cl92YWx1ZS52LmFycmF5LCBuYW1lX2xlbik7CkBAIC0xNzYzLDcgKzE3NjMsNyBAQAogICAgICAgICAgICAgaWYgKChwX2F0dHIgPSBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfcmVjLCBBVFRSX0lEX1BST1ZJREVSX05BTUUpKSAhPSBOVUxMKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChTRFBfRElTQ19BVFRSX0xFTihwX2F0dHItPmF0dHJfbGVuX3R5cGUpIDwgQlRfTUFYX1NFUlZJQ0VfTkFNRV9MRU4pCi0gICAgICAgICAgICAgICAgICAgIG5hbWVfbGVuID0gKFVJTlQxNilTRFBfRElTQ19BVFRSX0xFTihwX2F0dHItPmF0dHJfbGVuX3R5cGUpOworICAgICAgICAgICAgICAgICAgICBuYW1lX2xlbiA9ICh1aW50MTZfdClTRFBfRElTQ19BVFRSX0xFTihwX2F0dHItPmF0dHJfbGVuX3R5cGUpOwogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgbmFtZV9sZW4gPSBCVF9NQVhfU0VSVklDRV9OQU1FX0xFTjsKICAgICAgICAgICAgICAgICBtZW1jcHkocF9oZHBfcmVjLT5wcm92aWRlcl9uYW1lLCBwX2F0dHItPmF0dHJfdmFsdWUudi5hcnJheSwgbmFtZV9sZW4pOwpAQCAtMTc4Myw3ICsxNzgzLDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoYnRhX2hsX2ZpbGxfc3VwX2ZlYXR1cmVfbGlzdCAocF9hdHRyLCAmc3VwX2ZlYXR1cmUpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcF9oZHBfcmVjLT5udW1fbWRlcHMgPSAoVUlOVDgpIHN1cF9mZWF0dXJlLm51bV9lbGVtczsKKyAgICAgICAgICAgICAgICAgICAgcF9oZHBfcmVjLT5udW1fbWRlcHMgPSAodWludDhfdCkgc3VwX2ZlYXR1cmUubnVtX2VsZW1zOwogICAgICAgICAgICAgICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoImJ0YV9obF9zZHBfY2JhY2sgbnVtX21kZXBzICVkIixzdXBfZmVhdHVyZS5udW1fZWxlbXMpOwogICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxzdXBfZmVhdHVyZS5udW1fZWxlbXM7IGkrKykKICAgICAgICAgICAgICAgICAgICAgewpAQCAtMTgwMyw3ICsxODAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIHNkcF9wYXJzaW5nX29rID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgc2RwX3BhcnNpbmdfb2sgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewpAQCAtMTgxNiw3ICsxODE2LDcgQEAKICAgICAgICAgICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIkhEUCBzdXBwb3J0ZWQgZmVhdHVyZSBsaXN0IG5vdCBmb3VuZCIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygicmVjb3JkPSVkIGN0cmxfcHNtPSUweCBkYXRhX3BzbT0leCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNfY250KzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2hkcF9yZWMtPmN0cmxfcHNtLApAQCAtMTg0NCw3ICsxODQ0LDcgQEAKICAgICAgICAgICAgIH0KIAogCi0gICAgICAgIH0gd2hpbGUgKFRSVUUpOworICAgICAgICB9IHdoaWxlICh0cnVlKTsKICAgICB9CiAKICAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQgKiopJnBfY2ItPnBfZGIpOwpAQCAtMTg1Myw3ICsxODUzLDcgQEAKICAgICAgICAgIHBfY2ItPnNkcC5udW1fcmVjcyAgJiYKICAgICAgICAgIHNkcF9wYXJzaW5nX29rKQogICAgIHsKLSAgICAgICAgcmVzdWx0ID0gVFJVRTsKKyAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKQEAgLTE4OTAsOSArMTg5MCw5IEBACiAKICAgICAgICAgICAgIHBfY2NoX2J1Zi0+YXBwX2lkeCA9IGFwcF9pZHg7CiAgICAgICAgICAgICBwX2NjaF9idWYtPm1jbF9pZHggPSBtY2xfaWR4OwotICAgICAgICAgICAgcF9jY2hfYnVmLT5yZWxlYXNlX21jbF9jYiA9IEZBTFNFOworICAgICAgICAgICAgcF9jY2hfYnVmLT5yZWxlYXNlX21jbF9jYiA9IGZhbHNlOwogICAgICAgICAgICAgaWYgKHNkcF9vcGVyID09IEJUQV9ITF9TRFBfT1BfU0RQX1FVRVJZX05FVykKLSAgICAgICAgICAgICAgICBwX2NjaF9idWYtPnJlbGVhc2VfbWNsX2NiID0gVFJVRTsKKyAgICAgICAgICAgICAgICBwX2NjaF9idWYtPnJlbGVhc2VfbWNsX2NiID0gdHJ1ZTsKIAogICAgICAgICAgICAgYnRhX3N5c19zZW5kbXNnKHBfY2NoX2J1Zik7CiAgICAgICAgICAgICBicmVhazsKQEAgLTE5MDYsNyArMTkwNiw3IEBACiAgICAgICAgICAgICBwX2RjYiA9IEJUQV9ITF9HRVRfTURMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4LCBtZGxfaWR4KTsKICAgICAgICAgICAgIGlmIChwX2RjYi0+YWJvcnRfb3BlciAmIEJUQV9ITF9BQk9SVF9QRU5ESU5HX01BU0spIHsKICAgICAgICAgICAgICAgICBwX2RjYi0+YWJvcnRfb3BlciAmPSB+QlRBX0hMX0FCT1JUX1BFTkRJTkdfTUFTSzsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICBpZiAoc2RwX29wZXIgPT0gQlRBX0hMX1NEUF9PUF9EQ0hfT1BFTl9JTklUKSB7CkBAIC0xOTM2LDcgKzE5MzYsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9obF9zZHBfY2JhY2swKFVJTlQxNiBzdGF0dXMpCitzdGF0aWMgdm9pZCBidGFfaGxfc2RwX2NiYWNrMCh1aW50MTZfdCBzdGF0dXMpCiB7CiAgICAgYnRhX2hsX3NkcF9jYmFjayhidGFfaGxfY2Iuc2NiWzBdLnNkcF9vcGVyLAogICAgICAgICAgICAgICAgICAgICAgYnRhX2hsX2NiLnNjYlswXS5hcHBfaWR4LApAQCAtMTk1Nyw3ICsxOTU3LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZC4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGxfc2RwX2NiYWNrMShVSU5UMTYgc3RhdHVzKQorc3RhdGljIHZvaWQgYnRhX2hsX3NkcF9jYmFjazEodWludDE2X3Qgc3RhdHVzKQogewogICAgIGJ0YV9obF9zZHBfY2JhY2soYnRhX2hsX2NiLnNjYlsxXS5zZHBfb3BlciwKICAgICAgICAgICAgICAgICAgICAgIGJ0YV9obF9jYi5zY2JbMV0uYXBwX2lkeCwKQEAgLTE5NzYsNyArMTk3Niw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2hsX3NkcF9jYmFjazIoVUlOVDE2IHN0YXR1cykKK3N0YXRpYyB2b2lkIGJ0YV9obF9zZHBfY2JhY2syKHVpbnQxNl90IHN0YXR1cykKIHsKICAgICBidGFfaGxfc2RwX2NiYWNrKGJ0YV9obF9jYi5zY2JbMl0uc2RwX29wZXIsCiAgICAgICAgICAgICAgICAgICAgICBidGFfaGxfY2Iuc2NiWzJdLmFwcF9pZHgsCkBAIC0xOTk1LDcgKzE5OTUsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9obF9zZHBfY2JhY2szKFVJTlQxNiBzdGF0dXMpCitzdGF0aWMgdm9pZCBidGFfaGxfc2RwX2NiYWNrMyh1aW50MTZfdCBzdGF0dXMpCiB7CiAgICAgYnRhX2hsX3NkcF9jYmFjayhidGFfaGxfY2Iuc2NiWzNdLnNkcF9vcGVyLAogICAgICAgICAgICAgICAgICAgICAgYnRhX2hsX2NiLnNjYlszXS5hcHBfaWR4LApAQCAtMjAxNiw3ICsyMDE2LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZC4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGxfc2RwX2NiYWNrNChVSU5UMTYgc3RhdHVzKQorc3RhdGljIHZvaWQgYnRhX2hsX3NkcF9jYmFjazQodWludDE2X3Qgc3RhdHVzKQogewogICAgIGJ0YV9obF9zZHBfY2JhY2soYnRhX2hsX2NiLnNjYls0XS5zZHBfb3BlciwKICAgICAgICAgICAgICAgICAgICAgIGJ0YV9obF9jYi5zY2JbNF0uYXBwX2lkeCwKQEAgLTIwMzcsNyArMjAzNyw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2hsX3NkcF9jYmFjazUoVUlOVDE2IHN0YXR1cykKK3N0YXRpYyB2b2lkIGJ0YV9obF9zZHBfY2JhY2s1KHVpbnQxNl90IHN0YXR1cykKIHsKICAgICBidGFfaGxfc2RwX2NiYWNrKGJ0YV9obF9jYi5zY2JbNV0uc2RwX29wZXIsCiAgICAgICAgICAgICAgICAgICAgICBidGFfaGxfY2Iuc2NiWzVdLmFwcF9pZHgsCkBAIC0yMDU2LDcgKzIwNTYsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9obF9zZHBfY2JhY2s2KFVJTlQxNiBzdGF0dXMpCitzdGF0aWMgdm9pZCBidGFfaGxfc2RwX2NiYWNrNih1aW50MTZfdCBzdGF0dXMpCiB7CiAgICAgYnRhX2hsX3NkcF9jYmFjayhidGFfaGxfY2Iuc2NiWzZdLnNkcF9vcGVyLAogICAgICAgICAgICAgICAgICAgICAgYnRhX2hsX2NiLnNjYls2XS5hcHBfaWR4LApAQCAtMjA3MywxNyArMjA3MywxNyBAQAogKioKICoqIERlc2NyaXB0aW9uICAgRGVhbGxvY2F0ZSBhIFNEUCBjb250cm9sIGJsb2NrCiAqKgotKiogUmV0dXJucyAgICAgIEJPT0xFQU4gLSBUUlVFIGZvdW5kCi0qKiAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIG5vdCBmb3VuZAorKiogUmV0dXJucyAgICAgIGJvb2wgLSB0cnVlIGZvdW5kCisqKiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIG5vdCBmb3VuZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9obF9kZWFsbG9jYXRlX3NwZF9jYmFjayhVSU5UOCBzZHBfY2JhY2tfaWR4KQordm9pZCBidGFfaGxfZGVhbGxvY2F0ZV9zcGRfY2JhY2sodWludDhfdCBzZHBfY2JhY2tfaWR4KQogewogICAgIHRCVEFfSExfU0RQX0NCICpwX3NwZF9jYiA9ICZidGFfaGxfY2Iuc2NiW3NkcF9jYmFja19pZHhdOwogCiAgICAgbWVtc2V0KHBfc3BkX2NiLCAwLCBzaXplb2YodEJUQV9ITF9TRFBfQ0IpKTsKIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9kZWFsbG9jYXRlX3NwZF9jYmFjayBpbmRleD0lZCIsIHNkcF9jYmFja19pZHgpOwogI2VuZGlmCiAKQEAgLTIwOTcsMTUgKzIwOTcsMTUgQEAKICoqIERlc2NyaXB0aW9uICAgRmluZHMgYSBub3QgaW4gdXNlZCBTRFAgY29udHJvbCBibG9jayBpbmRleAogKioKICoqCi0qKiBSZXR1cm5zICAgICAgQk9PTEVBTiAtIFRSVUUgZm91bmQKLSoqICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0Ugbm90IGZvdW5kCisqKiBSZXR1cm5zICAgICAgYm9vbCAtIHRydWUgZm91bmQKKyoqICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2Ugbm90IGZvdW5kCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRTRFBfRElTQ19DTVBMX0NCICpidGFfaGxfYWxsb2NhdGVfc3BkX2NiYWNrKHRCVEFfSExfU0RQX09QRVIgc2RwX29wZXIsIFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBtZGxfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfc2RwX2NiYWNrX2lkeCkKK3RTRFBfRElTQ19DTVBMX0NCICpidGFfaGxfYWxsb2NhdGVfc3BkX2NiYWNrKHRCVEFfSExfU0RQX09QRVIgc2RwX29wZXIsIHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtZGxfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9zZHBfY2JhY2tfaWR4KQogewotICAgIFVJTlQ4IGk7CisgICAgdWludDhfdCBpOwogICAgIHRTRFBfRElTQ19DTVBMX0NCICpwX2NiY2FrPU5VTEw7CiAKIApAQCAtMjExNCw3ICsyMTE0LDcgQEAKICAgICAgICAgaWYgKCFidGFfaGxfY2Iuc2NiW2ldLmluX3VzZSkKICAgICAgICAgewogICAgICAgICAgICAgcF9jYmNhayA9IGJ0YV9obF9zZHBfY2JhY2tfYXJyW2ldOwotICAgICAgICAgICAgYnRhX2hsX2NiLnNjYltpXS5pbl91c2UgPSBUUlVFOworICAgICAgICAgICAgYnRhX2hsX2NiLnNjYltpXS5pbl91c2UgPSB0cnVlOwogICAgICAgICAgICAgYnRhX2hsX2NiLnNjYltpXS5zZHBfb3BlciA9IHNkcF9vcGVyOwogICAgICAgICAgICAgYnRhX2hsX2NiLnNjYltpXS5hcHBfaWR4ID0gYXBwX2lkeDsKICAgICAgICAgICAgIGJ0YV9obF9jYi5zY2JbaV0ubWNsX2lkeCA9IG1jbF9pZHg7CkBAIC0yMTMwLDcgKzIxMzAsNyBAQAogICAgIH0KICAgICBlbHNlCiAgICAgewotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9hbGxvY2F0ZV9zcGRfY2JhY2sgY2JhY2tfaWR4PSVkICIsaSApOwogICAgIEFQUExfVFJBQ0VfREVCVUcoInNkcF9vcGVyPSVkLCBhcHBfaWR4PSVkLCBtY2xfaWR4PSVkLCAgbWRsX2lkeD0lZCIsCiAgICAgICAgICAgICAgICAgICAgICAgYnRhX2hsX2NiLnNjYltpXS5zZHBfb3BlciwKQEAgLTIxNTIsMTYgKzIxNTIsMTYgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0hMX1NUQVRVUyBidGFfaGxfaW5pdF9zZHAodEJUQV9ITF9TRFBfT1BFUiBzZHBfb3BlciwgVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBtZGxfaWR4KQordEJUQV9ITF9TVEFUVVMgYnRhX2hsX2luaXRfc2RwKHRCVEFfSExfU0RQX09QRVIgc2RwX29wZXIsIHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWRsX2lkeCkKIHsKICAgICB0QlRBX0hMX01DTF9DQiAgICAgICpwX2NiICA9IEJUQV9ITF9HRVRfTUNMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4KTsKICAgICB0U0RQX1VVSUQgICAgICAgICAgIHV1aWRfbGlzdDsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIGF0dHJfbGlzdFtCVEFfSExfTlVNX1NSQ0hfQVRUUl07Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBudW1fYXR0cnMgPSBCVEFfSExfTlVNX1NSQ0hfQVRUUjsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgYXR0cl9saXN0W0JUQV9ITF9OVU1fU1JDSF9BVFRSXTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgbnVtX2F0dHJzID0gQlRBX0hMX05VTV9TUkNIX0FUVFI7CiAgICAgdEJUQV9ITF9TVEFUVVMgICAgICBzdGF0dXM7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBzZHBfY2JhY2tfaWR4OwotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisgICAgdWludDhfdCAgICAgICAgICAgICAgIHNkcF9jYmFja19pZHg7CisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9pbml0X3NkcCBzZHBfb3Blcj0lZCBhcHBfaWR4PSVkIG1jbF9pZHg9JWQsIG1kbF9pZHg9JWQiLAogICAgICAgICAgICAgICAgICAgICAgIHNkcF9vcGVyLCBhcHBfaWR4LCBtY2xfaWR4LCBtZGxfaWR4KTsKICNlbmRpZgpAQCAtMjIxMiwxMCArMjIxMiwxMCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hsX2NjaF9zZHBfaW5pdChVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCAgdEJUQV9ITF9EQVRBICpwX2RhdGEpCit2b2lkIGJ0YV9obF9jY2hfc2RwX2luaXQodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsICB0QlRBX0hMX0RBVEEgKnBfZGF0YSkKIHsKICAgICB0QlRBX0hMX01DTF9DQiAgICAgICpwX2NiICA9IEJUQV9ITF9HRVRfTUNMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4KTsKLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGxfY2NoX2luaXRfc2RwIik7CiAjZW5kaWYKICAgICBpZiAoIHBfY2ItPnNkcF9vcGVyID09IEJUQV9ITF9TRFBfT1BfTk9ORSkKQEAgLTIyNDUsMTMgKzIyNDUsMTMgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9obF9jY2hfbWNhX29wZW4oVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgIHRCVEFfSExfREFUQSAqcF9kYXRhKQordm9pZCBidGFfaGxfY2NoX21jYV9vcGVuKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCAgdEJUQV9ITF9EQVRBICpwX2RhdGEpCiB7CiAgICAgdEJUQV9ITF9BUFBfQ0IgICAgICAqcF9hY2IgID0gQlRBX0hMX0dFVF9BUFBfQ0JfUFRSKGFwcF9pZHgpOwogICAgIHRCVEFfSExfTUNMX0NCICAgICAgKnBfbWNiICA9IEJUQV9ITF9HRVRfTUNMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4KTsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIHNkcF9pZHg7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIHNkcF9pZHg7CiAKLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGxfY2NoX21jYV9vcGVuIik7CiAjZW5kaWYKIApAQCAtMjI4MywxMSArMjI4MywxMSBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hsX2NjaF9tY2FfY2xvc2UoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgIHRCVEFfSExfREFUQSAqcF9kYXRhKQordm9pZCBidGFfaGxfY2NoX21jYV9jbG9zZSh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgIHRCVEFfSExfREFUQSAqcF9kYXRhKQogewogICAgIHRCVEFfSExfTUNMX0NCICAgICAgKnBfbWNiICA9IEJUQV9ITF9HRVRfTUNMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4KTsKIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9jY2hfbWNhX2Nsb3NlIG1jbF9oYW5kbGU9JWQiLCBwX21jYi0+bWNsX2hhbmRsZSk7CiAjZW5kaWYKICAgICBpZiAocF9tY2ItPnNkcF9vcGVyICE9IEJUQV9ITF9TRFBfT1BfQ0NIX0lOSVQpCkBAIC0yMzAxLDEzICsyMzAxLDEzIEBACiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7Ci0gICAgICAgICAgICBwX21jYi0+Y2xvc2VfcGVuZGluZyA9IFRSVUU7CisgICAgICAgICAgICBwX21jYi0+Y2xvc2VfcGVuZGluZyA9IHRydWU7CiAgICAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJObyB2YWxpZCBtY2xfaGFuZGxlIHRvIHN0b3AgdGhlIENDSCBzZXR1cCBub3cgc28gd2FpdCB1bnRpbCBDQ0ggaXMgdXAgdGhlbiBjbG9zZSBpdCIgKTsKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgICBwX21jYi0+Y2xvc2VfcGVuZGluZyA9IFRSVUU7CisgICAgICAgIHBfbWNiLT5jbG9zZV9wZW5kaW5nID0gdHJ1ZTsKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiY2FuIG5vdCBzdG9wIHRoZSBDQ0ggc2V0dXAgYmVjYXN1ZSBTRFAgaXMgaW4gcHJvZ3Jlc3Mgc28gd2FpdCB1bnRpbCBpdCBpcyBkb25lIiApOwogICAgIH0KIH0KQEAgLTIzMjEsMTUgKzIzMjEsMTUgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9obF9jY2hfY2xvc2VfY21wbChVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCAgdEJUQV9ITF9EQVRBICpwX2RhdGEpCit2b2lkIGJ0YV9obF9jY2hfY2xvc2VfY21wbCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgIHRCVEFfSExfREFUQSAqcF9kYXRhKQogewogICAgIHRCVEFfSExfQVBQX0NCICAgICAgKnBfYWNiICA9IEJUQV9ITF9HRVRfQVBQX0NCX1BUUihhcHBfaWR4KTsKICAgICB0QlRBX0hMX01DTF9DQiAgICAgICpwX21jYiAgPSBCVEFfSExfR0VUX01DTF9DQl9QVFIoYXBwX2lkeCwgbWNsX2lkeCk7CiAKICAgICB0QlRBX0hMICAgICAgICAgICAgIGV2dF9kYXRhOwogICAgIHRCVEFfSExfRVZUICAgICAgICAgZXZlbnQ7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBzZW5kX2V2dD1UUlVFOwotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisgICAgYm9vbCAgICAgICAgICAgICBzZW5kX2V2dD10cnVlOworI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGxfY2NoX2Nsb3NlX2NtcGwiKTsKICNlbmRpZgogICAgIGJ0YV9zeXNfY29ubl9jbG9zZShCVEFfSURfSEwsIHBfYWNiLT5hcHBfaWQsIHBfbWNiLT5iZF9hZGRyKTsKQEAgLTIzNjMsNyArMjM2Myw3IEBACiAgICAgICAgICAgICBldmVudCA9IEJUQV9ITF9DQ0hfQ0xPU0VfSU5EX0VWVDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgc2VuZF9ldnQ9RkFMU0U7CisgICAgICAgICAgICBzZW5kX2V2dD1mYWxzZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtMjM4NCwyMCArMjM4NCwyMCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hsX2NjaF9tY2FfZGlzY29ubmVjdChVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCAgdEJUQV9ITF9EQVRBICpwX2RhdGEpCit2b2lkIGJ0YV9obF9jY2hfbWNhX2Rpc2Nvbm5lY3QodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsICB0QlRBX0hMX0RBVEEgKnBfZGF0YSkKIHsKIAogICAgIHRCVEFfSExfTUNMX0NCICAgICAgKnBfbWNiICA9IEJUQV9ITF9HRVRfTUNMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4KTsKICAgICB0QlRBX0hMX01ETF9DQiAgICAgICpwX2RjYjsKLSAgICBVSU5UOCAgICAgICAgICAgICAgaTsKLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorICAgIHVpbnQ4X3QgICAgICAgICAgICAgIGk7CisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9jY2hfbWNhX2Rpc2Nvbm5lY3QiKTsKICNlbmRpZgogCi0gICAgcF9tY2ItPmludGVudGlvbmFsX2Nsb3NlID0gRkFMU0U7CisgICAgcF9tY2ItPmludGVudGlvbmFsX2Nsb3NlID0gZmFsc2U7CiAgICAgaWYgKHBfZGF0YS0+bWNhX2V2dC5tY2FfZGF0YS5kaXNjb25uZWN0X2luZC5yZWFzb24gPT0gTDJDQVBfRElTQ19PSykKICAgICB7Ci0gICAgICAgIHBfbWNiLT5pbnRlbnRpb25hbF9jbG9zZSA9IFRSVUU7CisgICAgICAgIHBfbWNiLT5pbnRlbnRpb25hbF9jbG9zZSA9IHRydWU7CiAgICAgfQogCiAgICAgZm9yIChpPTA7IGk8IEJUQV9ITF9OVU1fTURMU19QRVJfTUNMOyBpKyspCkBAIC0yNDI3LDE1ICsyNDI3LDE1IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGxfY2NoX21jYV9kaXNjX29wZW4oVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgIHRCVEFfSExfREFUQSAqcF9kYXRhKQordm9pZCBidGFfaGxfY2NoX21jYV9kaXNjX29wZW4odWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsICB0QlRBX0hMX0RBVEEgKnBfZGF0YSkKIHsKICAgICB0QlRBX0hMX01DTF9DQiAgICAgICpwX21jYiAgPSBCVEFfSExfR0VUX01DTF9DQl9QVFIoYXBwX2lkeCwgbWNsX2lkeCk7CiAKLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGxfY2NoX21jYV9kaXNjX29wZW4gbWNsX2hhbmRsZT0weCV4IGNsb3NlX3BlbmRpbmc9JWQiLCBwX2RhdGEtPm1jYV9ldnQubWNsX2hhbmRsZSwgcF9tY2ItPmNsb3NlX3BlbmRpbmcgKTsKICNlbmRpZgogCi0gICAgcF9tY2ItPmNsb3NlX3BlbmRpbmcgPSBGQUxTRTsKKyAgICBwX21jYi0+Y2xvc2VfcGVuZGluZyA9IGZhbHNlOwogICAgIHBfbWNiLT5tY2xfaGFuZGxlID0gcF9kYXRhLT5tY2FfZXZ0Lm1jbF9oYW5kbGU7CiAgICAgYnRhX2hsX2NjaF9tY2FfY2xvc2UoYXBwX2lkeCwgbWNsX2lkeCwgcF9kYXRhKTsKIH0KQEAgLTI0NDksMTcgKzI0NDksMTcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9obF9jY2hfbWNhX3JzcF90b3V0KFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsICB0QlRBX0hMX0RBVEEgKnBfZGF0YSkKK3ZvaWQgYnRhX2hsX2NjaF9tY2FfcnNwX3RvdXQodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsICB0QlRBX0hMX0RBVEEgKnBfZGF0YSkKIHsKIAogICAgIHRCVEFfSExfTUNMX0NCICAgICAgKnBfbWNiICA9IEJUQV9ITF9HRVRfTUNMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4KTsKLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGxfY2NoX21jYV9yc3BfdG91dCIpOwogI2VuZGlmCiAKLSAgICBwX21jYi0+cnNwX3RvdXQgPSBUUlVFOworICAgIHBfbWNiLT5yc3BfdG91dCA9IHRydWU7CiAKLSAgICBidGFfaGxfY2hlY2tfY2NoX2Nsb3NlKGFwcF9pZHgsbWNsX2lkeCxwX2RhdGEsVFJVRSk7CisgICAgYnRhX2hsX2NoZWNrX2NjaF9jbG9zZShhcHBfaWR4LG1jbF9pZHgscF9kYXRhLHRydWUpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjQ3MSwxNSArMjQ3MSwxNSBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hsX2NjaF9tY2FfY29ubmVjdChVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCAgdEJUQV9ITF9EQVRBICpwX2RhdGEpCit2b2lkIGJ0YV9obF9jY2hfbWNhX2Nvbm5lY3QodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsICB0QlRBX0hMX0RBVEEgKnBfZGF0YSkKIHsKICAgICB0QlRBX0hMX0FQUF9DQiAgICAgICpwX2FjYiAgPSBCVEFfSExfR0VUX0FQUF9DQl9QVFIoYXBwX2lkeCk7CiAgICAgdEJUQV9ITF9NQ0xfQ0IgICAgICAqcF9tY2IgID0gQlRBX0hMX0dFVF9NQ0xfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgpOwogICAgIHRCVEFfSEwgICAgICAgICAgICAgZXZ0X2RhdGE7CiAgICAgdEJUQV9ITF9FVlQgICAgICAgICBldmVudDsKLSAgICBCT09MRUFOICAgICAgICAgICAgIHNlbmRfZXZlbnQ9VFJVRTsKKyAgICBib29sICAgICAgICAgICAgIHNlbmRfZXZlbnQ9dHJ1ZTsKIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9jY2hfbWNhX2Nvbm5lY3QgbWNsX2hhbmRsZT0lZCAiLCBwX2RhdGEtPm1jYV9ldnQubWNsX2hhbmRsZSk7CiAjZW5kaWYKIApAQCAtMjUwNCw3ICsyNTA0LDcgQEAKICAgICAgICAgICAgIGV2ZW50ID0gQlRBX0hMX0NDSF9PUEVOX0lORF9FVlQ7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHNlbmRfZXZlbnQgPSBGQUxTRTsKKyAgICAgICAgICAgIHNlbmRfZXZlbnQgPSBmYWxzZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtMjUyMSwxMSArMjUyMSwxMSBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hsX21jYXBfY3RybF9jYmFjayAodE1DQV9IQU5ETEUgaGFuZGxlLCB0TUNBX0NMIG1jbCwgVUlOVDggZXZlbnQsCit2b2lkIGJ0YV9obF9tY2FwX2N0cmxfY2JhY2sgKHRNQ0FfSEFORExFIGhhbmRsZSwgdE1DQV9DTCBtY2wsIHVpbnQ4X3QgZXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRNQ0FfQ1RSTCAqcF9kYXRhKQogewotICAgIEJPT0xFQU4gc2VuZF9ldmVudD1UUlVFOwotICAgIFVJTlQxNiBtY2FfZXZlbnQ7CisgICAgYm9vbCBzZW5kX2V2ZW50PXRydWU7CisgICAgdWludDE2X3QgbWNhX2V2ZW50OwogCiAjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogI2lmIChCVF9UUkFDRV9WRVJCT1NFID09IFRSVUUpCkBAIC0yNTM5LDU3ICsyNTM5LDU3IEBACiAgICAgewogCiAgICAgICAgIGNhc2UgTUNBX0NSRUFURV9JTkRfRVZUOgotICAgICAgICAgICAgbWNhX2V2ZW50ID0gKFVJTlQxNikgQlRBX0hMX01DQV9DUkVBVEVfSU5EX0VWVDsKKyAgICAgICAgICAgIG1jYV9ldmVudCA9ICh1aW50MTZfdCkgQlRBX0hMX01DQV9DUkVBVEVfSU5EX0VWVDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1DQV9DUkVBVEVfQ0ZNX0VWVDoKLSAgICAgICAgICAgIG1jYV9ldmVudCA9IChVSU5UMTYpIEJUQV9ITF9NQ0FfQ1JFQVRFX0NGTV9FVlQ7CisgICAgICAgICAgICBtY2FfZXZlbnQgPSAodWludDE2X3QpIEJUQV9ITF9NQ0FfQ1JFQVRFX0NGTV9FVlQ7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNQ0FfUkVDT05ORUNUX0lORF9FVlQ6Ci0gICAgICAgICAgICBtY2FfZXZlbnQgPSAoVUlOVDE2KSBCVEFfSExfTUNBX1JFQ09OTkVDVF9JTkRfRVZUOworICAgICAgICAgICAgbWNhX2V2ZW50ID0gKHVpbnQxNl90KSBCVEFfSExfTUNBX1JFQ09OTkVDVF9JTkRfRVZUOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTUNBX1JFQ09OTkVDVF9DRk1fRVZUOgotICAgICAgICAgICAgbWNhX2V2ZW50ID0gKFVJTlQxNikgQlRBX0hMX01DQV9SRUNPTk5FQ1RfQ0ZNX0VWVDsKKyAgICAgICAgICAgIG1jYV9ldmVudCA9ICh1aW50MTZfdCkgQlRBX0hMX01DQV9SRUNPTk5FQ1RfQ0ZNX0VWVDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1DQV9BQk9SVF9JTkRfRVZUOgotICAgICAgICAgICAgbWNhX2V2ZW50ID0gKFVJTlQxNikgQlRBX0hMX01DQV9BQk9SVF9JTkRfRVZUOworICAgICAgICAgICAgbWNhX2V2ZW50ID0gKHVpbnQxNl90KSBCVEFfSExfTUNBX0FCT1JUX0lORF9FVlQ7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNQ0FfQUJPUlRfQ0ZNX0VWVDoKLSAgICAgICAgICAgIG1jYV9ldmVudCA9IChVSU5UMTYpIEJUQV9ITF9NQ0FfQUJPUlRfQ0ZNX0VWVDsKKyAgICAgICAgICAgIG1jYV9ldmVudCA9ICh1aW50MTZfdCkgQlRBX0hMX01DQV9BQk9SVF9DRk1fRVZUOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTUNBX0RFTEVURV9JTkRfRVZUOgotICAgICAgICAgICAgbWNhX2V2ZW50ID0gKFVJTlQxNikgQlRBX0hMX01DQV9ERUxFVEVfSU5EX0VWVDsKKyAgICAgICAgICAgIG1jYV9ldmVudCA9ICh1aW50MTZfdCkgQlRBX0hMX01DQV9ERUxFVEVfSU5EX0VWVDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1DQV9ERUxFVEVfQ0ZNX0VWVDoKLSAgICAgICAgICAgIG1jYV9ldmVudCA9IChVSU5UMTYpIEJUQV9ITF9NQ0FfREVMRVRFX0NGTV9FVlQ7CisgICAgICAgICAgICBtY2FfZXZlbnQgPSAodWludDE2X3QpIEJUQV9ITF9NQ0FfREVMRVRFX0NGTV9FVlQ7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNQ0FfQ09OTkVDVF9JTkRfRVZUOgotICAgICAgICAgICAgbWNhX2V2ZW50ID0gKFVJTlQxNikgQlRBX0hMX01DQV9DT05ORUNUX0lORF9FVlQ7CisgICAgICAgICAgICBtY2FfZXZlbnQgPSAodWludDE2X3QpIEJUQV9ITF9NQ0FfQ09OTkVDVF9JTkRfRVZUOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTUNBX0RJU0NPTk5FQ1RfSU5EX0VWVDoKLSAgICAgICAgICAgIG1jYV9ldmVudCA9IChVSU5UMTYpIEJUQV9ITF9NQ0FfRElTQ09OTkVDVF9JTkRfRVZUOworICAgICAgICAgICAgbWNhX2V2ZW50ID0gKHVpbnQxNl90KSBCVEFfSExfTUNBX0RJU0NPTk5FQ1RfSU5EX0VWVDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1DQV9PUEVOX0lORF9FVlQ6Ci0gICAgICAgICAgICBtY2FfZXZlbnQgPSAoVUlOVDE2KSBCVEFfSExfTUNBX09QRU5fSU5EX0VWVDsKKyAgICAgICAgICAgIG1jYV9ldmVudCA9ICh1aW50MTZfdCkgQlRBX0hMX01DQV9PUEVOX0lORF9FVlQ7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNQ0FfT1BFTl9DRk1fRVZUOgotICAgICAgICAgICAgbWNhX2V2ZW50ID0gKFVJTlQxNikgQlRBX0hMX01DQV9PUEVOX0NGTV9FVlQ7CisgICAgICAgICAgICBtY2FfZXZlbnQgPSAodWludDE2X3QpIEJUQV9ITF9NQ0FfT1BFTl9DRk1fRVZUOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTUNBX0NMT1NFX0lORF9FVlQ6Ci0gICAgICAgICAgICBtY2FfZXZlbnQgPSAoVUlOVDE2KSBCVEFfSExfTUNBX0NMT1NFX0lORF9FVlQ7CisgICAgICAgICAgICBtY2FfZXZlbnQgPSAodWludDE2X3QpIEJUQV9ITF9NQ0FfQ0xPU0VfSU5EX0VWVDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1DQV9DTE9TRV9DRk1fRVZUOgotICAgICAgICAgICAgbWNhX2V2ZW50ID0gKFVJTlQxNikgQlRBX0hMX01DQV9DTE9TRV9DRk1fRVZUOworICAgICAgICAgICAgbWNhX2V2ZW50ID0gKHVpbnQxNl90KSBCVEFfSExfTUNBX0NMT1NFX0NGTV9FVlQ7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNQ0FfQ09OR19DSEdfRVZUOgotICAgICAgICAgICAgbWNhX2V2ZW50ID0gKFVJTlQxNikgQlRBX0hMX01DQV9DT05HX0NIR19FVlQ7CisgICAgICAgICAgICBtY2FfZXZlbnQgPSAodWludDE2X3QpIEJUQV9ITF9NQ0FfQ09OR19DSEdfRVZUOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTUNBX1JTUF9UT1VUX0lORF9FVlQ6Ci0gICAgICAgICAgICBtY2FfZXZlbnQgPSAoVUlOVDE2KSBCVEFfSExfTUNBX1JTUF9UT1VUX0lORF9FVlQ7CisgICAgICAgICAgICBtY2FfZXZlbnQgPSAodWludDE2X3QpIEJUQV9ITF9NQ0FfUlNQX1RPVVRfSU5EX0VWVDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1DQV9FUlJPUl9SU1BfRVZUOgogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBzZW5kX2V2ZW50PUZBTFNFOworICAgICAgICAgICAgc2VuZF9ldmVudD1mYWxzZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtMjYxNSw3ICsyNjE1LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9obF9tY2FwX2RhdGFfY2JhY2sgKHRNQ0FfREwgbWRsLCBCVF9IRFIgKnBfcGt0KQogewotICAgIFVJTlQ4IGFwcF9pZHgsIG1jbF9pZHgsIG1kbF9pZHg7CisgICAgdWludDhfdCBhcHBfaWR4LCBtY2xfaWR4LCBtZGxfaWR4OwogICAgIGlmIChidGFfaGxfZmluZF9tZGxfaWR4X3VzaW5nX2hhbmRsZSAoKHRCVEFfSExfTURMX0hBTkRMRSltZGwsICZhcHBfaWR4LCAmbWNsX2lkeCwgJm1kbF9pZHgpKQogICAgIHsKICAgICAgICAgdEJUQV9ITF9NQ0FfUkNWX0RBVEFfRVZUICpwX21zZyA9CkBAIC0yNjQzLDcgKzI2NDMsNyBAQAogKiogUmV0dXJucyAgICAgICAgICBjaGFyICogLSBldmVudCBzdHJpbmcgcG9pbnRlcgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgY2hhciAqYnRhX2hsX21jYXBfZXZ0X2NvZGUoVUlOVDggZXZ0X2NvZGUpCitzdGF0aWMgY2hhciAqYnRhX2hsX21jYXBfZXZ0X2NvZGUodWludDhfdCBldnRfY29kZSkKIHsKIAogICAgIHN3aXRjaCAoZXZ0X2NvZGUpCkBAIC0yNjk5LDcgKzI2OTksNyBAQAogKiogUmV0dXJucyAgICAgICAgICBjaGFyICogLSBldmVudCBzdHJpbmcgcG9pbnRlcgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgY2hhciAqYnRhX2hsX2NiYWNrX2V2dF9jb2RlKFVJTlQ4IGV2dF9jb2RlKQorc3RhdGljIGNoYXIgKmJ0YV9obF9jYmFja19ldnRfY29kZSh1aW50OF90IGV2dF9jb2RlKQogewogCiAgICAgc3dpdGNoIChldnRfY29kZSkKZGlmZiAtLWdpdCBhL2J0YS9obC9idGFfaGxfYXBpLmMgYi9idGEvaGwvYnRhX2hsX2FwaS5jCmluZGV4IDgxODEzZjMuLjdiNTdlMDQgMTAwNjQ0Ci0tLSBhL2J0YS9obC9idGFfaGxfYXBpLmMKKysrIGIvYnRhL2hsL2J0YV9obF9hcGkuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogCiAjaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaWYgZGVmaW5lZChITF9JTkNMVURFRCkgJiYgKEhMX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEhMX0lOQ0xVREVEID09IFRSVUUpCiAKICNpbmNsdWRlICJidF9jb21tb24uaCIKICNpbmNsdWRlICJidGFfaGxfYXBpLmgiCkBAIC0xMDQsOCArMTA0LDggQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9IbFVwZGF0ZShVSU5UOCBhcHBfaWQsIHRCVEFfSExfUkVHX1BBUkFNICpwX3JlZ19wYXJhbSwKLSAgICAgICAgICAgICAgICAgIEJPT0xFQU4gaXNfcmVnaXN0ZXIsIHRCVEFfSExfQ0JBQ0sgKnBfY2JhY2spCit2b2lkIEJUQV9IbFVwZGF0ZSh1aW50OF90IGFwcF9pZCwgdEJUQV9ITF9SRUdfUEFSQU0gKnBfcmVnX3BhcmFtLAorICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZWdpc3RlciwgdEJUQV9ITF9DQkFDSyAqcF9jYmFjaykKIHsKICAgICB0QlRBX0hMX0FQSV9VUERBVEUgKnBfYnVmID0KICAgICAgICAgKHRCVEFfSExfQVBJX1VQREFURSAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfSExfQVBJX1VQREFURSkpOwpAQCAtMTUyLDcgKzE1Miw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfSGxSZWdpc3RlcihVSU5UOCAgYXBwX2lkLAordm9pZCBCVEFfSGxSZWdpc3Rlcih1aW50OF90ICBhcHBfaWQsCiAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfUkVHX1BBUkFNICpwX3JlZ19wYXJhbSwKICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9DQkFDSyAqcF9jYmFjaykKIHsKQEAgLTE5Myw3ICsxOTMsNyBAQAogKiogUmV0dXJucyAgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9IbERlcmVnaXN0ZXIoVUlOVDggYXBwX2lkLHRCVEFfSExfQVBQX0hBTkRMRSBhcHBfaGFuZGxlKQordm9pZCBCVEFfSGxEZXJlZ2lzdGVyKHVpbnQ4X3QgYXBwX2lkLHRCVEFfSExfQVBQX0hBTkRMRSBhcHBfaGFuZGxlKQogewogICAgIHRCVEFfSExfQVBJX0RFUkVHSVNURVIgKnBfYnVmID0KICAgICAgICAgKHRCVEFfSExfQVBJX0RFUkVHSVNURVIgKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0hMX0FQSV9ERVJFR0lTVEVSKSk7CkBAIC0yMjEsNyArMjIxLDcgQEAKICoqICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgSERQIGluc3RhbmNlcy4gQWxzbywgaWYgdGhlIGNvbnRyb2wgUFNNIHZhbHVlIGlzIHplcm8KICoqICAgICAgICAgICAgICAgICAgdGhlbiB0aGUgZmlyc3QgSERQIGluc3RhbmNlIGlzIHVzZWQgZm9yIHRoZSBjb250cm9sIGNoYW5uZWwgc2V0dXAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9IbENjaE9wZW4oVUlOVDggYXBwX2lkLCB0QlRBX0hMX0FQUF9IQU5ETEUgYXBwX2hhbmRsZSwKK3ZvaWQgQlRBX0hsQ2NoT3Blbih1aW50OF90IGFwcF9pZCwgdEJUQV9ITF9BUFBfSEFORExFIGFwcF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9DQ0hfT1BFTl9QQVJBTSAqcF9vcGVuX3BhcmFtKQogewogICAgIHRCVEFfSExfQVBJX0NDSF9PUEVOICpwX2J1ZiA9CkBAIC0zNzQsNyArMzc0LDcgQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBCVEFfSGxTZW5kRGF0YSh0QlRBX0hMX01ETF9IQU5ETEUgbWRsX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgVUlOVDE2ICAgICAgICAgICBwa3Rfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgIHBrdF9zaXplKQogewogICAgIHRCVEFfSExfQVBJX1NFTkRfREFUQSAqcF9idWYgPQogICAgICAgICAodEJUQV9ITF9BUElfU0VORF9EQVRBICopb3NpX21hbGxvYyhzaXplb2YodEJUQV9ITF9BUElfU0VORF9EQVRBKSk7CkBAIC00NTQsNyArNDU0LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9IbFNkcFF1ZXJ5KFVJTlQ4ICBhcHBfaWQsdEJUQV9ITF9BUFBfSEFORExFIGFwcF9oYW5kbGUsCit2b2lkIEJUQV9IbFNkcFF1ZXJ5KHVpbnQ4X3QgIGFwcF9pZCx0QlRBX0hMX0FQUF9IQU5ETEUgYXBwX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgQkRfQUREUiBiZF9hZGRyKQogewogICAgIHRCVEFfSExfQVBJX1NEUF9RVUVSWSAqcF9idWYgPQpkaWZmIC0tZ2l0IGEvYnRhL2hsL2J0YV9obF9jaS5jIGIvYnRhL2hsL2J0YV9obF9jaS5jCmluZGV4IDlhYWE5NjMuLjQxZjAxMzAgMTAwNjQ0Ci0tLSBhL2J0YS9obC9idGFfaGxfY2kuYworKysgYi9idGEvaGwvYnRhX2hsX2NpLmMKQEAgLTQ4LDEyICs0OCwxMiBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGV4dGVybiB2b2lkIGJ0YV9obF9jaV9nZXRfdHhfZGF0YSggIHRCVEFfSExfTURMX0hBTkRMRSBtZGxfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IGV2dCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBldnQgKQogewogICAgIHRCVEFfSExfQ0lfR0VUX1BVVF9EQVRBICpwX2V2dCA9CiAgICAgICAgICh0QlRBX0hMX0NJX0dFVF9QVVRfREFUQSAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfSExfQ0lfR0VUX1BVVF9EQVRBKSk7CiAKLSNpZiAgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBtZGxfaGFuZGxlPSVkIHN0YXR1cz0lZCBldnQ9JWRcbiIsIF9fZnVuY19fLAogICAgICAgICAgICAgICAgICAgICAgbWRsX2hhbmRsZSwgc3RhdHVzLCBldnQpOwogI2VuZGlmCkBAIC04MiwxMiArODIsMTIgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBleHRlcm4gdm9pZCBidGFfaGxfY2lfcHV0X3J4X2RhdGEoICB0QlRBX0hMX01ETF9IQU5ETEUgbWRsX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBldnQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZXZ0ICkKIHsKICAgICB0QlRBX0hMX0NJX0dFVF9QVVRfREFUQSAqcF9ldnQgPQogICAgICAgICAodEJUQV9ITF9DSV9HRVRfUFVUX0RBVEEgKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0hMX0NJX0dFVF9QVVRfREFUQSkpOwogCi0jaWYgIChCVEFfSExfREVCVUcgPT0gVFJVRSkKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgbWRsX2hhbmRsZT0lZCBzdGF0dXM9JWQgZXZ0PSVkXG4iLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICAgICAgIG1kbF9oYW5kbGUsIHN0YXR1cywgZXZ0KTsKICNlbmRpZgpAQCAtMTE2LDEyICsxMTYsMTIgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBleHRlcm4gdm9pZCBidGFfaGxfY2lfZ2V0X2VjaG9fZGF0YSggIHRCVEFfSExfTUNMX0hBTkRMRSBtY2xfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBldnQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBldnQgKQogewogICAgIHRCVEFfSExfQ0lfRUNIT19EQVRBICpwX2V2dCA9CiAgICAgICAgICh0QlRBX0hMX0NJX0VDSE9fREFUQSAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfSExfQ0lfRUNIT19EQVRBKSk7CiAKLSNpZiAgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBtY2xfaGFuZGxlPSVkIHN0YXR1cz0lZCBldnQ9JWRcbiIsIF9fZnVuY19fLAogICAgICAgICAgICAgICAgICAgICAgbWNsX2hhbmRsZSwgc3RhdHVzLCBldnQpOwogI2VuZGlmCkBAIC0xNTAsMTIgKzE1MCwxMiBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGV4dGVybiB2b2lkIGJ0YV9obF9jaV9wdXRfZWNob19kYXRhKCAgdEJUQV9ITF9NQ0xfSEFORExFIG1jbF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IGV2dCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGV2dCApCiB7CiAgICAgdEJUQV9ITF9DSV9FQ0hPX0RBVEEgKnBfZXZ0ID0KICAgICAgICAgKHRCVEFfSExfQ0lfRUNIT19EQVRBICopb3NpX21hbGxvYyhzaXplb2YodEJUQV9ITF9DSV9FQ0hPX0RBVEEpKTsKIAotI2lmICAoQlRBX0hMX0RFQlVHID09IFRSVUUpCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIG1jbF9oYW5kbGU9JWQgc3RhdHVzPSVkIGV2dD0lZFxuIiwgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgICAgICAgbWNsX2hhbmRsZSwgc3RhdHVzLCBldnQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9idGEvaGwvYnRhX2hsX2ludC5oIGIvYnRhL2hsL2J0YV9obF9pbnQuaAppbmRleCAxYTAzZmNmLi4wYTgzZDZmIDEwMDY0NAotLS0gYS9idGEvaGwvYnRhX2hsX2ludC5oCisrKyBiL2J0YS9obC9idGFfaGxfaW50LmgKQEAgLTM1LDcgKzM1LDcgQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLXR5cGVkZWYgVUlOVDE2ICh0QlRBX0hMX0FMTE9DQVRFX1BTTSkgKHZvaWQpOwordHlwZWRlZiB1aW50MTZfdCAodEJUQV9ITF9BTExPQ0FURV9QU00pICh2b2lkKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKiAgQ29uc3RhbnRzIGFuZCBkYXRhIHR5cGVzCkBAIC03MCw3ICs3MCw3IEBACiAjZGVmaW5lIEJUQV9ITF9TRFBfT1BfU0RQX1FVRVJZX05FVyAgICAgICAgIDQKICNkZWZpbmUgQlRBX0hMX1NEUF9PUF9TRFBfUVVFUllfQ1VSUkVOVCAgICAgNQogCi10eXBlZGVmIFVJTlQ4IHRCVEFfSExfU0RQX09QRVI7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9ITF9TRFBfT1BFUjsKIAogLyogQ0NIIE9wZXJhdGlvbnMgKi8KICNkZWZpbmUgICAgIEJUQV9ITF9DQ0hfT1BfTk9ORSAgICAgICAgICAgIDAKQEAgLTc5LDEzICs3OSwxMyBAQAogI2RlZmluZSAgICAgQlRBX0hMX0NDSF9PUF9MT0NBTF9DTE9TRSAgICAgMwogI2RlZmluZSAgICAgQlRBX0hMX0NDSF9PUF9SRU1PVEVfQ0xPU0UgICAgNAogCi10eXBlZGVmIFVJTlQ4IHRCVEFfSExfQ0NIX09QRVI7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9ITF9DQ0hfT1BFUjsKIAogLyogUGVuZGluZyBEQ0ggY2xvc2Ugb3BlcmF0aW9ucyB3aGVuIGNsb3NpbmcgYSBDQ0ggKi8KICNkZWZpbmUgICAgQlRBX0hMX0NDSF9DTE9TRV9PUF9EQ0hfTk9ORSAgICAgMAogI2RlZmluZSAgICBCVEFfSExfQ0NIX0NMT1NFX09QX0RDSF9BQk9SVCAgICAxCiAjZGVmaW5lICAgIEJUQV9ITF9DQ0hfQ0xPU0VfT1BfRENIX0NMT1NFICAgIDIKLXR5cGVkZWYgVUlOVDggdEJUQV9ITF9DQ0hfQ0xPU0VfRENIX09QRVI7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9ITF9DQ0hfQ0xPU0VfRENIX09QRVI7CiAKIC8qIERDSCBPcGVyYXRpb25zICovCiAjZGVmaW5lICAgIEJUQV9ITF9EQ0hfT1BfTk9ORSAgICAgICAgICAgICAgICAgICAgMApAQCAtMTAxLDcgKzEwMSw3IEBACiAjZGVmaW5lICAgIEJUQV9ITF9EQ0hfT1BfTE9DQUxfQ0xPU0VfRUNIT19URVNUICAgMTAKICNkZWZpbmUgICAgQlRBX0hMX0RDSF9PUF9MT0NBTF9DTE9TRV9SRUNPTk5FQ1QgICAxMQogCi10eXBlZGVmIFVJTlQ4IHRCVEFfSExfRENIX09QRVI7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9ITF9EQ0hfT1BFUjsKIAogLyogRWNobyB0ZXN0IE9wZXJhdGlvbnMgKi8KICNkZWZpbmUgICAgQlRBX0hMX0VDSE9fT1BfTk9ORSAgICAgICAgICAgICAgICAgMApAQCAtMTE1LDcgKzExNSw3IEBACiAjZGVmaW5lICAgIEJUQV9ITF9FQ0hPX09QX09QRU5fSU5EICAgICAgICAgICAgIDgKICNkZWZpbmUgICAgQlRBX0hMX0VDSE9fT1BfRUNIT19QS1QgICAgICAgICAgICAgOQogCi10eXBlZGVmIFVJTlQ4IHRCVEFfSExfRUNIT19PUEVSOwordHlwZWRlZiB1aW50OF90IHRCVEFfSExfRUNIT19PUEVSOwogCiAvKiBhYm9ydCBzdGF0dXMgbWFzayBmb3IgYWJvcnRfb3BlciAqLwogCkBAIC0xMzQsOCArMTM0LDggQEAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UMTYgICAgICBtdHU7Ci0gICAgVUlOVDggICAgICAgZmNzOyAgICAgICAgICAgICAgICAgICAgLyogJzAnIE5vIEZDUywgb3RoZXJ3aXNlICcxJyAqLworICAgIHVpbnQxNl90ICAgICAgbXR1OworICAgIHVpbnQ4X3QgICAgICAgZmNzOyAgICAgICAgICAgICAgICAgICAgLyogJzAnIE5vIEZDUywgb3RoZXJ3aXNlICcxJyAqLwogfSB0QlRBX0hMX0wyQ0FQX0NGR19JTkZPOwogCiAKQEAgLTIwNSw3ICsyMDUsNyBAQAogICAgIEJUQV9ITF9NQ0FfREVMRVRFX0lORF9FVlQsCiAgICAgQlRBX0hMX01DQV9ERUxFVEVfQ0ZNX0VWVAogfTsKLXR5cGVkZWYgVUlOVDE2IHRCVEFfSExfSU5UX0VWVDsKK3R5cGVkZWYgdWludDE2X3QgdEJUQV9ITF9JTlRfRVZUOwogCiAjZGVmaW5lIEJUQV9ITF9EQ0hfRVZUX01JTiBCVEFfSExfRENIX1NEUF9JTklUX0VWVAogI2RlZmluZSBCVEFfSExfRENIX0VWVF9NQVggMHhGRkZGCkBAIC0yMTksNyArMjE5LDcgQEAKICAgICBCVEFfSExfQ0NIX09QRU5fU1QsICAgICAgICAgIC8qIENvbm5lY3Rpb24gaXMgb3BlbiAqLwogICAgIEJUQV9ITF9DQ0hfQ0xPU0lOR19TVCAgICAgICAgLyogQ2xvc2luZyBpcyBpbiBwcm9ncmVzcyAqLwogfTsKLXR5cGVkZWYgVUlOVDggdEJUQV9ITF9DQ0hfU1RBVEU7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9ITF9DQ0hfU1RBVEU7CiAKIGVudW0KIHsKQEAgLTIyOCw3ICsyMjgsNyBAQAogICAgIEJUQV9ITF9EQ0hfT1BFTl9TVCwgICAgICAgICAgLyogQ29ubmVjdGlvbiBpcyBvcGVuICovCiAgICAgQlRBX0hMX0RDSF9DTE9TSU5HX1NUICAgICAgICAvKiBDbG9zaW5nIGlzIGluIHByb2dyZXNzICovCiB9OwotdHlwZWRlZiBVSU5UOCB0QlRBX0hMX0RDSF9TVEFURTsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0hMX0RDSF9TVEFURTsKIAogCiB0eXBlZGVmIHN0cnVjdApAQCAtMjQwLDggKzI0MCw4IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJUX0hEUiAgICAgICAgICAgICAgaGRyOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgYXBwX2lkOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgaXNfcmVnaXN0ZXI7ICAgICAgICAvKiBVcGRhdGUgSEwgYXBwbGljYXRpb24gZHVlIHRvIHJlZ2lzdGVyIG9yIGRlcmVnaXN0ZXIgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgYXBwX2lkOworICAgIGJvb2wgICAgICAgICAgICAgaXNfcmVnaXN0ZXI7ICAgICAgICAvKiBVcGRhdGUgSEwgYXBwbGljYXRpb24gZHVlIHRvIHJlZ2lzdGVyIG9yIGRlcmVnaXN0ZXIgKi8KICAgICB0QlRBX0hMX0NCQUNLICAgICAgICpwX2NiYWNrOyAgICAgICAgICAgLyogcG9pbnRlciB0byBhcHBsaWNhdGlvbiBjYWxsYmFjayBmdW5jdGlvbiAqLwogICAgIHRCVEFfSExfREVWSUNFX1RZUEUgZGV2X3R5cGU7ICAgICAgICAgICAvKiBzaW5rLCBzb3VyY2Ugb3IgZHVhbCByb2xlcyAqLwogICAgIHRCVEFfU0VDICAgICAgICAgICAgc2VjX21hc2s7ICAgICAgICAgICAvKiBzZWN1cml0eSBtYXNrIGZvciBhY2NlcHRpbmcgY29uZW5jdGlvbiovCkBAIC0yNTQsNyArMjU0LDcgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICBoZHI7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBhcHBfaWQ7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIGFwcF9pZDsKICAgICB0QlRBX0hMX0NCQUNLICAgICAgICpwX2NiYWNrOyAgICAgICAgLyogcG9pbnRlciB0byBhcHBsaWNhdGlvbiBjYWxsYmFjayBmdW5jdGlvbiAqLwogICAgIHRCVEFfSExfREVWSUNFX1RZUEUgZGV2X3R5cGU7ICAgICAgICAgICAvKiBzaW5rLCBzb3VyY2Ugb3IgZHVhbCByb2xlcyAqLwogICAgIHRCVEFfU0VDICAgICAgICAgICAgc2VjX21hc2s7ICAgICAgICAgICAvKiBzZWN1cml0eSBtYXNrIGZvciBhY2NlcHRpbmcgY29uZW5jdGlvbiovCkBAIC0yNjYsNyArMjY2LDcgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICAgICAgaGRyOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIGFwcF9pZDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIGFwcF9pZDsKICAgICB0QlRBX0hMX0NCQUNLICAgICAgICAgICAqcF9jYmFjazsgICAgICAgIC8qIHBvaW50ZXIgdG8gYXBwbGljYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gKi8KICAgICB0QlRBX0hMX0FQUF9IQU5ETEUgICAgICBhcHBfaGFuZGxlOwogfSB0QlRBX0hMX0FQSV9ERVJFR0lTVEVSOwpAQCAtMjc0LDkgKzI3NCw5IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJUX0hEUiAgICAgICAgICAgICAgICAgIGhkcjsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBhcHBfaWQ7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBhcHBfaWQ7CiAgICAgdEJUQV9ITF9BUFBfSEFORExFICAgICAgYXBwX2hhbmRsZTsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBjdHJsX3BzbTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIGN0cmxfcHNtOwogICAgIEJEX0FERFIgICAgICAgICAgICAgICAgIGJkX2FkZHI7ICAgICAgICAvKiBBZGRyZXNzIG9mIHBlZXIgZGV2aWNlICovCiAgICAgdEJUQV9TRUMgICAgICAgICAgICAgICAgc2VjX21hc2s7ICAgICAgIC8qIHNlY3VyaXR5IG1hc2sgZm9yIGluaXRpYXRpbmcgY29ubmVjdGlvbiovCiB9IHRCVEFfSExfQVBJX0NDSF9PUEVOOwpAQCAtMjk0LDcgKzI5NCw3IEBACiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICAgICAgaGRyOwogICAgIHRCVEFfSExfTUNMX0hBTkRMRSAgICAgIG1jbF9oYW5kbGU7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgY3RybF9wc207CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICBjdHJsX3BzbTsKICAgICB0QlRBX0hMX01ERVBfSUQgICAgICAgICBsb2NhbF9tZGVwX2lkOyAgICAgLyogbG9jYWwgTURFUCBJRCAqLwogICAgIHRCVEFfSExfTURFUF9JRCAgICAgICAgIHBlZXJfbWRlcF9pZDsgICAgICAvKiBwZWVyIG1kZXAgaWQgKi8KICAgICB0QlRBX0hMX0RDSF9DRkcgICAgICAgICBsb2NhbF9jZmc7CkBAIC0zMDcsNyArMzA3LDcgQEAKICAgICBCVF9IRFIgICAgICAgICAgICAgICAgICBoZHI7CiAKICAgICB0QlRBX0hMX01DTF9IQU5ETEUgICAgICBtY2xfaGFuZGxlOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIGN0cmxfcHNtOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgY3RybF9wc207CiAgICAgdEJUQV9ITF9NRExfSUQgICAgICAgICAgbWRsX2lkOwogfSB0QlRBX0hMX0FQSV9EQ0hfUkVDT05ORUNUOwogCkBAIC0zMzUsMjQgKzMzNSwyNCBAQAogewogICAgIEJUX0hEUiAgICAgICAgICAgICAgaGRyOwogICAgIHRCVEFfSExfTURMX0hBTkRMRSAgbWRsX2hhbmRsZTsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIHBrdF9zaXplOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBwa3Rfc2l6ZTsKIH0gdEJUQV9ITF9BUElfU0VORF9EQVRBOwogCiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJUX0hEUiAgICAgICAgICAgICAgaGRyOwogICAgIHRCVEFfSExfTUNMX0hBTkRMRSAgbWNsX2hhbmRsZTsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIGN0cmxfcHNtOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgcGt0X3NpemU7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIGN0cmxfcHNtOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBwa3Rfc2l6ZTsKICAgICB0QlRBX0hMX0RDSF9DRkcgICAgIGxvY2FsX2NmZzsKIH0gdEJUQV9ITF9BUElfRENIX0VDSE9fVEVTVDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICAgICAgICAgICAgICBoZHI7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgYXBwX2lkeDsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBtY2xfaWR4OwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgIHJlbGVhc2VfbWNsX2NiOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgYXBwX2lkeDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIG1jbF9pZHg7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgcmVsZWFzZV9tY2xfY2I7CiB9dEJUQV9ITF9DQ0hfU0RQOwogCiAKQEAgLTM3MCw5ICszNzAsOSBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICAgICAgaGRyOwotICAgIFVJTlQ4ICAgICAgICAgICBhcHBfaWR4OwotICAgIFVJTlQ4ICAgICAgICAgICBtY2xfaWR4OwotICAgIFVJTlQ4ICAgICAgICAgICBtZGxfaWR4OworICAgIHVpbnQ4X3QgICAgICAgICAgIGFwcF9pZHg7CisgICAgdWludDhfdCAgICAgICAgICAgbWNsX2lkeDsKKyAgICB1aW50OF90ICAgICAgICAgICBtZGxfaWR4OwogICAgIEJUX0hEUiAgICAgICAgICAqcF9wa3Q7CiB9IHRCVEFfSExfTUNBX1JDVl9EQVRBX0VWVDsKIApAQCAtMzgwLDE2ICszODAsMTYgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICAgICAgaGRyOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIGFwcF9pZHg7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgbWNsX2lkeDsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBtZGxfaWR4OworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgYXBwX2lkeDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIG1jbF9pZHg7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBtZGxfaWR4OwogfXRCVEFfSExfRENIX1NEUDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICAgICAgICAgICAgICBoZHI7CiAgICAgdEJUQV9ITF9BUFBfSEFORExFICAgICAgYXBwX2hhbmRsZTsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBhcHBfaWQ7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBhcHBfaWQ7CiAgICAgQkRfQUREUiAgICAgICAgICAgICAgICAgYmRfYWRkcjsgICAgICAgIC8qIEFkZHJlc3Mgb2YgcGVlciBkZXZpY2UgKi8KIH0gdEJUQV9ITF9BUElfU0RQX1FVRVJZOwogCkBAIC00NDgsMzcgKzQ0OCwzNyBAQAogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgIGluX3VzZTsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBtZGxfaWQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgaW5fdXNlOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgbWRsX2lkOwogICAgIHRCVEFfSExfTURMX0hBTkRMRSAgICAgIG1kbF9oYW5kbGU7CiAgICAgdEJUQV9ITF9EQ0hfT1BFUiAgICAgICAgZGNoX29wZXI7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgaW50ZW50aW9uYWxfY2xvc2U7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgaW50ZW50aW9uYWxfY2xvc2U7CiAgICAgdEJUQV9ITF9EQ0hfU1RBVEUgICAgICAgZGNoX3N0YXRlOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIGFib3J0X29wZXI7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgcmVxX2RhdGFfcHNtOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIG1heF9yeF9hcGR1X3NpemU7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgbWF4X3R4X2FwZHVfc2l6ZTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIGFib3J0X29wZXI7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICByZXFfZGF0YV9wc207CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICBtYXhfcnhfYXBkdV9zaXplOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgbWF4X3R4X2FwZHVfc2l6ZTsKICAgICBCVF9IRFIgICAgICAgICAgICAgICAgICAqcF90eF9wa3Q7CiAgICAgQlRfSERSICAgICAgICAgICAgICAgICAgKnBfcnhfcGt0OwogICAgIHRCVEFfSExfTURFUF9JRCAgICAgICAgIGxvY2FsX21kZXBfaWQ7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgbG9jYWxfbWRlcF9jZmdfaWR4OworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgbG9jYWxfbWRlcF9jZmdfaWR4OwogICAgIHRCVEFfSExfRENIX0NGRyAgICAgICAgIGxvY2FsX2NmZzsKICAgICB0QlRBX0hMX0RDSF9DRkcgICAgICAgICByZW1vdGVfY2ZnOwogICAgIHRCVEFfSExfTURFUF9JRCAgICAgICAgIHBlZXJfbWRlcF9pZDsKLSAgICBVSU5UMTYgIHBlZXJfZGF0YV90eXBlOworICAgIHVpbnQxNl90ICBwZWVyX2RhdGFfdHlwZTsKICAgICB0QlRBX0hMX01ERVBfUk9MRSAgICAgICBwZWVyX21kZXBfcm9sZTsKICAgICB0QlRBX0hMX0RDSF9NT0RFICAgICAgICBkY2hfbW9kZTsKICAgICB0QlRBX1NFQyAgICAgICAgICAgICAgICBzZWNfbWFzazsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICBpc190aGVfZmlyc3RfcmVsaWFibGU7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgZGVsZXRlX21kbDsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBtdHU7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgaXNfdGhlX2ZpcnN0X3JlbGlhYmxlOworICAgIGJvb2wgICAgICAgICAgICAgICAgIGRlbGV0ZV9tZGw7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICBtdHU7CiAgICAgdE1DQV9DSE5MX0NGRyAgICAgICAgICAgY2hubF9jZmc7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgbWRsX2NmZ19pZHhfaW5jbHVkZWQ7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgbWRsX2NmZ19pZHg7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgZWNob19vcGVyOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgIGNvbmc7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgY2xvc2VfcGVuZGluZzsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBjb3V0X29wZXI7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgbWRsX2NmZ19pZHhfaW5jbHVkZWQ7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBtZGxfY2ZnX2lkeDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIGVjaG9fb3BlcjsKKyAgICBib29sICAgICAgICAgICAgICAgICBjb25nOworICAgIGJvb2wgICAgICAgICAgICAgICAgIGNsb3NlX3BlbmRpbmc7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBjb3V0X29wZXI7CiAgICAgQlRfSERSICAgICAgICAgICAgICAgICAgKnBfZWNob190eF9wa3Q7CiAgICAgQlRfSERSICAgICAgICAgICAgICAgICAgKnBfZWNob19yeF9wa3Q7CiAgICAgdEJUQV9ITF9TVEFUVVMgICAgICAgICAgY2lfcHV0X2VjaG9fZGF0YV9zdGF0dXM7CkBAIC00ODgsNDcgKzQ4OCw0NyBAQAogewogICAgIHRCVEFfSExfTURMX0NCICAgICAgICAgIG1kbFtCVEFfSExfTlVNX01ETFNfUEVSX01DTF07CiAgICAgdEJUQV9ITF9ERUxFVEVfTURMICAgICAgZGVsZXRlX21kbDsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICBpbl91c2U7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgaW5fdXNlOwogICAgIHRCVEFfSExfQ0NIX1NUQVRFICAgICAgIGNjaF9zdGF0ZTsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICByZXFfY3RybF9wc207Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgY3RybF9wc207Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgZGF0YV9wc207CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICByZXFfY3RybF9wc207CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICBjdHJsX3BzbTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIGRhdGFfcHNtOwogICAgIEJEX0FERFIgICAgICAgICAgICAgICAgIGJkX2FkZHI7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgY2NoX210dTsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBzZWNfbWFzazsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIGNjaF9tdHU7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICBzZWNfbWFzazsKICAgICB0QlRBX0hMX01DTF9IQU5ETEUgICAgICBtY2xfaGFuZGxlOwogICAgIHRTRFBfRElTQ09WRVJZX0RCICAgICAgICpwX2RiOyAgICAgICAgIC8qIHBvaW50ZXIgdG8gZGlzY292ZXJ5IGRhdGFiYXNlICovCiAgICAgdFNEUF9ESVNDX0NNUExfQ0IgICAgICAgKnNkcF9jYmFjazsKICAgICB0QlRBX0hMX1NEUF9PUEVSICAgICAgICBzZHBfb3BlcjsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICBjbG9zZV9wZW5kaW5nOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIHNkcF9tZGxfaWR4OworICAgIGJvb2wgICAgICAgICAgICAgICAgIGNsb3NlX3BlbmRpbmc7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBzZHBfbWRsX2lkeDsKICAgICB0QlRBX0hMX1NEUCAgICAgICAgICAgICBzZHA7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgY2NoX29wZXI7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgZm9yY2VfY2xvc2VfbG9jYWxfY2NoX29wZW5pbmc7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgaW50ZW50aW9uYWxfY2xvc2U7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgcnNwX3RvdXQ7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgdGltZXJfb3BlcjsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICBlY2hvX3Rlc3Q7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgZWNob19tZGxfaWR4OwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIGNjaF9jbG9zZV9kY2hfb3BlcjsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBhcHBfaWQ7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBjY2hfb3BlcjsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIGZvcmNlX2Nsb3NlX2xvY2FsX2NjaF9vcGVuaW5nOworICAgIGJvb2wgICAgICAgICAgICAgICAgIGludGVudGlvbmFsX2Nsb3NlOworICAgIGJvb2wgICAgICAgICAgICAgICAgIHJzcF90b3V0OworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgdGltZXJfb3BlcjsKKyAgICBib29sICAgICAgICAgICAgICAgICBlY2hvX3Rlc3Q7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBlY2hvX21kbF9pZHg7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBjY2hfY2xvc2VfZGNoX29wZXI7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBhcHBfaWQ7CiB9dEJUQV9ITF9NQ0xfQ0I7CiAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgdEJUQV9ITF9NQ0xfQ0IgICAgICAgbWNiW0JUQV9ITF9OVU1fTUNMU107IC8qIGFwcGxpY2F0aW9uIENvbnRyb2wgQmxvY2tzICovCiAgICAgdEJUQV9ITF9DQkFDSyAgICAgICAgKnBfY2JhY2s7ICAgICAgICAgICAgLyogcG9pbnRlciB0byBjb250cm9sIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0gICAgQk9PTEVBTiAgICAgICAgICAgICAgaW5fdXNlOyAgICAgICAgICAgICAgLyogdGhpcyBDQiBpcyBpbiB1c2UqLwotICAgIEJPT0xFQU4gICAgICAgICAgICAgIGRlcmVnaXN0ZXJpbmc7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgYXBwX2lkOwotICAgIFVJTlQzMiAgICAgICAgICAgICAgIHNkcF9oYW5kbGU7ICAgIC8qIFNEUCByZWNvcmQgaGFuZGxlICovCisgICAgYm9vbCAgICAgICAgICAgICAgaW5fdXNlOyAgICAgICAgICAgICAgLyogdGhpcyBDQiBpcyBpbiB1c2UqLworICAgIGJvb2wgICAgICAgICAgICAgIGRlcmVnaXN0ZXJpbmc7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICBhcHBfaWQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICBzZHBfaGFuZGxlOyAgICAvKiBTRFAgcmVjb3JkIGhhbmRsZSAqLwogICAgIHRCVEFfSExfU1VQX0ZFQVRVUkUgIHN1cF9mZWF0dXJlOwogICAgIHRCVEFfSExfTURMX0NGRyAgICAgIG1kbF9jZmdbQlRBX0hMX05VTV9NRExfQ0ZHU107CiAgICAgdEJUQV9ITF9ERVZJQ0VfVFlQRSAgZGV2X3R5cGU7CiAgICAgdEJUQV9ITF9BUFBfSEFORExFICAgYXBwX2hhbmRsZTsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICBjdHJsX3BzbTsgICAvKiBMMkNBUCBQU00gZm9yIHRoZSBNQ0FQIGNvbnRyb2wgY2hhbm5lbCAqLwotICAgIFVJTlQxNiAgICAgICAgICAgICAgIGRhdGFfcHNtOyAgIC8qIEwyQ0FQIFBTTSBmb3IgdGhlIE1DQVAgZGF0YSBjaGFubmVsICovCi0gICAgVUlOVDE2ICAgICAgICAgICAgICAgc2VjX21hc2s7ICAgLyogU2VjdXJpdHkgbWFzayBmb3IgQlRNX1NldFNlY3VyaXR5TGV2ZWwoKSAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgY3RybF9wc207ICAgLyogTDJDQVAgUFNNIGZvciB0aGUgTUNBUCBjb250cm9sIGNoYW5uZWwgKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgIGRhdGFfcHNtOyAgIC8qIEwyQ0FQIFBTTSBmb3IgdGhlIE1DQVAgZGF0YSBjaGFubmVsICovCisgICAgdWludDE2X3QgICAgICAgICAgICAgICBzZWNfbWFzazsgICAvKiBTZWN1cml0eSBtYXNrIGZvciBCVE1fU2V0U2VjdXJpdHlMZXZlbCgpICovCiAKICAgICBjaGFyICAgICAgICAgICAgICAgICBzcnZfbmFtZVtCVEFfU0VSVklDRV9OQU1FX0xFTiArMV07ICAgICAgICAvKiBzZXJ2aWNlIG5hbWUgdG8gYmUgdXNlZCBpbiB0aGUgU0RQOyBudWxsIHRlcm1pbmF0ZWQqLwogICAgIGNoYXIgICAgICAgICAgICAgICAgIHNydl9kZXNwW0JUQV9TRVJWSUNFX0RFU1BfTEVOICsxXTsgICAgICAgIC8qIHNlcnZpY2UgZGVzY3JpcHRpb24gdG8gYmUgdXNlZCBpbiB0aGUgU0RQOyBudWxsIHRlcm1pbmF0ZWQgKi8KQEAgLTU0MSwzMCArNTQxLDMwIEBACiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBpbl91c2U7CisgICAgYm9vbCAgICAgICAgICAgICBpbl91c2U7CiAgICAgdEJUQV9ITF9TRFBfT1BFUiAgICBzZHBfb3BlcjsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGFwcF9pZHg7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBtY2xfaWR4OwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgbWRsX2lkeDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgYXBwX2lkeDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgbWNsX2lkeDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgbWRsX2lkeDsKIH10QlRBX0hMX1NEUF9DQjsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBCT09MRUFOICAgICAgICAgaW5fdXNlOwotICAgIFVJTlQ4ICAgICAgICAgICBhcHBfaWR4OwotICAgIFVJTlQ4ICAgICAgICAgICBtY2xfaWR4OworICAgIGJvb2wgICAgICAgICBpbl91c2U7CisgICAgdWludDhfdCAgICAgICAgICAgYXBwX2lkeDsKKyAgICB1aW50OF90ICAgICAgICAgICBtY2xfaWR4OwogfXRCVEFfSExfVElNRVJfQ0I7CiAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgdEJUQV9ITF9BUFBfQ0IgICAgICAgIGFjYltCVEFfSExfTlVNX0FQUFNdOyAgICAgIC8qIEhMIENvbnRyb2wgQmxvY2tzICovCiAgICAgdEJUQV9ITF9DVFJMX0NCQUNLICAgICpwX2N0cmxfY2JhY2s7ICAgICAgICAgICAgLyogcG9pbnRlciB0byBjb250cm9sIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0gICAgQk9PTEVBTiAgICAgICAgICAgICAgIGVuYWJsZTsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgZGlzYWJsaW5nOworICAgIGJvb2wgICAgICAgICAgICAgICBlbmFibGU7CisgICAgYm9vbCAgICAgICAgICAgICAgIGRpc2FibGluZzsKIAogICAgIHRCVEFfSExfU0RQX0NCICAgICAgICBzY2JbQlRBX0hMX05VTV9TRFBfQ0JBQ0tTXTsKICAgICB0QlRBX0hMX1RJTUVSX0NCICAgICAgdGNiW0JUQV9ITF9OVU1fVElNRVJTXTsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgZW5hYmxlX3JhbmRvbV9wc207CisgICAgYm9vbCAgICAgICAgICAgICAgIGVuYWJsZV9yYW5kb21fcHNtOwogICAgIHRCVEFfSExfQUxMT0NBVEVfUFNNICAqcF9hbGxvY19wc207CiB9dEJUQV9ITF9DQjsKIApAQCAtNTc4LDcgKzU3OCw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogSEwgY29udHJvbCBibG9jayAqLwotI2lmIEJUQV9EWU5BTUlDX01FTU9SWSA9PSBGQUxTRQorI2lmIChCVEFfRFlOQU1JQ19NRU1PUlkgPT0gRkFMU0UpCiBleHRlcm4gdEJUQV9ITF9DQiAgYnRhX2hsX2NiOwogI2Vsc2UKIGV4dGVybiB0QlRBX0hMX0NCICpidGFfaGxfY2JfcHRyOwpAQCAtNTk0LDIwNSArNTk0LDIwNSBAQAogI2RlZmluZSBCVEFfSExfR0VUX01ERVBfQ0ZHX1BUUihhcHBfaWR4LCBtZGVwX2NmZ19pZHgpICAmKGJ0YV9obF9jYi5hY2JbKGFwcF9pZHgpXS5zdXBfZmVhdHVyZS5tZGVwW21kZXBfY2ZnX2lkeF0ubWRlcF9jZmcpCiAjZGVmaW5lIEJUQV9ITF9HRVRfREFUQV9DRkdfUFRSKGFwcF9pZHgsIG1kZXBfY2ZnX2lkeCwgZGF0YV9jZmdfaWR4KSAgXAogICAgICAgICAgICAmKGJ0YV9obF9jYi5hY2JbKGFwcF9pZHgpXS5zdXBfZmVhdHVyZS5tZGVwW21kZXBfY2ZnX2lkeF0ubWRlcF9jZmcuZGF0YV9jZmdbZGF0YV9jZmdfaWR4XSkKLSNkZWZpbmUgQlRBX0hMX0dFVF9CVUZfUFRSKHBfcGt0KSAoKFVJTlQ4ICopKChVSU5UOCAqKSAoKHBfcGt0KSsxKSArIChwX3BrdCktPm9mZnNldCkpCisjZGVmaW5lIEJUQV9ITF9HRVRfQlVGX1BUUihwX3BrdCkgKCh1aW50OF90ICopKCh1aW50OF90ICopICgocF9wa3QpKzEpICsgKHBfcGt0KS0+b2Zmc2V0KSkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKiAgRnVuY3Rpb24gcHJvdG90eXBlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgLyogbWFpbiAqLwotICAgIGV4dGVybiBCT09MRUFOIGJ0YV9obF9oZGxfZXZlbnQoQlRfSERSICpwX21zZyk7CisgICAgZXh0ZXJuIGJvb2wgYnRhX2hsX2hkbF9ldmVudChCVF9IRFIgKnBfbXNnKTsKICAgICAvKiBzZHAgKi8KLSAgICBleHRlcm4gQk9PTEVBTiBidGFfaGxfZmlsbF9zdXBfZmVhdHVyZV9saXN0KCBjb25zdCB0U0RQX0RJU0NfQVRUUiAgKnBfYXR0ciwKKyAgICBleHRlcm4gYm9vbCBidGFfaGxfZmlsbF9zdXBfZmVhdHVyZV9saXN0KCBjb25zdCB0U0RQX0RJU0NfQVRUUiAgKnBfYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX1NVUF9GRUFUVVJFX0xJU1RfRUxFTSAqcF9saXN0KTsKLSAgICBleHRlcm4gdEJUQV9ITF9TVEFUVVMgYnRhX2hsX3NkcF91cGRhdGUgKFVJTlQ4IGFwcF9pZCk7Ci0gICAgZXh0ZXJuIHRCVEFfSExfU1RBVFVTIGJ0YV9obF9zZHBfcmVnaXN0ZXIgKFVJTlQ4IGFwcF9pZHgpOworICAgIGV4dGVybiB0QlRBX0hMX1NUQVRVUyBidGFfaGxfc2RwX3VwZGF0ZSAodWludDhfdCBhcHBfaWQpOworICAgIGV4dGVybiB0QlRBX0hMX1NUQVRVUyBidGFfaGxfc2RwX3JlZ2lzdGVyICh1aW50OF90IGFwcF9pZHgpOwogICAgIGV4dGVybiB0U0RQX0RJU0NfUkVDICpidGFfaGxfZmluZF9zaW5rX29yX3NyY19zcnZfY2xhc3NfaW5fZGIgKGNvbnN0IHRTRFBfRElTQ09WRVJZX0RCICpwX2RiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRTRFBfRElTQ19SRUMgKnBfc3RhcnRfcmVjKTsKIAogICAgIC8qIGFjdGlvbiByb3V0aW5lcyAqLwotICAgIGV4dGVybiB2b2lkIGJ0YV9obF9kY2hfY2lfZ2V0X3R4X2RhdGEoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgVUlOVDggbWRsX2lkeCwKKyAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX2NpX2dldF90eF9kYXRhKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0RBVEEgKnBfZGF0YSk7Ci0gICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2RjaF9jaV9wdXRfcnhfZGF0YShVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAorICAgIGV4dGVybiB2b2lkIGJ0YV9obF9kY2hfY2lfcHV0X3J4X2RhdGEodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKLSAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX2NpX2dldF9lY2hvX2RhdGEoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgVUlOVDggbWRsX2lkeCwKKyAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX2NpX2dldF9lY2hvX2RhdGEodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpOwogCi0gICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2RjaF9lY2hvX3Rlc3QoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgVUlOVDggbWRsX2lkeCwKKyAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX2VjaG9fdGVzdCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKLSAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX2NpX3B1dF9lY2hvX2RhdGEoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgVUlOVDggbWRsX2lkeCwKKyAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX2NpX3B1dF9lY2hvX2RhdGEodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpOwotICAgIGV4dGVybiB2b2lkIGJ0YV9obF9kY2hfc2VuZF9kYXRhKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHgsCisgICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2RjaF9zZW5kX2RhdGEodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0RBVEEgKnBfZGF0YSk7Ci0gICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2RjaF9zZHBfZmFpbChVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAorICAgIGV4dGVybiB2b2lkIGJ0YV9obF9kY2hfc2RwX2ZhaWwodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKLSAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX21jYV9jb25nX2NoYW5nZShVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAorICAgIGV4dGVybiB2b2lkIGJ0YV9obF9kY2hfbWNhX2NvbmdfY2hhbmdlKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpOwotICAgIGV4dGVybiB2b2lkIGJ0YV9obF9kY2hfbWNhX3JlY29ubmVjdF9pbmQoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgVUlOVDggbWRsX2lkeCwKKyAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX21jYV9yZWNvbm5lY3RfaW5kKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0RBVEEgKnBfZGF0YSk7Ci0gICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2RjaF9tY2FfcmVjb25uZWN0X2NmbShVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAorICAgIGV4dGVybiB2b2lkIGJ0YV9obF9kY2hfbWNhX3JlY29ubmVjdF9jZm0odWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKLSAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX21jYV9yZWNvbm5lY3QoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgVUlOVDggbWRsX2lkeCwKKyAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX21jYV9yZWNvbm5lY3QodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpOwotICAgIGV4dGVybiB2b2lkIGJ0YV9obF9kY2hfc2RwX2luaXQoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgVUlOVDggbWRsX2lkeCwKKyAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX3NkcF9pbml0KHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0RBVEEgKnBfZGF0YSk7Ci0gICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2RjaF9jbG9zZV9lY2hvX3Rlc3QoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgVUlOVDggbWRsX2lkeCwKKyAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX2Nsb3NlX2VjaG9fdGVzdCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKLSAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX2NyZWF0ZV9yc3AoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgVUlOVDggbWRsX2lkeCwKKyAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX2NyZWF0ZV9yc3AodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpOwotICAgIGV4dGVybiB2b2lkIGJ0YV9obF9kY2hfbWNhX3Jjdl9kYXRhKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHgsCisgICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2RjaF9tY2FfcmN2X2RhdGEodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0RBVEEgKnBfZGF0YSk7Ci0gICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2RjaF9jbG9zZV9jbXBsKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHgsCisgICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2RjaF9jbG9zZV9jbXBsKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKLSAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX21jYV9jbG9zZV9jZm0oVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgVUlOVDggbWRsX2lkeCwKKyAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX21jYV9jbG9zZV9jZm0odWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpOwotICAgIGV4dGVybiB2b2lkIGJ0YV9obF9kY2hfbWNhX2Nsb3NlX2luZChVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAorICAgIGV4dGVybiB2b2lkIGJ0YV9obF9kY2hfbWNhX2Nsb3NlX2luZCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0RBVEEgKnBfZGF0YSk7Ci0gICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2RjaF9tY2FfY2xvc2UoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgVUlOVDggbWRsX2lkeCwKKyAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX21jYV9jbG9zZSh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKLSAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX21jYV9kZWxldGVfaW5kKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHgsCisgICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2RjaF9tY2FfZGVsZXRlX2luZCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpOwogCi0gICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2RjaF9tY2FfZGVsZXRlX2NmbShVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAorICAgIGV4dGVybiB2b2lkIGJ0YV9obF9kY2hfbWNhX2RlbGV0ZV9jZm0odWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKLSAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX21jYV9kZWxldGUoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgVUlOVDggbWRsX2lkeCwKKyAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX21jYV9kZWxldGUodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpOwotICAgIGV4dGVybiB2b2lkIGJ0YV9obF9kY2hfbWNhX2Fib3J0X2luZChVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAorICAgIGV4dGVybiB2b2lkIGJ0YV9obF9kY2hfbWNhX2Fib3J0X2luZCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0RBVEEgKnBfZGF0YSk7Ci0gICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2RjaF9tY2FfYWJvcnRfY2ZtKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHgsCisgICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2RjaF9tY2FfYWJvcnRfY2ZtKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKLSAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX21jYV9hYm9ydChVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAorICAgIGV4dGVybiB2b2lkIGJ0YV9obF9kY2hfbWNhX2Fib3J0KHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpOwotICAgIGV4dGVybiB2b2lkIGJ0YV9obF9kY2hfbWNhX29wZW5faW5kKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHgsCisgICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2RjaF9tY2Ffb3Blbl9pbmQodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0RBVEEgKnBfZGF0YSk7Ci0gICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2RjaF9tY2Ffb3Blbl9jZm0oVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgVUlOVDggbWRsX2lkeCwKKyAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX21jYV9vcGVuX2NmbSh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKLSAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX21jYV9jcmVhdGVfaW5kKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHgsCisgICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2RjaF9tY2FfY3JlYXRlX2luZCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQVRBICpwX2RhdGEpOwotICAgIGV4dGVybiB2b2lkIGJ0YV9obF9kY2hfbWNhX2NyZWF0ZV9jZm0oVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgVUlOVDggbWRsX2lkeCwKKyAgICBleHRlcm4gdm9pZCBidGFfaGxfZGNoX21jYV9jcmVhdGVfY2ZtKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0RBVEEgKnBfZGF0YSk7Ci0gICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2RjaF9tY2FfY3JlYXRlKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHgsCisgICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2RjaF9tY2FfY3JlYXRlKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKLSAgICBleHRlcm4gdm9pZCBidGFfaGxfZGVhbGxvY2F0ZV9zcGRfY2JhY2soVUlOVDggc2RwX2NiYWNrX2lkeCk7Ci0gICAgZXh0ZXJuIHRTRFBfRElTQ19DTVBMX0NCICpidGFfaGxfYWxsb2NhdGVfc3BkX2NiYWNrKHRCVEFfSExfU0RQX09QRVIgc2RwX29wZXIsIFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4IG1kbF9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4ICpwX3NkcF9jYmFja19pZHgpOwotICAgIGV4dGVybiB0QlRBX0hMX1NUQVRVUyBidGFfaGxfaW5pdF9zZHAodEJUQV9ITF9TRFBfT1BFUiBzZHBfb3BlciwgVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4IG1kbF9pZHgpOwotICAgIGV4dGVybiB2b2lkIGJ0YV9obF9jY2hfc2RwX2luaXQoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKLSAgICBleHRlcm4gdm9pZCBidGFfaGxfY2NoX21jYV9vcGVuKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsICB0QlRBX0hMX0RBVEEgKnBfZGF0YSk7Ci0gICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2NjaF9tY2FfY2xvc2UoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKLSAgICBleHRlcm4gdm9pZCBidGFfaGxfY2NoX2Nsb3NlX2NtcGwoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKLSAgICBleHRlcm4gdm9pZCBidGFfaGxfY2NoX21jYV9kaXNjb25uZWN0KFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsICB0QlRBX0hMX0RBVEEgKnBfZGF0YSk7Ci0gICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2NjaF9tY2FfZGlzY19vcGVuKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsICB0QlRBX0hMX0RBVEEgKnBfZGF0YSk7Ci0gICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2NjaF9tY2FfcnNwX3RvdXQoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKLSAgICBleHRlcm4gdm9pZCBidGFfaGxfY2NoX21jYV9jb25uZWN0KFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsICB0QlRBX0hMX0RBVEEgKnBfZGF0YSk7CisgICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2RlYWxsb2NhdGVfc3BkX2NiYWNrKHVpbnQ4X3Qgc2RwX2NiYWNrX2lkeCk7CisgICAgZXh0ZXJuIHRTRFBfRElTQ19DTVBMX0NCICpidGFfaGxfYWxsb2NhdGVfc3BkX2NiYWNrKHRCVEFfSExfU0RQX09QRVIgc2RwX29wZXIsIHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1kbF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfc2RwX2NiYWNrX2lkeCk7CisgICAgZXh0ZXJuIHRCVEFfSExfU1RBVFVTIGJ0YV9obF9pbml0X3NkcCh0QlRBX0hMX1NEUF9PUEVSIHNkcF9vcGVyLCB1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWRsX2lkeCk7CisgICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2NjaF9zZHBfaW5pdCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKKyAgICBleHRlcm4gdm9pZCBidGFfaGxfY2NoX21jYV9vcGVuKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCAgdEJUQV9ITF9EQVRBICpwX2RhdGEpOworICAgIGV4dGVybiB2b2lkIGJ0YV9obF9jY2hfbWNhX2Nsb3NlKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCAgdEJUQV9ITF9EQVRBICpwX2RhdGEpOworICAgIGV4dGVybiB2b2lkIGJ0YV9obF9jY2hfY2xvc2VfY21wbCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKKyAgICBleHRlcm4gdm9pZCBidGFfaGxfY2NoX21jYV9kaXNjb25uZWN0KHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCAgdEJUQV9ITF9EQVRBICpwX2RhdGEpOworICAgIGV4dGVybiB2b2lkIGJ0YV9obF9jY2hfbWNhX2Rpc2Nfb3Blbih1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKKyAgICBleHRlcm4gdm9pZCBidGFfaGxfY2NoX21jYV9yc3BfdG91dCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKKyAgICBleHRlcm4gdm9pZCBidGFfaGxfY2NoX21jYV9jb25uZWN0KHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCAgdEJUQV9ITF9EQVRBICpwX2RhdGEpOwogCiAgICAgLyogU3RhdGUgbWFjaGluZSBkcml2ZXJzICAqLwotICAgIGV4dGVybiB2b2lkIGJ0YV9obF9jY2hfc21fZXhlY3V0ZShVSU5UOCBpbnN0X2lkeCwgVUlOVDggbWNsX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IGV2ZW50LCB0QlRBX0hMX0RBVEEgKnBfZGF0YSk7Ci0gICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2RjaF9zbV9leGVjdXRlKFVJTlQ4IGluc3RfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgZXZlbnQsIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKKyAgICBleHRlcm4gdm9pZCBidGFfaGxfY2NoX3NtX2V4ZWN1dGUodWludDhfdCBpbnN0X2lkeCwgdWludDhfdCBtY2xfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBldmVudCwgdEJUQV9ITF9EQVRBICpwX2RhdGEpOworICAgIGV4dGVybiB2b2lkIGJ0YV9obF9kY2hfc21fZXhlY3V0ZSh1aW50OF90IGluc3RfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZXZlbnQsIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKICAgICAvKiBNQ0FQIGNhbGxiYWNrIGZ1bmN0aW9ucyAgKi8KLSAgICBleHRlcm4gdm9pZCBidGFfaGxfbWNhcF9jdHJsX2NiYWNrKHRNQ0FfSEFORExFIGhhbmRsZSwgdE1DQV9DTCBtY2wsIFVJTlQ4IGV2ZW50LAorICAgIGV4dGVybiB2b2lkIGJ0YV9obF9tY2FwX2N0cmxfY2JhY2sodE1DQV9IQU5ETEUgaGFuZGxlLCB0TUNBX0NMIG1jbCwgdWludDhfdCBldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRNQ0FfQ1RSTCAqcF9kYXRhKTsKIAogICAgIGV4dGVybiB2b2lkIGJ0YV9obF9tY2FwX2RhdGFfY2JhY2sodE1DQV9ETCBtZGwsIEJUX0hEUiAqcF9wa3QpOwogCiAgICAgLyogdXRpbGl0eSBmdW5jdGlvbnMgICovCi0gICAgZXh0ZXJuIEJPT0xFQU4gYnRhX2hsX3NldF9jdHJsX3BzbV9mb3JfZGNoKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4IG1kbF9pZHgsIFVJTlQxNiBjdHJsX3BzbSk7Ci0gICAgZXh0ZXJuIEJPT0xFQU4gYnRhX2hsX2ZpbmRfc2RwX2lkeF91c2luZ19jdHJsX3BzbSh0QlRBX0hMX1NEUCAqcF9zZHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgY3RybF9wc20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9zZHBfaWR4KTsKLSAgICBleHRlcm4gVUlOVDE2IGJ0YV9obF9zZXRfdXNlcl90eF9idWZfc2l6ZShVSU5UMTYgbWF4X3R4X3NpemUpOwotICAgIGV4dGVybiBVSU5UMTYgYnRhX2hsX3NldF91c2VyX3J4X2J1Zl9zaXplKFVJTlQxNiBtdHUpOwotICAgIGV4dGVybiBVSU5UOCBidGFfaGxfc2V0X3R4X3dpbl9zaXplKFVJTlQxNiBtdHUsIFVJTlQxNiBtcHMpOwotICAgIGV4dGVybiBVSU5UMTYgYnRhX2hsX3NldF9tcHMoVUlOVDE2IG10dSk7Ci0gICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2NsZWFuX21kbF9jYihVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4KTsKLSAgICBleHRlcm4gQlRfSERSICogYnRhX2hsX2dldF9idWYoVUlOVDE2IGRhdGFfc2l6ZSwgQk9PTEVBTiBmY3NfdXNlKTsKLSAgICBleHRlcm4gQk9PTEVBTiBidGFfaGxfZmluZF9zZXJ2aWNlX2luX2RiKCBVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBzZXJ2aWNlX3V1aWQsCisgICAgZXh0ZXJuIGJvb2wgYnRhX2hsX3NldF9jdHJsX3BzbV9mb3JfZGNoKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1kbF9pZHgsIHVpbnQxNl90IGN0cmxfcHNtKTsKKyAgICBleHRlcm4gYm9vbCBidGFfaGxfZmluZF9zZHBfaWR4X3VzaW5nX2N0cmxfcHNtKHRCVEFfSExfU0RQICpwX3NkcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGN0cmxfcHNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9zZHBfaWR4KTsKKyAgICBleHRlcm4gdWludDE2X3QgYnRhX2hsX3NldF91c2VyX3R4X2J1Zl9zaXplKHVpbnQxNl90IG1heF90eF9zaXplKTsKKyAgICBleHRlcm4gdWludDE2X3QgYnRhX2hsX3NldF91c2VyX3J4X2J1Zl9zaXplKHVpbnQxNl90IG10dSk7CisgICAgZXh0ZXJuIHVpbnQ4X3QgYnRhX2hsX3NldF90eF93aW5fc2l6ZSh1aW50MTZfdCBtdHUsIHVpbnQxNl90IG1wcyk7CisgICAgZXh0ZXJuIHVpbnQxNl90IGJ0YV9obF9zZXRfbXBzKHVpbnQxNl90IG10dSk7CisgICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2NsZWFuX21kbF9jYih1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4KTsKKyAgICBleHRlcm4gQlRfSERSICogYnRhX2hsX2dldF9idWYodWludDE2X3QgZGF0YV9zaXplLCBib29sIGZjc191c2UpOworICAgIGV4dGVybiBib29sIGJ0YV9obF9maW5kX3NlcnZpY2VfaW5fZGIoIHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlcnZpY2VfdXVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NfUkVDICoqcHBfcmVjICk7Ci0gICAgZXh0ZXJuIFVJTlQxNiBidGFfaGxfZ2V0X3NlcnZpY2VfdXVpZHMoVUlOVDggc2RwX29wZXIsIFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggbWRsX2lkeCApOwotICAgIGV4dGVybiBCT09MRUFOIGJ0YV9obF9maW5kX2VjaG9fY2ZnX3JzcChVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGVwX2lkeCwgVUlOVDggY2ZnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9jZmdfcnNwKTsKLSAgICBleHRlcm4gQk9PTEVBTiBidGFfaGxfdmFsaWRhdGVfY2ZnKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBjZmcpOwotICAgIGV4dGVybiBCT09MRUFOIGJ0YV9obF9maW5kX2NjaF9jYl9pbmRleGVzKHRCVEFfSExfREFUQSAqcF9tc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfYXBwX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAgKnBfbWNsX2lkeCk7Ci0gICAgZXh0ZXJuIEJPT0xFQU4gYnRhX2hsX2ZpbmRfZGNoX2NiX2luZGV4ZXModEJUQV9ITF9EQVRBICpwX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9hcHBfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4ICpwX21jbF9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfbWRsX2lkeCk7Ci0gICAgZXh0ZXJuIFVJTlQxNiAgYnRhX2hsX2FsbG9jYXRlX21kbF9pZChVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4ICk7Ci0gICAgZXh0ZXJuIEJPT0xFQU4gYnRhX2hsX2ZpbmRfbWRsX2lkeF91c2luZ19oYW5kbGUodEJUQV9ITF9NRExfSEFORExFIG1kbF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfYXBwX2lkeCwgVUlOVDggKnBfbWNsX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9tZGxfaWR4KTsKLSAgICBleHRlcm4gQk9PTEVBTiBidGFfaGxfZmluZF9tZGxfaWR4KFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQxNiBtZGxfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9tZGxfaWR4KTsKLSAgICBleHRlcm4gQk9PTEVBTiBidGFfaGxfZmluZF9hbl9hY3RpdmVfbWRsX2lkeChVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4ICpwX21kbF9pZHgpOwotICAgIGV4dGVybiBCT09MRUFOIGJ0YV9obF9maW5kX2RjaF9zZXR1cF9tZGxfaWR4KFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfbWRsX2lkeCk7Ci0gICAgZXh0ZXJuIEJPT0xFQU4gYnRhX2hsX2ZpbmRfYW5faW5fdXNlX21jbF9pZHgoVUlOVDggYXBwX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9tY2xfaWR4KTsKLSAgICBleHRlcm4gQk9PTEVBTiBidGFfaGxfZmluZF9hbl9pbl91c2VfYXBwX2lkeChVSU5UOCAqcF9hcHBfaWR4KTsKLSAgICBleHRlcm4gQk9PTEVBTiBidGFfaGxfZmluZF9hcHBfaWR4KFVJTlQ4IGFwcF9pZCwgVUlOVDggKnBfYXBwX2lkeCk7Ci0gICAgZXh0ZXJuIEJPT0xFQU4gYnRhX2hsX2ZpbmRfYXBwX2lkeF91c2luZ19oYW5kbGUodEJUQV9ITF9BUFBfSEFORExFIGFwcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfYXBwX2lkeCk7Ci0gICAgZXh0ZXJuIEJPT0xFQU4gYnRhX2hsX2ZpbmRfbWNsX2lkeF91c2luZ19oYW5kbGUoIHRCVEFfSExfTUNMX0hBTkRMRSBtY2xfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9hcHBfaWR4LCBVSU5UOCAqcF9tY2xfaWR4KTsKLSAgICBleHRlcm4gQk9PTEVBTiBidGFfaGxfZmluZF9tY2xfaWR4KFVJTlQ4IGFwcF9pZHgsIEJEX0FERFIgcF9iZF9hZGRyLCBVSU5UOCAqcF9tY2xfaWR4KTsKLSAgICBleHRlcm4gQk9PTEVBTiBidGFfaGxfaXNfdGhlX2ZpcnN0X3JlbGlhYmxlX2V4aXN0ZWQoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCApOwotICAgIGV4dGVybiBCT09MRUFOICBidGFfaGxfZmluZF9ub25fYWN0aXZlX21kbF9jZmcoVUlOVDggYXBwX2lkeCwgVUlOVDggc3RhcnRfbWRsX2NmZ19pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9tZGxfY2ZnX2lkeCk7Ci0gICAgZXh0ZXJuIEJPT0xFQU4gIGJ0YV9obF9maW5kX2F2YWlsX21kbF9jZmdfaWR4KFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4ICpwX21kbF9jZmdfaWR4KTsKLSAgICBleHRlcm4gQk9PTEVBTiAgYnRhX2hsX2ZpbmRfbWRsX2NmZ19pZHgoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9NRExfSUQgbWRsX2lkLCBVSU5UOCAqcF9tZGxfY2ZnX2lkeCk7Ci0gICAgZXh0ZXJuIEJPT0xFQU4gIGJ0YV9obF9nZXRfY3VyX3RpbWUoVUlOVDggYXBwX2lkeCwgVUlOVDggKnBfY3VyX3RpbWUpOwotICAgIGV4dGVybiB2b2lkIGJ0YV9obF9zb3J0X2NmZ190aW1lX2lkeChVSU5UOCBhcHBfaWR4LCBVSU5UOCAqYSwgVUlOVDggbik7Ci0gICAgZXh0ZXJuIHZvaWQgIGJ0YV9obF9jb21wYWN0X21kbF9jZmdfdGltZShVSU5UOCBhcHBfaWR4LCBVSU5UOCBtZGVwX2lkKTsKLSAgICBleHRlcm4gQk9PTEVBTiAgYnRhX2hsX2lzX21kbF9leHNpdF9pbl9tY2woVUlOVDggYXBwX2lkeCwgQkRfQUREUiBiZF9hZGRyLAorICAgIGV4dGVybiB1aW50MTZfdCBidGFfaGxfZ2V0X3NlcnZpY2VfdXVpZHModWludDhfdCBzZHBfb3BlciwgdWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtZGxfaWR4ICk7CisgICAgZXh0ZXJuIGJvb2wgYnRhX2hsX2ZpbmRfZWNob19jZmdfcnNwKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kZXBfaWR4LCB1aW50OF90IGNmZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9jZmdfcnNwKTsKKyAgICBleHRlcm4gYm9vbCBidGFfaGxfdmFsaWRhdGVfY2ZnKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNmZyk7CisgICAgZXh0ZXJuIGJvb2wgYnRhX2hsX2ZpbmRfY2NoX2NiX2luZGV4ZXModEJUQV9ITF9EQVRBICpwX21zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwX2FwcF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgKnBfbWNsX2lkeCk7CisgICAgZXh0ZXJuIGJvb2wgYnRhX2hsX2ZpbmRfZGNoX2NiX2luZGV4ZXModEJUQV9ITF9EQVRBICpwX21zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwX2FwcF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9tY2xfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfbWRsX2lkeCk7CisgICAgZXh0ZXJuIHVpbnQxNl90ICBidGFfaGxfYWxsb2NhdGVfbWRsX2lkKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHggKTsKKyAgICBleHRlcm4gYm9vbCBidGFfaGxfZmluZF9tZGxfaWR4X3VzaW5nX2hhbmRsZSh0QlRBX0hMX01ETF9IQU5ETEUgbWRsX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwX2FwcF9pZHgsIHVpbnQ4X3QgKnBfbWNsX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwX21kbF9pZHgpOworICAgIGV4dGVybiBib29sIGJ0YV9obF9maW5kX21kbF9pZHgodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQxNl90IG1kbF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfbWRsX2lkeCk7CisgICAgZXh0ZXJuIGJvb2wgYnRhX2hsX2ZpbmRfYW5fYWN0aXZlX21kbF9pZHgodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9tZGxfaWR4KTsKKyAgICBleHRlcm4gYm9vbCBidGFfaGxfZmluZF9kY2hfc2V0dXBfbWRsX2lkeCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwX21kbF9pZHgpOworICAgIGV4dGVybiBib29sIGJ0YV9obF9maW5kX2FuX2luX3VzZV9tY2xfaWR4KHVpbnQ4X3QgYXBwX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwX21jbF9pZHgpOworICAgIGV4dGVybiBib29sIGJ0YV9obF9maW5kX2FuX2luX3VzZV9hcHBfaWR4KHVpbnQ4X3QgKnBfYXBwX2lkeCk7CisgICAgZXh0ZXJuIGJvb2wgYnRhX2hsX2ZpbmRfYXBwX2lkeCh1aW50OF90IGFwcF9pZCwgdWludDhfdCAqcF9hcHBfaWR4KTsKKyAgICBleHRlcm4gYm9vbCBidGFfaGxfZmluZF9hcHBfaWR4X3VzaW5nX2hhbmRsZSh0QlRBX0hMX0FQUF9IQU5ETEUgYXBwX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwX2FwcF9pZHgpOworICAgIGV4dGVybiBib29sIGJ0YV9obF9maW5kX21jbF9pZHhfdXNpbmdfaGFuZGxlKCB0QlRBX0hMX01DTF9IQU5ETEUgbWNsX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9hcHBfaWR4LCB1aW50OF90ICpwX21jbF9pZHgpOworICAgIGV4dGVybiBib29sIGJ0YV9obF9maW5kX21jbF9pZHgodWludDhfdCBhcHBfaWR4LCBCRF9BRERSIHBfYmRfYWRkciwgdWludDhfdCAqcF9tY2xfaWR4KTsKKyAgICBleHRlcm4gYm9vbCBidGFfaGxfaXNfdGhlX2ZpcnN0X3JlbGlhYmxlX2V4aXN0ZWQodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHggKTsKKyAgICBleHRlcm4gYm9vbCAgYnRhX2hsX2ZpbmRfbm9uX2FjdGl2ZV9tZGxfY2ZnKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBzdGFydF9tZGxfY2ZnX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfbWRsX2NmZ19pZHgpOworICAgIGV4dGVybiBib29sICBidGFfaGxfZmluZF9hdmFpbF9tZGxfY2ZnX2lkeCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9tZGxfY2ZnX2lkeCk7CisgICAgZXh0ZXJuIGJvb2wgIGJ0YV9obF9maW5kX21kbF9jZmdfaWR4KHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX01ETF9JRCBtZGxfaWQsIHVpbnQ4X3QgKnBfbWRsX2NmZ19pZHgpOworICAgIGV4dGVybiBib29sICBidGFfaGxfZ2V0X2N1cl90aW1lKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCAqcF9jdXJfdGltZSk7CisgICAgZXh0ZXJuIHZvaWQgYnRhX2hsX3NvcnRfY2ZnX3RpbWVfaWR4KHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCAqYSwgdWludDhfdCBuKTsKKyAgICBleHRlcm4gdm9pZCAgYnRhX2hsX2NvbXBhY3RfbWRsX2NmZ190aW1lKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtZGVwX2lkKTsKKyAgICBleHRlcm4gYm9vbCAgYnRhX2hsX2lzX21kbF9leHNpdF9pbl9tY2wodWludDhfdCBhcHBfaWR4LCBCRF9BRERSIGJkX2FkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfTURMX0lEIG1kbF9pZCk7Ci0gICAgZXh0ZXJuIEJPT0xFQU4gIGJ0YV9obF9kZWxldGVfbWRsX2NmZyhVSU5UOCBhcHBfaWR4LCBCRF9BRERSIGJkX2FkZHIsCisgICAgZXh0ZXJuIGJvb2wgIGJ0YV9obF9kZWxldGVfbWRsX2NmZyh1aW50OF90IGFwcF9pZHgsIEJEX0FERFIgYmRfYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfTURMX0lEIG1kbF9pZCk7Ci0gICAgZXh0ZXJuIEJPT0xFQU4gIGJ0YV9obF9pc19tZGxfdmFsdWVfdmFsaWQodEJUQV9ITF9NRExfSUQgbWRsX2lkKTsKLSAgICBleHRlcm4gQk9PTEVBTiBidGFfaGxfZmluZF9tZGVwX2NmZ19pZHgoVUlOVDggYXBwX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9NREVQX0lEIGxvY2FsX21kZXBfaWQsIFVJTlQ4ICpwX21kZXBfY2ZnX2lkeCk7Ci0gICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2ZpbmRfcnh0eF9hcGR1X3NpemUoVUlOVDggYXBwX2lkeCwgVUlOVDggbWRlcF9jZmdfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiAqcF9yeF9hcHVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgKnBfdHhfYXB1X3NpemUpOwotICAgIGV4dGVybiBCT09MRUFOIGJ0YV9obF92YWxpZGF0ZV9wZWVyX2NmZyhVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LAorICAgIGV4dGVybiBib29sICBidGFfaGxfaXNfbWRsX3ZhbHVlX3ZhbGlkKHRCVEFfSExfTURMX0lEIG1kbF9pZCk7CisgICAgZXh0ZXJuIGJvb2wgYnRhX2hsX2ZpbmRfbWRlcF9jZmdfaWR4KHVpbnQ4X3QgYXBwX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9NREVQX0lEIGxvY2FsX21kZXBfaWQsIHVpbnQ4X3QgKnBfbWRlcF9jZmdfaWR4KTsKKyAgICBleHRlcm4gdm9pZCBidGFfaGxfZmluZF9yeHR4X2FwZHVfc2l6ZSh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWRlcF9jZmdfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpwX3J4X2FwdV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpwX3R4X2FwdV9zaXplKTsKKyAgICBleHRlcm4gYm9vbCBidGFfaGxfdmFsaWRhdGVfcGVlcl9jZmcodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9NREVQX0lEIHBlZXJfbWRlcF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9NREVQX1JPTEUgcGVlcl9tZGVwX3JvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4IHNkcF9pZHgpOwotICAgIGV4dGVybiB0QlRBX0hMX1NUQVRVUyBidGFfaGxfY2hrX2xvY2FsX2NmZyhVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBtZGVwX2NmZ19pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2RwX2lkeCk7CisgICAgZXh0ZXJuIHRCVEFfSExfU1RBVFVTIGJ0YV9obF9jaGtfbG9jYWxfY2ZnKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1kZXBfY2ZnX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQ0hfQ0ZHIGxvY2FsX2NmZyk7CiAKLSAgICBleHRlcm4gQk9PTEVBTiBidGFfaGxfdmFsaWRhdGVfcmVjb25uZWN0X3BhcmFtcyhVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LAorICAgIGV4dGVybiBib29sIGJ0YV9obF92YWxpZGF0ZV9yZWNvbm5lY3RfcGFyYW1zKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfQVBJX0RDSF9SRUNPTk5FQ1QgKnBfcmVjb25uZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4ICpwX21kZXBfY2ZnX2lkeCwgVUlOVDggKnBfbWRsX2NmZ19pZHgpOwotICAgIGV4dGVybiBCT09MRUFOIGJ0YV9obF9maW5kX2F2YWlsX21jbF9pZHgoVUlOVDggYXBwX2lkeCwgVUlOVDggKnBfbWNsX2lkeCk7Ci0gICAgZXh0ZXJuIEJPT0xFQU4gYnRhX2hsX2ZpbmRfYXZhaWxfbWRsX2lkeChVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfbWRsX2lkeCk7Ci0gICAgZXh0ZXJuIEJPT0xFQU4gYnRhX2hsX2lzX2FfZHVwbGljYXRlX2lkKFVJTlQ4IGFwcF9pZCk7Ci0gICAgZXh0ZXJuIEJPT0xFQU4gYnRhX2hsX2ZpbmRfYXZhaWxfYXBwX2lkeChVSU5UOCAqcF9pZHgpOwotICAgIGV4dGVybiB0QlRBX0hMX1NUQVRVUyBidGFfaGxfYXBwX3VwZGF0ZShVSU5UOCBhcHBfaWQsIEJPT0xFQU4gaXNfcmVnaXN0ZXIpOwotICAgIGV4dGVybiB0QlRBX0hMX1NUQVRVUyBidGFfaGxfYXBwX3JlZ2lzdHJhdGlvbihVSU5UOCBhcHBfaWR4KTsKLSAgICBleHRlcm4gdm9pZCBidGFfaGxfZGlzY2FyZF9kYXRhKFVJTlQxNiBldmVudCwgdEJUQV9ITF9EQVRBICpwX2RhdGEpOwotICAgIGV4dGVybiB2b2lkIGJ0YV9obF9zYXZlX21kbF9jZmcoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgVUlOVDggbWRsX2lkeCApOwotICAgIGV4dGVybiB2b2lkIGJ0YV9obF9zZXRfZGNoX2NoYW5fY2ZnKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHgsIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKLSAgICBleHRlcm4gQk9PTEVBTiBidGFfaGxfZ2V0X2wyY2FwX2NmZyh0QlRBX0hMX01ETF9IQU5ETEUgbWRsX2huZCwgdEJUQV9ITF9MMkNBUF9DRkdfSU5GTyAqcF9jZmcpOwotICAgIGV4dGVybiBCT09MRUFOIGJ0YV9obF92YWxpZGF0ZV9jaGFuX2NmZyhVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4KTsKLSAgICBleHRlcm4gQk9PTEVBTiBidGFfaGxfaXNfY29uZ19vbihVSU5UOCBhcHBfaWQsIEJEX0FERFIgYmRfYWRkciwgdEJUQV9ITF9NRExfSUQgbWRsX2lkKTsKLSAgICBleHRlcm4gdm9pZCBidGFfaGxfY2hlY2tfY2NoX2Nsb3NlKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0RBVEEgKnBfZGF0YSwgQk9PTEVBTiBjaGVja19kY2hfc2V0dXApOwotICAgIGV4dGVybiB2b2lkIGJ0YV9obF9jbGVhbl9hcHAoVUlOVDggYXBwX2lkeCk7Ci0gICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2NoZWNrX2RlcmVnaXN0cmF0aW9uKFVJTlQ4IGFwcF9pZHgsIHRCVEFfSExfREFUQSAqcF9kYXRhICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9tZGVwX2NmZ19pZHgsIHVpbnQ4X3QgKnBfbWRsX2NmZ19pZHgpOworICAgIGV4dGVybiBib29sIGJ0YV9obF9maW5kX2F2YWlsX21jbF9pZHgodWludDhfdCBhcHBfaWR4LCB1aW50OF90ICpwX21jbF9pZHgpOworICAgIGV4dGVybiBib29sIGJ0YV9obF9maW5kX2F2YWlsX21kbF9pZHgodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwX21kbF9pZHgpOworICAgIGV4dGVybiBib29sIGJ0YV9obF9pc19hX2R1cGxpY2F0ZV9pZCh1aW50OF90IGFwcF9pZCk7CisgICAgZXh0ZXJuIGJvb2wgYnRhX2hsX2ZpbmRfYXZhaWxfYXBwX2lkeCh1aW50OF90ICpwX2lkeCk7CisgICAgZXh0ZXJuIHRCVEFfSExfU1RBVFVTIGJ0YV9obF9hcHBfdXBkYXRlKHVpbnQ4X3QgYXBwX2lkLCBib29sIGlzX3JlZ2lzdGVyKTsKKyAgICBleHRlcm4gdEJUQV9ITF9TVEFUVVMgYnRhX2hsX2FwcF9yZWdpc3RyYXRpb24odWludDhfdCBhcHBfaWR4KTsKKyAgICBleHRlcm4gdm9pZCBidGFfaGxfZGlzY2FyZF9kYXRhKHVpbnQxNl90IGV2ZW50LCB0QlRBX0hMX0RBVEEgKnBfZGF0YSk7CisgICAgZXh0ZXJuIHZvaWQgYnRhX2hsX3NhdmVfbWRsX2NmZyh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4ICk7CisgICAgZXh0ZXJuIHZvaWQgYnRhX2hsX3NldF9kY2hfY2hhbl9jZmcodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwgdEJUQV9ITF9EQVRBICpwX2RhdGEpOworICAgIGV4dGVybiBib29sIGJ0YV9obF9nZXRfbDJjYXBfY2ZnKHRCVEFfSExfTURMX0hBTkRMRSBtZGxfaG5kLCB0QlRBX0hMX0wyQ0FQX0NGR19JTkZPICpwX2NmZyk7CisgICAgZXh0ZXJuIGJvb2wgYnRhX2hsX3ZhbGlkYXRlX2NoYW5fY2ZnKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgpOworICAgIGV4dGVybiBib29sIGJ0YV9obF9pc19jb25nX29uKHVpbnQ4X3QgYXBwX2lkLCBCRF9BRERSIGJkX2FkZHIsIHRCVEFfSExfTURMX0lEIG1kbF9pZCk7CisgICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2NoZWNrX2NjaF9jbG9zZSh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfREFUQSAqcF9kYXRhLCBib29sIGNoZWNrX2RjaF9zZXR1cCk7CisgICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2NsZWFuX2FwcCh1aW50OF90IGFwcF9pZHgpOworICAgIGV4dGVybiB2b2lkIGJ0YV9obF9jaGVja19kZXJlZ2lzdHJhdGlvbih1aW50OF90IGFwcF9pZHgsIHRCVEFfSExfREFUQSAqcF9kYXRhICk7CiAgICAgZXh0ZXJuIHZvaWQgYnRhX2hsX2NoZWNrX2Rpc2FibGUodEJUQV9ITF9EQVRBICpwX2RhdGEgKTsKICAgICBleHRlcm4gdm9pZCAgYnRhX2hsX2J1aWxkX2Fib3J0X2luZCh0QlRBX0hMICpwX2V2dF9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfQVBQX0hBTkRMRSBhcHBfaGFuZGxlLApAQCAtODEwLDcgKzgxMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfQVBQX0hBTkRMRSBhcHBfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX01DTF9IQU5ETEUgbWNsX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9NRExfSEFORExFIG1kbF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xFQU4gaW50ZW50aW9uYWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGludGVudGlvbmFsKTsKICAgICBleHRlcm4gdm9pZCAgYnRhX2hsX2J1aWxkX3NlbmRfZGF0YV9jZm0odEJUQV9ITCAqcF9ldnRfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9BUFBfSEFORExFIGFwcF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfTUNMX0hBTkRMRSBtY2xfaGFuZGxlLApAQCAtODIxLDcgKzgyMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9NQ0xfSEFORExFIG1jbF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9NRExfSEFORExFIG1kbF9oYW5kbGUpOwogICAgIGV4dGVybiB2b2lkICBidGFfaGxfYnVpbGRfY2NoX29wZW5fY2ZtKHRCVEFfSEwgKnBfZXZ0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4IGFwcF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhcHBfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9BUFBfSEFORExFIGFwcF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9NQ0xfSEFORExFIG1jbF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRfQUREUiBiZF9hZGRyLApAQCAtODM3LDcgKzgzNyw3IEBACiAgICAgZXh0ZXJuIHZvaWQgICBidGFfaGxfYnVpbGRfY2NoX2Nsb3NlX2luZCh0QlRBX0hMICpwX2V2dF9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9BUFBfSEFORExFIGFwcF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX01DTF9IQU5ETEUgbWNsX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xFQU4gaW50ZW50aW9uYWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbnRlbnRpb25hbCk7CiAKICAgICBleHRlcm4gdm9pZCAgYnRhX2hsX2J1aWxkX2RjaF9vcGVuX2NmbSh0QlRBX0hMICpwX2V2dF9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfQVBQX0hBTkRMRSBhcHBfaGFuZGxlLApAQCAtODQ2LDggKzg0Niw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9NREVQX0lEIGxvY2FsX21kZXBfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9NRExfSUQgbWRsX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfRENIX01PREUgZGNoX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTEVBTiBmaXJzdF9yZWxpYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgbXR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZmlyc3RfcmVsaWFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbXR1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfU1RBVFVTIHN0YXR1cyk7CiAKICAgICBleHRlcm4gdm9pZCAgYnRhX2hsX2J1aWxkX2RlbGV0ZV9tZGxfY2ZtKHRCVEFfSEwgKnBfZXZ0X2RhdGEsCkBAIC04NjAsNyArODYwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9NQ0xfSEFORExFIG1jbF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfU1RBVFVTIHN0YXR1cyApOwogICAgIGV4dGVybiB2b2lkICBidGFfaGxfYnVpbGRfc2RwX3F1ZXJ5X2NmbSh0QlRBX0hMICpwX2V2dF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBhcHBfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXBwX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0FQUF9IQU5ETEUgYXBwX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRfQUREUiBiZF9hZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX1NEUCAqcF9zZHAsCmRpZmYgLS1naXQgYS9idGEvaGwvYnRhX2hsX21haW4uYyBiL2J0YS9obC9idGFfaGxfbWFpbi5jCmluZGV4IGI0ZDk2Y2QuLjRiM2U4YWIgMTAwNjQ0Ci0tLSBhL2J0YS9obC9idGFfaGxfbWFpbi5jCisrKyBiL2J0YS9obC9idGFfaGxfbWFpbi5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpZiBkZWZpbmVkKEhMX0lOQ0xVREVEKSAmJiAoSExfSU5DTFVERUQgPT0gVFJVRSkKKyNpZiAoSExfSU5DTFVERUQgPT0gVFJVRSkKIAogCiAKQEAgLTM3LDEzICszNywxMyBAQAogI2luY2x1ZGUgIm1jYV9kZWZzLmgiCiAKIAotI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkgJiYgKEJUX1VTRV9UUkFDRVMgPT0gVFJVRSkKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUgJiYgQlRfVVNFX1RSQUNFUyA9PSBUUlVFKQogc3RhdGljIGNoYXIgKmJ0YV9obF9jY2hfc3RhdGVfY29kZSh0QlRBX0hMX0NDSF9TVEFURSBzdGF0ZV9jb2RlKTsKIHN0YXRpYyBjaGFyICpidGFfaGxfZGNoX3N0YXRlX2NvZGUodEJUQV9ITF9EQ0hfU1RBVEUgc3RhdGVfY29kZSk7CiAjZW5kaWYKIAotZXh0ZXJuIFVJTlQxNiBMMkNBX0FsbG9jYXRlUmFuZG9tUHNtKHZvaWQpOwotZXh0ZXJuIFVJTlQxNiBMMkNBX0FsbG9jYXRlUHNtKHZvaWQpOworZXh0ZXJuIHVpbnQxNl90IEwyQ0FfQWxsb2NhdGVSYW5kb21Qc20odm9pZCk7CitleHRlcm4gdWludDE2X3QgTDJDQV9BbGxvY2F0ZVBzbSh2b2lkKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiogRENIIFN0YXRlIFRhYmxlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTg2LDcgKzg2LDcgQEAKICAgICBCVEFfSExfRENIX0lHTk9SRQogfTsKIAotdHlwZWRlZiB2b2lkICgqdEJUQV9ITF9EQ0hfQUNUSU9OKShVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4LCB0QlRBX0hMX0RBVEEgKnBfZGF0YSk7Cit0eXBlZGVmIHZvaWQgKCp0QlRBX0hMX0RDSF9BQ1RJT04pKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgsIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKIAogc3RhdGljIGNvbnN0IHRCVEFfSExfRENIX0FDVElPTiBidGFfaGxfZGNoX2FjdGlvbltdID0KIHsKQEAgLTEyOSw3ICsxMjksNyBAQAogI2RlZmluZSBCVEFfSExfRENIX05VTV9DT0xTICAgICAgICAgICAgMiAgICAgICAvKiBudW1iZXIgb2YgY29sdW1ucyBpbiBzdGF0ZSB0YWJsZXMgKi8KIAogLyogc3RhdGUgdGFibGUgZm9yIGlkbGUgc3RhdGUgKi8KLXN0YXRpYyBjb25zdCBVSU5UOCBidGFfaGxfZGNoX3N0X2lkbGVbXVtCVEFfSExfRENIX05VTV9DT0xTXSA9CitzdGF0aWMgY29uc3QgdWludDhfdCBidGFfaGxfZGNoX3N0X2lkbGVbXVtCVEFfSExfRENIX05VTV9DT0xTXSA9CiB7CiAvKiBFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uIDEgICAgICAgICAgICAgICAgICAgIE5leHQgc3RhdGUgKi8KIC8qIEJUQV9ITF9EQ0hfU0RQX0lOSVRfRVZUICAgKi8gICAgIHtCVEFfSExfRENIX1NEUF9JTklULCAgICAgICAgICAgQlRBX0hMX0RDSF9PUEVOSU5HX1NUfSwKQEAgLTE2Niw3ICsxNjYsNyBAQAogfTsKIAogLyogc3RhdGUgdGFibGUgZm9yIG9wZW5pbmcgc3RhdGUgKi8KLXN0YXRpYyBjb25zdCBVSU5UOCBidGFfaGxfZGNoX3N0X29wZW5pbmdbXVtCVEFfSExfRENIX05VTV9DT0xTXSA9CitzdGF0aWMgY29uc3QgdWludDhfdCBidGFfaGxfZGNoX3N0X29wZW5pbmdbXVtCVEFfSExfRENIX05VTV9DT0xTXSA9CiB7CiAvKiBFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uIDEgICAgICAgICAgICAgICAgICAgIE5leHQgc3RhdGUgKi8KIC8qIEJUQV9ITF9EQ0hfU0RQX0lOSVRfRVZUICAgKi8gICB7QlRBX0hMX0RDSF9TRFBfSU5JVCwgICAgICAgICAgICAgQlRBX0hMX0RDSF9PUEVOSU5HX1NUfSwKQEAgLTIwMSw3ICsyMDEsNyBAQAogfTsKIAogLyogc3RhdGUgdGFibGUgZm9yIG9wZW4gc3RhdGUgKi8KLXN0YXRpYyBjb25zdCBVSU5UOCBidGFfaGxfZGNoX3N0X29wZW5bXVtCVEFfSExfRENIX05VTV9DT0xTXSA9CitzdGF0aWMgY29uc3QgdWludDhfdCBidGFfaGxfZGNoX3N0X29wZW5bXVtCVEFfSExfRENIX05VTV9DT0xTXSA9CiB7CiAvKiBFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uIDEgICAgICAgICAgICAgICAgICBOZXh0IHN0YXRlICovCiAvKiBCVEFfSExfRENIX1NEUF9JTklUX0VWVCAgICovICAgICB7QlRBX0hMX0RDSF9JR05PUkUsICAgICAgICAgICBCVEFfSExfRENIX09QRU5fU1R9LApAQCAtMjM3LDcgKzIzNyw3IEBACiAKIAogLyogc3RhdGUgdGFibGUgZm9yIGNsb3Npbmcgc3RhdGUgKi8KLXN0YXRpYyBjb25zdCBVSU5UOCBidGFfaGxfZGNoX3N0X2Nsb3NpbmdbXVtCVEFfSExfRENIX05VTV9DT0xTXSA9CitzdGF0aWMgY29uc3QgdWludDhfdCBidGFfaGxfZGNoX3N0X2Nsb3NpbmdbXVtCVEFfSExfRENIX05VTV9DT0xTXSA9CiB7CiAvKiBFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uIDEgICAgICAgICAgICAgICAgICBOZXh0IHN0YXRlICovCiAvKiBCVEFfSExfRENIX1NEUF9JTklUX0VWVCAgICovICAgICB7QlRBX0hMX0RDSF9JR05PUkUsICAgICAgICAgICBCVEFfSExfRENIX0NMT1NJTkdfU1R9LApAQCAtMjcyLDcgKzI3Miw3IEBACiB9OwogCiAvKiB0eXBlIGZvciBzdGF0ZSB0YWJsZSAqLwotdHlwZWRlZiBjb25zdCBVSU5UOCAoKnRCVEFfSExfRENIX1NUX1RCTClbQlRBX0hMX0RDSF9OVU1fQ09MU107Cit0eXBlZGVmIGNvbnN0IHVpbnQ4X3QgKCp0QlRBX0hMX0RDSF9TVF9UQkwpW0JUQV9ITF9EQ0hfTlVNX0NPTFNdOwogCiAvKiBzdGF0ZSB0YWJsZSAqLwogY29uc3QgdEJUQV9ITF9EQ0hfU1RfVEJMIGJ0YV9obF9kY2hfc3RfdGJsW10gPQpAQCAtMzA0LDcgKzMwNCw3IEBACiB9OwogCiAvKiB0eXBlIGZvciBhY3Rpb24gZnVuY3Rpb25zICovCi10eXBlZGVmIHZvaWQgKCp0QlRBX0hMX0NDSF9BQ1RJT04pKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKK3R5cGVkZWYgdm9pZCAoKnRCVEFfSExfQ0NIX0FDVElPTikodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHRCVEFfSExfREFUQSAqcF9kYXRhKTsKIAogLyogYWN0aW9uIGZ1bmN0aW9uIGxpc3QgZm9yIE1BUyAqLwogY29uc3QgdEJUQV9ITF9DQ0hfQUNUSU9OIGJ0YV9obF9jY2hfYWN0aW9uW10gPQpAQCAtMzI3LDcgKzMyNyw3IEBACiAKIAogLyogc3RhdGUgdGFibGUgZm9yIE1BUyBpZGxlIHN0YXRlICovCi1zdGF0aWMgY29uc3QgVUlOVDggYnRhX2hsX2NjaF9zdF9pZGxlW11bQlRBX0hMX0NDSF9OVU1fQ09MU10gPQorc3RhdGljIGNvbnN0IHVpbnQ4X3QgYnRhX2hsX2NjaF9zdF9pZGxlW11bQlRBX0hMX0NDSF9OVU1fQ09MU10gPQogewogLyogRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAxICAgICAgICAgICAgICAgICAgTmV4dCBzdGF0ZSAqLwogLyogQlRBX0hMX0NDSF9PUEVOX0VWVCAgICAgICAgICAgKi8ge0JUQV9ITF9DQ0hfU0RQX0lOSVQsICAgICAgIEJUQV9ITF9DQ0hfT1BFTklOR19TVH0sCkBAIC0zNDEsNyArMzQxLDcgQEAKIH07CiAKIC8qIHN0YXRlIHRhYmxlIGZvciBvYmV4L3JmY29tbSBjb25uZWN0aW9uIHN0YXRlICovCi1zdGF0aWMgY29uc3QgVUlOVDggYnRhX2hsX2NjaF9zdF9vcGVuaW5nW11bQlRBX0hMX0NDSF9OVU1fQ09MU10gPQorc3RhdGljIGNvbnN0IHVpbnQ4X3QgYnRhX2hsX2NjaF9zdF9vcGVuaW5nW11bQlRBX0hMX0NDSF9OVU1fQ09MU10gPQogewogLyogRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAxICAgICAgICAgICAgICAgTmV4dCBzdGF0ZSAqLwogLyogQlRBX0hMX0NDSF9PUEVOX0VWVCAgICAgICAgICAgKi8ge0JUQV9ITF9DQ0hfSUdOT1JFLCAgICAgICAgIEJUQV9ITF9DQ0hfT1BFTklOR19TVH0sCkBAIC0zNTUsNyArMzU1LDcgQEAKIH07CiAKIC8qIHN0YXRlIHRhYmxlIGZvciBvcGVuIHN0YXRlICovCi1zdGF0aWMgY29uc3QgVUlOVDggYnRhX2hsX2NjaF9zdF9vcGVuW11bQlRBX0hMX0NDSF9OVU1fQ09MU10gPQorc3RhdGljIGNvbnN0IHVpbnQ4X3QgYnRhX2hsX2NjaF9zdF9vcGVuW11bQlRBX0hMX0NDSF9OVU1fQ09MU10gPQogewogLyogRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAxICAgICAgICAgICAgICAgICAgTmV4dCBzdGF0ZSAqLwogLyogQlRBX0hMX0NDSF9PUEVOX0VWVCAgICAgICAgICAgKi8ge0JUQV9ITF9DQ0hfSUdOT1JFLCAgICAgICAgIEJUQV9ITF9DQ0hfT1BFTl9TVH0sCkBAIC0zNjksNyArMzY5LDcgQEAKIH07CiAKIC8qIHN0YXRlIHRhYmxlIGZvciBjbG9zaW5nIHN0YXRlICovCi1zdGF0aWMgY29uc3QgVUlOVDggYnRhX2hsX2NjaF9zdF9jbG9zaW5nW11bQlRBX0hMX0NDSF9OVU1fQ09MU10gPQorc3RhdGljIGNvbnN0IHVpbnQ4X3QgYnRhX2hsX2NjaF9zdF9jbG9zaW5nW11bQlRBX0hMX0NDSF9OVU1fQ09MU10gPQogewogLyogRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAxICAgICAgICAgICAgICAgICAgTmV4dCBzdGF0ZSAqLwogLyogQlRBX0hMX0NDSF9PUEVOX0VWVCAgICAgICAgICAgKi8ge0JUQV9ITF9DQ0hfSUdOT1JFLCAgICAgICAgIEJUQV9ITF9DQ0hfQ0xPU0lOR19TVH0sCkBAIC0zODMsNyArMzgzLDcgQEAKIH07CiAKIC8qIHR5cGUgZm9yIHN0YXRlIHRhYmxlIENDSCAqLwotdHlwZWRlZiBjb25zdCBVSU5UOCAoKnRCVEFfSExfQ0NIX1NUX1RCTClbQlRBX0hMX0NDSF9OVU1fQ09MU107Cit0eXBlZGVmIGNvbnN0IHVpbnQ4X3QgKCp0QlRBX0hMX0NDSF9TVF9UQkwpW0JUQV9ITF9DQ0hfTlVNX0NPTFNdOwogCiAvKiBNQVMgc3RhdGUgdGFibGUgKi8KIGNvbnN0IHRCVEFfSExfQ0NIX1NUX1RCTCBidGFfaGxfY2NoX3N0X3RibFtdID0KQEAgLTQwMCw3ICs0MDAsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEhMIGNvbnRyb2wgYmxvY2sgKi8KLSNpZiBCVEFfRFlOQU1JQ19NRU1PUlkgPT0gRkFMU0UKKyNpZiAoQlRBX0RZTkFNSUNfTUVNT1JZID09IEZBTFNFKQogdEJUQV9ITF9DQiAgYnRhX2hsX2NiOwogI2VuZGlmCiAKQEAgLTQxNCwxNyArNDE0LDE3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGxfY2NoX3NtX2V4ZWN1dGUoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBldmVudCwgdEJUQV9ITF9EQVRBICpwX2RhdGEpCit2b2lkIGJ0YV9obF9jY2hfc21fZXhlY3V0ZSh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGV2ZW50LCB0QlRBX0hMX0RBVEEgKnBfZGF0YSkKIHsKICAgICB0QlRBX0hMX0NDSF9TVF9UQkwgIHN0YXRlX3RhYmxlOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgYWN0aW9uOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBhY3Rpb247CiAgICAgaW50ICAgICAgICAgICAgICAgICBpOwogICAgIHRCVEFfSExfTUNMX0NCICAgICAgKnBfY2IgID0gQlRBX0hMX0dFVF9NQ0xfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgpOwogCi0jaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKSAmJiAoQlRfVVNFX1RSQUNFUyA9PSBUUlVFKQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSAmJiBCVF9VU0VfVFJBQ0VTID09IFRSVUUpCiAgICAgdEJUQV9ITF9DQ0hfU1RBVEUgaW5fc3RhdGUgPSBwX2NiLT5jY2hfc3RhdGU7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgIGN1cl9ldnQgPSBldmVudDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICBjdXJfZXZ0ID0gZXZlbnQ7CiAgICAgQVBQTF9UUkFDRV9ERUJVRygiSERQIENDSCBFdmVudCBIYW5kbGVyOiBTdGF0ZSAweCUwMnggWyVzXSwgRXZlbnQgWyVzXSIsIGluX3N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgIGJ0YV9obF9jY2hfc3RhdGVfY29kZShpbl9zdGF0ZSksCiAgICAgICAgICAgICAgICAgICAgICAgYnRhX2hsX2V2dF9jb2RlKGN1cl9ldnQpKTsKQEAgLTQ1MSw3ICs0NTEsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9Ci0jaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKSAmJiAoQlRfVVNFX1RSQUNFUyA9PSBUUlVFKQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSAmJiBCVF9VU0VfVFJBQ0VTID09IFRSVUUpCiAgICAgaWYgKGluX3N0YXRlICE9IHBfY2ItPmNjaF9zdGF0ZSkKICAgICB7CiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIkhMIENDSCBTdGF0ZSBDaGFuZ2U6IFslc10gLT4gWyVzXSBhZnRlciBbJXNdIiwKQEAgLTQ3MiwxNyArNDcyLDE3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGxfZGNoX3NtX2V4ZWN1dGUoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgVUlOVDggbWRsX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBldmVudCwgdEJUQV9ITF9EQVRBICpwX2RhdGEpCit2b2lkIGJ0YV9obF9kY2hfc21fZXhlY3V0ZSh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZXZlbnQsIHRCVEFfSExfREFUQSAqcF9kYXRhKQogewogICAgIHRCVEFfSExfRENIX1NUX1RCTCAgc3RhdGVfdGFibGU7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBhY3Rpb247CisgICAgdWludDhfdCAgICAgICAgICAgICAgIGFjdGlvbjsKICAgICBpbnQgICAgICAgICAgICAgICAgIGk7CiAgICAgdEJUQV9ITF9NRExfQ0IgICAgICAqcF9jYiAgPSBCVEFfSExfR0VUX01ETF9DQl9QVFIoYXBwX2lkeCwgbWNsX2lkeCwgbWRsX2lkeCk7CiAKLSNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpICYmIChCVF9VU0VfVFJBQ0VTID09IFRSVUUpCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFICYmIEJUX1VTRV9UUkFDRVMgPT0gVFJVRSkKICAgICB0QlRBX0hMX0RDSF9TVEFURSBpbl9zdGF0ZSA9IHBfY2ItPmRjaF9zdGF0ZTsKLSAgICBVSU5UMTYgICAgICAgICAgICAgY3VyX2V2dCA9IGV2ZW50OworICAgIHVpbnQxNl90ICAgICAgICAgICAgIGN1cl9ldnQgPSBldmVudDsKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJIRFAgRENIIEV2ZW50IEhhbmRsZXI6IFN0YXRlIDB4JTAyeCBbJXNdLCBFdmVudCBbJXNdIiwgaW5fc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgYnRhX2hsX2RjaF9zdGF0ZV9jb2RlKGluX3N0YXRlKSwKICAgICAgICAgICAgICAgICAgICAgICBidGFfaGxfZXZ0X2NvZGUoY3VyX2V2dCkpOwpAQCAtNTEwLDcgKzUxMCw3IEBACiAgICAgfQogCiAKLSNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpICYmIChCVF9VU0VfVFJBQ0VTID09IFRSVUUpCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFICYmIEJUX1VTRV9UUkFDRVMgPT0gVFJVRSkKICAgICBpZiAoaW5fc3RhdGUgIT0gcF9jYi0+ZGNoX3N0YXRlKQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiSEwgRENIIFN0YXRlIENoYW5nZTogWyVzXSAtPiBbJXNdIGFmdGVyIFslc10iLApAQCAtNTQ2LDcgKzU0Niw3IEBACiAgICAgLyogRG9uZSB3aXRoIGNoZWNraW5nLiBub3cgcGVyZm9ybSB0aGUgZW5hYmxlIG9lcHJhdGlvbiovCiAgICAgLyogaW5pdGlhbGl6ZSBjb250cm9sIGJsb2NrICovCiAgICAgbWVtc2V0KHBfY2IsIDAsIHNpemVvZih0QlRBX0hMX0NCKSk7Ci0gICAgcF9jYi0+ZW5hYmxlID0gVFJVRTsKKyAgICBwX2NiLT5lbmFibGUgPSB0cnVlOwogICAgIHBfY2ItPnBfY3RybF9jYmFjayA9IHBfZGF0YS0+YXBpX2VuYWJsZS5wX2NiYWNrOwogICAgIGV2dF9kYXRhLmVuYWJsZV9jZm0uc3RhdHVzID0gQlRBX0hMX1NUQVRVU19PSzsKICAgICBpZiAocF9kYXRhLT5hcGlfZW5hYmxlLnBfY2JhY2spCkBAIC01NjksNyArNTY5LDcgQEAKIAogICAgIGlmIChwX2NiLT5lbmFibGUpCiAgICAgewotICAgICAgICBwX2NiLT5kaXNhYmxpbmcgPSBUUlVFOworICAgICAgICBwX2NiLT5kaXNhYmxpbmcgPSB0cnVlOwogICAgICAgICBidGFfaGxfY2hlY2tfZGlzYWJsZShwX2RhdGEpOwogICAgIH0KICAgICBlbHNlCkBAIC01ODAsNyArNTgwLDcgQEAKICAgICB9CiAKIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIGlmIChzdGF0dXMgIT0gQlRBX0hMX1NUQVRVU19PSykKICAgICB7CiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9hcGlfZGlzYWJsZSBzdGF0dXMgPSVzIiwgYnRhX2hsX3N0YXR1c19jb2RlKHN0YXR1cykpOwpAQCAtNjM2LDcgKzYzNiw3IEBACiAgICAgICAgICAgICAgICAgbWVtc2V0KHBfYWNiLCAwLCBzaXplb2YodEJUQV9ITF9BUFBfQ0IpKTsKICAgICAgICAgfQogICAgIH0KLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBpZiAoc3RhdHVzICE9IEJUQV9ITF9TVEFUVVNfT0spCiAgICAgewogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGxfYXBpX3JlZ2lzdGVyIHN0YXR1cyA9JXMiLCBidGFfaGxfc3RhdHVzX2NvZGUoc3RhdHVzKSk7CkBAIC02ODAsNyArNjgwLDcgQEAKIHN0YXRpYyB2b2lkIGJ0YV9obF9hcGlfcmVnaXN0ZXIodEJUQV9ITF9DQiAqcF9jYiwgdEJUQV9ITF9EQVRBICpwX2RhdGEpCiB7CiAgICAgdEJUQV9ITCAgICAgICAgIGV2dF9kYXRhOwotICAgIFVJTlQ4ICAgICAgICAgICBhcHBfaWR4OworICAgIHVpbnQ4X3QgICAgICAgICAgIGFwcF9pZHg7CiAgICAgdEJUQV9ITF9BUFBfQ0IgICpwX2FjYiA9IE5VTEw7CiAgICAgdEJUQV9ITF9TVEFUVVMgIHN0YXR1cyA9IEJUQV9ITF9TVEFUVVNfRkFJTDsKIApAQCAtNjkyLDcgKzY5Miw3IEBACiAgICAgICAgICAgICBpZiAoYnRhX2hsX2ZpbmRfYXZhaWxfYXBwX2lkeCgmYXBwX2lkeCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcF9hY2IgPSBCVEFfSExfR0VUX0FQUF9DQl9QVFIoYXBwX2lkeCk7Ci0gICAgICAgICAgICAgICAgcF9hY2ItPmluX3VzZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgcF9hY2ItPmluX3VzZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgcF9hY2ItPmFwcF9pZCA9IHBfZGF0YS0+YXBpX3JlZy5hcHBfaWQ7CiAgICAgICAgICAgICAgICAgcF9hY2ItPnBfY2JhY2sgPSBwX2RhdGEtPmFwaV9yZWcucF9jYmFjazsKICAgICAgICAgICAgICAgICBwX2FjYi0+c2VjX21hc2sgPSBwX2RhdGEtPmFwaV9yZWcuc2VjX21hc2s7CkBAIC03MjYsNyArNzI2LDcgQEAKICAgICAgICAgICAgICAgICBtZW1zZXQocF9hY2IsIDAsIHNpemVvZih0QlRBX0hMX0FQUF9DQikpOwogICAgICAgICB9CiAgICAgfQotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIGlmIChzdGF0dXMgIT0gQlRBX0hMX1NUQVRVU19PSykKICAgICB7CiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9hcGlfcmVnaXN0ZXIgc3RhdHVzID0lcyIsIGJ0YV9obF9zdGF0dXNfY29kZShzdGF0dXMpKTsKQEAgLTc2OSwxNCArNzY5LDE0IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgYnRhX2hsX2FwaV9kZXJlZ2lzdGVyKHRCVEFfSExfQ0IgKnBfY2IsIHRCVEFfSExfREFUQSAqcF9kYXRhKQogewotICAgIFVJTlQ4ICAgICAgICAgICBhcHBfaWR4OworICAgIHVpbnQ4X3QgICAgICAgICAgIGFwcF9pZHg7CiAgICAgdEJUQV9ITF9BUFBfQ0IgICpwX2FjYjsKICAgICBVTlVTRUQocF9jYik7CiAKICAgICBpZiAoYnRhX2hsX2ZpbmRfYXBwX2lkeF91c2luZ19oYW5kbGUocF9kYXRhLT5hcGlfZGVyZWcuYXBwX2hhbmRsZSwgJmFwcF9pZHgpKQogICAgIHsKICAgICAgICAgcF9hY2IgPSBCVEFfSExfR0VUX0FQUF9DQl9QVFIoYXBwX2lkeCk7Ci0gICAgICAgIHBfYWNiLT5kZXJlZ2lzdGVyaW5nPSBUUlVFOworICAgICAgICBwX2FjYi0+ZGVyZWdpc3RlcmluZz0gdHJ1ZTsKICAgICAgICAgYnRhX2hsX2NoZWNrX2RlcmVnaXN0cmF0aW9uKGFwcF9pZHgscF9kYXRhKTsKICAgICB9CiAgICAgZWxzZQpAQCAtNzk4LDcgKzc5OCw3IEBACiB7CiAgICAgdEJUQV9ITCAgICAgICAgIGV2dF9kYXRhOwogICAgIHRCVEFfSExfU1RBVFVTICBzdGF0dXMgPSBCVEFfSExfU1RBVFVTX09LOwotICAgIFVJTlQ4ICAgICAgICAgICBhcHBfaWR4LCBtY2xfaWR4OworICAgIHVpbnQ4X3QgICAgICAgICAgIGFwcF9pZHgsIG1jbF9pZHg7CiAgICAgdEJUQV9ITF9BUFBfQ0IgICpwX2FjYjsKICAgICB0QlRBX0hMX01DTF9DQiAgKnBfbWNiOwogICAgIFVOVVNFRChwX2NiKTsKQEAgLTgxMSw3ICs4MTEsNyBAQAogICAgICAgICAgICAgaWYgKGJ0YV9obF9maW5kX2F2YWlsX21jbF9pZHgoYXBwX2lkeCwgJm1jbF9pZHgpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHBfbWNiID0gQlRBX0hMX0dFVF9NQ0xfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgpOwotICAgICAgICAgICAgICAgIHBfbWNiLT5pbl91c2UgPSBUUlVFOworICAgICAgICAgICAgICAgIHBfbWNiLT5pbl91c2UgPSB0cnVlOwogICAgICAgICAgICAgICAgIHBfbWNiLT5yZXFfY3RybF9wc20gPSBwX2RhdGEtPmFwaV9jY2hfb3Blbi5jdHJsX3BzbTsKICAgICAgICAgICAgICAgICBwX21jYi0+c2VjX21hc2sgPSBwX2RhdGEtPmFwaV9jY2hfb3Blbi5zZWNfbWFzazsKICAgICAgICAgICAgICAgICBiZGNweShwX21jYi0+YmRfYWRkciwgcF9kYXRhLT5hcGlfY2NoX29wZW4uYmRfYWRkcik7CkBAIC04NDksNyArODQ5LDcgQEAKICAgICB7CiAgICAgICAgIHN0YXR1cyA9IEJUQV9ITF9TVEFUVVNfSU5WQUxJRF9BUFBfSEFORExFOwogICAgIH0KLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBpZiAoc3RhdHVzICE9IEJUQV9ITF9TVEFUVVNfT0spCiAgICAgewogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGxfYXBpX2NjaF9vcGVuIHN0YXR1cyA9JXMiLCBidGFfaGxfc3RhdHVzX2NvZGUoc3RhdHVzKSk7CkBAIC04OTcsNyArODk3LDcgQEAKIHsKICAgICB0QlRBX0hMICAgICAgICAgZXZ0X2RhdGE7CiAgICAgdEJUQV9ITF9TVEFUVVMgIHN0YXR1cyA9IEJUQV9ITF9TVEFUVVNfT0s7Ci0gICAgVUlOVDggICAgICAgICAgIGFwcF9pZHgsIG1jbF9pZHg7CisgICAgdWludDhfdCAgICAgICAgICAgYXBwX2lkeCwgbWNsX2lkeDsKICAgICB0QlRBX0hMX0FQUF9DQiAgKnBfYWNiOwogICAgIHRCVEFfSExfTUNMX0NCICAqcF9tY2I7CiAgICAgVU5VU0VEKHBfY2IpOwpAQCAtOTExLDcgKzkxMSw3IEBACiAgICAgewogICAgICAgICBzdGF0dXMgPSBCVEFfSExfU1RBVFVTX0lOVkFMSURfTUNMX0hBTkRMRTsKICAgICB9Ci0jaWYgQlRBX0hMX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgaWYgKHN0YXR1cyAhPSBCVEFfSExfU1RBVFVTX09LKQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hsX2FwaV9jY2hfY2xvc2Ugc3RhdHVzID0lcyIsIGJ0YV9obF9zdGF0dXNfY29kZShzdGF0dXMpKTsKQEAgLTkyMCw3ICs5MjAsNyBAQAogICAgIHN3aXRjaCAoc3RhdHVzKQogICAgIHsKICAgICAgICAgY2FzZSBCVEFfSExfU1RBVFVTX09LOgotICAgICAgICAgICAgYnRhX2hsX2NoZWNrX2NjaF9jbG9zZShhcHBfaWR4LCBtY2xfaWR4LCBwX2RhdGEsIFRSVUUpOworICAgICAgICAgICAgYnRhX2hsX2NoZWNrX2NjaF9jbG9zZShhcHBfaWR4LCBtY2xfaWR4LCBwX2RhdGEsIHRydWUpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBCVEFfSExfU1RBVFVTX0lOVkFMSURfTUNMX0hBTkRMRToKQEAgLTk1OCwxMiArOTU4LDEyIEBACiB7CiAgICAgdEJUQV9ITCAgICAgICAgICAgICAgICAgICAgIGV2dF9kYXRhOwogICAgIHRCVEFfSExfU1RBVFVTICAgICAgICAgICAgICBzdGF0dXMgPSBCVEFfSExfU1RBVFVTX09LOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICBhcHBfaWR4LCBtY2xfaWR4LCBtZGxfaWR4OworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgIGFwcF9pZHgsIG1jbF9pZHgsIG1kbF9pZHg7CiAgICAgdEJUQV9ITF9BUFBfQ0IgICAgICAgICAgICAgICpwX2FjYjsKICAgICB0QlRBX0hMX01DTF9DQiAgICAgICAgICAgICAgKnBfbWNiID0gTlVMTDsKICAgICB0QlRBX0hMX01ETF9DQiAgICAgICAgICAgICAgKnBfZGNiOwogICAgIHRCVEFfSExfTURFUF9DRkcgICAgICAgICAgICAqcF9tZGVwX2NmZzsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgbWRlcF9jZmdfaWR4OworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgIG1kZXBfY2ZnX2lkeDsKICAgICBVTlVTRUQocF9jYik7CiAKICAgICBpZiAoYnRhX2hsX2ZpbmRfbWNsX2lkeF91c2luZ19oYW5kbGUocF9kYXRhLT5hcGlfZGNoX29wZW4ubWNsX2hhbmRsZSwgJmFwcF9pZHgsICZtY2xfaWR4KSkKQEAgLTk5NSw3ICs5OTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidGFfaGxfc2V0X2N0cmxfcHNtX2Zvcl9kY2goYXBwX2lkeCwgbWNsX2lkeCwgbWRsX2lkeCwgcF9kYXRhLT5hcGlfZGNoX29wZW4uY3RybF9wc20pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tZGVwX2NmZyA9IEJUQV9ITF9HRVRfTURFUF9DRkdfUFRSKGFwcF9pZHgsIG1kZXBfY2ZnX2lkeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGNiLT5pbl91c2UgICAgICAgICAgICAgICAgICAgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RjYi0+aW5fdXNlICAgICAgICAgICAgICAgICAgID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kY2ItPmRjaF9vcGVyICAgICAgICAgICAgICAgICA9IEJUQV9ITF9EQ0hfT1BfTE9DQUxfT1BFTjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kY2ItPnNlY19tYXNrICAgICAgICAgICAgICAgICA9IHBfZGF0YS0+YXBpX2RjaF9vcGVuLnNlY19tYXNrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RjYi0+bG9jYWxfbWRlcF9pZCAgICAgICAgICAgID0gcF9kYXRhLT5hcGlfZGNoX29wZW4ubG9jYWxfbWRlcF9pZDsKQEAgLTEwMTcsNyArMTAxNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX2RjYi0+bWF4X3J4X2FwZHVfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfZGNiLT5tYXhfdHhfYXBkdV9zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kY2ItPm1kbF9pZCAgICAgICAgICAgICAgID0gYnRhX2hsX2FsbG9jYXRlX21kbF9pZChhcHBfaWR4LG1jbF9pZHgsbWRsX2lkeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGNiLT5tZGxfY2ZnX2lkeF9pbmNsdWRlZCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RjYi0+bWRsX2NmZ19pZHhfaW5jbHVkZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKQEAgLTEwNTEsNyArMTA1MSw3IEBACiAgICAgICAgIHN0YXR1cyA9IEJUQV9ITF9TVEFUVVNfSU5WQUxJRF9NQ0xfSEFORExFOwogICAgIH0KIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIGlmIChzdGF0dXMgIT0gQlRBX0hMX1NUQVRVU19PSykKICAgICB7CiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9hcGlfZGNoX29wZW4gc3RhdHVzID0lcyIsIGJ0YV9obF9zdGF0dXNfY29kZShzdGF0dXMpKTsKQEAgLTExMTIsNyArMTExMiw3IEBACiB7CiAgICAgdEJUQV9ITCAgICAgICAgIGV2dF9kYXRhOwogICAgIHRCVEFfSExfU1RBVFVTICBzdGF0dXMgPSBCVEFfSExfU1RBVFVTX09LOwotICAgIFVJTlQ4ICAgICAgICAgICBhcHBfaWR4LCBtY2xfaWR4LCBtZGxfaWR4OworICAgIHVpbnQ4X3QgICAgICAgICAgIGFwcF9pZHgsIG1jbF9pZHgsIG1kbF9pZHg7CiAgICAgdEJUQV9ITF9BUFBfQ0IgICpwX2FjYjsKICAgICB0QlRBX0hMX01DTF9DQiAgKnBfbWNiOwogICAgIHRCVEFfSExfTURMX0NCICAqcF9kY2I7CkBAIC0xMTMxLDcgKzExMzEsNyBAQAogICAgICAgICBzdGF0dXMgPSBCVEFfSExfU1RBVFVTX0lOVkFMSURfTURMX0hBTkRMRTsKICAgICB9CiAKLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBpZiAoc3RhdHVzICE9IEJUQV9ITF9TVEFUVVNfT0spCiAgICAgewogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGxfYXBpX2RjaF9jbG9zZSBzdGF0dXMgPSVzIiwgYnRhX2hsX3N0YXR1c19jb2RlKHN0YXR1cykpOwpAQCAtMTE4MSwxMiArMTE4MSwxMiBAQAogewogICAgIHRCVEFfSEwgICAgICAgICBldnRfZGF0YTsKICAgICB0QlRBX0hMX1NUQVRVUyAgc3RhdHVzID0gQlRBX0hMX1NUQVRVU19PSzsKLSAgICBVSU5UOCAgICAgICAgICAgYXBwX2lkeCwgbWNsX2lkeCwgbWRsX2lkeDsKKyAgICB1aW50OF90ICAgICAgICAgICBhcHBfaWR4LCBtY2xfaWR4LCBtZGxfaWR4OwogICAgIHRCVEFfSExfQVBQX0NCICAqcF9hY2I7CiAgICAgdEJUQV9ITF9NQ0xfQ0IgICpwX21jYiA9IE5VTEw7CiAgICAgdEJUQV9ITF9NRExfQ0IgICpwX2RjYjsKLSAgICBVSU5UOCAgICAgICAgICAgbWRlcF9jZmdfaWR4OwotICAgIFVJTlQ4ICAgICAgICAgICBtZGxfY2ZnX2lkeDsKKyAgICB1aW50OF90ICAgICAgICAgICBtZGVwX2NmZ19pZHg7CisgICAgdWludDhfdCAgICAgICAgICAgbWRsX2NmZ19pZHg7CiAgICAgdEJUQV9ITF9NREVQX0NGRyAgICAgICAgICAgICpwX21kZXBfY2ZnOwogICAgIFVOVVNFRChwX2NiKTsKIApAQCAtMTIxMSwxNCArMTIxMSwxNCBAQAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnRhX2hsX3NldF9jdHJsX3BzbV9mb3JfZGNoKGFwcF9pZHgsIG1jbF9pZHgsIG1kbF9pZHgsIHBfZGF0YS0+YXBpX2RjaF9vcGVuLmN0cmxfcHNtKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RjYi0+aW5fdXNlICAgICAgICAgICAgICAgICAgID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RjYi0+aW5fdXNlICAgICAgICAgICAgICAgICAgID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RjYi0+ZGNoX29wZXIgICAgICAgICAgICAgICAgID0gQlRBX0hMX0RDSF9PUF9MT0NBTF9SRUNPTk5FQ1Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kY2ItPnNlY19tYXNrICAgICAgICAgICAgICAgICA9IChCVEFfU0VDX0FVVEhFTlRJQ0FURSB8IEJUQV9TRUNfRU5DUllQVCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kY2ItPmxvY2FsX21kZXBfaWQgICAgICAgICAgICA9IHBfYWNiLT5tZGxfY2ZnW21kbF9jZmdfaWR4XS5sb2NhbF9tZGVwX2lkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGNiLT5sb2NhbF9tZGVwX2NmZ19pZHggICAgICAgPSBtZGVwX2NmZ19pZHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kY2ItPmxvY2FsX2NmZyAgICAgICAgICAgICAgICA9IEJUQV9ITF9EQ0hfQ0ZHX1VOS05PV047CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kY2ItPm1kbF9pZCAgICAgICAgICAgICAgICAgICA9IHBfZGF0YS0+YXBpX2RjaF9yZWNvbm5lY3QubWRsX2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGNiLT5tZGxfY2ZnX2lkeF9pbmNsdWRlZCAgICAgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGNiLT5tZGxfY2ZnX2lkeF9pbmNsdWRlZCAgICAgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGNiLT5tZGxfY2ZnX2lkeCAgICAgICAgICAgICAgPSBtZGxfY2ZnX2lkeDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RjYi0+ZGNoX21vZGUgICAgICAgICAgICAgICAgID0gcF9hY2ItPm1kbF9jZmdbbWRsX2NmZ19pZHhdLmRjaF9tb2RlOwogCkBAIC0xMjY1LDcgKzEyNjUsNyBAQAogICAgICAgICBzdGF0dXMgPSBCVEFfSExfU1RBVFVTX0lOVkFMSURfTUNMX0hBTkRMRTsKICAgICB9CiAKLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBpZiAoc3RhdHVzICE9IEJUQV9ITF9TVEFUVVNfT0spCiAgICAgewogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGxfYXBpX2RjaF9yZWNvbm5lY3Qgc3RhdHVzPSVzIiwgYnRhX2hsX3N0YXR1c19jb2RlKHN0YXR1cykpOwpAQCAtMTMyMiw3ICsxMzIyLDcgQEAKIHsKICAgICB0QlRBX0hMICAgICAgICAgICAgIGV2dF9kYXRhOwogICAgIHRCVEFfSExfU1RBVFVTICAgICAgc3RhdHVzID0gQlRBX0hMX1NUQVRVU19PSzsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGFwcF9pZHgsIG1jbF9pZHgsIG1kbF9pZHg7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIGFwcF9pZHgsIG1jbF9pZHgsIG1kbF9pZHg7CiAgICAgdEJUQV9ITF9BUFBfQ0IgICAgICAqcF9hY2I7CiAgICAgdEJUQV9ITF9NQ0xfQ0IgICAgICAqcF9tY2IgPSBOVUxMOwogICAgIHRCVEFfSExfTURMX0NCICAgICAgKnBfZGNiOwpAQCAtMTM0NCwxMiArMTM0NCwxMiBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoKHBfZGF0YS0+YXBpX2RjaF9lY2hvX3Rlc3QubG9jYWxfY2ZnID09IEJUQV9ITF9EQ0hfQ0ZHX1JFTElBQkxFKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgKHBfZGF0YS0+YXBpX2RjaF9lY2hvX3Rlc3QubG9jYWxfY2ZnID09IEJUQV9ITF9EQ0hfQ0ZHX1NUUkVBTUlORykpCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xFQU4gZmNzX3VzZSA9IChCT09MRUFOKSAocF9kY2ItPmNobmxfY2ZnLmZjcyAmIEJUQV9ITF9NQ0FfRkNTX1VTRV9NQVNLKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZmNzX3VzZSA9IChib29sKSAocF9kY2ItPmNobmxfY2ZnLmZjcyAmIEJUQV9ITF9NQ0FfRkNTX1VTRV9NQVNLKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocF9kY2ItPnBfZWNob190eF9wa3QgPSBidGFfaGxfZ2V0X2J1ZihwX2RhdGEtPmFwaV9kY2hfZWNob190ZXN0LnBrdF9zaXplLCBmY3NfdXNlKSkgIT0gTlVMTCApCiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ0YV9obF9zZXRfY3RybF9wc21fZm9yX2RjaChhcHBfaWR4LCBtY2xfaWR4LCBtZGxfaWR4LCBwX2RhdGEtPmFwaV9kY2hfb3Blbi5jdHJsX3BzbSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RjYi0+aW5fdXNlICAgICAgICAgICAgICAgICAgID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kY2ItPmluX3VzZSAgICAgICAgICAgICAgICAgICA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGNiLT5kY2hfb3BlciAgICAgICAgICAgICAgICAgPSBCVEFfSExfRENIX09QX0xPQ0FMX09QRU47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGNiLT5zZWNfbWFzayAgICAgICAgICAgICAgICAgPSAoQlRBX1NFQ19BVVRIRU5USUNBVEUgfCBCVEFfU0VDX0VOQ1JZUFQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RjYi0+bG9jYWxfbWRlcF9jZmdfaWR4ICAgICAgID0gQlRBX0hMX0VDSE9fVEVTVF9NREVQX0NGR19JRFg7CkBAIC0xMzU3LDExICsxMzU3LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGNiLT5sb2NhbF9tZGVwX2lkICAgICAgICAgICAgPSBCVEFfSExfRUNIT19URVNUX01ERVBfSUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGNiLT5wZWVyX21kZXBfaWQgICAgICAgICAgICAgPSBCVEFfSExfRUNIT19URVNUX01ERVBfSUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGNiLT5tZGxfaWQgICAgICAgICAgICAgICAgICAgPSBidGFfaGxfYWxsb2NhdGVfbWRsX2lkKGFwcF9pZHgsbWNsX2lkeCxtZGxfaWR4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kY2ItPm1kbF9jZmdfaWR4X2luY2x1ZGVkICAgICA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RjYi0+bWRsX2NmZ19pZHhfaW5jbHVkZWQgICAgID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZWNob19jZmcgICAgICAgICAgICAgICAgICAgICAgPSBCVEFfSExfR0VUX0VDSE9fQ0ZHX1BUUihhcHBfaWR4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kY2ItPm1heF9yeF9hcGR1X3NpemUgICAgICAgICA9IHBfZWNob19jZmctPm1heF9yeF9hcGR1X3NpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGNiLT5tYXhfdHhfYXBkdV9zaXplICAgICAgICAgPSBwX2VjaG9fY2ZnLT5tYXhfdHhfYXBkdV9zaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21jYi0+ZWNob190ZXN0ICAgICAgICAgICAgICAgID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tY2ItPmVjaG9fdGVzdCAgICAgICAgICAgICAgICA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWNiLT5lY2hvX21kbF9pZHggICAgICAgICAgICAgPSBtZGxfaWR4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCkBAIC0xMzk5LDcgKzEzOTksNyBAQAogICAgICAgICBzdGF0dXMgPSBCVEFfSExfU1RBVFVTX05PX01DTDsKICAgICB9CiAKLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBpZiAoc3RhdHVzICE9IEJUQV9ITF9TVEFUVVNfT0spCiAgICAgewogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGxfYXBpX2RjaF9lY2hvX3Rlc3Qgc3RhdHVzPSVzIiwgYnRhX2hsX3N0YXR1c19jb2RlKHN0YXR1cykpOwpAQCAtMTQ1Niw3ICsxNDU2LDcgQEAKIHsKICAgICB0QlRBX0hMICAgICAgICAgZXZ0X2RhdGE7CiAgICAgdEJUQV9ITF9TVEFUVVMgIHN0YXR1cyA9IEJUQV9ITF9TVEFUVVNfT0s7Ci0gICAgVUlOVDggICAgICAgICAgIGFwcF9pZHgsIG1jbF9pZHg7CisgICAgdWludDhfdCAgICAgICAgICAgYXBwX2lkeCwgbWNsX2lkeDsKICAgICB0QlRBX0hMX0FQUF9DQiAgKnBfYWNiOwogICAgIHRCVEFfSExfTUNMX0NCICAqcF9tY2I7CiAgICAgVU5VU0VEKHBfY2IpOwpAQCAtMTQ2OCw3ICsxNDY4LDcgQEAKICAgICAgICAgICAgIGlmIChidGFfaGxfZmluZF9hdmFpbF9tY2xfaWR4KGFwcF9pZHgsICZtY2xfaWR4KSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBwX21jYiA9IEJUQV9ITF9HRVRfTUNMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4KTsKLSAgICAgICAgICAgICAgICBwX21jYi0+aW5fdXNlID0gVFJVRTsKKyAgICAgICAgICAgICAgICBwX21jYi0+aW5fdXNlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBiZGNweShwX21jYi0+YmRfYWRkciwgcF9kYXRhLT5hcGlfc2RwX3F1ZXJ5LmJkX2FkZHIpOwogICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9hcGlfc2RwX3F1ZXJ5IHBfbWNiLT5hcHBfaWQgJWQgYXBwX2lkeCAlZCBtY2xfaWR4ICVkIiwgcF9tY2ItPmFwcF9pZCwgYXBwX2lkeCwgbWNsX2lkeCk7CiAgICAgICAgICAgICAgICAgcF9tY2ItPmFwcF9pZCA9IHBfZGF0YS0+YXBpX3NkcF9xdWVyeS5hcHBfaWQ7CkBAIC0xNTA3LDcgKzE1MDcsNyBAQAogICAgICAgICAgICAgbWVtc2V0KHBfbWNiLCAwICxzaXplb2YodEJUQV9ITF9NQ0xfQ0IpKTsKICAgICAgICAgfQogICAgIH0KLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBpZiAoc3RhdHVzICE9IEJUQV9ITF9TVEFUVVNfT0spCiAgICAgewogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGxfYXBpX3NkcF9xdWVyeSBzdGF0dXM9JXMiLCBidGFfaGxfc3RhdHVzX2NvZGUoc3RhdHVzKSk7CkBAIC0xNTU4LDEzICsxNTU4LDEzIEBACiB7CiAgICAgdEJUQV9ITCAgICAgICAgICAgICBldnRfZGF0YTsKICAgICB0QlRBX0hMX1NUQVRVUyAgICAgIHN0YXR1cyA9IEJUQV9ITF9TVEFUVVNfT0s7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBhcHBfaWR4ID0gcF9kYXRhLT5jY2hfc2RwLmFwcF9pZHg7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBtY2xfaWR4ID0gcF9kYXRhLT5jY2hfc2RwLm1jbF9pZHg7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIGFwcF9pZHggPSBwX2RhdGEtPmNjaF9zZHAuYXBwX2lkeDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgbWNsX2lkeCA9IHBfZGF0YS0+Y2NoX3NkcC5tY2xfaWR4OwogICAgIHRCVEFfSExfQVBQX0NCICAgICAgKnBfYWNiID0gQlRBX0hMX0dFVF9BUFBfQ0JfUFRSKCBhcHBfaWR4KTsKICAgICB0QlRBX0hMX01DTF9DQiAgICAgICpwX21jYiA9ICBCVEFfSExfR0VUX01DTF9DQl9QVFIoIGFwcF9pZHgsICBtY2xfaWR4KTsKICAgICB0QlRBX0hMX1NEUCAgICAgICAgICpwX3NkcD1OVUxMOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgZXZlbnQ7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICByZWxlYXNlX3NkcF9idWY9RkFMU0U7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIGV2ZW50OworICAgIGJvb2wgICAgICAgICAgICAgcmVsZWFzZV9zZHBfYnVmPWZhbHNlOwogICAgIFVOVVNFRChwX2NiKTsKIAogICAgIGV2ZW50ID0gcF9kYXRhLT5oZHIuZXZlbnQ7CkBAIC0xNTcyLDEyICsxNTcyLDEyIEBACiAgICAgaWYgKGV2ZW50ID09IEJUQV9ITF9TRFBfUVVFUllfT0tfRVZUKSB7CiAgICAgICAgIHBfc2RwID0gKHRCVEFfSExfU0RQICopb3NpX21hbGxvYyhzaXplb2YodEJUQV9ITF9TRFApKTsKICAgICAgICAgbWVtY3B5KHBfc2RwLCAmcF9tY2ItPnNkcCwgc2l6ZW9mKHRCVEFfSExfU0RQKSk7Ci0gICAgICAgIHJlbGVhc2Vfc2RwX2J1ZiA9IFRSVUU7CisgICAgICAgIHJlbGVhc2Vfc2RwX2J1ZiA9IHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgc3RhdHVzID0gQlRBX0hMX1NUQVRVU19TRFBfRkFJTDsKICAgICB9CiAKLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBpZiAoc3RhdHVzICE9IEJUQV9ITF9TVEFUVVNfT0spCiAgICAgewogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGxfc2RwX3F1ZXJ5X3Jlc3VsdHMgc3RhdHVzPSVzIiwgYnRhX2hsX3N0YXR1c19jb2RlKHN0YXR1cykpOwpAQCAtMTU5Niw3ICsxNTk2LDcgQEAKICAgICAgICAgbWVtc2V0KHBfbWNiLCAwLCBzaXplb2YodEJUQV9ITF9NQ0xfQ0IpKTsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAocF9tY2ItPmNsb3NlX3BlbmRpbmcpCi0gICAgICAgICAgICBidGFfaGxfY2hlY2tfY2NoX2Nsb3NlKGFwcF9pZHgsIG1jbF9pZHgsIHBfZGF0YSwgVFJVRSk7CisgICAgICAgICAgICBidGFfaGxfY2hlY2tfY2NoX2Nsb3NlKGFwcF9pZHgsIG1jbF9pZHgsIHBfZGF0YSwgdHJ1ZSk7CiAKICAgICAgICAgaWYgKCFwX21jYi0+Y3RybF9wc20pIHsKICAgICAgICAgICAgIC8qIENvbnRyb2wgY2hhbm5lbCBhY2NlcHRvcjogZG8gbm90IHN0b3JlIHRoZSBTRFAgcmVjb3JkcyAqLwpAQCAtMTYxOSw3ICsxNjE5LDcgQEAKIHsKICAgICB0QlRBX0hMICAgICAgICAgZXZ0X2RhdGE7CiAgICAgdEJUQV9ITF9TVEFUVVMgIHN0YXR1cyA9IEJUQV9ITF9TVEFUVVNfT0s7Ci0gICAgVUlOVDggICAgICAgICAgIGFwcF9pZHgsIG1jbF9pZHg7CisgICAgdWludDhfdCAgICAgICAgICAgYXBwX2lkeCwgbWNsX2lkeDsKICAgICB0QlRBX0hMX0FQUF9DQiAgKnBfYWNiOwogICAgIHRCVEFfSExfTUNMX0NCICAqcF9tY2I7CiAgICAgVU5VU0VEKHBfY2IpOwpAQCAtMTYzNyw3ICsxNjM3LDcgQEAKIAogICAgICAgICAgICAgICAgIHBfbWNiLT5kZWxldGVfbWRsLm1jbF9oYW5kbGUgPSAgcF9kYXRhLT5hcGlfZGVsZXRlX21kbC5tY2xfaGFuZGxlOwogICAgICAgICAgICAgICAgIHBfbWNiLT5kZWxldGVfbWRsLm1kbF9pZCA9IHBfZGF0YS0+YXBpX2RlbGV0ZV9tZGwubWRsX2lkOwotICAgICAgICAgICAgICAgIHBfbWNiLT5kZWxldGVfbWRsLmRlbGV0ZV9yZXFfcGVuZGluZyA9IFRSVUU7CisgICAgICAgICAgICAgICAgcF9tY2ItPmRlbGV0ZV9tZGwuZGVsZXRlX3JlcV9wZW5kaW5nID0gdHJ1ZTsKIAogICAgICAgICAgICAgICAgIGlmIChNQ0FfRGVsZXRlKCh0TUNBX0NMKSBwX21jYi0+bWNsX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmFwaV9kZWxldGVfbWRsLm1kbF9pZCkhPSBNQ0FfU1VDQ0VTUykKQEAgLTE2NjEsNyArMTY2MSw3IEBACiAgICAgICAgIHN0YXR1cyA9IEJUQV9ITF9TVEFUVVNfSU5WQUxJRF9NQ0xfSEFORExFOwogICAgIH0KIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIGlmIChzdGF0dXMgIT0gQlRBX0hMX1NUQVRVU19PSykKICAgICB7CiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9hcGlfZGVsZXRlX21kbCBzdGF0dXM9JXMiLCBidGFfaGxfc3RhdHVzX2NvZGUoc3RhdHVzKSk7CkBAIC0xNzA4LDEwICsxNzA4LDEwIEBACiB7CiAgICAgdEJUQV9ITCAgICAgICAgIGV2dF9kYXRhOwogICAgIHRCVEFfSExfU1RBVFVTICBzdGF0dXMgPSBCVEFfSExfU1RBVFVTX09LOwotICAgIFVJTlQ4ICAgICAgICAgICBhcHBfaWR4LCBtY2xfaWR4OworICAgIHVpbnQ4X3QgICAgICAgICAgIGFwcF9pZHgsIG1jbF9pZHg7CiAgICAgdE1DQV9SU1BfRVZUICAgICpwX2RlbGV0ZV9jZm0gPSAmcF9kYXRhLT5tY2FfZXZ0Lm1jYV9kYXRhLmRlbGV0ZV9jZm07CiAgICAgdEJUQV9ITF9NQ0xfQ0IgICpwX21jYjsKLSAgICBCT09MRUFOICAgICAgICAgc2VuZF9jZm1fZXZ0ID0gVFJVRTsKKyAgICBib29sICAgICAgICAgc2VuZF9jZm1fZXZ0ID0gdHJ1ZTsKICAgICB0QlRBX0hMX0FQUF9DQiAgKnBfYWNiOwogICAgIFVOVVNFRChwX2NiKTsKIApAQCAtMTczOSwxNSArMTczOSwxNSBAQAogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgICAgc2VuZF9jZm1fZXZ0ID0gRkFMU0U7CisgICAgICAgICAgICBzZW5kX2NmbV9ldnQgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgICBzZW5kX2NmbV9ldnQgPSBGQUxTRTsKKyAgICAgICAgc2VuZF9jZm1fZXZ0ID0gZmFsc2U7CiAgICAgfQogCi0jaWYgQlRBX0hMX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgaWYgKHN0YXR1cyAhPSBCVEFfSExfU1RBVFVTX09LKQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hsX2FwaV9kZWxldGVfbWRsIHN0YXR1cz0lcyIsIGJ0YV9obF9zdGF0dXNfY29kZShzdGF0dXMpKTsKQEAgLTE3ODcsMTEgKzE3ODcsMTEgQEAKIHN0YXRpYyB2b2lkIGJ0YV9obF9tY2FfZGVsZXRlX21kbF9pbmQodEJUQV9ITF9DQiAqcF9jYiwgdEJUQV9ITF9EQVRBICpwX2RhdGEpCiB7CiAgICAgdEJUQV9ITCAgICAgICAgIGV2dF9kYXRhOwotICAgIFVJTlQ4ICAgICAgICAgICBhcHBfaWR4LCBtY2xfaWR4LCBtZGxfaWR4OworICAgIHVpbnQ4X3QgICAgICAgICAgIGFwcF9pZHgsIG1jbF9pZHgsIG1kbF9pZHg7CiAgICAgdE1DQV9FVlRfSERSICAgICpwX2RlbGV0ZV9pbmQgPSAmcF9kYXRhLT5tY2FfZXZ0Lm1jYV9kYXRhLmRlbGV0ZV9pbmQ7CiAgICAgdEJUQV9ITF9NQ0xfQ0IgICpwX21jYjsKICAgICB0QlRBX0hMX01ETF9DQiAgKnBfZGNiOwotICAgIEJPT0xFQU4gICAgICAgICBzZW5kX2luZF9ldnQgPSBGQUxTRTsKKyAgICBib29sICAgICAgICAgc2VuZF9pbmRfZXZ0ID0gZmFsc2U7CiAgICAgdEJUQV9ITF9BUFBfQ0IgICpwX2FjYjsKICAgICBVTlVTRUQocF9jYik7CiAKQEAgLTE4MDgsMTEgKzE4MDgsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21jYi0+YmRfYWRkciAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kZWxldGVfaW5kLT5tZGxfaWQpKQogICAgICAgICB7Ci0gICAgICAgICAgICBzZW5kX2luZF9ldnQgPSBUUlVFOworICAgICAgICAgICAgc2VuZF9pbmRfZXZ0ID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIGlmICghc2VuZF9pbmRfZXZ0KQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hsX21jYV9kZWxldGVfbWRsX2luZCBpc19zZW5kX2luZF9ldnQgPSVkIiwgc2VuZF9pbmRfZXZ0KTsKQEAgLTE4NTAsNyArMTg1MCw3IEBACiBzdGF0aWMgdm9pZCBidGFfaGxfYXBpX2RjaF9hYm9ydCh0QlRBX0hMX0NCICpwX2NiLCB0QlRBX0hMX0RBVEEgKnBfZGF0YSkKIHsKICAgICB0QlRBX0hMX1NUQVRVUyAgc3RhdHVzID0gQlRBX0hMX1NUQVRVU19PSzsKLSAgICBVSU5UOCAgICAgICAgICAgYXBwX2lkeCwgbWNsX2lkeCwgbWRsX2lkeDsKKyAgICB1aW50OF90ICAgICAgICAgICBhcHBfaWR4LCBtY2xfaWR4LCBtZGxfaWR4OwogICAgIHRCVEFfSExfQVBQX0NCICAqcF9hY2I7CiAgICAgdEJUQV9ITF9NQ0xfQ0IgICpwX21jYjsKICAgICB0QlRBX0hMX01ETF9DQiAgKnBfZGNiOwpAQCAtMTg4NCw3ICsxODg0LDcgQEAKICAgICB9CiAKIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIGlmIChzdGF0dXMgIT0gQlRBX0hMX1NUQVRVU19PSykKICAgICB7CiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9hcGlfZGNoX2Fib3J0IHN0YXR1cz0lcyIsIGJ0YV9obF9zdGF0dXNfY29kZShzdGF0dXMpKTsKQEAgLTE5MzIsMTIgKzE5MzIsMTIgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9obF9oZGxfZXZlbnQoQlRfSERSICpwX21zZykKK2Jvb2wgYnRhX2hsX2hkbF9ldmVudChCVF9IRFIgKnBfbXNnKQogewotICAgIFVJTlQ4IGFwcF9pZHgsIG1jbF9pZHgsIG1kbF9pZHg7Ci0gICAgQk9PTEVBTiBzdWNjZXNzID0gVFJVRTsKKyAgICB1aW50OF90IGFwcF9pZHgsIG1jbF9pZHgsIG1kbF9pZHg7CisgICAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoIkJUQSBITCBFdmVudCBIYW5kbGVyOiBFdmVudCBbJXNdIiwKICAgICAgICAgICAgICAgICAgICAgICBidGFfaGxfZXZ0X2NvZGUocF9tc2ctPmV2ZW50KSk7CiAjZW5kaWYKQEAgLTIwMTQsMTMgKzIwMTQsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHsKLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICAgICAgICAgICAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigidW5hYmxlIHRvIGZpbmQgY29udHJvbCBibG9jayBpbmRleGVzIGZvciBDQ0g6IFtldmVudD0lc10iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfaGxfZXZ0X2NvZGUocF9tc2ctPmV2ZW50KSk7CiAjZWxzZQogICAgICAgICAgICAgICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKCJ1bmFibGUgdG8gZmluZCBjb250cm9sIGJsb2NrIGluZGV4ZXMgZm9yIENDSDogW2V2ZW50PSVkXSIsIHBfbXNnLT5ldmVudCk7CiAjZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQpAQCAtMjAzNSwxMyArMjAzNSwxMyBAQAogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICB7CiAKLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICAgICAgICAgICAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigidW5hYmxlIHRvIGZpbmQgY29udHJvbCBibG9jayBpbmRleGVzIGZvciBEQ0ggOiBbZXZlbnQ9JXNdIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2hsX2V2dF9jb2RlKHBfbXNnLT5ldmVudCkpOwogI2Vsc2UKICAgICAgICAgICAgICAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigidW5hYmxlIHRvIGZpbmQgY29udHJvbCBibG9jayBpbmRleGVzIGZvciBEQ0g6IFtldmVudD0lZF0iLCBwX21zZy0+ZXZlbnQpOwogI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtMjA1NSw3ICsyMDU1LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiogIERlYnVnIEZ1bmN0aW9ucwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKSAmJiAoQlRfVVNFX1RSQUNFUyA9PSBUUlVFKQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSAmJiBCVF9VU0VfVFJBQ0VTID09IFRSVUUpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpkaWZmIC0tZ2l0IGEvYnRhL2hsL2J0YV9obF9zZHAuYyBiL2J0YS9obC9idGFfaGxfc2RwLmMKaW5kZXggODI2YWRjZC4uNGY2MmZmZSAxMDA2NDQKLS0tIGEvYnRhL2hsL2J0YV9obF9zZHAuYworKysgYi9idGEvaGwvYnRhX2hsX3NkcC5jCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpZiBkZWZpbmVkKEhMX0lOQ0xVREVEKSAmJiAoSExfSU5DTFVERUQgPT0gVFJVRSkKKyNpZiAoSExfSU5DTFVERUQgPT0gVFJVRSkKIAogI2luY2x1ZGUgInNkcF9hcGkuaCIKICNpbmNsdWRlICJidGFfaGxfaW50LmgiCkBAIC0zMSwyNCArMzEsMjQgQEAKICoqCiAqKiBEZXNjcmlwdGlvbiAgICAgIEZpbGwgdGhlIHN1cHBvcnRlZCBmZWF0dXJlcyBmcm9tIHRlaCBTRFAgcmVjb3JkCiAqKgotKiogUmV0dXJucyAgICAgICAgICBUUlVFIGlmIGZvdW5kLCBGQUxTRSBpZiBub3QKKyoqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBmb3VuZCwgZmFsc2UgaWYgbm90CiAqKiAgICAgICAgICAgICAgICAgIElmIGZvdW5kLCB0aGUgcGFzc2VkIHByb3RvY29sIGxpc3QgZWxlbWVudCBpcyBmaWxsZWQgaW4uCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX2hsX2ZpbGxfc3VwX2ZlYXR1cmVfbGlzdCggY29uc3QgdFNEUF9ESVNDX0FUVFIgICpwX2F0dHIsCitib29sIGJ0YV9obF9maWxsX3N1cF9mZWF0dXJlX2xpc3QoIGNvbnN0IHRTRFBfRElTQ19BVFRSICAqcF9hdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX1NVUF9GRUFUVVJFX0xJU1RfRUxFTSAqcF9saXN0KQogewogICAgIHRTRFBfRElTQ19BVFRSICAqcF9zYXR0cjsKLSAgICBVSU5UOCAgICAgICAgICAgaXRlbV9jbnQ7Ci0gICAgVUlOVDggICAgICAgICAgIGxpc3RfY250PTA7Ci0gICAgQk9PTEVBTiAgICAgICAgIHN0YXR1cz1UUlVFOworICAgIHVpbnQ4X3QgICAgICAgICAgIGl0ZW1fY250OworICAgIHVpbnQ4X3QgICAgICAgICAgIGxpc3RfY250PTA7CisgICAgYm9vbCAgICAgICAgIHN0YXR1cz10cnVlOwogCiAgICAgZm9yIChwX2F0dHIgPSBwX2F0dHItPmF0dHJfdmFsdWUudi5wX3N1Yl9hdHRyOyBwX2F0dHI7IHBfYXR0ciA9IHBfYXR0ci0+cF9uZXh0X2F0dHIpCiAgICAgewogICAgICAgICAvKiBtZGVwIHNlcXVlbmNlICovCiAgICAgICAgIGlmIChTRFBfRElTQ19BVFRSX1RZUEUocF9hdHRyLT5hdHRyX2xlbl90eXBlKSAhPSBEQVRBX0VMRV9TRVFfREVTQ19UWVBFKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgICAgICAgfQogCiAgICAgICAgIGl0ZW1fY250PTA7CkBAIC05MiwxMSArOTIsMTEgQEAKICoqIFJldHVybnMgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBzZXF1ZW5jZQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgYnRhX2hsX2NvbXBvc2Vfc3VwcG9ydGVkX2ZlYXR1cmVfbGlzdCggVUlOVDggKnAsIFVJTlQxNiBudW1fZWxlbSwKK2ludCBidGFfaGxfY29tcG9zZV9zdXBwb3J0ZWRfZmVhdHVyZV9saXN0KCB1aW50OF90ICpwLCB1aW50MTZfdCBudW1fZWxlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0hMX1NVUF9GRUFUVVJFX0VMRU0gKnBfZWxlbV9saXN0KQogewotICAgIFVJTlQxNiAgICAgICAgICB4eCwgc3RyX2xlbiwgc2VxX2xlbjsKLSAgICBVSU5UOCAgICAgICAgICAgKnBfaGVhZCA9IHA7CisgICAgdWludDE2X3QgICAgICAgICAgeHgsIHN0cl9sZW4sIHNlcV9sZW47CisgICAgdWludDhfdCAgICAgICAgICAgKnBfaGVhZCA9IHA7CiAKICAgICBmb3IgKHh4ID0gMDsgeHggPCBudW1fZWxlbTsgeHgrKywgcF9lbGVtX2xpc3QrKykKICAgICB7CkBAIC0xMDksNyArMTA5LDcgQEAKICAgICAgICAgICAgIHNlcV9sZW4gKz0gc3RyX2xlbisyOyAvKiB0b2RvIGFkZCBhICMgc3ltYm9sIGZvciAyICovCiAgICAgICAgIH0KIAotICAgICAgICAqcCsrID0gKFVJTlQ4KSBzZXFfbGVuOworICAgICAgICAqcCsrID0gKHVpbnQ4X3QpIHNlcV9sZW47CiAKICAgICAgICAgVUlOVDhfVE9fQkVfU1RSRUFNICAocCwgKFVJTlRfREVTQ19UWVBFIDw8IDMpIHwgU0laRV9PTkVfQllURSk7CiAgICAgICAgIFVJTlQ4X1RPX0JFX1NUUkVBTSAgKHAsIHBfZWxlbV9saXN0LT5tZGVwX2lkKTsKQEAgLTEzOCwyMCArMTM4LDIwIEBACiAqKiAgICAgICAgICAgICAgICAgIElmIHRoZSBwcm90b2NvbCBsaXN0IGFscmVhZHkgZXhpc3RzIGluIHRoZSByZWNvcmQsIGl0IGlzIHJlcGxhY2VkCiAqKiAgICAgICAgICAgICAgICAgIHdpdGggdGhlIG5ldyBsaXN0LgogKioKLSoqIFJldHVybnMgICAgICAgICAgVFJVRSBpZiBhZGRlZCBPSywgZWxzZSBGQUxTRQorKiogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGFkZGVkIE9LLCBlbHNlIGZhbHNlCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX2hsX2FkZF9zdXBfZmVhdHVyZV9saXN0IChVSU5UMzIgaGFuZGxlLCBVSU5UMTYgbnVtX2VsZW0sCitib29sIGJ0YV9obF9hZGRfc3VwX2ZlYXR1cmVfbGlzdCAodWludDMyX3QgaGFuZGxlLCB1aW50MTZfdCBudW1fZWxlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0hMX1NVUF9GRUFUVVJFX0VMRU0gKnBfZWxlbV9saXN0KQogewogICAgIGludCBvZmZzZXQ7Ci0gICAgQk9PTEVBTiByZXN1bHQ7Ci0gICAgVUlOVDggKnBfYnVmID0gKFVJTlQ4ICopb3NpX21hbGxvYyhCVEFfSExfU1VQX0ZFQVRVUkVfU0RQX0JVRl9TSVpFKTsKKyAgICBib29sIHJlc3VsdDsKKyAgICB1aW50OF90ICpwX2J1ZiA9ICh1aW50OF90ICopb3NpX21hbGxvYyhCVEFfSExfU1VQX0ZFQVRVUkVfU0RQX0JVRl9TSVpFKTsKIAogICAgIG9mZnNldCA9IGJ0YV9obF9jb21wb3NlX3N1cHBvcnRlZF9mZWF0dXJlX2xpc3QocF9idWYsIG51bV9lbGVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9lbGVtX2xpc3QpOwogICAgIHJlc3VsdCA9IFNEUF9BZGRBdHRyaWJ1dGUoaGFuZGxlLCBBVFRSX0lEX0hEUF9TVVBfRkVBVF9MSVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUQV9FTEVfU0VRX0RFU0NfVFlQRSwgKFVJTlQzMikgb2Zmc2V0LCBwX2J1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRBX0VMRV9TRVFfREVTQ19UWVBFLCAodWludDMyX3QpIG9mZnNldCwgcF9idWYpOwogICAgIG9zaV9mcmVlKHBfYnVmKTsKIAogICAgIHJldHVybiByZXN1bHQ7CkBAIC0xNjgsMjEgKzE2OCwyMSBAQAogKiogIFJldHVybnM6ICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0hMX1NUQVRVUyBidGFfaGxfc2RwX3VwZGF0ZSAoVUlOVDggYXBwX2lkKQordEJUQV9ITF9TVEFUVVMgYnRhX2hsX3NkcF91cGRhdGUgKHVpbnQ4X3QgYXBwX2lkKQogewotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZjX2NsYXNzX2lkX2xpc3RbQlRBX0hMX05VTV9TVkNfRUxFTVNdOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICBzdmNfY2xhc3NfaWRfbGlzdFtCVEFfSExfTlVNX1NWQ19FTEVNU107CiAgICAgdFNEUF9QUk9UT0NPTF9FTEVNICAgICAgICAgICAgICBwcm90b19lbGVtX2xpc3RbQlRBX0hMX05VTV9QUk9UT19FTEVNU107CiAgICAgdFNEUF9QUk9UT19MSVNUX0VMRU0gICAgICAgICAgICBhZGRfcHJvdG9fbGlzdDsKICAgICB0QlRBX0hMX1NVUF9GRUFUVVJFX0xJU1RfRUxFTSAgIHN1cF9mZWF0dXJlX2xpc3Q7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBicm93c2VfbGlzdFtdID0ge1VVSURfU0VSVkNMQVNTX1BVQkxJQ19CUk9XU0VfR1JPVVB9OwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgaSxqLCBjbnQsbWRlcF9pZCwgbWRlcF9yb2xlOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9leGNoYW5nZV9zcGVjID0gQlRBX0hMX1NEUF9JRUVFXzExMDczXzIwNjAxOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgbWNhcF9zdXBfcHJvYyA9IEJUQV9ITF9NQ0FQX1NVUF9QUk9DX01BU0s7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX3V1aWQgPSBVVUlEX1NFUlZDTEFTU19IRFBfUFJPRklMRTsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSBCVEFfSExfVkVSU0lPTjsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9zZXJ2aWNlcz0xOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICBicm93c2VfbGlzdFtdID0ge1VVSURfU0VSVkNMQVNTX1BVQkxJQ19CUk9XU0VfR1JPVVB9OworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgICAgICBpLGosIGNudCxtZGVwX2lkLCBtZGVwX3JvbGU7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZXhjaGFuZ2Vfc3BlYyA9IEJUQV9ITF9TRFBfSUVFRV8xMTA3M18yMDYwMTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbWNhcF9zdXBfcHJvYyA9IEJUQV9ITF9NQ0FQX1NVUF9QUk9DX01BU0s7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfdXVpZCA9IFVVSURfU0VSVkNMQVNTX0hEUF9QUk9GSUxFOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gQlRBX0hMX1ZFUlNJT047CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9zZXJ2aWNlcz0xOwogICAgIHRCVEFfSExfQVBQX0NCICAgICAgICAgICAgICAgICAgKnBfY2IgPSBCVEFfSExfR0VUX0FQUF9DQl9QVFIoMCk7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUUlVFOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKICAgICB0QlRBX0hMX1NUQVRVUyAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJUQV9ITF9TVEFUVVNfT0s7CiAgICAgVU5VU0VEKGFwcF9pZCk7CiAKQEAgLTI0MCwxMCArMjQwLDEwIEBACiAgICAgICAgIGlmIChwX2NiLT5zcnZfbmFtZVswXSApCiAgICAgICAgIHsKICAgICAgICAgICAgIHJlc3VsdCAmPSBTRFBfQWRkQXR0cmlidXRlKHBfY2ItPnNkcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDE2KUFUVFJfSURfU0VSVklDRV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4KVRFWFRfU1RSX0RFU0NfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UMzIpKHN0cmxlbihwX2NiLT5zcnZfbmFtZSkgKyAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UOCAqKXBfY2ItPnNydl9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdClBVFRSX0lEX1NFUlZJQ0VfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KVRFWFRfU1RSX0RFU0NfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoc3RybGVuKHBfY2ItPnNydl9uYW1lKSArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKilwX2NiLT5zcnZfbmFtZSk7CiAgICAgICAgIH0gLyogZW5kIG9mIHNldHRpbmcgb3B0aW9uYWwgc2VydmljZSBuYW1lICovCiAgICAgfQogCkBAIC0yNTIsMTAgKzI1MiwxMCBAQAogICAgICAgICBpZiAocF9jYi0+c3J2X2Rlc3BbMF0gKQogICAgICAgICB7CiAgICAgICAgICAgICByZXN1bHQgJj0gU0RQX0FkZEF0dHJpYnV0ZShwX2NiLT5zZHBfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQxNilBVFRSX0lEX1NFUlZJQ0VfREVTQ1JJUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgpVEVYVF9TVFJfREVTQ19UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQzMikoc3RybGVuKHBfY2ItPnNydl9kZXNwKSArIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4ICopcF9jYi0+c3J2X2Rlc3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KUFUVFJfSURfU0VSVklDRV9ERVNDUklQVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KVRFWFRfU1RSX0RFU0NfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoc3RybGVuKHBfY2ItPnNydl9kZXNwKSArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKilwX2NiLT5zcnZfZGVzcCk7CiAKICAgICAgICAgfSAvKiBlbmQgb2Ygc2V0dGluZyBvcHRpb25hbCBzZXJ2aWNlIGRlc2NyaXB0aW9uICovCiAKQEAgLTI2NiwxMCArMjY2LDEwIEBACiAgICAgICAgIGlmIChwX2NiLT5wcm92aWRlcl9uYW1lWzBdICkKICAgICAgICAgewogICAgICAgICAgICAgcmVzdWx0ICY9IFNEUF9BZGRBdHRyaWJ1dGUocF9jYi0+c2RwX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UMTYpQVRUUl9JRF9QUk9WSURFUl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4KVRFWFRfU1RSX0RFU0NfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UMzIpKHN0cmxlbihwX2NiLT5wcm92aWRlcl9uYW1lKSArIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4ICopcF9jYi0+cHJvdmlkZXJfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpQVRUUl9JRF9QUk9WSURFUl9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpVEVYVF9TVFJfREVTQ19UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShzdHJsZW4ocF9jYi0+cHJvdmlkZXJfbmFtZSkgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90ICopcF9jYi0+cHJvdmlkZXJfbmFtZSk7CiAgICAgICAgIH0gLyogZW5kIG9mIHNldHRpbmcgb3B0aW9uYWwgcHJvdmlkZXIgbmFtZSAqLwogICAgIH0KIApAQCAtMjgyLDggKzI4Miw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChwX2NiLT5zdXBfZmVhdHVyZS5tZGVwW2ldLm1kZXBfaWQpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWRlcF9pZCA9IChVSU5UOClwX2NiLT5zdXBfZmVhdHVyZS5tZGVwW2ldLm1kZXBfaWQ7Ci0gICAgICAgICAgICAgICAgbWRlcF9yb2xlID0gKFVJTlQ4KXBfY2ItPnN1cF9mZWF0dXJlLm1kZXBbaV0ubWRlcF9jZmcubWRlcF9yb2xlOworICAgICAgICAgICAgICAgIG1kZXBfaWQgPSAodWludDhfdClwX2NiLT5zdXBfZmVhdHVyZS5tZGVwW2ldLm1kZXBfaWQ7CisgICAgICAgICAgICAgICAgbWRlcF9yb2xlID0gKHVpbnQ4X3QpcF9jYi0+c3VwX2ZlYXR1cmUubWRlcFtpXS5tZGVwX2NmZy5tZGVwX3JvbGU7CiAKICAgICAgICAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJudW1fb2ZfbWRlcF9kYXRhX3R5cGVzICVkICIsIHBfY2ItPnN1cF9mZWF0dXJlLm1kZXBbaV0ubWRlcF9jZmcubnVtX29mX21kZXBfZGF0YV90eXBlcyk7CiAgICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8cF9jYi0+c3VwX2ZlYXR1cmUubWRlcFtpXS5tZGVwX2NmZy5udW1fb2ZfbWRlcF9kYXRhX3R5cGVzOyBqKyspCkBAIC0zMDMsNyArMzAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgY250Kys7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjbnQ9PUJUQV9ITF9OVU1fU1VQX0ZFQVRVUkVfRUxFTVMpCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTMxNywxNCArMzE3LDE0IEBACiAgICAgaWYgKHJlc3VsdCkKICAgICB7CiAgICAgICAgIHJlc3VsdCAmPSBTRFBfQWRkQXR0cmlidXRlKHBfY2ItPnNkcF9oYW5kbGUsIEFUVFJfSURfSERQX0RBVEFfRVhDSF9TUEVDLCBVSU5UX0RFU0NfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQzMikxLCAoVUlOVDgqKSZkYXRhX2V4Y2hhbmdlX3NwZWMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpMSwgKHVpbnQ4X3QqKSZkYXRhX2V4Y2hhbmdlX3NwZWMpOwogICAgIH0KIAogICAgIGlmIChyZXN1bHQpCiAgICAgewogCiAgICAgICAgIHJlc3VsdCAmPSBTRFBfQWRkQXR0cmlidXRlKHBfY2ItPnNkcF9oYW5kbGUsIEFUVFJfSURfSERQX01DQVBfU1VQX1BST0MsIFVJTlRfREVTQ19UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDMyKTEsIChVSU5UOCopJm1jYXBfc3VwX3Byb2MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpMSwgKHVpbnQ4X3QqKSZtY2FwX3N1cF9wcm9jKTsKICAgICB9CiAKICAgICBpZiAocmVzdWx0KQpAQCAtMzQ5LDcgKzM0OSw3IEBACiAgICAgICAgIH0KICAgICAgICAgc3RhdHVzID0gQlRBX0hMX1NUQVRVU19TRFBfRkFJTDsKICAgICB9Ci0jaWYgQlRBX0hMX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hsX3NkcF91cGRhdGUgc3RhdHVzPSVzIiwgYnRhX2hsX3N0YXR1c19jb2RlKHN0YXR1cykpOwogI2VuZGlmCiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTM3MSwyNCArMzcxLDI0IEBACiAqKiAgUmV0dXJuczogICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSExfU1RBVFVTIGJ0YV9obF9zZHBfcmVnaXN0ZXIgKFVJTlQ4IGFwcF9pZHgpCit0QlRBX0hMX1NUQVRVUyBidGFfaGxfc2RwX3JlZ2lzdGVyICh1aW50OF90IGFwcF9pZHgpCiB7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBzdmNfY2xhc3NfaWRfbGlzdFtCVEFfSExfTlVNX1NWQ19FTEVNU107CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgIHN2Y19jbGFzc19pZF9saXN0W0JUQV9ITF9OVU1fU1ZDX0VMRU1TXTsKICAgICB0U0RQX1BST1RPQ09MX0VMRU0gICAgICAgICAgICAgIHByb3RvX2VsZW1fbGlzdFtCVEFfSExfTlVNX1BST1RPX0VMRU1TXTsKICAgICB0U0RQX1BST1RPX0xJU1RfRUxFTSAgICAgICAgICAgIGFkZF9wcm90b19saXN0OwogICAgIHRCVEFfSExfU1VQX0ZFQVRVUkVfTElTVF9FTEVNICAgc3VwX2ZlYXR1cmVfbGlzdDsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZV9saXN0W10gPSB7VVVJRF9TRVJWQ0xBU1NfUFVCTElDX0JST1dTRV9HUk9VUH07Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBpLGosIGNudCxtZGVwX2lkLCBtZGVwX3JvbGU7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2V4Y2hhbmdlX3NwZWMgPSBCVEFfSExfU0RQX0lFRUVfMTEwNzNfMjA2MDE7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBtY2FwX3N1cF9wcm9jID0gQlRBX0hMX01DQVBfU1VQX1BST0NfTUFTSzsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfdXVpZCA9IFVVSURfU0VSVkNMQVNTX0hEUF9QUk9GSUxFOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IEJUQV9ITF9WRVJTSU9OOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3NlcnZpY2VzPTE7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZV9saXN0W10gPSB7VVVJRF9TRVJWQ0xBU1NfUFVCTElDX0JST1dTRV9HUk9VUH07CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGksaiwgY250LG1kZXBfaWQsIG1kZXBfcm9sZTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9leGNoYW5nZV9zcGVjID0gQlRBX0hMX1NEUF9JRUVFXzExMDczXzIwNjAxOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtY2FwX3N1cF9wcm9jID0gQlRBX0hMX01DQVBfU1VQX1BST0NfTUFTSzsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV91dWlkID0gVVVJRF9TRVJWQ0xBU1NfSERQX1BST0ZJTEU7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSBCVEFfSExfVkVSU0lPTjsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3NlcnZpY2VzPTE7CiAgICAgdEJUQV9ITF9BUFBfQ0IgICAgICAgICAgICAgICAgICAqcF9jYiA9IEJUQV9ITF9HRVRfQVBQX0NCX1BUUihhcHBfaWR4KTsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRSVUU7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwogICAgIHRCVEFfSExfU1RBVFVTICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQlRBX0hMX1NUQVRVU19PSzsKIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9zZHBfcmVnaXN0ZXIgYXBwX2lkeD0lZCIsYXBwX2lkeCk7CiAjZW5kaWYKIApAQCAtNDUxLDEwICs0NTEsMTAgQEAKICAgICAgICAgaWYgKHBfY2ItPnNydl9uYW1lWzBdICkKICAgICAgICAgewogICAgICAgICAgICAgcmVzdWx0ICY9IFNEUF9BZGRBdHRyaWJ1dGUocF9jYi0+c2RwX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UMTYpQVRUUl9JRF9TRVJWSUNFX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgpVEVYVF9TVFJfREVTQ19UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQzMikoc3RybGVuKHBfY2ItPnNydl9uYW1lKSArIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4ICopcF9jYi0+c3J2X25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KUFUVFJfSURfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpVEVYVF9TVFJfREVTQ19UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShzdHJsZW4ocF9jYi0+c3J2X25hbWUpICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKXBfY2ItPnNydl9uYW1lKTsKICAgICAgICAgfSAvKiBlbmQgb2Ygc2V0dGluZyBvcHRpb25hbCBzZXJ2aWNlIG5hbWUgKi8KICAgICB9CiAKQEAgLTQ2MywxMCArNDYzLDEwIEBACiAgICAgICAgIGlmIChwX2NiLT5zcnZfZGVzcFswXSApCiAgICAgICAgIHsKICAgICAgICAgICAgIHJlc3VsdCAmPSBTRFBfQWRkQXR0cmlidXRlKHBfY2ItPnNkcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDE2KUFUVFJfSURfU0VSVklDRV9ERVNDUklQVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UOClURVhUX1NUUl9ERVNDX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDMyKShzdHJsZW4ocF9jYi0+c3J2X2Rlc3ApICsgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDggKilwX2NiLT5zcnZfZGVzcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpQVRUUl9JRF9TRVJWSUNFX0RFU0NSSVBUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpVEVYVF9TVFJfREVTQ19UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShzdHJsZW4ocF9jYi0+c3J2X2Rlc3ApICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKXBfY2ItPnNydl9kZXNwKTsKIAogICAgICAgICB9IC8qIGVuZCBvZiBzZXR0aW5nIG9wdGlvbmFsIHNlcnZpY2UgZGVzY3JpcHRpb24gKi8KIApAQCAtNDc3LDEwICs0NzcsMTAgQEAKICAgICAgICAgaWYgKHBfY2ItPnByb3ZpZGVyX25hbWVbMF0gKQogICAgICAgICB7CiAgICAgICAgICAgICByZXN1bHQgJj0gU0RQX0FkZEF0dHJpYnV0ZShwX2NiLT5zZHBfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQxNilBVFRSX0lEX1BST1ZJREVSX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgpVEVYVF9TVFJfREVTQ19UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQzMikoc3RybGVuKHBfY2ItPnByb3ZpZGVyX25hbWUpICsgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDggKilwX2NiLT5wcm92aWRlcl9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdClBVFRSX0lEX1BST1ZJREVSX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdClURVhUX1NUUl9ERVNDX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKHN0cmxlbihwX2NiLT5wcm92aWRlcl9uYW1lKSArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKilwX2NiLT5wcm92aWRlcl9uYW1lKTsKICAgICAgICAgfSAvKiBlbmQgb2Ygc2V0dGluZyBvcHRpb25hbCBwcm92aWRlciBuYW1lICovCiAgICAgfQogCkBAIC00OTEsOCArNDkxLDggQEAKICAgICAgICAgY250PTA7CiAgICAgICAgIGZvciAoaT0xOyBpPD0gcF9jYi0+c3VwX2ZlYXR1cmUubnVtX29mX21kZXBzOyBpKyspCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1kZXBfaWQgPSAoVUlOVDgpcF9jYi0+c3VwX2ZlYXR1cmUubWRlcFtpXS5tZGVwX2lkOwotICAgICAgICAgICAgbWRlcF9yb2xlID0gKFVJTlQ4KXBfY2ItPnN1cF9mZWF0dXJlLm1kZXBbaV0ubWRlcF9jZmcubWRlcF9yb2xlOworICAgICAgICAgICAgbWRlcF9pZCA9ICh1aW50OF90KXBfY2ItPnN1cF9mZWF0dXJlLm1kZXBbaV0ubWRlcF9pZDsKKyAgICAgICAgICAgIG1kZXBfcm9sZSA9ICh1aW50OF90KXBfY2ItPnN1cF9mZWF0dXJlLm1kZXBbaV0ubWRlcF9jZmcubWRlcF9yb2xlOwogCiAgICAgICAgICAgICBmb3IgKGo9MDsgajxwX2NiLT5zdXBfZmVhdHVyZS5tZGVwW2ldLm1kZXBfY2ZnLm51bV9vZl9tZGVwX2RhdGFfdHlwZXM7IGorKykKICAgICAgICAgICAgIHsKQEAgLTUxMSw3ICs1MTEsNyBAQAogICAgICAgICAgICAgICAgIGNudCsrOwogICAgICAgICAgICAgICAgIGlmIChjbnQ9PUJUQV9ITF9OVU1fU1VQX0ZFQVRVUkVfRUxFTVMpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTUyNCwxNCArNTI0LDE0IEBACiAgICAgaWYgKHJlc3VsdCkKICAgICB7CiAgICAgICAgIHJlc3VsdCAmPSBTRFBfQWRkQXR0cmlidXRlKHBfY2ItPnNkcF9oYW5kbGUsIEFUVFJfSURfSERQX0RBVEFfRVhDSF9TUEVDLCBVSU5UX0RFU0NfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQzMikxLCAoVUlOVDgqKSZkYXRhX2V4Y2hhbmdlX3NwZWMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpMSwgKHVpbnQ4X3QqKSZkYXRhX2V4Y2hhbmdlX3NwZWMpOwogICAgIH0KIAogICAgIGlmIChyZXN1bHQpCiAgICAgewogCiAgICAgICAgIHJlc3VsdCAmPSBTRFBfQWRkQXR0cmlidXRlKHBfY2ItPnNkcF9oYW5kbGUsIEFUVFJfSURfSERQX01DQVBfU1VQX1BST0MsIFVJTlRfREVTQ19UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDMyKTEsIChVSU5UOCopJm1jYXBfc3VwX3Byb2MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpMSwgKHVpbnQ4X3QqKSZtY2FwX3N1cF9wcm9jKTsKICAgICB9CiAKICAgICBpZiAocmVzdWx0KQpAQCAtNTU2LDcgKzU1Niw3IEBACiAgICAgICAgIH0KICAgICAgICAgc3RhdHVzID0gQlRBX0hMX1NUQVRVU19TRFBfRkFJTDsKICAgICB9Ci0jaWYgQlRBX0hMX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hsX3NkcF9yZWdpc3RlciBzdGF0dXM9JXMiLCBidGFfaGxfc3RhdHVzX2NvZGUoc3RhdHVzKSk7CiAjZW5kaWYKICAgICByZXR1cm4gc3RhdHVzOwpAQCAtNTc4LDcgKzU3OCw3IEBACiB0U0RQX0RJU0NfUkVDICpidGFfaGxfZmluZF9zaW5rX29yX3NyY19zcnZfY2xhc3NfaW5fZGIgKGNvbnN0IHRTRFBfRElTQ09WRVJZX0RCICpwX2RiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0U0RQX0RJU0NfUkVDICpwX3N0YXJ0X3JlYykKIHsKLSNpZiBTRFBfQ0xJRU5UX0VOQUJMRUQgPT0gVFJVRQorI2lmIChTRFBfQ0xJRU5UX0VOQUJMRUQgPT0gVFJVRSkKICAgICB0U0RQX0RJU0NfUkVDICAgKnBfcmVjOwogICAgIHRTRFBfRElTQ19BVFRSICAqcF9hdHRyLCAqcF9zYXR0cjsKIApAQCAtNjI2LDcgKzYyNiw3IEBACiAjZW5kaWYKICAgICAvKiBJZiBoZXJlLCBubyBtYXRjaGluZyBVVUlEIGZvdW5kICovCiAKLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGxfZmluZF9zaW5rX29yX3NyY19zcnZfY2xhc3NfaW5fZGIgZmFpbGVkIik7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYnRhL2hsL2J0YV9obF91dGlscy5jIGIvYnRhL2hsL2J0YV9obF91dGlscy5jCmluZGV4IDRlOGMyYjMuLjM5MzllMTYgMTAwNjQ0Ci0tLSBhL2J0YS9obC9idGFfaGxfdXRpbHMuYworKysgYi9idGEvaGwvYnRhX2hsX3V0aWxzLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2lmIGRlZmluZWQoSExfSU5DTFVERUQpICYmIChITF9JTkNMVURFRCA9PSBUUlVFKQorI2lmIChITF9JTkNMVURFRCA9PSBUUlVFKQogCiAKICNpbmNsdWRlICJidF9jb21tb24uaCIKQEAgLTQ0LDEzICs0NCwxMyBAQAogKioKICoqIERlc2NyaXB0aW9uICAgIFRoaXMgZnVuY3Rpb24gc2V0IHRoZSBjb250cm9sIFBTTSBmb3IgdGhlIERDSCBzZXR1cAogKioKLSoqIFJldHVybnMgICAgIEJPT0xFQU4gLSBUUlVFIC0gY29udHJvbCBQU00gc2V0dGluZyBpcyBzdWNjZXNzZnVsCisqKiBSZXR1cm5zICAgICBib29sIC0gdHJ1ZSAtIGNvbnRyb2wgUFNNIHNldHRpbmcgaXMgc3VjY2Vzc2Z1bAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX2hsX3NldF9jdHJsX3BzbV9mb3JfZGNoKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBtZGxfaWR4LCBVSU5UMTYgY3RybF9wc20pCitib29sIGJ0YV9obF9zZXRfY3RybF9wc21fZm9yX2RjaCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWRsX2lkeCwgdWludDE2X3QgY3RybF9wc20pCiB7CiAgICAgdEJUQV9ITF9NQ0xfQ0IgKnBfbWNiICA9IEJUQV9ITF9HRVRfTUNMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4KTsKLSAgICBCT09MRUFOIHN1Y2Nlc3MgPSBUUlVFLCB1cGRhdGVfY3RybF9wc20gPSBGQUxTRTsKKyAgICBib29sIHN1Y2Nlc3MgPSB0cnVlLCB1cGRhdGVfY3RybF9wc20gPSBmYWxzZTsKICAgICBVTlVTRUQobWRsX2lkeCk7CiAKICAgICBpZiAocF9tY2ItPnNkcC5udW1fcmVjcykKQEAgLTU4LDEzICs1OCwxMyBAQAogICAgICAgICBpZiAocF9tY2ItPmN0cmxfcHNtICE9IGN0cmxfcHNtKQogICAgICAgICB7CiAgICAgICAgICAgICAvKiBjYW4gbm90IHVzZSBhIGRpZmZlcmVudCBjdHJsIFBTTSB0aGFuIHRoZSBjdXJyZW50IG9uZSovCi0gICAgICAgICAgICBzdWNjZXNzID0gRkFMU0U7CisgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgLyogTm8gU0RQIGluZm8gY29udHJvbCBpLmUuIGNoYW5uZWwgd2FzIG9wZW5lZCBieSB0aGUgcGVlciAqLwotICAgICAgICB1cGRhdGVfY3RybF9wc20gPSBUUlVFOworICAgICAgICB1cGRhdGVfY3RybF9wc20gPSB0cnVlOwogICAgIH0KIAogICAgIGlmIChzdWNjZXNzICYmIHVwZGF0ZV9jdHJsX3BzbSkKQEAgLTczLDcgKzczLDcgQEAKICAgICB9CiAKIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIGlmICghc3VjY2VzcykKICAgICB7CiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9zZXRfY3RybF9wc21fZm9yX2RjaCBudW1fcmVjcz0lZCBzdWNjZXNzPSVkIHVwZGF0ZV9jdHJsX3BzbT0lZCBjdHJsX3BzbT0weCV4ICIsCkBAIC05MSwxNiArOTEsMTYgQEAKICoqCiAqKiBEZXNjcmlwdGlvbgogKioKLSoqIFJldHVybnMgICAgICBUUlVFIGlmIGZvdW5kCisqKiBSZXR1cm5zICAgICAgdHJ1ZSBpZiBmb3VuZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9obF9maW5kX3NkcF9pZHhfdXNpbmdfY3RybF9wc20odEJUQV9ITF9TRFAgKnBfc2RwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBjdHJsX3BzbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9zZHBfaWR4KQorYm9vbCBidGFfaGxfZmluZF9zZHBfaWR4X3VzaW5nX2N0cmxfcHNtKHRCVEFfSExfU0RQICpwX3NkcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjdHJsX3BzbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwX3NkcF9pZHgpCiB7Ci0gICAgQk9PTEVBTiBmb3VuZD1GQUxTRTsKKyAgICBib29sIGZvdW5kPWZhbHNlOwogICAgIHRCVEFfSExfU0RQX1JFQyAgICAgKnBfcmVjOwotICAgIFVJTlQ4IGk7CisgICAgdWludDhfdCBpOwogCiAgICAgaWYgKGN0cmxfcHNtICE9IDApCiAgICAgewpAQCAtMTEwLDcgKzExMCw3IEBACiAgICAgICAgICAgICBpZiAocF9yZWMtPmN0cmxfcHNtID09IGN0cmxfcHNtKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICpwX3NkcF9pZHggPSBpOwotICAgICAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTExOCwxMCArMTE4LDEwIEBACiAgICAgZWxzZQogICAgIHsKICAgICAgICAgKnBfc2RwX2lkeCA9IDA7Ci0gICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgZm91bmQgPSB0cnVlOwogICAgIH0KIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIGlmICghZm91bmQpCiAgICAgewogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGxfZmluZF9zZHBfaWR4X3VzaW5nX2N0cmxfcHNtIGZvdW5kPSVkIHNkcF9pZHg9JWQgY3RybF9wc209MHgleCAiLApAQCAtMTM3LDExICsxMzcsMTEgQEAKICoqCiAqKiBEZXNjcmlwdGlvbiAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSB1c2VyIHR4IGJ1ZmZlciBzaXplCiAqKgotKiogUmV0dXJucyAgICAgIFVJTlQxNiBidWZfc2l6ZQorKiogUmV0dXJucyAgICAgIHVpbnQxNl90IGJ1Zl9zaXplCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotVUlOVDE2IGJ0YV9obF9zZXRfdXNlcl90eF9idWZfc2l6ZShVSU5UMTYgbWF4X3R4X3NpemUpCit1aW50MTZfdCBidGFfaGxfc2V0X3VzZXJfdHhfYnVmX3NpemUodWludDE2X3QgbWF4X3R4X3NpemUpCiB7CiAgICAgaWYgKG1heF90eF9zaXplID4gQlRfREVGQVVMVF9CVUZGRVJfU0laRSkKICAgICAgICAgcmV0dXJuIEJUQV9ITF9MUkdfREFUQV9CVUZfU0laRTsKQEAgLTE1NCwxMSArMTU0LDExIEBACiAqKgogKiogRGVzY3JpcHRpb24gIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdXNlciByeCBidWZmZXIgc2l6ZQogKioKLSoqIFJldHVybnMgICAgICBVSU5UMTYgYnVmX3NpemUKKyoqIFJldHVybnMgICAgICB1aW50MTZfdCBidWZfc2l6ZQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLVVJTlQxNiBidGFfaGxfc2V0X3VzZXJfcnhfYnVmX3NpemUoVUlOVDE2IG10dSkKK3VpbnQxNl90IGJ0YV9obF9zZXRfdXNlcl9yeF9idWZfc2l6ZSh1aW50MTZfdCBtdHUpCiB7CiAgICAgaWYgKG10dSA+IEJUX0RFRkFVTFRfQlVGRkVSX1NJWkUpCiAgICAgICAgIHJldHVybiBCVEFfSExfTFJHX0RBVEFfQlVGX1NJWkU7CkBAIC0xNzMsMTIgKzE3MywxMiBAQAogKioKICoqIERlc2NyaXB0aW9uICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHR4IHdpbmRvdyBzaXplCiAqKgotKiogUmV0dXJucyAgICAgIFVJTlQ4IHR4X3dpbl9zaXplCisqKiBSZXR1cm5zICAgICAgdWludDhfdCB0eF93aW5fc2l6ZQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1VSU5UOCBidGFfaGxfc2V0X3R4X3dpbl9zaXplKFVJTlQxNiBtdHUsIFVJTlQxNiBtcHMpCit1aW50OF90IGJ0YV9obF9zZXRfdHhfd2luX3NpemUodWludDE2X3QgbXR1LCB1aW50MTZfdCBtcHMpCiB7Ci0gICAgVUlOVDggdHhfd2luX3NpemU7CisgICAgdWludDhfdCB0eF93aW5fc2l6ZTsKIAogICAgIGlmIChtdHUgPD0gbXBzKQogICAgIHsKQEAgLTE5Nyw3ICsxOTcsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0jaWYgQlRBX0hMX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hsX3NldF90eF93aW5fc2l6ZSB3aW5fc2l6ZT0lZCBtdHU9JWQgbXBzPSVkIiwKICAgICAgICAgICAgICAgICAgICAgICB0eF93aW5fc2l6ZSwgbXR1LCBtcHMpOwogI2VuZGlmCkBAIC0yMTAsMTIgKzIxMCwxMiBAQAogKioKICoqIERlc2NyaXB0aW9uICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIE1QUwogKioKLSoqIFJldHVybnMgICAgICBVSU5UMTYgTVBTCisqKiBSZXR1cm5zICAgICAgdWludDE2X3QgTVBTCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVVJTlQxNiBidGFfaGxfc2V0X21wcyhVSU5UMTYgbXR1KQordWludDE2X3QgYnRhX2hsX3NldF9tcHModWludDE2X3QgbXR1KQogewotICAgIFVJTlQxNiBtcHM7CisgICAgdWludDE2X3QgbXBzOwogICAgIGlmIChtdHUgPiBCVEFfSExfTDJDX01QUykKICAgICB7CiAgICAgICAgIG1wcyA9IEJUQV9ITF9MMkNfTVBTOwpAQCAtMjI0LDcgKzIyNCw3IEBACiAgICAgewogICAgICAgICBtcHMgPSBtdHU7CiAgICAgfQotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9zZXRfbXBzIG1wcz0lZCBtdHU9JWQiLAogICAgICAgICAgICAgICAgICAgICAgIG1wcywgbXR1KTsKICNlbmRpZgpAQCAtMjQxLDEwICsyNDEsMTAgQEAKICoqIFJldHVybnMgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hsX2NsZWFuX21kbF9jYihVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4KQordm9pZCBidGFfaGxfY2xlYW5fbWRsX2NiKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgpCiB7CiAgICAgdEJUQV9ITF9NRExfQ0IgICAgICAqcF9kY2IgID0gQlRBX0hMX0dFVF9NRExfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgsIG1kbF9pZHgpOwotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9jbGVhbl9tZGxfY2IgYXBwX2lkeD0lZCBtY2xfaWR4PSVkIG1kbF9pZHg9JWQiLAogICAgICAgICAgICAgICAgICAgICAgIGFwcF9pZHgsIG1jbF9pZHgsIG1kbF9pZHgpOwogI2VuZGlmCkBAIC0yNjYsNyArMjY2LDcgQEAKICoqIFJldHVybnMgICAgICBCVF9IRFIgKi4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQlRfSERSICogYnRhX2hsX2dldF9idWYoVUlOVDE2IGRhdGFfc2l6ZSwgQk9PTEVBTiBmY3NfdXNlKQorQlRfSERSICogYnRhX2hsX2dldF9idWYodWludDE2X3QgZGF0YV9zaXplLCBib29sIGZjc191c2UpCiB7CiAgICAgc2l6ZV90IHNpemUgPSBkYXRhX3NpemUgKyBMMkNBUF9NSU5fT0ZGU0VUICsgQlRfSERSX1NJWkUgKyBMMkNBUF9GQ1NfTEVOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEwyQ0FQX0VYVF9DT05UUk9MX09WRVJIRUFEOwpAQCAtMjg4LDE2ICsyODgsMTYgQEAKICoqIERlc2NyaXB0aW9uICBUaGlzIGZ1bmN0aW9uIGNoZWNrIHRoZSBzcGVjaWZpZWQgc2VydmljZSBjbGFzcyhlcykgY2FuIGJlIGZpbmQgaW4KICoqICAgICAgICAgICAgICB0aGUgcmVjZWl2ZWQgU0RQIGRhdGFiYXNlCiAqKgotKiogUmV0dXJucyAgICAgIEJPT0xFQU4gVFJVRSAtIGZvdW5kCi0qKiAgICAgICAgICAgICAgICAgICAgICBGQUxTRSAtIG5vdCBmb3VuZAorKiogUmV0dXJucyAgICAgIGJvb2wgdHJ1ZSAtIGZvdW5kCisqKiAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtIG5vdCBmb3VuZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9obF9maW5kX3NlcnZpY2VfaW5fZGIoIFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBzZXJ2aWNlX3V1aWQsCitib29sIGJ0YV9obF9maW5kX3NlcnZpY2VfaW5fZGIoIHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzZXJ2aWNlX3V1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ19SRUMgKipwcF9yZWMgKQogewogICAgIHRCVEFfSExfTUNMX0NCICAgICAgICAgICpwX21jYiA9IEJUQV9ITF9HRVRfTUNMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4KTsKLSAgICBCT09MRUFOIGZvdW5kID0gVFJVRTsKKyAgICBib29sIGZvdW5kID0gdHJ1ZTsKIAogICAgIHN3aXRjaCAoc2VydmljZV91dWlkKQogICAgIHsKQEAgLTMwNiwxNCArMzA2LDE0IEBACiAgICAgICAgICAgICBpZiAoKCpwcF9yZWMgPSBTRFBfRmluZFNlcnZpY2VJbkRiKHBfbWNiLT5wX2RiLCBzZXJ2aWNlX3V1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcF9yZWMpKSA9PSBOVUxMKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvdW5kID0gRkFMU0U7CisgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaWYgKCgoKnBwX3JlYyA9IGJ0YV9obF9maW5kX3Npbmtfb3Jfc3JjX3Nydl9jbGFzc19pbl9kYihwX21jYi0+cF9kYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwX3JlYykpID09IE5VTEwpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvdW5kID0gRkFMU0U7CisgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTMyNywxNiArMzI3LDE2IEBACiAqKgogKiogRGVzY3JpcHRpb24gIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIHNlcnZpY2UgY2xhc3MoZXMpIGZvciBib3RoIENDSCBhbmQgRENIIG9lcHJhdGlvbnMKICoqCi0qKiBSZXR1cm5zICAgICAgVUlOVDE2IC0gc2VydmljZV9pZAorKiogUmV0dXJucyAgICAgIHVpbnQxNl90IC0gc2VydmljZV9pZAogKiogICAgICAgICAgICAgICAgICAgICAgIGlmIHNlcnZpY2VfdXVpZCA9IDB4RkZGRiB0aGVuIGl0IG1lYW5zIHNlcnZpY2UgdXVpZAogKiogICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBlaXRoZXIgU2luayBvciBTb3VyY2UKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVUlOVDE2IGJ0YV9obF9nZXRfc2VydmljZV91dWlkcyhVSU5UOCBzZHBfb3BlciwgVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggbWRsX2lkeCApCit1aW50MTZfdCBidGFfaGxfZ2V0X3NlcnZpY2VfdXVpZHModWludDhfdCBzZHBfb3BlciwgdWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWRsX2lkeCApCiB7CiAgICAgdEJUQV9ITF9NRExfQ0IgICAgICAgICAgKnBfZGNiOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIHNlcnZpY2VfdXVpZCA9IDB4RkZGRjsgLyogYm90aCBTaW5rIGFuZCBTb3VyY2UgKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIHNlcnZpY2VfdXVpZCA9IDB4RkZGRjsgLyogYm90aCBTaW5rIGFuZCBTb3VyY2UgKi8KIAogICAgIHN3aXRjaCAoc2RwX29wZXIpCiAgICAgewpAQCAtMzYxLDcgKzM2MSw3IEBACiAgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCB0aGF0IGlzIGJvdGggU2luayBhbmQgU291cmNlICovCiAgICAgICAgICAgICBicmVhazsKICAgICB9Ci0jaWYgQlRBX0hMX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hsX2dldF9zZXJ2aWNlX3V1aWRzIHNlcnZpY2VfdXVpZD0weCV4IixzZXJ2aWNlX3V1aWQgKTsKICNlbmRpZgogICAgIHJldHVybiBzZXJ2aWNlX3V1aWQ7CkBAIC0zNzQsMTYgKzM3NCwxNiBAQAogKioKICoqIERlc2NyaXB0aW9uICBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBjb25maWd1cmF0aW9uIHJlc3BvbnNlIGZvciB0aGUgZWNobyB0ZXN0CiAqKgotKiogUmV0dXJucyAgICAgIEJPT0xFQU4gLSBUUlVFIGZvdW5kCi0qKiAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIG5vdCBmb3VuZAorKiogUmV0dXJucyAgICAgIGJvb2wgLSB0cnVlIGZvdW5kCisqKiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIG5vdCBmb3VuZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9obF9maW5kX2VjaG9fY2ZnX3JzcChVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGVwX2lkeCwgVUlOVDggY2ZnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfY2ZnX3JzcCkKK2Jvb2wgYnRhX2hsX2ZpbmRfZWNob19jZmdfcnNwKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kZXBfaWR4LCB1aW50OF90IGNmZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfY2ZnX3JzcCkKIHsKICAgICB0QlRBX0hMX0FQUF9DQiAgICAgICpwX2FjYiA9IEJUQV9ITF9HRVRfQVBQX0NCX1BUUihhcHBfaWR4KTsKICAgICB0QlRBX0hMX01ERVAgICAgICAgICpwX21kZXA9ICZwX2FjYi0+c3VwX2ZlYXR1cmUubWRlcFttZGVwX2lkeF07Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBzdGF0dXMgPVRSVUU7CisgICAgYm9vbCAgICAgICAgICAgICBzdGF0dXMgPXRydWU7CiAKICAgICBpZiAocF9tZGVwLT5tZGVwX2lkID09IEJUQV9ITF9FQ0hPX1RFU1RfTURFUF9JRCkKICAgICB7CkBAIC0zOTcsMTMgKzM5NywxMyBAQAogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgICAgc3RhdHVzID0gRkFMU0U7CisgICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTsKICAgICAgICAgICAgIEFQUExfVFJBQ0VfRVJST1IoIkluYXZsaWQgZWNobyBjZmcgdmFsdWUiKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIGlmICghc3RhdHVzKQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hsX2ZpbmRfZWNob19jZmdfcnNwIHN0YXR1cz1mYWlsZWQgYXBwX2lkeD0lZCBtY2xfaWR4PSVkIG1kZXBfaWR4PSVkIGNmZz0lZCIsCkBAIC00MjAsMTUgKzQyMCwxNSBAQAogKioKICoqIERlc2NyaXB0aW9uICBUaGlzIGZ1bmN0aW9uIHZhbGlkYXRlIHRoZSBEQ0ggY29uZmlndXJhdGlvbgogKioKLSoqIFJldHVybnMgICAgICBCT09MRUFOIC0gVFJVRSBjZmcgaXMgdmFsaWQKLSoqICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0Ugbm90IHZhbGlkCisqKiBSZXR1cm5zICAgICAgYm9vbCAtIHRydWUgY2ZnIGlzIHZhbGlkCisqKiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIG5vdCB2YWxpZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9obF92YWxpZGF0ZV9jZmcoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgVUlOVDggbWRsX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBjZmcpCitib29sIGJ0YV9obF92YWxpZGF0ZV9jZmcodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNmZykKIHsKICAgICB0QlRBX0hMX01ETF9DQiAgICAgICpwX2RjYiA9IEJUQV9ITF9HRVRfTURMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4LCBtZGxfaWR4KTsKLSAgICBCT09MRUFOIGlzX3ZhbGlkID1GQUxTRTsKKyAgICBib29sIGlzX3ZhbGlkID1mYWxzZTsKIAogCiAgICAgaWYgKCFidGFfaGxfaXNfdGhlX2ZpcnN0X3JlbGlhYmxlX2V4aXN0ZWQoYXBwX2lkeCwgbWNsX2lkeCkgJiYKQEAgLTQ0NCwyMSArNDQ0LDIxIEBACiAKICAgICAgICAgICAgIGlmICgoY2ZnID09IEJUQV9ITF9EQ0hfQ0ZHX1JFTElBQkxFKSB8fCAoY2ZnID09IEJUQV9ITF9EQ0hfQ0ZHX1NUUkVBTUlORykpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaXNfdmFsaWQgPSBUUlVFOworICAgICAgICAgICAgICAgIGlzX3ZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEJUQV9ITF9EQ0hfQ0ZHX1JFTElBQkxFOgogICAgICAgICBjYXNlIEJUQV9ITF9EQ0hfQ0ZHX1NUUkVBTUlORzoKICAgICAgICAgICAgIGlmIChwX2RjYi0+bG9jYWxfY2ZnID09IGNmZyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaXNfdmFsaWQgPSBUUlVFOworICAgICAgICAgICAgICAgIGlzX3ZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0jaWYgQlRBX0hMX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgaWYgKCFpc192YWxpZCkKICAgICB7CiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF92YWxpZGF0ZV9kY2hfb3Blbl9jZmcgaXNfdmFsaWQ9JWQsIGNmZz0lZCIsIGlzX3ZhbGlkLCBjZmcgKTsKQEAgLTQ3MywxNyArNDczLDE3IEBACiAqKgogKiogRGVzY3JpcHRpb24gIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIGluZGV4ZXMgbmVlZGVkIGZvciB0aGUgQ0NIIHN0YXRlIG1hY2hpbmUKICoqCi0qKiBSZXR1cm5zICAgICAgQk9PTEVBTiAtIFRSVUUgZm91bmQKLSoqICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0Ugbm90IGZvdW5kCisqKiBSZXR1cm5zICAgICAgYm9vbCAtIHRydWUgZm91bmQKKyoqICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2Ugbm90IGZvdW5kCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX2hsX2ZpbmRfY2NoX2NiX2luZGV4ZXModEJUQV9ITF9EQVRBICpwX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfYXBwX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggICpwX21jbF9pZHgpCitib29sIGJ0YV9obF9maW5kX2NjaF9jYl9pbmRleGVzKHRCVEFfSExfREFUQSAqcF9tc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfYXBwX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgKnBfbWNsX2lkeCkKIHsKLSAgICBCT09MRUFOIGZvdW5kID0gRkFMU0U7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwogICAgIHRCVEFfSExfTUNMX0NCICAgICAgKnBfbWNiOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgYXBwX2lkeCA9IDAsIG1jbF9pZHggPSAwOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBhcHBfaWR4ID0gMCwgbWNsX2lkeCA9IDA7CiAKICAgICBzd2l0Y2ggKHBfbXNnLT5oZHIuZXZlbnQpCiAgICAgewpAQCAtNDkxLDcgKzQ5MSw3IEBACiAgICAgICAgIGNhc2UgQlRBX0hMX0NDSF9TRFBfRkFJTF9FVlQ6CiAgICAgICAgICAgICBhcHBfaWR4ID0gcF9tc2ctPmNjaF9zZHAuYXBwX2lkeDsKICAgICAgICAgICAgIG1jbF9pZHggPSBwX21zZy0+Y2NoX3NkcC5tY2xfaWR4OwotICAgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBCVEFfSExfTUNBX0NPTk5FQ1RfSU5EX0VWVDoKQEAgLTUwMSwxNiArNTAxLDE2IEBACiAgICAgICAgICAgICAgICAgaWYgKGJ0YV9obF9maW5kX21jbF9pZHgoYXBwX2lkeCwgcF9tc2ctPm1jYV9ldnQubWNhX2RhdGEuY29ubmVjdF9pbmQuYmRfYWRkciwgJm1jbF9pZHgpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgaW5pdGlhdGVkICovCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIGlmICghYnRhX2hsX2ZpbmRfbWNsX2lkeF91c2luZ19oYW5kbGUocF9tc2ctPm1jYV9ldnQubWNsX2hhbmRsZSwgJmFwcF9pZHgsICZtY2xfaWR4KSYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2hsX2ZpbmRfYXZhaWxfbWNsX2lkeChhcHBfaWR4LCAmbWNsX2lkeCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvKiByZW1vdGUgaW5pdGlhdGVkICovCiAgICAgICAgICAgICAgICAgICAgIHBfbWNiID0gQlRBX0hMX0dFVF9NQ0xfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgpOwotICAgICAgICAgICAgICAgICAgICBwX21jYi0+aW5fdXNlID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcF9tY2ItPmluX3VzZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIHBfbWNiLT5jY2hfb3BlciA9IEJUQV9ITF9DQ0hfT1BfUkVNT1RFX09QRU47Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtNTE5LDEyICs1MTksMTIgQEAKIAogICAgICAgICAgICAgaWYgKGJ0YV9obF9maW5kX21jbF9pZHhfdXNpbmdfaGFuZGxlKHBfbXNnLT5tY2FfZXZ0Lm1jbF9oYW5kbGUsICZhcHBfaWR4LCAgJm1jbF9pZHgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIGlmIChidGFfaGxfZmluZF9hcHBfaWR4X3VzaW5nX2hhbmRsZShwX21zZy0+bWNhX2V2dC5hcHBfaGFuZGxlLCAmYXBwX2lkeCkgJiYKICAgICAgICAgICAgICAgICAgICAgIGJ0YV9obF9maW5kX21jbF9pZHgoYXBwX2lkeCwgcF9tc2ctPm1jYV9ldnQubWNhX2RhdGEuZGlzY29ubmVjdF9pbmQuYmRfYWRkciwgJm1jbF9pZHgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChmb3VuZCkKQEAgLTU0MSw3ICs1NDEsNyBAQAogCiAgICAgICAgICAgICBpZiAoYnRhX2hsX2ZpbmRfbWNsX2lkeF91c2luZ19oYW5kbGUocF9tc2ctPm1jYV9ldnQubWNsX2hhbmRsZSwgJmFwcF9pZHgsICAmbWNsX2lkeCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGZvdW5kKQpAQCAtNTY0LDcgKzU2NCw3IEBACiAgICAgICAgICpwX21jbF9pZHggPSBtY2xfaWR4OwogICAgIH0KIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIGlmICghZm91bmQpCiAgICAgewogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGxfZmluZF9jY2hfY2JfaW5kZXhlcyBldmVudD0lcyBmb3VuZD0lZCBhcHBfaWR4PSVkIG1jbF9pZHg9JWQiLApAQCAtNTgxLDE4ICs1ODEsMTggQEAKICoqCiAqKiBEZXNjcmlwdGlvbiAgVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgaW5kZXhlcyBuZWVkZWQgZm9yIHRoZSBEQ0ggc3RhdGUgbWFjaGluZQogKioKLSoqIFJldHVybnMgICAgICBCT09MRUFOIC0gVFJVRSBmb3VuZAotKiogICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBub3QgZm91bmQKKyoqIFJldHVybnMgICAgICBib29sIC0gdHJ1ZSBmb3VuZAorKiogICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBub3QgZm91bmQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfaGxfZmluZF9kY2hfY2JfaW5kZXhlcyh0QlRBX0hMX0RBVEEgKnBfbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9hcHBfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9tY2xfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9tZGxfaWR4KQorYm9vbCBidGFfaGxfZmluZF9kY2hfY2JfaW5kZXhlcyh0QlRBX0hMX0RBVEEgKnBfbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwX2FwcF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfbWNsX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9tZGxfaWR4KQogewotICAgIEJPT0xFQU4gICAgICAgICBmb3VuZCA9IEZBTFNFOworICAgIGJvb2wgICAgICAgICBmb3VuZCA9IGZhbHNlOwogICAgIHRCVEFfSExfTUNMX0NCICAqcF9tY2I7Ci0gICAgVUlOVDggICAgICAgICAgIGFwcF9pZHggPSAwLCBtY2xfaWR4ID0gMCwgbWRsX2lkeCA9IDA7CisgICAgdWludDhfdCAgICAgICAgICAgYXBwX2lkeCA9IDAsIG1jbF9pZHggPSAwLCBtZGxfaWR4ID0gMDsKIAogICAgIHN3aXRjaCAocF9tc2ctPmhkci5ldmVudCkKICAgICB7CkBAIC02MDAsNyArNjAwLDcgQEAKICAgICAgICAgICAgIGlmIChidGFfaGxfZmluZF9tY2xfaWR4X3VzaW5nX2hhbmRsZShwX21zZy0+bWNhX2V2dC5tY2xfaGFuZGxlLCAmYXBwX2lkeCwgJm1jbF9pZHgpICYmCiAgICAgICAgICAgICAgICAgYnRhX2hsX2ZpbmRfbWRsX2lkeCggYXBwX2lkeCwgIG1jbF9pZHgsICBwX21zZy0+bWNhX2V2dC5tY2FfZGF0YS5jcmVhdGVfY2ZtLm1kbF9pZCwgJm1kbF9pZHgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKIApAQCAtNjA5LDcgKzYwOSw3IEBACiAgICAgICAgICAgICBpZiAoYnRhX2hsX2ZpbmRfbWNsX2lkeF91c2luZ19oYW5kbGUocF9tc2ctPm1jYV9ldnQubWNsX2hhbmRsZSwgJmFwcF9pZHgsICZtY2xfaWR4KSAmJgogICAgICAgICAgICAgICAgIGJ0YV9obF9maW5kX2F2YWlsX21kbF9pZHgoIGFwcF9pZHgsICBtY2xfaWR4LCAmbWRsX2lkeCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogCkBAIC02MTcsNyArNjE3LDcgQEAKICAgICAgICAgICAgIGlmIChidGFfaGxfZmluZF9tY2xfaWR4X3VzaW5nX2hhbmRsZShwX21zZy0+bWNhX2V2dC5tY2xfaGFuZGxlLCAmYXBwX2lkeCwgJm1jbF9pZHgpICYmCiAgICAgICAgICAgICAgICAgYnRhX2hsX2ZpbmRfbWRsX2lkeCggYXBwX2lkeCwgIG1jbF9pZHgsICBwX21zZy0+bWNhX2V2dC5tY2FfZGF0YS5vcGVuX2NmbS5tZGxfaWQsICZtZGxfaWR4KSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTYyNSw3ICs2MjUsNyBAQAogICAgICAgICAgICAgaWYgKGJ0YV9obF9maW5kX21jbF9pZHhfdXNpbmdfaGFuZGxlKHBfbXNnLT5tY2FfZXZ0Lm1jbF9oYW5kbGUsICZhcHBfaWR4LCAmbWNsX2lkeCkgJiYKICAgICAgICAgICAgICAgICBidGFfaGxfZmluZF9tZGxfaWR4KCBhcHBfaWR4LCAgbWNsX2lkeCwgIHBfbXNnLT5tY2FfZXZ0Lm1jYV9kYXRhLm9wZW5faW5kLm1kbF9pZCwgJm1kbF9pZHgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKIApAQCAtNjM0LDcgKzYzNCw3IEBACiAgICAgICAgICAgICBpZiAoYnRhX2hsX2ZpbmRfbWRsX2lkeF91c2luZ19oYW5kbGUoKHRCVEFfSExfTURMX0hBTkRMRSlwX21zZy0+bWNhX2V2dC5tY2FfZGF0YS5jbG9zZV9jZm0ubWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcHBfaWR4LCAmbWNsX2lkeCwgJm1kbF9pZHgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBCVEFfSExfTUNBX0NMT1NFX0lORF9FVlQ6CkBAIC02NDIsNyArNjQyLDcgQEAKICAgICAgICAgICAgIGlmIChidGFfaGxfZmluZF9tZGxfaWR4X3VzaW5nX2hhbmRsZSgodEJUQV9ITF9NRExfSEFORExFKXBfbXNnLT5tY2FfZXZ0Lm1jYV9kYXRhLmNsb3NlX2luZC5tZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFwcF9pZHgsICZtY2xfaWR4LCAmbWRsX2lkeCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEJUQV9ITF9BUElfU0VORF9EQVRBX0VWVDoKQEAgLTY1MCw3ICs2NTAsNyBAQAogICAgICAgICAgICAgaWYgKGJ0YV9obF9maW5kX21kbF9pZHhfdXNpbmdfaGFuZGxlKHBfbXNnLT5hcGlfc2VuZF9kYXRhLm1kbF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFwcF9pZHgsICZtY2xfaWR4LCAmbWRsX2lkeCApKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjYwLDcgKzY2MCw3IEBACiAgICAgICAgICAgICBpZiAoYnRhX2hsX2ZpbmRfbWRsX2lkeF91c2luZ19oYW5kbGUoKHRCVEFfSExfTURMX0hBTkRMRSlwX21zZy0+bWNhX2V2dC5tY2FfZGF0YS5jb25nX2NoZy5tZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFwcF9pZHgsICZtY2xfaWR4LCAmbWRsX2lkeCApKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjY5LDcgKzY2OSw3IEBACiAgICAgICAgICAgICBhcHBfaWR4ID0gcF9tc2ctPm1jYV9yY3ZfZGF0YV9ldnQuYXBwX2lkeDsKICAgICAgICAgICAgIG1jbF9pZHggPSBwX21zZy0+bWNhX3Jjdl9kYXRhX2V2dC5tY2xfaWR4OwogICAgICAgICAgICAgbWRsX2lkeCA9IHBfbXNnLT5tY2FfcmN2X2RhdGFfZXZ0Lm1kbF9pZHg7Ci0gICAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBCVEFfSExfRENIX1JFQ09OTkVDVF9FVlQ6CiAgICAgICAgIGNhc2UgQlRBX0hMX0RDSF9PUEVOX0VWVDoKQEAgLTY3OCwxMyArNjc4LDEzIEBACiAgICAgICAgICAgICBhcHBfaWR4ID0gcF9tc2ctPmRjaF9zZHAuYXBwX2lkeDsKICAgICAgICAgICAgIG1jbF9pZHggPSBwX21zZy0+ZGNoX3NkcC5tY2xfaWR4OwogICAgICAgICAgICAgbWRsX2lkeCA9IHBfbXNnLT5kY2hfc2RwLm1kbF9pZHg7Ci0gICAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBCVEFfSExfTUNBX1JFQ09OTkVDVF9DRk1fRVZUOgogICAgICAgICAgICAgaWYgKGJ0YV9obF9maW5kX21jbF9pZHhfdXNpbmdfaGFuZGxlKHBfbXNnLT5tY2FfZXZ0Lm1jbF9oYW5kbGUsICZhcHBfaWR4LCAmbWNsX2lkeCkgJiYKICAgICAgICAgICAgICAgICBidGFfaGxfZmluZF9tZGxfaWR4KCBhcHBfaWR4LCAgbWNsX2lkeCwgIHBfbXNnLT5tY2FfZXZ0Lm1jYV9kYXRhLnJlY29ubmVjdF9jZm0ubWRsX2lkLCAmbWRsX2lkeCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogCkBAIC02OTMsMjggKzY5MywyOCBAQAogICAgICAgICAgICAgaWYgKGJ0YV9obF9maW5kX21jbF9pZHhfdXNpbmdfaGFuZGxlKHBfbXNnLT5hcGlfZGNoX2NyZWF0ZV9yc3AubWNsX2hhbmRsZSwgJmFwcF9pZHgsICZtY2xfaWR4KSYmCiAgICAgICAgICAgICAgICAgYnRhX2hsX2ZpbmRfbWRsX2lkeCggYXBwX2lkeCwgIG1jbF9pZHgscF9tc2ctPmFwaV9kY2hfY3JlYXRlX3JzcC5tZGxfaWQsICZtZGxfaWR4KSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQlRBX0hMX01DQV9BQk9SVF9JTkRfRVZUOgogICAgICAgICAgICAgaWYgKGJ0YV9obF9maW5kX21jbF9pZHhfdXNpbmdfaGFuZGxlKHBfbXNnLT5tY2FfZXZ0Lm1jbF9oYW5kbGUsICZhcHBfaWR4LCAmbWNsX2lkeCkgJiYKICAgICAgICAgICAgICAgICBidGFfaGxfZmluZF9tZGxfaWR4KCBhcHBfaWR4LCAgbWNsX2lkeCxwX21zZy0+bWNhX2V2dC5tY2FfZGF0YS5hYm9ydF9pbmQubWRsX2lkLCAmbWRsX2lkeCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEJUQV9ITF9NQ0FfQUJPUlRfQ0ZNX0VWVDoKICAgICAgICAgICAgIGlmIChidGFfaGxfZmluZF9tY2xfaWR4X3VzaW5nX2hhbmRsZShwX21zZy0+bWNhX2V2dC5tY2xfaGFuZGxlLCAmYXBwX2lkeCwgICZtY2xfaWR4KSAmJgogICAgICAgICAgICAgICAgIGJ0YV9obF9maW5kX21kbF9pZHgoIGFwcF9pZHgsICBtY2xfaWR4LCAgcF9tc2ctPm1jYV9ldnQubWNhX2RhdGEuYWJvcnRfY2ZtLm1kbF9pZCwgJm1kbF9pZHgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBCVEFfSExfQ0lfR0VUX1RYX0RBVEFfRVZUOgogICAgICAgICBjYXNlIEJUQV9ITF9DSV9QVVRfUlhfREFUQV9FVlQ6CiAgICAgICAgICAgICBpZiAoYnRhX2hsX2ZpbmRfbWRsX2lkeF91c2luZ19oYW5kbGUocF9tc2ctPmNpX2dldF9wdXRfZGF0YS5tZGxfaGFuZGxlLCAmYXBwX2lkeCwgJm1jbF9pZHgsICZtZGxfaWR4KSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQlRBX0hMX0NJX0dFVF9FQ0hPX0RBVEFfRVZUOgpAQCAtNzIzLDcgKzcyMyw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcF9tY2IgPSBCVEFfSExfR0VUX01DTF9DQl9QVFIoYXBwX2lkeCwgbWNsX2lkeCk7CiAgICAgICAgICAgICAgICAgbWRsX2lkeCA9IHBfbWNiLT5lY2hvX21kbF9pZHg7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogCkBAIC03MzgsNyArNzM4LDcgQEAKICAgICAgICAgKnBfbWNsX2lkeCA9IG1jbF9pZHg7CiAgICAgICAgICpwX21kbF9pZHggPSBtZGxfaWR4OwogICAgIH0KLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBpZiAoIWZvdW5kKQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hsX2ZpbmRfZGNoX2NiX2luZGV4ZXMgZXZlbnQ9JXMgZm91bmQ9JWQgYXBwX2lkeD0lZCBtY2xfaWR4PSVkIG1kbF9pZHg9JWQiLApAQCAtNzU1LDE5ICs3NTUsMTkgQEAKICoqCiAqKiBEZXNjcmlwdGlvbiAgVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBNREwgSUQKICoqCi0qKiBSZXR1cm5zICAgICAgVUlOVDE2IC0gTURMIElECisqKiBSZXR1cm5zICAgICAgdWludDE2X3QgLSBNREwgSUQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVUlOVDE2ICBidGFfaGxfYWxsb2NhdGVfbWRsX2lkKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHggKQordWludDE2X3QgIGJ0YV9obF9hbGxvY2F0ZV9tZGxfaWQodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHgsIHVpbnQ4X3QgbWRsX2lkeCApCiB7Ci0gICAgVUlOVDE2ICBtZGxfaWQ9MDsKKyAgICB1aW50MTZfdCAgbWRsX2lkPTA7CiAgICAgdEJUQV9ITF9NQ0xfQ0IgICAgICAqcF9tY2IgPSBCVEFfSExfR0VUX01DTF9DQl9QVFIoYXBwX2lkeCwgbWNsX2lkeCk7Ci0gICAgQk9PTEVBTiBkdXBsaWNhdGVfaWQ7Ci0gICAgVUlOVDggaSwgbWRsX2NmZ19pZHg7CisgICAgYm9vbCBkdXBsaWNhdGVfaWQ7CisgICAgdWludDhfdCBpLCBtZGxfY2ZnX2lkeDsKIAogICAgIGRvCiAgICAgewotICAgICAgICBkdXBsaWNhdGVfaWQgPSBGQUxTRTsKKyAgICAgICAgZHVwbGljYXRlX2lkID0gZmFsc2U7CiAgICAgICAgIG1kbF9pZCA9ICgobWRsX2lkKzEpICYgMHhGRUZGKTsKICAgICAgICAgLyogY2hlY2sgbWRsX2lkcyB0aGF0IGFyZSB1c2VkIGZvciB0aGUgY3VycmVudCBjb25lbmN0aW9ucyAqLwogICAgICAgICBmb3IgKGk9MDsgaTwgQlRBX0hMX05VTV9NRExTX1BFUl9NQ0w7IGkrKykKQEAgLTc3Niw3ICs3NzYsNyBAQAogICAgICAgICAgICAgICAgIChpICE9IG1kbF9pZHgpICYmCiAgICAgICAgICAgICAgICAgKHBfbWNiLT5tZGxbaV0ubWRsX2lkID09IG1kbF9pZCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGR1cGxpY2F0ZV9pZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgZHVwbGljYXRlX2lkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNzkxLDcgKzc5MSw3IEBACiAgICAgICAgICAgICAvKiBjaGVjayBtZGxfaWRzIHRoYXQgYXJlIHN0b3JlZCBpbiB0aGUgcGVyc2lzdGVudCBtZW1vcnkgKi8KICAgICAgICAgICAgIGlmIChidGFfaGxfZmluZF9tZGxfY2ZnX2lkeChhcHBfaWR4LG1jbF9pZHgsIG1kbF9pZCwgJm1kbF9jZmdfaWR4KSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkdXBsaWNhdGVfaWQgPSBUUlVFOworICAgICAgICAgICAgICAgIGR1cGxpY2F0ZV9pZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7CkBAIC04MDAsOSArODAwLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgfXdoaWxlIChUUlVFKTsKKyAgICB9d2hpbGUgKHRydWUpOwogCi0jaWYgQlRBX0hMX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hsX2FsbG9jYXRlX21kbCBPSyBtZGxfaWQ9JWQiLCAgbWRsX2lkKTsKICNlbmRpZgogICAgIHJldHVybiBtZGxfaWQ7CkBAIC04MTMsMTUgKzgxMywxNSBAQAogKioKICoqIERlc2NyaXB0aW9uICBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBNREwgaW5kZXggYmFzZWQgb24gbWRsX2lkCiAqKgotKiogUmV0dXJucyAgICAgIEJPT0xFQU4gVFJVRS1mb3VuZAorKiogUmV0dXJucyAgICAgIGJvb2wgdHJ1ZS1mb3VuZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9obF9maW5kX21kbF9pZHgoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgVUlOVDE2IG1kbF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9tZGxfaWR4KQorYm9vbCBidGFfaGxfZmluZF9tZGxfaWR4KHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50MTZfdCBtZGxfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9tZGxfaWR4KQogewogICAgIHRCVEFfSExfTUNMX0NCICAgICAgKnBfbWNiICA9IEJUQV9ITF9HRVRfTUNMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4KTsKLSAgICBCT09MRUFOIGZvdW5kPUZBTFNFOwotICAgIFVJTlQ4IGk7CisgICAgYm9vbCBmb3VuZD1mYWxzZTsKKyAgICB1aW50OF90IGk7CiAKICAgICBmb3IgKGk9MDsgaSA8IEJUQV9ITF9OVU1fTURMU19QRVJfTUNMIDsgaSArKykKICAgICB7CkBAIC04MjksMTMgKzgyOSwxMyBAQAogICAgICAgICAgICAgKG1kbF9pZCAhPTApICYmCiAgICAgICAgICAgICAocF9tY2ItPm1kbFtpXS5tZGxfaWQ9PSBtZGxfaWQpKQogICAgICAgICB7Ci0gICAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAqcF9tZGxfaWR4ID0gaTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCi0jaWYgQlRBX0hMX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgaWYgKCFmb3VuZCkKICAgICB7CiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9maW5kX21kbF9pZHggZm91bmQ9JWQgbWRsX2lkPSVkIG1kbF9pZHg9JWQgIiwKQEAgLTg1MiwyOCArODUyLDI4IEBACiAqKgogKiogRGVzY3JpcHRpb24gIFRoaXMgZnVuY3Rpb24gZmluZHMgYW4gYWN0aXZlIE1ETAogKioKLSoqIFJldHVybnMgICAgICBCT09MRUFOIFRSVUUtZm91bmQKKyoqIFJldHVybnMgICAgICBib29sIHRydWUtZm91bmQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfaGxfZmluZF9hbl9hY3RpdmVfbWRsX2lkeChVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9tZGxfaWR4KQorYm9vbCBidGFfaGxfZmluZF9hbl9hY3RpdmVfbWRsX2lkeCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9tZGxfaWR4KQogewogICAgIHRCVEFfSExfTUNMX0NCICAgICAgKnBfbWNiICA9IEJUQV9ITF9HRVRfTUNMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4KTsKLSAgICBCT09MRUFOIGZvdW5kPUZBTFNFOwotICAgIFVJTlQ4IGk7CisgICAgYm9vbCBmb3VuZD1mYWxzZTsKKyAgICB1aW50OF90IGk7CiAKICAgICBmb3IgKGk9MDsgaSA8IEJUQV9ITF9OVU1fTURMU19QRVJfTUNMIDsgaSArKykKICAgICB7CiAgICAgICAgIGlmIChwX21jYi0+bWRsW2ldLmluX3VzZSAgJiYKICAgICAgICAgICAgIChwX21jYi0+bWRsW2ldLmRjaF9zdGF0ZSA9PSBCVEFfSExfRENIX09QRU5fU1QpKQogICAgICAgICB7Ci0gICAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAqcF9tZGxfaWR4ID0gaTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCi0jaWYgQlRBX0hMX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgaWYgKGZvdW5kKQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hsX2ZpbmRfYW5fb3BlbmVkX21kbF9pZHggZm91bmQ9JWQgYXBwX2lkeD0lZCBtY2xfaWR4PSVkIG1kbF9pZHg9JWQiLApAQCAtODkwLDI4ICs4OTAsMjggQEAKICoqCiAqKiBEZXNjcmlwdGlvbiAgVGhpcyBmdW5jdGlvbiBmaW5kcyBhIE1ETCB3aGljaCBpbiB0aGUgRENIIHNldHVwIHN0YXRlCiAqKgotKiogUmV0dXJucyAgICAgIEJPT0xFQU4gVFJVRS1mb3VuZAorKiogUmV0dXJucyAgICAgIGJvb2wgdHJ1ZS1mb3VuZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9obF9maW5kX2RjaF9zZXR1cF9tZGxfaWR4KFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4ICpwX21kbF9pZHgpCitib29sIGJ0YV9obF9maW5kX2RjaF9zZXR1cF9tZGxfaWR4KHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwX21kbF9pZHgpCiB7CiAgICAgdEJUQV9ITF9NQ0xfQ0IgICAgICAqcF9tY2IgID0gQlRBX0hMX0dFVF9NQ0xfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgpOwotICAgIEJPT0xFQU4gZm91bmQ9RkFMU0U7Ci0gICAgVUlOVDggaTsKKyAgICBib29sIGZvdW5kPWZhbHNlOworICAgIHVpbnQ4X3QgaTsKIAogICAgIGZvciAoaT0wOyBpIDwgQlRBX0hMX05VTV9NRExTX1BFUl9NQ0wgOyBpICsrKQogICAgIHsKICAgICAgICAgaWYgKHBfbWNiLT5tZGxbaV0uaW5fdXNlICAmJgogICAgICAgICAgICAgKHBfbWNiLT5tZGxbaV0uZGNoX3N0YXRlID09IEJUQV9ITF9EQ0hfT1BFTklOR19TVCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICpwX21kbF9pZHggPSBpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBpZiAoZm91bmQpCiAgICAgewogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGxfZmluZF9kY2hfc2V0dXBfbWRsX2lkeCBmb3VuZD0lZCBhcHBfaWR4PSVkIG1jbF9pZHg9JWQgbWRsX2lkeD0lZCIsCkBAIC05MjgsMTUgKzkyOCwxNSBAQAogKioKICoqIERlc2NyaXB0aW9uICBUaGlzIGZ1bmN0aW9uIGZpbmRzIGFuIGluLXVzZSBNQ0wgY29udHJvbCBibG9jayBpbmRleAogKioKLSoqIFJldHVybnMgICAgICBCT09MRUFOIFRSVUUtZm91bmQKKyoqIFJldHVybnMgICAgICBib29sIHRydWUtZm91bmQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfaGxfZmluZF9hbl9pbl91c2VfbWNsX2lkeChVSU5UOCBhcHBfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9tY2xfaWR4KQorYm9vbCBidGFfaGxfZmluZF9hbl9pbl91c2VfbWNsX2lkeCh1aW50OF90IGFwcF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfbWNsX2lkeCkKIHsKICAgICB0QlRBX0hMX01DTF9DQiAgICAgICpwX21jYjsKLSAgICBCT09MRUFOIGZvdW5kPUZBTFNFOwotICAgIFVJTlQ4IGk7CisgICAgYm9vbCBmb3VuZD1mYWxzZTsKKyAgICB1aW50OF90IGk7CiAKICAgICBmb3IgKGk9MDsgaSA8IEJUQV9ITF9OVU1fTUNMUyA7IGkgKyspCiAgICAgewpAQCAtOTQ0LDEzICs5NDQsMTMgQEAKICAgICAgICAgaWYgKHBfbWNiLT5pbl91c2UgICYmCiAgICAgICAgICAgICAocF9tY2ItPmNjaF9zdGF0ZSAhPSBCVEFfSExfQ0NIX0lETEVfU1QpKQogICAgICAgICB7Ci0gICAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAqcF9tY2xfaWR4ID0gaTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCi0jaWYgQlRBX0hMX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgaWYgKGZvdW5kKQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hsX2ZpbmRfYW5faW5fdXNlX21jbF9pZHggZm91bmQ9JWQgYXBwX2lkeD0lZCBtY2xfaWR4PSVkICIsCkBAIC05NjgsMjcgKzk2OCwyNyBAQAogKioKICoqIERlc2NyaXB0aW9uICBUaGlzIGZ1bmN0aW9uIGZpbmRzIGFuIGluLXVzZSBhcHBsaWNhdGlvbiBjb250cm9sIGJsb2NrIGluZGV4CiAqKgotKiogUmV0dXJucyAgICAgIEJPT0xFQU4gVFJVRS1mb3VuZAorKiogUmV0dXJucyAgICAgIGJvb2wgdHJ1ZS1mb3VuZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9obF9maW5kX2FuX2luX3VzZV9hcHBfaWR4KFVJTlQ4ICpwX2FwcF9pZHgpCitib29sIGJ0YV9obF9maW5kX2FuX2luX3VzZV9hcHBfaWR4KHVpbnQ4X3QgKnBfYXBwX2lkeCkKIHsKICAgICB0QlRBX0hMX0FQUF9DQiAgICAgICpwX2FjYiA7Ci0gICAgQk9PTEVBTiBmb3VuZD1GQUxTRTsKLSAgICBVSU5UOCBpOworICAgIGJvb2wgZm91bmQ9ZmFsc2U7CisgICAgdWludDhfdCBpOwogCiAgICAgZm9yIChpPTA7IGkgPCBCVEFfSExfTlVNX0FQUFMgOyBpICsrKQogICAgIHsKICAgICAgICAgcF9hY2IgID0gQlRBX0hMX0dFVF9BUFBfQ0JfUFRSKGkpOwogICAgICAgICBpZiAocF9hY2ItPmluX3VzZSkKICAgICAgICAgewotICAgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgKnBfYXBwX2lkeCA9IGk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIGlmIChmb3VuZCkKICAgICB7CiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9maW5kX2FuX2luX3VzZV9hcHBfaWR4IGZvdW5kPSVkIGFwcF9pZHg9JWQgIiwKQEAgLTEwMDUsMjYgKzEwMDUsMjYgQEAKICoqIERlc2NyaXB0aW9uICBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBhcHBsaWNhdGlvbiBjb250cm9sIGJsb2NrIGluZGV4IGJhc2VkIG9uCiAqKiAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIElECiAqKgotKiogUmV0dXJucyAgICAgIEJPT0xFQU4gVFJVRS1mb3VuZAorKiogUmV0dXJucyAgICAgIGJvb2wgdHJ1ZS1mb3VuZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9obF9maW5kX2FwcF9pZHgoVUlOVDggYXBwX2lkLCBVSU5UOCAqcF9hcHBfaWR4KQorYm9vbCBidGFfaGxfZmluZF9hcHBfaWR4KHVpbnQ4X3QgYXBwX2lkLCB1aW50OF90ICpwX2FwcF9pZHgpCiB7Ci0gICAgQk9PTEVBTiBmb3VuZD1GQUxTRTsKLSAgICBVSU5UOCBpOworICAgIGJvb2wgZm91bmQ9ZmFsc2U7CisgICAgdWludDhfdCBpOwogCiAgICAgZm9yIChpPTA7IGkgPCBCVEFfSExfTlVNX0FQUFMgOyBpICsrKQogICAgIHsKICAgICAgICAgaWYgKGJ0YV9obF9jYi5hY2JbaV0uaW5fdXNlICYmCiAgICAgICAgICAgICAoYnRhX2hsX2NiLmFjYltpXS5hcHBfaWQgPT0gYXBwX2lkKSkKICAgICAgICAgewotICAgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgKnBfYXBwX2lkeCA9IGk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9maW5kX2FwcF9pZHggZm91bmQ9JWQgYXBwX2lkPSVkIGlkeD0lZCAiLAogICAgICAgICAgICAgICAgICAgICAgIGZvdW5kLCBhcHBfaWQsIGkpOwogI2VuZGlmCkBAIC0xMDQwLDI3ICsxMDQwLDI3IEBACiAqKiBEZXNjcmlwdGlvbiAgVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgYXBwbGljYXRpb24gY29udHJvbCBibG9jayBpbmRleCBiYXNlZCBvbgogKiogICAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiBoYW5kbGUKICoqCi0qKiBSZXR1cm5zICAgICAgQk9PTEVBTiBUUlVFLWZvdW5kCisqKiBSZXR1cm5zICAgICAgYm9vbCB0cnVlLWZvdW5kCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX2hsX2ZpbmRfYXBwX2lkeF91c2luZ19oYW5kbGUodEJUQV9ITF9BUFBfSEFORExFIGFwcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4ICpwX2FwcF9pZHgpCitib29sIGJ0YV9obF9maW5kX2FwcF9pZHhfdXNpbmdfaGFuZGxlKHRCVEFfSExfQVBQX0hBTkRMRSBhcHBfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwX2FwcF9pZHgpCiB7Ci0gICAgQk9PTEVBTiBmb3VuZD1GQUxTRTsKLSAgICBVSU5UOCBpOworICAgIGJvb2wgZm91bmQ9ZmFsc2U7CisgICAgdWludDhfdCBpOwogCiAgICAgZm9yIChpPTA7IGkgPCBCVEFfSExfTlVNX0FQUFMgOyBpICsrKQogICAgIHsKICAgICAgICAgaWYgKGJ0YV9obF9jYi5hY2JbaV0uaW5fdXNlICYmCiAgICAgICAgICAgICAoYnRhX2hsX2NiLmFjYltpXS5hcHBfaGFuZGxlID09IGFwcF9oYW5kbGUpKQogICAgICAgICB7Ci0gICAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAqcF9hcHBfaWR4ID0gaTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCi0jaWYgQlRBX0hMX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgaWYgKCFmb3VuZCkKICAgICB7CiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9maW5kX2FwcF9pZHhfdXNpbmdfbWNhX2hhbmRsZSBzdGF0dXM9JWQgaGFuZGxlPSVkIGFwcF9pZHg9JWQgIiwKQEAgLTEwNzksMTUgKzEwNzksMTUgQEAKICoqIERlc2NyaXB0aW9uICBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBNQ0wgY29udHJvbCBibG9jayBpbmRleCBiYXNlZCBvbgogKiogICAgICAgICAgICAgIHRoZSBNQ0wgaGFuZGxlCiAqKgotKiogUmV0dXJucyAgICAgIEJPT0xFQU4gVFJVRS1mb3VuZAorKiogUmV0dXJucyAgICAgIGJvb2wgdHJ1ZS1mb3VuZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9obF9maW5kX21jbF9pZHhfdXNpbmdfaGFuZGxlKCB0QlRBX0hMX01DTF9IQU5ETEUgbWNsX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4ICpwX2FwcF9pZHgsIFVJTlQ4ICpwX21jbF9pZHgpCitib29sIGJ0YV9obF9maW5kX21jbF9pZHhfdXNpbmdfaGFuZGxlKCB0QlRBX0hMX01DTF9IQU5ETEUgbWNsX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfYXBwX2lkeCwgdWludDhfdCAqcF9tY2xfaWR4KQogewogICAgIHRCVEFfSExfQVBQX0NCICAqcF9hY2I7Ci0gICAgQk9PTEVBTiAgICAgICAgIGZvdW5kPUZBTFNFOwotICAgIFVJTlQ4IGkgPSAwLGogPSAwOworICAgIGJvb2wgICAgICAgICBmb3VuZD1mYWxzZTsKKyAgICB1aW50OF90IGkgPSAwLGogPSAwOwogCiAgICAgZm9yIChpPTA7IGk8QlRBX0hMX05VTV9BUFBTOyBpKyspCiAgICAgewpAQCAtMTA5OCw3ICsxMDk4LDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoIHBfYWNiLT5tY2Jbal0ubWNsX2hhbmRsZSA9PSBtY2xfaGFuZGxlICkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAqcF9hcHBfaWR4ID0gaTsKICAgICAgICAgICAgICAgICAgICAgKnBfbWNsX2lkeCA9IGo7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTEwNyw3ICsxMTA3LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIGlmICghZm91bmQpCiAgICAgewogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGxfZmluZF9tY2xfaWR4X3VzaW5nX2hhbmRsZSBmb3VuZD0lZCBhcHBfaWR4PSVkIG1jbF9pZHg9JWQiLApAQCAtMTEyNCwyNiArMTEyNCwyNiBAQAogKiogRGVzY3JpcHRpb24gIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIE1DTCBjb250cm9sIGJsb2NrIGluZGV4IGJhc2VkIG9uCiAqKiAgICAgICAgICAgICAgdGhlIHBlZXIgQkQgYWRkcmVzcwogKioKLSoqIFJldHVybnMgICAgICBCT09MRUFOIFRSVUUtZm91bmQKKyoqIFJldHVybnMgICAgICBib29sIHRydWUtZm91bmQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfaGxfZmluZF9tY2xfaWR4KFVJTlQ4IGFwcF9pZHgsIEJEX0FERFIgcF9iZF9hZGRyLCBVSU5UOCAqcF9tY2xfaWR4KQorYm9vbCBidGFfaGxfZmluZF9tY2xfaWR4KHVpbnQ4X3QgYXBwX2lkeCwgQkRfQUREUiBwX2JkX2FkZHIsIHVpbnQ4X3QgKnBfbWNsX2lkeCkKIHsKLSAgICBCT09MRUFOIGZvdW5kPUZBTFNFOwotICAgIFVJTlQ4IGk7CisgICAgYm9vbCBmb3VuZD1mYWxzZTsKKyAgICB1aW50OF90IGk7CiAKICAgICBmb3IgKGk9MDsgaSA8IEJUQV9ITF9OVU1fTUNMUyA7IGkgKyspCiAgICAgewogICAgICAgICBpZiAoYnRhX2hsX2NiLmFjYlthcHBfaWR4XS5tY2JbaV0uaW5fdXNlICYmCiAgICAgICAgICAgICAoIW1lbWNtcCAoYnRhX2hsX2NiLmFjYlthcHBfaWR4XS5tY2JbaV0uYmRfYWRkciwgcF9iZF9hZGRyLCBCRF9BRERSX0xFTikpKQogICAgICAgICB7Ci0gICAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAqcF9tY2xfaWR4ID0gaTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCi0jaWYgQlRBX0hMX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgaWYgKCFmb3VuZCkKICAgICB7CiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9maW5kX21jbF9pZHggZm91bmQ9JWQgaWR4PSVkIiwKQEAgLTExNjIsMTggKzExNjIsMTggQEAKICoqIERlc2NyaXB0aW9uICBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBNREwgY29udHJvbCBibG9jayBpbmRleCBiYXNlZCBvbgogKiogICAgICAgICAgICAgIHRoZSBNREwgaGFuZGxlCiAqKgotKiogUmV0dXJucyAgICAgIEJPT0xFQU4gVFJVRS1mb3VuZAorKiogUmV0dXJucyAgICAgIGJvb2wgdHJ1ZS1mb3VuZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9obF9maW5kX21kbF9pZHhfdXNpbmdfaGFuZGxlKHRCVEFfSExfTURMX0hBTkRMRSBtZGxfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9hcHBfaWR4LFVJTlQ4ICpwX21jbF9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4ICpwX21kbF9pZHgpCitib29sIGJ0YV9obF9maW5kX21kbF9pZHhfdXNpbmdfaGFuZGxlKHRCVEFfSExfTURMX0hBTkRMRSBtZGxfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwX2FwcF9pZHgsdWludDhfdCAqcF9tY2xfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwX21kbF9pZHgpCiB7CiAgICAgdEJUQV9ITF9BUFBfQ0IgICAgICAqcF9hY2I7CiAgICAgdEJUQV9ITF9NQ0xfQ0IgICAgICAqcF9tY2I7CiAgICAgdEJUQV9ITF9NRExfQ0IgICAgICAqcF9kY2I7Ci0gICAgQk9PTEVBTiBmb3VuZD1GQUxTRTsKLSAgICBVSU5UOCBpLGosazsKKyAgICBib29sIGZvdW5kPWZhbHNlOworICAgIHVpbnQ4X3QgaSxqLGs7CiAKICAgICBmb3IgKGk9MDsgaSA8IEJUQV9ITF9OVU1fQVBQUyA7IGkgKyspCiAgICAgewpAQCAtMTE5Miw3ICsxMTkyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocF9kY2ItPm1kbF9oYW5kbGUgPT0gbWRsX2hhbmRsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9hcHBfaWR4ID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbWNsX2lkeCA9ajsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbWRsX2lkeCA9IGs7CkBAIC0xMjA2LDcgKzEyMDYsNyBAQAogICAgIH0KIAogCi0jaWYgQlRBX0hMX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgaWYgKCFmb3VuZCkKICAgICB7CiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9maW5kX21kbF9pZHhfdXNpbmdfaGFuZGxlIGZvdW5kPSVkIG1kbF9oYW5kbGU9JWQgICIsCkBAIC0xMjIyLDI2ICsxMjIyLDI2IEBACiAqKiBEZXNjcmlwdGlvbiAgVGhpcyBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciB0aGUgZmlyc3QgcmVsaWFibGUgRENIIGNoYW5uZWwKICoqICAgICAgICAgICAgICBoYXMgYmVlbiBzZXR1cCBvbiB0aGUgTUNMIG9yIG5vdAogKioKLSoqIFJldHVybnMgICAgICBCT09MRUFOIC0gVFJVRSBleGlzdAotKiogICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBkb2VzIG5vdCBleGlzdAorKiogUmV0dXJucyAgICAgIGJvb2wgLSB0cnVlIGV4aXN0CisqKiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIGRvZXMgbm90IGV4aXN0CiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX2hsX2lzX3RoZV9maXJzdF9yZWxpYWJsZV9leGlzdGVkKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHggKQorYm9vbCBidGFfaGxfaXNfdGhlX2ZpcnN0X3JlbGlhYmxlX2V4aXN0ZWQodWludDhfdCBhcHBfaWR4LCB1aW50OF90IG1jbF9pZHggKQogewogICAgIHRCVEFfSExfTUNMX0NCICAgICAgKnBfbWNiID0gQlRBX0hMX0dFVF9NQ0xfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgpOwotICAgIEJPT0xFQU4gaXNfZXhpc3RlZCA9RkFMU0U7Ci0gICAgVUlOVDggaSA7CisgICAgYm9vbCBpc19leGlzdGVkID1mYWxzZTsKKyAgICB1aW50OF90IGkgOwogCiAgICAgZm9yIChpPTA7IGk8IEJUQV9ITF9OVU1fTURMU19QRVJfTUNMOyBpKyspCiAgICAgewogICAgICAgICBpZiAocF9tY2ItPm1kbFtpXS5pbl91c2UgJiYgcF9tY2ItPm1kbFtpXS5pc190aGVfZmlyc3RfcmVsaWFibGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlzX2V4aXN0ZWQgPSBUUlVFOworICAgICAgICAgICAgaXNfZXhpc3RlZCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9pc190aGVfZmlyc3RfcmVsaWFibGVfZXhpc3RlZCBpc19leGlzdGVkPSVkICAiLGlzX2V4aXN0ZWQgKTsKICNlbmRpZgogICAgIHJldHVybiBpc19leGlzdGVkOwpAQCAtMTI1NCwyNCArMTI1NCwyNCBAQAogKiogRGVzY3JpcHRpb24gIFRoaXMgZnVuY3Rpb24gZmluZHMgYSB2YWxpZCBNREwgY29uZmlnaXJhdGlvbiBpbmRleCBhbmQgdGhpcwogKiogICAgICAgICAgICAgIE1ETCBJRCBpcyBub3QgYWN0aXZlCiAqKgotKiogUmV0dXJucyAgICAgIEJPT0xFQU4gLSBUUlVFIGZvdW5kCi0qKiAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIG5vdCBmb3VuZAorKiogUmV0dXJucyAgICAgIGJvb2wgLSB0cnVlIGZvdW5kCisqKiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIG5vdCBmb3VuZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOICBidGFfaGxfZmluZF9ub25fYWN0aXZlX21kbF9jZmcoVUlOVDggYXBwX2lkeCwgVUlOVDggc3RhcnRfbWRsX2NmZ19pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfbWRsX2NmZ19pZHgpCitib29sICBidGFfaGxfZmluZF9ub25fYWN0aXZlX21kbF9jZmcodWludDhfdCBhcHBfaWR4LCB1aW50OF90IHN0YXJ0X21kbF9jZmdfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfbWRsX2NmZ19pZHgpCiB7CiAKICAgICB0QlRBX0hMX01DTF9DQiAgICAgICpwX21jYjsKICAgICB0QlRBX0hMX01ETF9DQiAgICAgICpwX2RjYjsKICAgICB0QlRBX0hMX01ETF9DRkcgICAgICpwX21kbDsKLSAgICBCT09MRUFOICAgICAgICAgICAgIG1kbF9pbl91c2U7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBmb3VuZCA9IEZBTFNFOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgaSxqLGs7CisgICAgYm9vbCAgICAgICAgICAgICBtZGxfaW5fdXNlOworICAgIGJvb2wgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgaSxqLGs7CiAKICAgICBmb3IgKGkgPSBzdGFydF9tZGxfY2ZnX2lkeDsgaTwgQlRBX0hMX05VTV9NRExfQ0ZHUzsgaSsrKQogICAgIHsKLSAgICAgICAgbWRsX2luX3VzZSA9IEZBTFNFOworICAgICAgICBtZGxfaW5fdXNlID0gZmFsc2U7CiAgICAgICAgIHBfbWRsID0gQlRBX0hMX0dFVF9NRExfQ0ZHX1BUUihhcHBfaWR4LCBpKTsKICAgICAgICAgZm9yIChqPTA7IGo8IEJUQV9ITF9OVU1fTUNMUzsgaisrKQogICAgICAgICB7CkBAIC0xMjg2LDcgKzEyODYsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgIGlmIChwX2RjYi0+aW5fdXNlICYmICBwX21kbC0+bWRsX2lkID09IHBfZGNiLT5tZGxfaWQpCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1kbF9pbl91c2UgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgbWRsX2luX3VzZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTEzMDEsNyArMTMwMSw3IEBACiAgICAgICAgIGlmICghbWRsX2luX3VzZSkKICAgICAgICAgewogICAgICAgICAgICAgKnBfbWRsX2NmZ19pZHggPSBpOwotICAgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMzE1LDE4ICsxMzE1LDE4IEBACiAqKgogKiogRGVzY3JpcHRpb24gIFRoaXMgZnVuY3Rpb24gZmluZHMgYW4gYXZhaWxhYmxlIE1ETCBjb25maWd1cmF0aW9uIGluZGV4CiAqKgotKiogUmV0dXJucyAgICAgIEJPT0xFQU4gLSBUUlVFIGZvdW5kCi0qKiAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIG5vdCBmb3VuZAorKiogUmV0dXJucyAgICAgIGJvb2wgLSB0cnVlIGZvdW5kCisqKiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIG5vdCBmb3VuZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOICBidGFfaGxfZmluZF9hdmFpbF9tZGxfY2ZnX2lkeChVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfbWRsX2NmZ19pZHgpCitib29sICBidGFfaGxfZmluZF9hdmFpbF9tZGxfY2ZnX2lkeCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfbWRsX2NmZ19pZHgpCiB7CiAgICAgdEJUQV9ITF9NRExfQ0ZHICAgICAqcF9tZGwsICpwX21kbDEsICpwX21kbDI7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBpOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgZm91bmQ9RkFMU0U7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBmaXJzdF9tZGxfY2ZnX2lkeCwgc2Vjb25kX21kbF9jZmdfaWR4LCBvbGRlcl9tZGxfY2ZnX2lkeDsKLSAgICBCT09MRUFOICAgICAgICAgICAgIGRvbmU7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIGk7CisgICAgYm9vbCAgICAgICAgICAgICBmb3VuZD1mYWxzZTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgZmlyc3RfbWRsX2NmZ19pZHgsIHNlY29uZF9tZGxfY2ZnX2lkeCwgb2xkZXJfbWRsX2NmZ19pZHg7CisgICAgYm9vbCAgICAgICAgICAgICBkb25lOwogICAgIFVOVVNFRChtY2xfaWR4KTsKIAogICAgIGZvciAoaT0wOyBpPCBCVEFfSExfTlVNX01ETF9DRkdTOyBpKyspCkBAIC0xMzM1LDcgKzEzMzUsNyBAQAogICAgICAgICBpZiAoIXBfbWRsLT5hY3RpdmUgICkKICAgICAgICAgewogICAgICAgICAgICAgLyogZm91bmQgYW4gdW51c2VkIHNwYWNlIHRvIHN0b3JlIG1kbCBjZmcqLwotICAgICAgICAgICAgZm91bmQ9VFJVRTsKKyAgICAgICAgICAgIGZvdW5kPXRydWU7CiAgICAgICAgICAgICAqcF9tZGxfY2ZnX2lkeCA9aTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMzQ2LDEyICsxMzQ2LDEyIEBACiAgICAgICAgIC8qIGFsbCBhdmFpbGFibGUgbWRsIGNmZyBzcGFjZXMgYXJlIGluIHVzZSBzbyB3ZSBuZWVkIHRvIGZpbmQgdGhlIG1kbCBjZmcgd2hpY2ggaXMKICAgICAgICAgbm90IGN1cnJlbnRseSBpbiB1c2UgYW5kIGhhcyB0aGUgdGhlIG9sZGVzdCB0aW1lIHN0YW1wIHRvIHJlbW92ZSovCiAKLSAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgIGlmIChidGFfaGxfZmluZF9ub25fYWN0aXZlX21kbF9jZmcoYXBwX2lkeCwwLCAmZmlyc3RfbWRsX2NmZ19pZHgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYnRhX2hsX2ZpbmRfbm9uX2FjdGl2ZV9tZGxfY2ZnKGFwcF9pZHgsKFVJTlQ4KSAoZmlyc3RfbWRsX2NmZ19pZHgrMSksICZzZWNvbmRfbWRsX2NmZ19pZHgpKQorICAgICAgICAgICAgaWYgKGJ0YV9obF9maW5kX25vbl9hY3RpdmVfbWRsX2NmZyhhcHBfaWR4LCh1aW50OF90KSAoZmlyc3RfbWRsX2NmZ19pZHgrMSksICZzZWNvbmRfbWRsX2NmZ19pZHgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRvbmUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBkb25lID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgd2hpbGUgKCFkb25lKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcF9tZGwxID0gQlRBX0hMX0dFVF9NRExfQ0ZHX1BUUihhcHBfaWR4LCBmaXJzdF9tZGxfY2ZnX2lkeCk7CkBAIC0xMzY2LDEzICsxMzY2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBvbGRlcl9tZGxfY2ZnX2lkeCA9ICBzZWNvbmRfbWRsX2NmZ19pZHg7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAoYnRhX2hsX2ZpbmRfbm9uX2FjdGl2ZV9tZGxfY2ZnKGFwcF9pZHgsKFVJTlQ4KSAoc2Vjb25kX21kbF9jZmdfaWR4KzEpLCAmc2Vjb25kX21kbF9jZmdfaWR4KSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ0YV9obF9maW5kX25vbl9hY3RpdmVfbWRsX2NmZyhhcHBfaWR4LCh1aW50OF90KSAoc2Vjb25kX21kbF9jZmdfaWR4KzEpLCAmc2Vjb25kX21kbF9jZmdfaWR4KSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfbWRsX2NmZ19pZHggPSBvbGRlcl9tZGxfY2ZnX2lkeDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKQEAgLTEzODcsMTEgKzEzODcsMTEgQEAKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZvdW5kID0gRkFMU0U7CisgICAgICAgICAgICBmb3VuZCA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCi0jaWYgQlRBX0hMX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgaWYgKCFmb3VuZCkKICAgICB7CiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9maW5kX2F2YWlsX21kbF9jZmdfaWR4IGZvdW5kPSVkIG1kbF9jZmdfaWR4PSVkICIsZm91bmQsICpwX21kbF9jZmdfaWR4ICApOwpAQCAtMTQxMCwxNyArMTQxMCwxNyBAQAogKiogRGVzY3JpcHRpb24gIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIE1ETCBjb25maWd1cmF0aW9uIGluZGV4IGJhc2VkIG9uCiAqKiAgICAgICAgICAgICAgdGhlIE1ETCBJRAogKioKLSoqIFJldHVybnMgICAgICBCT09MRUFOIC0gVFJVRSBmb3VuZAotKiogICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBub3QgZm91bmQKKyoqIFJldHVybnMgICAgICBib29sIC0gdHJ1ZSBmb3VuZAorKiogICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBub3QgZm91bmQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiAgYnRhX2hsX2ZpbmRfbWRsX2NmZ19pZHgoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfTURMX0lEIG1kbF9pZCwgVUlOVDggKnBfbWRsX2NmZ19pZHgpCitib29sICBidGFfaGxfZmluZF9tZGxfY2ZnX2lkeCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfTURMX0lEIG1kbF9pZCwgdWludDhfdCAqcF9tZGxfY2ZnX2lkeCkKIHsKICAgICB0QlRBX0hMX01DTF9DQiAgICAgICpwX21jYiA9IEJUQV9ITF9HRVRfTUNMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4KTsKICAgICB0QlRBX0hMX01ETF9DRkcgICAgICpwX21kbDsKLSAgICBVSU5UOCBpIDsKLSAgICBCT09MRUFOIGZvdW5kPUZBTFNFOworICAgIHVpbnQ4X3QgaSA7CisgICAgYm9vbCBmb3VuZD1mYWxzZTsKIAogICAgICpwX21kbF9jZmdfaWR4ID0gMDsKICAgICBmb3IgKGk9MDsgaTwgQlRBX0hMX05VTV9NRExfQ0ZHUzsgaSsrKQpAQCAtMTQzMywxMyArMTQzMywxMyBAQAogICAgICAgICAgICAgKCFtZW1jbXAgKHBfbWNiLT5iZF9hZGRyLCBwX21kbC0+cGVlcl9iZF9hZGRyLCBCRF9BRERSX0xFTikpJiYKICAgICAgICAgICAgIChwX21kbC0+bWRsX2lkID09IG1kbF9pZCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZvdW5kPVRSVUU7CisgICAgICAgICAgICBmb3VuZD10cnVlOwogICAgICAgICAgICAgKnBfbWRsX2NmZ19pZHggPWk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIGlmICghZm91bmQpCiAgICAgewogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGxfZmluZF9tZGxfY2ZnX2lkeCBmb3VuZD0lZCBtZGxfY2ZnX2lkeD0lZCAiLGZvdW5kLCBpICk7CkBAIC0xNDU4LDIyICsxNDU4LDIyIEBACiAqKgogKiogRGVzY3JpcHRpb24gIFRoaXMgZnVuY3Rpb24gZ2V0IHRoZSBjdXVyZW50IHRpbWUgdmFsdWUKICoqCi0qKiBSZXR1cm5zICAgICAgQk9PTEVBTiAtIFRSVUUgZm91bmQKLSoqICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0Ugbm90IGZvdW5kCisqKiBSZXR1cm5zICAgICAgYm9vbCAtIHRydWUgZm91bmQKKyoqICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2Ugbm90IGZvdW5kCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gIGJ0YV9obF9nZXRfY3VyX3RpbWUoVUlOVDggYXBwX2lkeCwgVUlOVDggKnBfY3VyX3RpbWUpCitib29sICBidGFfaGxfZ2V0X2N1cl90aW1lKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCAqcF9jdXJfdGltZSkKIHsKICAgICB0QlRBX0hMX01ETF9DRkcgICAgICpwX21kbDsKLSAgICBVSU5UOCBpLCBqLCB0aW1lX2xhdGVzdCwgdGltZTsKLSAgICBCT09MRUFOIGZvdW5kPUZBTFNFLCByZXN1bHQ9VFJVRTsKKyAgICB1aW50OF90IGksIGosIHRpbWVfbGF0ZXN0LCB0aW1lOworICAgIGJvb2wgZm91bmQ9ZmFsc2UsIHJlc3VsdD10cnVlOwogCiAgICAgZm9yIChpPTA7IGk8IEJUQV9ITF9OVU1fTURMX0NGR1M7IGkrKykKICAgICB7CiAgICAgICAgIHBfbWRsID0gQlRBX0hMX0dFVF9NRExfQ0ZHX1BUUihhcHBfaWR4LCBpKTsKICAgICAgICAgaWYgKHBfbWRsLT5hY3RpdmUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZvdW5kPVRSVUU7CisgICAgICAgICAgICBmb3VuZD10cnVlOwogICAgICAgICAgICAgdGltZV9sYXRlc3QgPSBwX21kbC0+dGltZTsKICAgICAgICAgICAgIGZvciAoaj0oaSsxKTsgajwgQlRBX0hMX05VTV9NRExfQ0ZHUzsgaisrICkKICAgICAgICAgICAgIHsKQEAgLTE1MDEsNyArMTUwMSw3IEBACiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICAgLyogbmVlZCB0byB3cmFwIGFyb3VuZCAqLwotICAgICAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlCkBAIC0xNTA5LDcgKzE1MDksNyBAQAogICAgICAgICAqcF9jdXJfdGltZSA9IEJUQV9ITF9NSU5fVElNRTsKICAgICB9CiAKLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBpZiAoIXJlc3VsdCkKICAgICB7CiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9nZXRfY3VyX3RpbWUgcmVzdWx0PSVzIGN1cl90aW1lPSVkIiwKQEAgLTE1MjcsMTUgKzE1MjcsMTUgQEAKICoqIERlc2NyaXB0aW9uICBUaGlzIGZ1bmN0aW9uIHNvcnQgdGhlIG1kbCBjb25maWd1cmF0aW9uIGlkeCBzdG9yZWQgaW4gYXJyYXkgYQogKiogICAgICAgICAgICAgIGJhc2VkIG9uIGRlY2VuZGluZyB0aW1lIHZhbHVlCiAqKgotKiogUmV0dXJucyAgICAgIEJPT0xFQU4gLSBUUlVFIGZvdW5kCi0qKiAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIG5vdCBmb3VuZAorKiogUmV0dXJucyAgICAgIGJvb2wgLSB0cnVlIGZvdW5kCisqKiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIG5vdCBmb3VuZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9obF9zb3J0X2NmZ190aW1lX2lkeChVSU5UOCBhcHBfaWR4LCBVSU5UOCAqYSwgVUlOVDggbikKK3ZvaWQgYnRhX2hsX3NvcnRfY2ZnX3RpbWVfaWR4KHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCAqYSwgdWludDhfdCBuKQogewogICAgIHRCVEFfSExfQVBQX0NCICAgICAgKnBfYWNiID0gQlRBX0hMX0dFVF9BUFBfQ0JfUFRSKGFwcF9pZHgpOwotICAgIFVJTlQ4IHRlbXBfdGltZSwgdGVtcF9pZHg7Ci0gICAgSU5UMTYgaSwgajsKKyAgICB1aW50OF90IHRlbXBfdGltZSwgdGVtcF9pZHg7CisgICAgaW50MTZfdCBpLCBqOwogICAgIGZvciAoaSA9IDE7IGkgPCBuOyArK2kpCiAgICAgewogICAgICAgICB0ZW1wX2lkeCA9IGFbaV07CkBAIC0xNTU3LDE1ICsxNTU3LDE1IEBACiAqKiBEZXNjcmlwdGlvbiAgVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgTURMIGNvbmZpZ3VyYXRpb24gaW5kZXggYmFzZWQgb24KICoqICAgICAgICAgICAgICB0aGUgTURMIElECiAqKgotKiogUmV0dXJucyAgICAgIEJPT0xFQU4gLSBUUlVFIGZvdW5kCi0qKiAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIG5vdCBmb3VuZAorKiogUmV0dXJucyAgICAgIGJvb2wgLSB0cnVlIGZvdW5kCisqKiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIG5vdCBmb3VuZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICBidGFfaGxfY29tcGFjdF9tZGxfY2ZnX3RpbWUoVUlOVDggYXBwX2lkeCwgVUlOVDggbWRlcF9pZCkKK3ZvaWQgIGJ0YV9obF9jb21wYWN0X21kbF9jZmdfdGltZSh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWRlcF9pZCkKIHsKICAgICB0QlRBX0hMX01ETF9DRkcgICAgICpwX21kbDsKLSAgICBVSU5UOCBpLCB0aW1lX21pbiwgY250PTA7Ci0gICAgVUlOVDggICBzX2FycltCVEFfSExfTlVNX01ETF9DRkdTXTsKKyAgICB1aW50OF90IGksIHRpbWVfbWluLCBjbnQ9MDsKKyAgICB1aW50OF90ICAgc19hcnJbQlRBX0hMX05VTV9NRExfQ0ZHU107CiAKIAogICAgIGZvciAoaT0wOyBpPCBCVEFfSExfTlVNX01ETF9DRkdTOyBpKyspCkBAIC0xNTgwLDcgKzE1ODAsNyBAQAogCiAKIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9jb21wYWN0X21kbF9jZmdfdGltZSBjbnQ9JWQgIixjbnQgKTsKICNlbmRpZgogCkBAIC0xNjA5LDE2ICsxNjA5LDE2IEBACiAqKiBEZXNjcmlwdGlvbiAgVGhpcyBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciB0aGUgTURMIElECiAqKiAgICAgICAgICAgICAgaGFzIGFscmVhZHkgZXhpc3RlZCBpbiB0ZWggTUNMIG9yIG5vdAogKioKLSoqIFJldHVybnMgICAgICBCT09MRUFOIC0gVFJVRSBleGlzdAotKiogICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBkb2VzIG5vdCBleGlzdAorKiogUmV0dXJucyAgICAgIGJvb2wgLSB0cnVlIGV4aXN0CisqKiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIGRvZXMgbm90IGV4aXN0CiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gIGJ0YV9obF9pc19tZGxfZXhzaXRfaW5fbWNsKFVJTlQ4IGFwcF9pZHgsIEJEX0FERFIgYmRfYWRkciwKK2Jvb2wgIGJ0YV9obF9pc19tZGxfZXhzaXRfaW5fbWNsKHVpbnQ4X3QgYXBwX2lkeCwgQkRfQUREUiBiZF9hZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9NRExfSUQgbWRsX2lkKQogewogICAgIHRCVEFfSExfTURMX0NGRyAgICAgKnBfbWRsOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgZm91bmQgPSBGQUxTRTsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGk7CisgICAgYm9vbCAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBpOwogCiAgICAgZm9yIChpID0gMDsgaTwgQlRBX0hMX05VTV9NRExfQ0ZHUzsgaSsrKQogICAgIHsKQEAgLTE2MzAsMTMgKzE2MzAsMTMgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAocF9tZGwtPm1kbF9pZCA9PSBtZGxfaWQpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE2NTEsMTYgKzE2NTEsMTYgQEAKICoqCiAqKiBEZXNjcmlwdGlvbiAgVGhpcyBmdW5jdGlvbiBkZWxldGUgdGhlIHNwZWNpZmllZCBNREwgSUQKICoqCi0qKiBSZXR1cm5zICAgICAgQk9PTEVBTiAtIFRSVUUgU3VjY2VzcwotKiogICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBGYWlsZWQKKyoqIFJldHVybnMgICAgICBib29sIC0gdHJ1ZSBTdWNjZXNzCisqKiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIEZhaWxlZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOICBidGFfaGxfZGVsZXRlX21kbF9jZmcoVUlOVDggYXBwX2lkeCwgQkRfQUREUiBiZF9hZGRyLAorYm9vbCAgYnRhX2hsX2RlbGV0ZV9tZGxfY2ZnKHVpbnQ4X3QgYXBwX2lkeCwgQkRfQUREUiBiZF9hZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfTURMX0lEIG1kbF9pZCkKIHsKICAgICB0QlRBX0hMX01ETF9DRkcgICAgICpwX21kbDsKLSAgICBCT09MRUFOICAgICAgICAgICAgIHN1Y2Nlc3MgPSBGQUxTRTsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGk7CisgICAgYm9vbCAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIGk7CiAKICAgICBmb3IgKGkgPSAwOyBpPCBCVEFfSExfTlVNX01ETF9DRkdTOyBpKyspCiAgICAgewpAQCAtMTY3NCw3ICsxNjc0LDcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGJ0YV9obF9jb19kZWxldGVfbWRsKHBfbWRsLT5sb2NhbF9tZGVwX2lkLCBpKTsKICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHBfbWRsLCAwLCBzaXplb2YodEJUQV9ITF9NRExfQ0ZHKSk7Ci0gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTY4Miw3ICsxNjgyLDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBidGFfaGxfY29fZGVsZXRlX21kbChwX21kbC0+bG9jYWxfbWRlcF9pZCwgaSk7CiAgICAgICAgICAgICAgICAgbWVtc2V0KHBfbWRsLCAwLCBzaXplb2YodEJUQV9ITF9NRExfQ0ZHKSk7Ci0gICAgICAgICAgICAgICAgc3VjY2VzcyA9IFRSVUU7CisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNjk4LDggKzE2OTgsOCBAQAogKioKICoqIERlc2NyaXB0aW9uICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGUgc3BlY2lmaWVkIE1ETCBJRCBpcyBpbiB2YWxpZCByYW5nZSBvciBub3QKICoqCi0qKiBSZXR1cm5zICAgICAgQk9PTEVBTiAtIFRSVUUgU3VjY2VzcwotKiogICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBGYWlsZWQKKyoqIFJldHVybnMgICAgICBib29sIC0gdHJ1ZSBTdWNjZXNzCisqKiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIEZhaWxlZAogKioKICoqIG5vdGU6ICAgbWRsX2lkIHJhbmdlICAgMHgwMDAwIHJlc2VydmVkLAogKiogICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEtb3hGRUZGIGR5bmFtaWMgcmFuZ2UsCkBAIC0xNzA3LDkgKzE3MDcsOSBAQAogKiogICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYgaW5kaWNhdGVzIGFsbCBNRExzIChmb3IgZGVsZXRlIG9wZXJhdGlvbiBvbmx5KQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOICBidGFfaGxfaXNfbWRsX3ZhbHVlX3ZhbGlkKHRCVEFfSExfTURMX0lEIG1kbF9pZCkKK2Jvb2wgIGJ0YV9obF9pc19tZGxfdmFsdWVfdmFsaWQodEJUQV9ITF9NRExfSUQgbWRsX2lkKQogewotICAgIEJPT0xFQU4gICAgICAgICAgICAgc3RhdHVzID0gVFJVRTsKKyAgICBib29sICAgICAgICAgICAgIHN0YXR1cyA9IHRydWU7CiAKICAgICBpZiAobWRsX2lkICE9IEJUQV9ITF9ERUxFVEVfQUxMX01ETF9JRFMpCiAgICAgewpAQCAtMTcxNywxMiArMTcxNywxMiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAobWRsX2lkID4gQlRBX0hMX01BWF9NRExfVkFMICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IEZBTFNFOworICAgICAgICAgICAgc3RhdHVzID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE3MzYsMjkgKzE3MzYsMjkgQEAKICoqIERlc2NyaXB0aW9uICBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBNREVQIGNvbmZpZ3VyYXRpb24gaW5kZXggYmFzZWQKICoqICAgICAgICAgICAgICAgIG9uIHRoZSBsb2NhbCBNREVQIElECiAqKgotKiogUmV0dXJucyAgICAgIEJPT0xFQU4gLSBUUlVFIGZvdW5kCi0qKiAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIG5vdCBmb3VuZAorKiogUmV0dXJucyAgICAgIGJvb2wgLSB0cnVlIGZvdW5kCisqKiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIG5vdCBmb3VuZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9obF9maW5kX21kZXBfY2ZnX2lkeChVSU5UOCBhcHBfaWR4LCAgdEJUQV9ITF9NREVQX0lEIGxvY2FsX21kZXBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9tZGVwX2NmZ19pZHgpCitib29sIGJ0YV9obF9maW5kX21kZXBfY2ZnX2lkeCh1aW50OF90IGFwcF9pZHgsICB0QlRBX0hMX01ERVBfSUQgbG9jYWxfbWRlcF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfbWRlcF9jZmdfaWR4KQogewogICAgIHRCVEFfSExfQVBQX0NCICAgICAgKnBfYWNiID0gQlRBX0hMX0dFVF9BUFBfQ0JfUFRSKGFwcF9pZHgpOwogICAgIHRCVEFfSExfU1VQX0ZFQVRVUkUgICAgICpwX3N1cF9mZWF0dXJlPSAmcF9hY2ItPnN1cF9mZWF0dXJlOwotICAgIEJPT0xFQU4gZm91bmQgPUZBTFNFOwotICAgIFVJTlQ4IGk7CisgICAgYm9vbCBmb3VuZCA9ZmFsc2U7CisgICAgdWludDhfdCBpOwogCiAgICAgZm9yIChpPTA7IGk8IHBfc3VwX2ZlYXR1cmUtPm51bV9vZl9tZGVwczsgaSsrKQogICAgIHsKICAgICAgICAgaWYgKCBwX3N1cF9mZWF0dXJlLT5tZGVwW2ldLm1kZXBfaWQgPT0gbG9jYWxfbWRlcF9pZCkKICAgICAgICAgewotICAgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgKnBfbWRlcF9jZmdfaWR4ID0gaTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCi0jaWYgQlRBX0hMX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgaWYgKCFmb3VuZCkKICAgICB7CiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9maW5kX21kZXBfY2ZnX2lkeCBmb3VuZD0lZCBtZGVwX2lkeD0lZCBsb2NhbF9tZGVwX2lkPSVkICIsCkBAIC0xNzc5LDE0ICsxNzc5LDE0IEBACiAqKiBSZXR1cm5zICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9obF9maW5kX3J4dHhfYXBkdV9zaXplKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1kZXBfY2ZnX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2ICpwX3J4X2FwdV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgKnBfdHhfYXB1X3NpemUpCit2b2lkIGJ0YV9obF9maW5kX3J4dHhfYXBkdV9zaXplKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtZGVwX2NmZ19pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpwX3J4X2FwdV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqcF90eF9hcHVfc2l6ZSkKIHsKICAgICB0QlRBX0hMX0FQUF9DQiAgICAgICpwX2FjYiA9IEJUQV9ITF9HRVRfQVBQX0NCX1BUUihhcHBfaWR4KTsKICAgICB0QlRBX0hMX01ERVBfQ0ZHICAgICAqcF9tZGVwX2NmZzsKLSAgICBVSU5UOCBpOwotICAgIFVJTlQxNiBtYXhfcnhfYXBkdV9zaXplPTAsIG1heF90eF9hcGR1X3NpemU9MDsKKyAgICB1aW50OF90IGk7CisgICAgdWludDE2X3QgbWF4X3J4X2FwZHVfc2l6ZT0wLCBtYXhfdHhfYXBkdV9zaXplPTA7CiAKICAgICBwX21kZXBfY2ZnID0gJnBfYWNiLT5zdXBfZmVhdHVyZS5tZGVwW21kZXBfY2ZnX2lkeF0ubWRlcF9jZmc7CiAKQEAgLTE4MDksNyArMTgwOSw3IEBACiAgICAgKnBfcnhfYXB1X3NpemUgPSBtYXhfcnhfYXBkdV9zaXplOwogICAgICpwX3R4X2FwdV9zaXplID0gbWF4X3R4X2FwZHVfc2l6ZTsKIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9maW5kX3J4dHhfYXBkdV9zaXplIG1heF9yeF9hcGR1X3NpemU9JWQgbWF4X3R4X2FwZHVfc2l6ZT0lZCAiLAogICAgICAgICAgICAgICAgICAgICAgIG1heF9yeF9hcGR1X3NpemUsIG1heF90eF9hcGR1X3NpemUgKTsKICNlbmRpZgpAQCAtMTgyMywyNyArMTgyMywyNyBAQAogKioKICoqIERlc2NyaXB0aW9uICBUaGlzIGZ1bmN0aW9uIHZhbGlkYXRlcyB0aGUgcGVlciBEQ0ggY29uZmlndXJhdGlvbgogKioKLSoqIFJldHVybnMgICAgICBCT09MRUFOIC0gVFJVRSB2YWxpZGF0aW9uIGlzIHN1Y2Nlc3NmdWwKLSoqICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgdmFsaWRhdGlvbiBmYWlsZWQKKyoqIFJldHVybnMgICAgICBib29sIC0gdHJ1ZSB2YWxpZGF0aW9uIGlzIHN1Y2Nlc3NmdWwKKyoqICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgdmFsaWRhdGlvbiBmYWlsZWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfaGxfdmFsaWRhdGVfcGVlcl9jZmcoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgVUlOVDggbWRsX2lkeCwKK2Jvb2wgYnRhX2hsX3ZhbGlkYXRlX3BlZXJfY2ZnKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX01ERVBfSUQgcGVlcl9tZGVwX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9NREVQX1JPTEUgcGVlcl9tZGVwX3JvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBzZHBfaWR4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzZHBfaWR4KQogewogICAgIHRCVEFfSExfTUNMX0NCICAgICAgKnBfbWNiID0gQlRBX0hMX0dFVF9NQ0xfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgpOwogICAgIHRCVEFfSExfTURMX0NCICAgICAgKnBfZGNiID0gQlRBX0hMX0dFVF9NRExfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgsIG1kbF9pZHgpOwogICAgIHRCVEFfSExfU0RQX1JFQyAgICAgKnBfcmVjOwotICAgIEJPT0xFQU4gcGVlcl9mb3VuZCA9RkFMU0U7Ci0gICAgVUlOVDggaTsKKyAgICBib29sIHBlZXJfZm91bmQgPWZhbHNlOworICAgIHVpbnQ4X3QgaTsKIAogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF92YWxpZGF0ZV9wZWVyX2NmZyBzZHBfaWR4PSVkIGFwcF9pZHggJWQiLCBzZHBfaWR4LCBhcHBfaWR4KTsKIAogCiAgICAgaWYgKHBfZGNiLT5sb2NhbF9tZGVwX2lkID09IEJUQV9ITF9FQ0hPX1RFU1RfTURFUF9JRCkKICAgICB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICBwX3JlYyA9ICZwX21jYi0+c2RwLnNkcF9yZWNbc2RwX2lkeF07CkBAIC0xODU1LDEzICsxODU1LDEzIEBACiAgICAgICAgIGlmICggKHBfcmVjLT5tZGVwX2NmZ1tpXS5tZGVwX2lkID09IHBlZXJfbWRlcF9pZCkgJiYKICAgICAgICAgICAgICAocF9yZWMtPm1kZXBfY2ZnW2ldLm1kZXBfcm9sZSA9PSBwZWVyX21kZXBfcm9sZSkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHBlZXJfZm91bmQgPSBUUlVFOworICAgICAgICAgICAgcGVlcl9mb3VuZCA9IHRydWU7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCi0jaWYgQlRBX0hMX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgaWYgKCFwZWVyX2ZvdW5kKQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hsX3ZhbGlkYXRlX3BlZXJfY2ZnIGZhaWxlZCBudW1fbWRlcHM9JWQiLHBfcmVjLT5udW1fbWRlcHMpOwpAQCAtMTg4Miw4ICsxODgyLDggQEAKICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsaWFibGUgRENIIGNvbmZpZ3VyYXRpb24KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9ITF9TVEFUVVMgYnRhX2hsX2Noa19sb2NhbF9jZmcoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4IG1kZXBfY2ZnX2lkeCwKK3RCVEFfSExfU1RBVFVTIGJ0YV9obF9jaGtfbG9jYWxfY2ZnKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtZGVwX2NmZ19pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0RDSF9DRkcgbG9jYWxfY2ZnKQogewogICAgIHRCVEFfSExfQVBQX0NCICAgICAgKnBfYWNiID0gQlRBX0hMX0dFVF9BUFBfQ0JfUFRSKGFwcF9pZHgpOwpAQCAtMTkwOCwzMSArMTkwOCwzMSBAQAogKioKICoqIERlc2NyaXB0aW9uICBUaGlzIGZ1bmN0aW9uIHZhbGlkYXRlcyB0aGUgcmVjb25uZWN0IHBhcmFtZXRlcnMKICoqCi0qKiBSZXR1cm5zICAgICAgQk9PTEVBTiAtIFRSVUUgdmFsaWRhdGlvbiBpcyBzdWNjZXNzZnVsCi0qKiAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIHZhbGlkYXRpb24gZmFpbGVkCisqKiBSZXR1cm5zICAgICAgYm9vbCAtIHRydWUgdmFsaWRhdGlvbiBpcyBzdWNjZXNzZnVsCisqKiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIHZhbGlkYXRpb24gZmFpbGVkCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfaGxfdmFsaWRhdGVfcmVjb25uZWN0X3BhcmFtcyhVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LAorYm9vbCBidGFfaGxfdmFsaWRhdGVfcmVjb25uZWN0X3BhcmFtcyh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9BUElfRENIX1JFQ09OTkVDVCAqcF9yZWNvbm5lY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4ICpwX21kZXBfY2ZnX2lkeCwgVUlOVDggKnBfbWRsX2NmZ19pZHgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfbWRlcF9jZmdfaWR4LCB1aW50OF90ICpwX21kbF9jZmdfaWR4KQogewogICAgIHRCVEFfSExfQVBQX0NCICAgICAgKnBfYWNiID0gQlRBX0hMX0dFVF9BUFBfQ0JfUFRSKGFwcF9pZHgpOwogICAgIHRCVEFfSExfU1VQX0ZFQVRVUkUgKnBfc3VwX2ZlYXR1cmUgPSAmcF9hY2ItPnN1cF9mZWF0dXJlOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgbnVtX21kZXBzOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgbWRsX2NmZ19pZHg7Ci0gICAgQk9PTEVBTiBsb2NhbF9tZGVwX2lkX2ZvdW5kID1GQUxTRTsKLSAgICBCT09MRUFOIG1kbF9jZmdfZm91bmQgPUZBTFNFOwotICAgIEJPT0xFQU4gICAgICAgICAgICBzdGF0dXM9RkFMU0U7Ci0gICAgVUlOVDggaSwgaW5fdXNlX21kbF9pZHggPSAwOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBudW1fbWRlcHM7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIG1kbF9jZmdfaWR4OworICAgIGJvb2wgbG9jYWxfbWRlcF9pZF9mb3VuZCA9ZmFsc2U7CisgICAgYm9vbCBtZGxfY2ZnX2ZvdW5kID1mYWxzZTsKKyAgICBib29sICAgICAgICAgICAgc3RhdHVzPWZhbHNlOworICAgIHVpbnQ4X3QgaSwgaW5fdXNlX21kbF9pZHggPSAwOwogCi0jaWYgQlRBX0hMX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hsX3ZhbGlkYXRlX3JlY29ubmVjdF9wYXJhbXMgIG1kbF9pZD0lZCBhcHBfaWR4PSVkIiwgcF9yZWNvbm5lY3QtPm1kbF9pZCwgYXBwX2lkeCk7CiAjZW5kaWYKICAgICBpZiAoYnRhX2hsX2ZpbmRfbWRsX2NmZ19pZHgoYXBwX2lkeCwgbWNsX2lkeCwgcF9yZWNvbm5lY3QtPm1kbF9pZCwgJm1kbF9jZmdfaWR4KSkKICAgICB7Ci0gICAgICAgIG1kbF9jZmdfZm91bmQgPSBUUlVFOworICAgICAgICBtZGxfY2ZnX2ZvdW5kID0gdHJ1ZTsKICAgICB9CiAKLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBpZiAoIW1kbF9jZmdfZm91bmQpCiAgICAgewogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJtZGxfY2ZnX2ZvdW5kIG5vdCBmb3VuZCIpOwpAQCAtMTk0Nyw3ICsxOTQ3LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBwX3N1cF9mZWF0dXJlLT5tZGVwW2ldLm1kZXBfaWQgPT0gcF9hY2ItPm1kbF9jZmdbbWRsX2NmZ19pZHhdLmxvY2FsX21kZXBfaWQpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9jYWxfbWRlcF9pZF9mb3VuZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgbG9jYWxfbWRlcF9pZF9mb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgKnBfbWRlcF9jZmdfaWR4ID1pOwogICAgICAgICAgICAgICAgICpwX21kbF9jZmdfaWR4ID0gbWRsX2NmZ19pZHg7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xOTU1LDcgKzE5NTUsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0jaWYgQlRBX0hMX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgaWYgKCFsb2NhbF9tZGVwX2lkX2ZvdW5kKQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygibG9jYWxfbWRlcF9pZCBub3QgZm91bmQiKTsKQEAgLTE5NjcsNyArMTk2Nyw3IEBACiAgICAgewogICAgICAgICBpZiAoIWJ0YV9obF9maW5kX21kbF9pZHgoYXBwX2lkeCxtY2xfaWR4LCBwX3JlY29ubmVjdC0+bWRsX2lkLCAmaW5fdXNlX21kbF9pZHgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0dXM9IFRSVUU7CisgICAgICAgICAgICBzdGF0dXM9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CkBAIC0xOTc1LDcgKzE5NzUsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0jaWYgQlRBX0hMX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgaWYgKCFzdGF0dXMpCiAgICAgewogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJSZWNvbm5lY3QgdmFsaWRhdGlvbiBmYWlsZWQgbG9jYWxfbWRlcF9pZCBmb3VuZD0lZCBtZGxfY2ZnX2lkeCBmb3VuZD0lZCBpbl91c2VfbWRsX2lkeD0lZCAiLApAQCAtMTk4OSwyNiArMTk4OSwyNiBAQAogKioKICoqIEZ1bmN0aW9uICAgICAgYnRhX2hsX2ZpbmRfYXZhaWxfbWNsX2lkeAogKioKLSoqIFJldHVybnMgICAgICBCT09MRUFOIC0gVFJVRSBmb3VuZAotKiogICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBub3QgZm91bmQKKyoqIFJldHVybnMgICAgICBib29sIC0gdHJ1ZSBmb3VuZAorKiogICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBub3QgZm91bmQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfaGxfZmluZF9hdmFpbF9tY2xfaWR4KFVJTlQ4IGFwcF9pZHgsIFVJTlQ4ICpwX21jbF9pZHgpCitib29sIGJ0YV9obF9maW5kX2F2YWlsX21jbF9pZHgodWludDhfdCBhcHBfaWR4LCB1aW50OF90ICpwX21jbF9pZHgpCiB7Ci0gICAgQk9PTEVBTiBmb3VuZD1GQUxTRTsKLSAgICBVSU5UOCBpOworICAgIGJvb2wgZm91bmQ9ZmFsc2U7CisgICAgdWludDhfdCBpOwogCiAgICAgZm9yIChpPTA7IGkgPCBCVEFfSExfTlVNX01DTFMgOyBpICsrKQogICAgIHsKICAgICAgICAgaWYgKCFidGFfaGxfY2IuYWNiW2FwcF9pZHhdLm1jYltpXS5pbl91c2UpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICpwX21jbF9pZHggPSBpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBpZiAoIWZvdW5kKQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hsX2ZpbmRfYXZhaWxfbWNsX2lkeCBmb3VuZD0lZCBpZHg9JWQiLApAQCAtMjAyNiwyOSArMjAyNiwyOSBAQAogKioKICoqIERlc2NyaXB0aW9uICBUaGlzIGZ1bmN0aW9uIGZpbmRzIGFuIGF2YWlsYWJsZSBNREwgY29udHJvbCBibG9jayBpbmRleAogKioKLSoqIFJldHVybnMgICAgICBCT09MRUFOIC0gVFJVRSBmb3VuZAotKiogICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBub3QgZm91bmQKKyoqIFJldHVybnMgICAgICBib29sIC0gdHJ1ZSBmb3VuZAorKiogICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBub3QgZm91bmQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfaGxfZmluZF9hdmFpbF9tZGxfaWR4KFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfbWRsX2lkeCkKK2Jvb2wgYnRhX2hsX2ZpbmRfYXZhaWxfbWRsX2lkeCh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwX21kbF9pZHgpCiB7CiAgICAgdEJUQV9ITF9NQ0xfQ0IgICAgICAqcF9tY2IgPSBCVEFfSExfR0VUX01DTF9DQl9QVFIoYXBwX2lkeCwgbWNsX2lkeCk7Ci0gICAgQk9PTEVBTiBmb3VuZD1GQUxTRTsKLSAgICBVSU5UOCBpOworICAgIGJvb2wgZm91bmQ9ZmFsc2U7CisgICAgdWludDhfdCBpOwogCiAgICAgZm9yIChpPTA7IGkgPCBCVEFfSExfTlVNX01ETFNfUEVSX01DTCA7IGkgKyspCiAgICAgewogICAgICAgICBpZiAoIXBfbWNiLT5tZGxbaV0uaW5fdXNlKQogICAgICAgICB7CiAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKikmcF9tY2ItPm1kbFtpXSwwLCBzaXplb2YodEJUQV9ITF9NRExfQ0IpKTsKLSAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICpwX21kbF9pZHggPSBpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBpZiAoIWZvdW5kKQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hsX2ZpbmRfYXZhaWxfbWRsX2lkeCBmb3VuZD0lZCBpZHg9JWQiLApAQCAtMjA2NCwyNiArMjA2NCwyNiBAQAogKioKICoqIERlc2NyaXB0aW9uICBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBhcHBsaWNhdGlvbiBoYXMgYmVlbiB1c2VkIG9yIG5vdAogKioKLSoqIFJldHVybnMgICAgICBCT09MRUFOIC0gVFJVRSB0aGUgYXBwX2lkIGlzIGEgZHVwbGljYXRlIElECi0qKiAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIG5vdCBhIGR1cGxpY2F0ZSBJRAorKiogUmV0dXJucyAgICAgIGJvb2wgLSB0cnVlIHRoZSBhcHBfaWQgaXMgYSBkdXBsaWNhdGUgSUQKKyoqICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2Ugbm90IGEgZHVwbGljYXRlIElECiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfaGxfaXNfYV9kdXBsaWNhdGVfaWQoVUlOVDggYXBwX2lkKQorYm9vbCBidGFfaGxfaXNfYV9kdXBsaWNhdGVfaWQodWludDhfdCBhcHBfaWQpCiB7Ci0gICAgQk9PTEVBTiBpc19kdXBsaWNhdGU9RkFMU0U7Ci0gICAgVUlOVDggaTsKKyAgICBib29sIGlzX2R1cGxpY2F0ZT1mYWxzZTsKKyAgICB1aW50OF90IGk7CiAKICAgICBmb3IgKGk9MDsgaSA8IEJUQV9ITF9OVU1fQVBQUyA7IGkgKyspCiAgICAgewogICAgICAgICBpZiAoYnRhX2hsX2NiLmFjYltpXS5pbl91c2UgJiYKICAgICAgICAgICAgIChidGFfaGxfY2IuYWNiW2ldLmFwcF9pZCA9PSBhcHBfaWQpKQogICAgICAgICB7Ci0gICAgICAgICAgICBpc19kdXBsaWNhdGUgPSBUUlVFOworICAgICAgICAgICAgaXNfZHVwbGljYXRlID0gdHJ1ZTsKIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBpZiAoaXNfZHVwbGljYXRlKQogICAgIHsKIApAQCAtMjEwMiwyNiArMjEwMiwyNiBAQAogKioKICoqIERlc2NyaXB0aW9uICBUaGlzIGZ1bmN0aW9uIGZpbmRzIGFuIGF2YWlsYWJsZSBhcHBsaWNhdGlvbiBjb250cm9sIGJsb2NrIGluZGV4CiAqKgotKiogUmV0dXJucyAgICAgIEJPT0xFQU4gLSBUUlVFIGZvdW5kCi0qKiAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIG5vdCBmb3VuZAorKiogUmV0dXJucyAgICAgIGJvb2wgLSB0cnVlIGZvdW5kCisqKiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIG5vdCBmb3VuZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9obF9maW5kX2F2YWlsX2FwcF9pZHgoVUlOVDggKnBfaWR4KQorYm9vbCBidGFfaGxfZmluZF9hdmFpbF9hcHBfaWR4KHVpbnQ4X3QgKnBfaWR4KQogewotICAgIEJPT0xFQU4gZm91bmQ9RkFMU0U7Ci0gICAgVUlOVDggaTsKKyAgICBib29sIGZvdW5kPWZhbHNlOworICAgIHVpbnQ4X3QgaTsKIAogICAgIGZvciAoaT0wOyBpIDwgQlRBX0hMX05VTV9BUFBTIDsgaSArKykKICAgICB7CiAgICAgICAgIGlmICghYnRhX2hsX2NiLmFjYltpXS5pbl91c2UpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICpwX2lkeCA9IGk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIGlmICghZm91bmQpCiAgICAgewogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGxfZmluZF9hdmFpbF9hcHBfaWR4IGZvdW5kPSVkIGFwcF9pZHg9JWQiLApAQCAtMjE0MCwxNiArMjE0MCwxNiBAQAogKiogUmV0dXJucyAgICAgIHRCVEFfSExfU1RBVFVTIC1yZWdpc3RyYXRpb24gc3RhdHVzCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSExfU1RBVFVTIGJ0YV9obF9hcHBfdXBkYXRlKFVJTlQ4IGFwcF9pZCwgQk9PTEVBTiBpc19yZWdpc3RlcikKK3RCVEFfSExfU1RBVFVTIGJ0YV9obF9hcHBfdXBkYXRlKHVpbnQ4X3QgYXBwX2lkLCBib29sIGlzX3JlZ2lzdGVyKQogewogICAgIHRCVEFfSExfU1RBVFVTICBzdGF0dXMgPSBCVEFfSExfU1RBVFVTX09LOwogICAgIHRCVEFfSExfQVBQX0NCICAqcF9hY2IgPSBCVEFfSExfR0VUX0FQUF9DQl9QVFIoMCk7CiAgICAgdE1DQV9DUyAgICAgICAgIG1jYV9jczsKLSAgICBVSU5UOCAgICAgICAgICAgaSwgbWRlcF9pZHgsIG51bV9vZl9tZGVwczsKLSAgICBVSU5UOCAgICAgICAgICAgbWRlcF9jb3VudGVyID0gMDsKKyAgICB1aW50OF90ICAgICAgICAgICBpLCBtZGVwX2lkeCwgbnVtX29mX21kZXBzOworICAgIHVpbnQ4X3QgICAgICAgICAgIG1kZXBfY291bnRlciA9IDA7CiAKIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9hcHBfdXBkYXRlIGFwcF9pZD0lZCIsIGFwcF9pZCk7CiAjZW5kaWYKIApAQCAtMjMwMSwxNiArMjMwMSwxNiBAQAogKiogUmV0dXJucyAgICAgIHRCVEFfSExfU1RBVFVTIC1yZWdpc3RyYXRpb24gc3RhdHVzCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSExfU1RBVFVTIGJ0YV9obF9hcHBfcmVnaXN0cmF0aW9uKFVJTlQ4IGFwcF9pZHgpCit0QlRBX0hMX1NUQVRVUyBidGFfaGxfYXBwX3JlZ2lzdHJhdGlvbih1aW50OF90IGFwcF9pZHgpCiB7CiAgICAgdEJUQV9ITF9TVEFUVVMgIHN0YXR1cyA9IEJUQV9ITF9TVEFUVVNfT0s7CiAgICAgdEJUQV9ITF9BUFBfQ0IgICpwX2FjYiA9IEJUQV9ITF9HRVRfQVBQX0NCX1BUUihhcHBfaWR4KTsKICAgICB0TUNBX1JFRyAgICAgICAgcmVnOwogICAgIHRNQ0FfQ1MgICAgICAgICBtY2FfY3M7Ci0gICAgVUlOVDggICAgICAgICAgIGksIG51bV9vZl9tZGVwczsKLSAgICBVSU5UOCAgICAgICAgICAgbWRlcF9jb3VudGVyID0gMDsKKyAgICB1aW50OF90ICAgICAgICAgICBpLCBudW1fb2ZfbWRlcHM7CisgICAgdWludDhfdCAgICAgICAgICAgbWRlcF9jb3VudGVyID0gMDsKIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9hcHBfcmVnaXN0cmF0aW9uIGFwcF9pZHg9JWQiLCBhcHBfaWR4KTsKICNlbmRpZgogCkBAIC0yNDQyLDEwICsyNDQyLDEwIEBACiAqKiBSZXR1cm5zICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hsX2Rpc2NhcmRfZGF0YShVSU5UMTYgZXZlbnQsIHRCVEFfSExfREFUQSAqcF9kYXRhKQordm9pZCBidGFfaGxfZGlzY2FyZF9kYXRhKHVpbnQxNl90IGV2ZW50LCB0QlRBX0hMX0RBVEEgKnBfZGF0YSkKIHsKIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfRVJST1IoIkJUQSBITCBEaXNjYXJkIGV2ZW50PSVzIixidGFfaGxfZXZ0X2NvZGUoZXZlbnQpKTsKIAogI2VuZGlmCkBAIC0yNDc0LDI1ICsyNDc0LDI1IEBACiAqKiBSZXR1cm5zICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hsX3NhdmVfbWRsX2NmZyhVSU5UOCBhcHBfaWR4LCBVSU5UOCBtY2xfaWR4LCBVSU5UOCBtZGxfaWR4ICkKK3ZvaWQgYnRhX2hsX3NhdmVfbWRsX2NmZyh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdWludDhfdCBtZGxfaWR4ICkKIHsKICAgICB0QlRBX0hMX0FQUF9DQiAgICAgICpwX2FjYiAgPSBCVEFfSExfR0VUX0FQUF9DQl9QVFIoYXBwX2lkeCk7CiAgICAgdEJUQV9ITF9NQ0xfQ0IgICAgICAqcF9tY2IgID0gQlRBX0hMX0dFVF9NQ0xfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgpOwogICAgIHRCVEFfSExfTURMX0NCICAgICAgKnBfZGNiICA9IEJUQV9ITF9HRVRfTURMX0NCX1BUUihhcHBfaWR4LCBtY2xfaWR4LCBtZGxfaWR4KTsKLSAgICBVSU5UOCBtZGxfY2ZnX2lkeDsKKyAgICB1aW50OF90IG1kbF9jZmdfaWR4OwogICAgIHRCVEFfSExfTURMX0lEIG1kbF9pZDsKLSAgICBCT09MRUFOICAgICAgZm91bmQ9VFJVRTsKKyAgICBib29sICAgICAgZm91bmQ9dHJ1ZTsKICAgICB0QlRBX0hMX01ETF9DRkcgbWRsX2NmZzsKICAgICB0QlRBX0hMX01ERVAgKnBfbWRlcF9jZmc7CiAgICAgdEJUQV9ITF9MMkNBUF9DRkdfSU5GTyBsMmNhcF9jZmc7Ci0gICAgVUlOVDggdGltZV92YWwgPSAwOworICAgIHVpbnQ4X3QgdGltZV92YWwgPSAwOwogICAgIG1kbF9pZCA9IHBfZGNiLT5tZGxfaWQ7CiAgICAgaWYgKCFidGFfaGxfZmluZF9tZGxfY2ZnX2lkeChhcHBfaWR4LCBtY2xfaWR4LCBtZGxfaWQsICZtZGxfY2ZnX2lkeCkpCiAgICAgewogICAgICAgICBpZiAoIWJ0YV9obF9maW5kX2F2YWlsX21kbF9jZmdfaWR4KGFwcF9pZHgsIG1jbF9pZHgsICZtZGxfY2ZnX2lkeCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIEFQUExfVFJBQ0VfRVJST1IoIk5vIHNwYWNlIHRvIHNhdmUgdGhlIE1ETCBjb25maWciKTsKLSAgICAgICAgICAgIGZvdW5kPSBGQUxTRTsgLypubyBzcGFjZSBhdmFpbGFibGUqLworICAgICAgICAgICAgZm91bmQ9IGZhbHNlOyAvKm5vIHNwYWNlIGF2YWlsYWJsZSovCiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI1MDQsNyArMjUwNCw3IEBACiAgICAgICAgICAgICBidGFfaGxfY29tcGFjdF9tZGxfY2ZnX3RpbWUoYXBwX2lkeCxwX2RjYi0+bG9jYWxfbWRlcF9pZCk7CiAgICAgICAgICAgICBidGFfaGxfZ2V0X2N1cl90aW1lKGFwcF9pZHgsICZ0aW1lX3ZhbCk7CiAgICAgICAgIH0KLSAgICAgICAgbWRsX2NmZy5hY3RpdmUgPSBUUlVFOworICAgICAgICBtZGxfY2ZnLmFjdGl2ZSA9IHRydWU7CiAgICAgICAgIG1kbF9jZmcudGltZSA9IHRpbWVfdmFsOwogICAgICAgICBtZGxfY2ZnLm1kbF9pZCAgPSBwX2RjYi0+bWRsX2lkOwogICAgICAgICBtZGxfY2ZnLmRjaF9tb2RlID0gcF9kY2ItPmRjaF9tb2RlOwpAQCAtMjUxOSw3ICsyNTE5LDcgQEAKICAgICAgICAgYnRhX2hsX2NvX3NhdmVfbWRsKG1kbF9jZmcubG9jYWxfbWRlcF9pZCwgbWRsX2NmZ19pZHgsICZtZGxfY2ZnKTsKICAgICB9CiAKLSNpZiBCVEFfSExfREVCVUcgPT0gVFJVRQorI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKICAgICBpZiAoZm91bmQpCiAgICAgewogICAgICAgICBpZiAocF9kY2ItPm10dSAhPSBsMmNhcF9jZmcubXR1KQpAQCAtMjU0NSwxMyArMjU0NSwxMyBAQAogKioKICoqIFJldHVybnMgICAgIHZvaWQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9obF9zZXRfZGNoX2NoYW5fY2ZnKFVJTlQ4IGFwcF9pZHgsIFVJTlQ4IG1jbF9pZHgsIFVJTlQ4IG1kbF9pZHgsdEJUQV9ITF9EQVRBICpwX2RhdGEpCit2b2lkIGJ0YV9obF9zZXRfZGNoX2NoYW5fY2ZnKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgsdEJUQV9ITF9EQVRBICpwX2RhdGEpCiB7CiAgICAgdEJUQV9ITF9BUFBfQ0IgKnBfYWNiICA9IEJUQV9ITF9HRVRfQVBQX0NCX1BUUihhcHBfaWR4KTsKICAgICB0QlRBX0hMX01ETF9DQiAqcF9kY2IgID0gQlRBX0hMX0dFVF9NRExfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgsIG1kbF9pZHgpOwotICAgIFVJTlQ4IGwyY2FwX21vZGUgPSBMMkNBUF9GQ1JfRVJUTV9NT0RFOworICAgIHVpbnQ4X3QgbDJjYXBfbW9kZSA9IEwyQ0FQX0ZDUl9FUlRNX01PREU7CiAgICAgdEJUQV9ITF9TVVBfRkVBVFVSRSAqcF9zdXBfZmVhdHVyZT0gJnBfYWNiLT5zdXBfZmVhdHVyZTsKLSAgICBVSU5UOCBsb2NhbF9tZGVwX2NmZ19pZHggPSBwX2RjYi0+bG9jYWxfbWRlcF9jZmdfaWR4OworICAgIHVpbnQ4X3QgbG9jYWxfbWRlcF9jZmdfaWR4ID0gcF9kY2ItPmxvY2FsX21kZXBfY2ZnX2lkeDsKIAogICAgIHN3aXRjaCAocF9kY2ItPmRjaF9vcGVyKQogICAgIHsKQEAgLTI2MDAsNyArMjYwMCw3IEBACiAgICAgICAgIHBfZGNiLT5jaG5sX2NmZy5mY3MgPSBCVEFfSExfTUNBX1VTRV9GQ1M7CiAgICAgfQogCi0jaWYgQlRBX0hMX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiTDJDQVAgUGFyYW1zIGwyY2FwX21vZGVbMy1FUlRNIDQtU1RSRUFNXT0lZCIsIGwyY2FwX21vZGUpOwogICAgIEFQUExfVFJBQ0VfREVCVUcoIlVzZSBGQ1MgPSVzIG10dT0lZCIsICgocF9kY2ItPmNobmxfY2ZnLmZjcyAmIDEpPyJZRVMiOiJOTyIpLAogICAgICAgICAgICAgICAgICAgICAgIHBfZGNiLT5jaG5sX2NmZy5kYXRhX210dSk7CkBAIC0yNjM0LDEyICsyNjM0LDEyIEBACiAqKgogKiogRGVzY3JpcHRpb24gICAgVGhpcyBmdW5jdGlvbiBnZXQgdGhlIGN1cnJlbnQgTDJDQVAgY2hhbm5lbCBjb25maWd1cmF0aW9uCiAqKgotKiogUmV0dXJucyAgICAgQk9PTEVBTiAtIFRSVUUgLSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bAorKiogUmV0dXJucyAgICAgYm9vbCAtIHRydWUgLSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX2hsX2dldF9sMmNhcF9jZmcodEJUQV9ITF9NRExfSEFORExFIG1kbF9obmQsIHRCVEFfSExfTDJDQVBfQ0ZHX0lORk8gKnBfY2ZnKQorYm9vbCBidGFfaGxfZ2V0X2wyY2FwX2NmZyh0QlRBX0hMX01ETF9IQU5ETEUgbWRsX2huZCwgdEJUQV9ITF9MMkNBUF9DRkdfSU5GTyAqcF9jZmcpCiB7Ci0gICAgQk9PTEVBTiBzdWNjZXNzID0gRkFMU0U7Ci0gICAgVUlOVDE2IGxjaWQ7CisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgICAgdWludDE2X3QgbGNpZDsKICAgICB0TDJDQVBfQ0ZHX0lORk8gKnBfb3VyX2NmZzsKICAgICB0TDJDQVBfQ0hfQ0ZHX0JJVFMgb3VyX2NmZ19iaXRzOwogICAgIHRMMkNBUF9DRkdfSU5GTyAqcF9wZWVyX2NmZzsKQEAgLTI2ODEsNyArMjY4MSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHBfY2ZnLT5tdHUgPSBMMkNBUF9ERUZBVUxUX01UVTsKICAgICAgICAgfQotICAgICAgICBzdWNjZXNzID0gVFJVRTsKKyAgICAgICAgc3VjY2VzcyA9IHRydWU7CiAgICAgfQogICAgIGVsc2UKICAgICB7CkBAIC0yNjg5LDcgKzI2ODksNyBAQAogICAgICAgcF9jZmctPmZjcyA9IEJUQV9ITF9MMkNfTk9fRkNTOwogICAgIH0KIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIGlmICghc3VjY2VzcykKICAgICB7CiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9nZXRfbDJjYXBfY2ZnIHN1Y2Nlc3M9JWQgbWRsPSVkIGxjaWQ9JWQiLCBzdWNjZXNzLCBtZGxfaG5kLCBsY2lkKTsKQEAgLTI3MDYsMTYgKzI3MDYsMTYgQEAKICoqCiAqKiBEZXNjcmlwdGlvbiAgICBUaGlzIGZ1bmN0aW9uIHZhbGlkYXRlcyB0aGUgTDJDQVAgY2hhbm5lbCBjb25maWd1cmF0aW9uCiAqKgotKiogUmV0dXJucyAgICAgQk9PTEVBTiAtIFRSVUUgLSB2YWxpZGF0aW9uIGlzIHN1Y2Nlc3NmdWwKKyoqIFJldHVybnMgICAgIGJvb2wgLSB0cnVlIC0gdmFsaWRhdGlvbiBpcyBzdWNjZXNzZnVsCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfaGxfdmFsaWRhdGVfY2hhbl9jZmcoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgVUlOVDggbWRsX2lkeCkKK2Jvb2wgYnRhX2hsX3ZhbGlkYXRlX2NoYW5fY2ZnKHVpbnQ4X3QgYXBwX2lkeCwgdWludDhfdCBtY2xfaWR4LCB1aW50OF90IG1kbF9pZHgpCiB7CiAgICAgdEJUQV9ITF9BUFBfQ0IgKnBfYWNiICA9IEJUQV9ITF9HRVRfQVBQX0NCX1BUUihhcHBfaWR4KTsKICAgICB0QlRBX0hMX01ETF9DQiAqcF9kY2IgID0gQlRBX0hMX0dFVF9NRExfQ0JfUFRSKGFwcF9pZHgsIG1jbF9pZHgsIG1kbF9pZHgpOwotICAgIEJPT0xFQU4gc3VjY2VzcyA9IEZBTFNFOwotICAgIFVJTlQ4IG1kbF9jZmdfaWR4ID0gMDsKKyAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICB1aW50OF90IG1kbF9jZmdfaWR4ID0gMDsKICAgICB0QlRBX0hMX0wyQ0FQX0NGR19JTkZPIGwyY2FwX2NmZzsKLSAgICBCT09MRUFOIGdldF9sMmNhcF9yZXN1bHQsIGdldF9tZGxfcmVzdWx0OworICAgIGJvb2wgZ2V0X2wyY2FwX3Jlc3VsdCwgZ2V0X21kbF9yZXN1bHQ7CiAKICAgICBnZXRfbDJjYXBfcmVzdWx0ID0gYnRhX2hsX2dldF9sMmNhcF9jZmcocF9kY2ItPm1kbF9oYW5kbGUsICZsMmNhcF9jZmcpOwogICAgIGdldF9tZGxfcmVzdWx0ID0gYnRhX2hsX2ZpbmRfbWRsX2NmZ19pZHgoYXBwX2lkeCwgbWNsX2lkeCwgcF9kY2ItPm1kbF9pZCwgJm1kbF9jZmdfaWR4KTsKQEAgLTI3MjYsMTIgKzI3MjYsMTIgQEAKICAgICAgICAgICAgIChwX2FjYi0+bWRsX2NmZ1ttZGxfY2ZnX2lkeF0uZmNzID09IGwyY2FwX2NmZy5mY3MpICYmCiAgICAgICAgICAgICAocF9hY2ItPm1kbF9jZmdbbWRsX2NmZ19pZHhdLmRjaF9tb2RlID09IHBfZGNiLT5kY2hfbW9kZSkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHN1Y2Nlc3MgPSBUUlVFOworICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKIAotI2lmIEJUQV9ITF9ERUJVRyA9PSBUUlVFCisjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogCiAgICAgaWYgKHBfZGNiLT5tdHUgIT0gbDJjYXBfY2ZnLm10dSkKICAgICB7CkBAIC0yNzU4LDE2ICsyNzU4LDE2IEBACiAqKgogKiogRGVzY3JpcHRpb24gICAgVGhpcyBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciB0aGUgY29uZ2VzdGlvbiBjb25kaXRpb24gaXMgb24gb3Igbm90CiAqKgotKiogUmV0dXJucyAgICAgIEJPT0xFQU4gLSBUUlVFIERDSCBpcyBjb25nZXN0ZWQKLSoqICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0Ugbm90IGNvbmdlc3RlZAorKiogUmV0dXJucyAgICAgIGJvb2wgLSB0cnVlIERDSCBpcyBjb25nZXN0ZWQKKyoqICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2Ugbm90IGNvbmdlc3RlZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOICBidGFfaGxfaXNfY29uZ19vbihVSU5UOCBhcHBfaWQsIEJEX0FERFIgYmRfYWRkciwgdEJUQV9ITF9NRExfSUQgbWRsX2lkKQorYm9vbCAgYnRhX2hsX2lzX2Nvbmdfb24odWludDhfdCBhcHBfaWQsIEJEX0FERFIgYmRfYWRkciwgdEJUQV9ITF9NRExfSUQgbWRsX2lkKQogCiB7CiAgICAgdEJUQV9ITF9NRExfQ0IgICAgICAqcF9kY2I7Ci0gICAgVUlOVDggICBhcHBfaWR4ID0gMCwgbWNsX2lkeCwgbWRsX2lkeDsKLSAgICBCT09MRUFOIGNvbmdfc3RhdHVzID0gVFJVRTsKKyAgICB1aW50OF90ICAgYXBwX2lkeCA9IDAsIG1jbF9pZHgsIG1kbF9pZHg7CisgICAgYm9vbCBjb25nX3N0YXR1cyA9IHRydWU7CiAKICAgICBpZiAoYnRhX2hsX2ZpbmRfYXBwX2lkeChhcHBfaWQsICZhcHBfaWR4KSkKICAgICB7CkBAIC0yNzkzLDExICsyNzkzLDExIEBACiAqKgogKiogUmV0dXJucyAgICAgIHZvaWQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9obF9jaGVja19jY2hfY2xvc2UoVUlOVDggYXBwX2lkeCwgVUlOVDggbWNsX2lkeCwgdEJUQV9ITF9EQVRBICpwX2RhdGEsIEJPT0xFQU4gY2hlY2tfZGNoX3NldHVwICkKK3ZvaWQgYnRhX2hsX2NoZWNrX2NjaF9jbG9zZSh1aW50OF90IGFwcF9pZHgsIHVpbnQ4X3QgbWNsX2lkeCwgdEJUQV9ITF9EQVRBICpwX2RhdGEsIGJvb2wgY2hlY2tfZGNoX3NldHVwICkKIHsKICAgICB0QlRBX0hMX01DTF9DQiAgICAgICpwX21jYiAgPSBCVEFfSExfR0VUX01DTF9DQl9QVFIoYXBwX2lkeCwgbWNsX2lkeCk7CiAgICAgdEJUQV9ITF9NRExfQ0IgICAgICAqcF9kY2I7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBtZGxfaWR4OworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBtZGxfaWR4OwogCiAjaWYgKEJUQV9ITF9ERUJVRyA9PSBUUlVFKQogICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9obF9jaGVja19jY2hfY2xvc2UgY2NoX2Nsb3NlX2RjaF9vcGVyPSVkIixwX21jYi0+Y2NoX2Nsb3NlX2RjaF9vcGVyICk7CkBAIC0yODQ2LDEyICsyODQ2LDEyIEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGxfY2xlYW5fYXBwKFVJTlQ4IGFwcF9pZHgpCit2b2lkIGJ0YV9obF9jbGVhbl9hcHAodWludDhfdCBhcHBfaWR4KQogewogICAgIHRCVEFfSExfQVBQX0NCICAgICAgICAgKnBfYWNiICAgPSBCVEFfSExfR0VUX0FQUF9DQl9QVFIoYXBwX2lkeCk7CiAgICAgaW50IGksIG51bV9hY3RfYXBwcz0wOwogCi0jaWYgQlRBX0hMX0RFQlVHID09IFRSVUUKKyNpZiAoQlRBX0hMX0RFQlVHID09IFRSVUUpCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hsX2NsZWFuX2FwcCIpOwogI2VuZGlmCiAgICAgTUNBX0RlcmVnaXN0ZXIoKHRNQ0FfSEFORExFKXBfYWNiLT5hcHBfaGFuZGxlKTsKQEAgLTI4ODIsMTEgKzI4ODIsMTEgQEAKICoqCiAqKiBSZXR1cm5zICAgICAgdm9pZAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hsX2NoZWNrX2RlcmVnaXN0cmF0aW9uKFVJTlQ4IGFwcF9pZHgsIHRCVEFfSExfREFUQSAqcF9kYXRhICkKK3ZvaWQgYnRhX2hsX2NoZWNrX2RlcmVnaXN0cmF0aW9uKHVpbnQ4X3QgYXBwX2lkeCwgdEJUQV9ITF9EQVRBICpwX2RhdGEgKQogewogICAgIHRCVEFfSExfQVBQX0NCICAgICAgKnBfYWNiICA9IEJUQV9ITF9HRVRfQVBQX0NCX1BUUihhcHBfaWR4KTsKICAgICB0QlRBX0hMX01DTF9DQiAgICAgICpwX21jYjsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIG1jbF9pZHg7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIG1jbF9pZHg7CiAgICAgdEJUQV9ITCAgICAgICAgICAgICBldnRfZGF0YTsKIAogI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKQEAgLTI5MDEsMTAgKzI5MDEsMTAgQEAKICAgICAgICAgICAgIGlmIChwX21jYi0+Y2NoX29wZXIgIT0gQlRBX0hMX0NDSF9PUF9MT0NBTF9DTE9TRSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAocF9tY2ItPmNjaF9zdGF0ZSA9PSBCVEFfSExfQ0NIX09QRU5JTkdfU1QpCi0gICAgICAgICAgICAgICAgICAgIHBfbWNiLT5mb3JjZV9jbG9zZV9sb2NhbF9jY2hfb3BlbmluZyA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHBfbWNiLT5mb3JjZV9jbG9zZV9sb2NhbF9jY2hfb3BlbmluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgcF9tY2ItPmNjaF9vcGVyID0gQlRBX0hMX0NDSF9PUF9MT0NBTF9DTE9TRTsKICAgICAgICAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJwX21jYi0+Zm9yY2VfY2xvc2VfbG9jYWxfY2NoX29wZW5pbmc9JWQiLCBwX21jYi0+Zm9yY2VfY2xvc2VfbG9jYWxfY2NoX29wZW5pbmcgICk7Ci0gICAgICAgICAgICAgICAgYnRhX2hsX2NoZWNrX2NjaF9jbG9zZShhcHBfaWR4LG1jbF9pZHgscF9kYXRhLCBUUlVFKTsKKyAgICAgICAgICAgICAgICBidGFfaGxfY2hlY2tfY2NoX2Nsb3NlKGFwcF9pZHgsbWNsX2lkeCxwX2RhdGEsIHRydWUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UKQEAgLTI5MzUsNyArMjkzNSw3IEBACiB7CiAgICAgdEJUQV9ITF9DQiAgICAgICAgICAqcF9jYj0gJmJ0YV9obF9jYjsKICAgICB0QlRBX0hMX0FQUF9DQiAgICAgICpwX2FjYjsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGFwcF9pZHg7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIGFwcF9pZHg7CiAgICAgdEJUQV9ITF9DVFJMICAgICAgICBldnRfZGF0YTsKIAogI2lmIChCVEFfSExfREVCVUcgPT0gVFJVRSkKQEAgLTI5NDksNyArMjk0OSw3IEBACiAgICAgICAgICAgICBwX2FjYiAgPSBCVEFfSExfR0VUX0FQUF9DQl9QVFIoYXBwX2lkeCk7CiAgICAgICAgICAgICBpZiAoIXBfYWNiLT5kZXJlZ2lzdGVyaW5nKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBfYWNiLT5kZXJlZ2lzdGVyaW5nID0gVFJVRTsKKyAgICAgICAgICAgICAgICBwX2FjYi0+ZGVyZWdpc3RlcmluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnRhX2hsX2NoZWNrX2RlcmVnaXN0cmF0aW9uKGFwcF9pZHgsIHBfZGF0YSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTMwMzMsNyArMzAzMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0FQUF9IQU5ETEUgYXBwX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfTUNMX0hBTkRMRSBtY2xfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9NRExfSEFORExFIG1kbF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MRUFOIGludGVudGlvbmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbnRlbnRpb25hbCkKIHsKICAgICBwX2V2dF9kYXRhLT5kY2hfY2xvc2VfaW5kLm1kbF9oYW5kbGUgPSBtZGxfaGFuZGxlOwogICAgIHBfZXZ0X2RhdGEtPmRjaF9jbG9zZV9pbmQubWNsX2hhbmRsZSA9IG1jbF9oYW5kbGU7CkBAIC0zMDkzLDcgKzMwOTMsNyBAQAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkICBidGFfaGxfYnVpbGRfY2NoX29wZW5fY2ZtKHRCVEFfSEwgKnBfZXZ0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4IGFwcF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhcHBfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfQVBQX0hBTkRMRSBhcHBfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX01DTF9IQU5ETEUgbWNsX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRfQUREUiBiZF9hZGRyLApAQCAtMzE1OCw3ICszMTU4LDcgQEAKIHZvaWQgIGJ0YV9obF9idWlsZF9jY2hfY2xvc2VfaW5kKHRCVEFfSEwgKnBfZXZ0X2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0FQUF9IQU5ETEUgYXBwX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfTUNMX0hBTkRMRSBtY2xfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTEVBTiBpbnRlbnRpb25hbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW50ZW50aW9uYWwpCiB7CiAgICAgcF9ldnRfZGF0YS0+Y2NoX2Nsb3NlX2luZC5tY2xfaGFuZGxlID0gbWNsX2hhbmRsZTsKICAgICBwX2V2dF9kYXRhLT5jY2hfY2xvc2VfaW5kLmFwcF9oYW5kbGUgPSBhcHBfaGFuZGxlOwpAQCAtMzE4MSw4ICszMTgxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9NREVQX0lEIGxvY2FsX21kZXBfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfTURMX0lEIG1kbF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9EQ0hfTU9ERSBkY2hfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTEVBTiBmaXJzdF9yZWxpYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IG10dSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmaXJzdF9yZWxpYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbXR1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX1NUQVRVUyBzdGF0dXMpCiAKIHsKQEAgLTMyMDgsNyArMzIwOCw3IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgIGJ0YV9obF9idWlsZF9zZHBfcXVlcnlfY2ZtKHRCVEFfSEwgKnBfZXZ0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBhcHBfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFwcF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfQVBQX0hBTkRMRSBhcHBfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRfQUREUiBiZF9hZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9TRFAgKnBfc2RwLApkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX2FnX2FwaS5oIGIvYnRhL2luY2x1ZGUvYnRhX2FnX2FwaS5oCmluZGV4IGJlZGY2NDYuLmMxODBkNTggMTAwNjQ0Ci0tLSBhL2J0YS9pbmNsdWRlL2J0YV9hZ19hcGkuaAorKysgYi9idGEvaW5jbHVkZS9idGFfYWdfYXBpLmgKQEAgLTUzLDEzICs1MywxMyBAQAogI2RlZmluZSBCVEFfQUdfRkVBVF9OT1NDTyAgIDB4MDAwNDAwMDAgICAvKiBObyBTQ08gY29udHJvbCBwZXJmb3JtZWQgYnkgQlRBIEFHICovCiAjZGVmaW5lIEJUQV9BR19GRUFUX05PX0VTQ08gMHgwMDA4MDAwMCAgIC8qIERvIG5vdCBhbGxvdyBvciB1c2UgZVNDTyAqLwogCi10eXBlZGVmIFVJTlQzMiB0QlRBX0FHX0ZFQVQ7Cit0eXBlZGVmIHVpbnQzMl90IHRCVEFfQUdfRkVBVDsKIAogLyogQUcgcGFyc2UgbW9kZSAqLwogI2RlZmluZSBCVEFfQUdfUEFSU0UgICAgICAgICAgICAwIC8qIFBlcmZvcm0gQVQgY29tbWFuZCBwYXJzaW5nIGluIEFHICovCi0jZGVmaW5lIEJUQV9BR19QQVNTX1RIUk9VR0ggICAgIDEgLyogUGFzcyBkYXRhIGRpcmVjdGx5IHRvIHBob25lknMgQVQgY29tbWFuZCBpbnRlcnByZXRlciAqLworI2RlZmluZSBCVEFfQUdfUEFTU19USFJPVUdIICAgICAxIC8qIFBhc3MgZGF0YSBkaXJlY3RseSB0byBwaG9uZSdzIEFUIGNvbW1hbmQgaW50ZXJwcmV0ZXIgKi8KIAotdHlwZWRlZiBVSU5UOCB0QlRBX0FHX1BBUlNFX01PREU7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9BR19QQVJTRV9NT0RFOwogCiAvKiBBRyBvcGVuIHN0YXR1cyAqLwogI2RlZmluZSBCVEFfQUdfU1VDQ0VTUyAgICAgICAgICAwIC8qIENvbm5lY3Rpb24gc3VjY2Vzc2Z1bGx5IG9wZW5lZCAqLwpAQCAtNjcsNyArNjcsNyBAQAogI2RlZmluZSBCVEFfQUdfRkFJTF9SRkNPTU0gICAgICAyIC8qIE9wZW4gZmFpbGVkIGR1ZSB0byBSRkNPTU0gKi8KICNkZWZpbmUgQlRBX0FHX0ZBSUxfUkVTT1VSQ0VTICAgMyAvKiBvdXQgb2YgcmVzb3VyY2VzIGZhaWx1cmUgICovCiAKLXR5cGVkZWYgVUlOVDggdEJUQV9BR19TVEFUVVM7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9BR19TVEFUVVM7CiAKIC8qIGhhbmRsZSB2YWx1ZXMgdXNlZCB3aXRoIEJUQV9BZ1Jlc3VsdCAqLwogI2RlZmluZSBCVEFfQUdfSEFORExFX05PTkUgICAgICAwCkBAIC0xMDMsNyArMTAzLDcgQEAKICNkZWZpbmUgQlRBX0FHX1VOQVRfUkVTICAgICAgICAgICAgIDIwICAvKiBSZXNwb25zZSB0byB1bmtub3duIEFUIGNvbW1hbmQgZXZlbnQgKi8KICNkZWZpbmUgQlRBX0FHX01VTFRJX0NBTExfUkVTICAgICAgIDIxICAvKiBTTEMgYXQgdGhyZWUgd2F5IGNhbGwgKi8KIAotdHlwZWRlZiBVSU5UOCB0QlRBX0FHX1JFUzsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0FHX1JFUzsKIAogLyogSEZQIHBlZXIgZmVhdHVyZXMgKi8KICNkZWZpbmUgQlRBX0FHX1BFRVJfRkVBVF9FQ05SICAgICAgIDB4MDAwMSAgLyogRWNobyBjYW5jZWxsYXRpb24gYW5kL29yIG5vaXNlIHJlZHVjdGlvbiAqLwpAQCAtMTE2LDcgKzExNiw3IEBACiAjZGVmaW5lIEJUQV9BR19QRUVSX0ZFQVRfQ09ERUMgICAgICAweDAwODAgIC8qIENvZGVjIE5lZ290aWF0aW9uICovCiAjZGVmaW5lIEJUQV9BR19QRUVSX0ZFQVRfVk9JUCAgICAgICAweDAxMDAgIC8qIFZvSVAgY2FsbCAqLwogCi10eXBlZGVmIFVJTlQxNiB0QlRBX0FHX1BFRVJfRkVBVDsKK3R5cGVkZWYgdWludDE2X3QgdEJUQV9BR19QRUVSX0ZFQVQ7CiAKIC8qIEhGUCBwZWVyIHN1cHBvcnRlZCBjb2RlYyBtYXNrcyAqLwogLy8gVE9ETyhnb29nbGUpIFRoaXMgc2hvdWxkIHVzZSBjb21tb24gZGVmaW5pdGlvbnMKQEAgLTEyNCw3ICsxMjQsNyBAQAogI2RlZmluZSBCVEFfQUdfQ09ERUNfTk9ORSAgICAgICAgICAgQlRNX1NDT19DT0RFQ19OT05FCiAjZGVmaW5lIEJUQV9BR19DT0RFQ19DVlNEICAgICAgICAgICBCVE1fU0NPX0NPREVDX0NWU0QgICAgICAvKiBDVlNEICovCiAjZGVmaW5lIEJUQV9BR19DT0RFQ19NU0JDICAgICAgICAgICBCVE1fU0NPX0NPREVDX01TQkMgICAgICAvKiBtU0JDICovCi10eXBlZGVmIFVJTlQxNiB0QlRBX0FHX1BFRVJfQ09ERUM7Cit0eXBlZGVmIHVpbnQxNl90IHRCVEFfQUdfUEVFUl9DT0RFQzsKIAogLyogSEZQIGVycmNvZGUgLSBTZXQgd2hlbiBCVEFfQUdfT0tfRVJST1IgaXMgcmV0dXJuZWQgaW4gJ29rX2ZsYWcnICovCiAjZGVmaW5lIEJUQV9BR19FUlJfUEhPTkVfRkFJTFVSRSAgICAwICAgICAgIC8qIFBob25lIEZhaWx1cmUgKi8KQEAgLTIwOCw4ICsyMDgsOCBAQAogLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0FHX0lORF9SRVMgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDE2ICAgICAgICAgIGlkOwotICAgIFVJTlQxNiAgICAgICAgICB2YWx1ZTsKKyAgICB1aW50MTZfdCAgICAgICAgICBpZDsKKyAgICB1aW50MTZfdCAgICAgICAgICB2YWx1ZTsKIH0gdEJUQV9BR19JTkQ7CiAKIC8qIGRhdGEgdHlwZSBmb3IgQlRBX0FnUmVzdWx0KCkgKi8KQEAgLTIxNywxMSArMjE3LDExIEBACiB7CiAgICAgY2hhciAgICAgICAgICAgIHN0cltCVEFfQUdfQVRfTUFYX0xFTisxXTsKICAgICB0QlRBX0FHX0lORCAgICAgaW5kOwotICAgIFVJTlQxNiAgICAgICAgICBudW07Ci0gICAgVUlOVDE2ICAgICAgICAgIGF1ZGlvX2hhbmRsZTsKLSAgICBVSU5UMTYgICAgICAgICAgZXJyY29kZTsgICAgICAgIC8qIFZhbGlkIG9ubHkgaWYgJ29rX2ZsYWcnIGlzIHNldCB0byBCVEFfQUdfT0tfRVJST1IgKi8KLSAgICBVSU5UOCAgICAgICAgICAgb2tfZmxhZzsgICAgICAgIC8qIEluZGljYXRlcyBpZiByZXNwb25zZSBpcyBmaW5pc2hlZCwgYW5kIGlmIGVycm9yIG9jY3VycmVkICovCi0gICAgQk9PTEVBTiAgICAgICAgIHN0YXRlOworICAgIHVpbnQxNl90ICAgICAgICAgIG51bTsKKyAgICB1aW50MTZfdCAgICAgICAgICBhdWRpb19oYW5kbGU7CisgICAgdWludDE2X3QgICAgICAgICAgZXJyY29kZTsgICAgICAgIC8qIFZhbGlkIG9ubHkgaWYgJ29rX2ZsYWcnIGlzIHNldCB0byBCVEFfQUdfT0tfRVJST1IgKi8KKyAgICB1aW50OF90ICAgICAgICAgICBva19mbGFnOyAgICAgICAgLyogSW5kaWNhdGVzIGlmIHJlc3BvbnNlIGlzIGZpbmlzaGVkLCBhbmQgaWYgZXJyb3Igb2NjdXJyZWQgKi8KKyAgICBib29sICAgICAgICAgc3RhdGU7CiB9IHRCVEFfQUdfUkVTX0RBVEE7CiAKIC8qIEFHIGNhbGxiYWNrIGV2ZW50cyAqLwpAQCAtMjM2LDcgKzIzNiw3IEBACiAjZGVmaW5lIEJUQV9BR19NSUNfRVZUICAgICAgICAgIDggIC8qIE1pY3JvcGhvbmUgdm9sdW1lIGNoYW5nZWQgKi8KICNkZWZpbmUgQlRBX0FHX0FUX0NLUERfRVZUICAgICAgOSAgLyogQ0tQRCBmcm9tIHRoZSBIUyAqLwogI2RlZmluZSBCVEFfQUdfRElTQUJMRV9FVlQgICAgICAzMCAvKiBBRyBkaXNhYmxlZCAgICAgICAqLwotI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUgKQorI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUpCiAjZGVmaW5lIEJUQV9BR19XQlNfRVZUICAgICAgICAgIDMxIC8qIFNDTyBjb2RlYyBpbmZvICovCiAjZW5kaWYKIC8qIFZhbHVlcyBiZWxvdyBhcmUgZm9yIEhGUCBvbmx5ICovCkBAIC0yNTksMTMgKzI1OSwxMyBAQAogI2RlZmluZSBCVEFfQUdfQVRfQkFDX0VWVCAgICAgICAyNiAvKiBhdmFibGFibGUgY29kZWMgKi8KICNkZWZpbmUgQlRBX0FHX0FUX0JDU19FVlQgICAgICAgMjcgLyogQ29kZWMgc2VsZWN0ICovCiAKLXR5cGVkZWYgVUlOVDggdEJUQV9BR19FVlQ7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9BR19FVlQ7CiAKIC8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIG1vc3Qgbm9uLUFUIGV2ZW50cyAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIGhhbmRsZTsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGFwcF9pZDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgaGFuZGxlOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBhcHBfaWQ7CiAgICAgdEJUQV9BR19TVEFUVVMgICAgICBzdGF0dXM7CiB9IHRCVEFfQUdfSERSOwogCkBAIC0zMDcsOCArMzA3LDggQEAKICAgICB0QlRBX0FHX0hEUiAgICAgICAgIGhkcjsKICAgICBCRF9BRERSICAgICAgICAgICAgIGJkX2FkZHI7CiAgICAgY2hhciAgICAgICAgICAgICAgICBzdHJbQlRBX0FHX0FUX01BWF9MRU4rMV07Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBudW07Ci0gICAgVUlOVDggICAgICAgICAgICAgICBpZHg7ICAgIC8qIGNhbGwgbnVtYmVyIHVzZWQgYnkgQ0xDQyBhbmQgQ0hMRCAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBudW07CisgICAgdWludDhfdCAgICAgICAgICAgICAgIGlkeDsgICAgLyogY2FsbCBudW1iZXIgdXNlZCBieSBDTENDIGFuZCBDSExEICovCiB9IHRCVEFfQUdfVkFMOwogCiAvKiB1bmlvbiBvZiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBBRyBjYWxsYmFjayAqLwpAQCAtMzc2LDggKzM3Niw4IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIGNoYXIgICAgICAgICAqY2luZF9pbmZvOwotICAgIElOVDMyICAgICAgICBjb25uX3RvdXQ7Ci0gICAgVUlOVDE2ICAgICAgIHNjb19wa3RfdHlwZXM7CisgICAgaW50MzJfdCAgICAgICAgY29ubl90b3V0OworICAgIHVpbnQxNl90ICAgICAgIHNjb19wa3RfdHlwZXM7CiAgICAgY2hhciAgICAgICAgICpjaGxkX3ZhbF9lY2M7CiAgICAgY2hhciAgICAgICAgICpjaGxkX3ZhbDsKIH0gdEJUQV9BR19DRkc7CkBAIC00MjQsNyArNDI0LDcgQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBCVEFfQWdSZWdpc3Rlcih0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlcywgdEJUQV9TRUMgc2VjX21hc2ssCi0gICAgICAgICAgICAgICAgICAgIHRCVEFfQUdfRkVBVCBmZWF0dXJlcywgY29uc3QgY2hhciAqcF9zZXJ2aWNlX25hbWVzW10sIFVJTlQ4IGFwcF9pZCk7CisgICAgICAgICAgICAgICAgICAgIHRCVEFfQUdfRkVBVCBmZWF0dXJlcywgY29uc3QgY2hhciAqcF9zZXJ2aWNlX25hbWVzW10sIHVpbnQ4X3QgYXBwX2lkKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC00MzYsNyArNDM2LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BZ0RlcmVnaXN0ZXIoVUlOVDE2IGhhbmRsZSk7Cit2b2lkIEJUQV9BZ0RlcmVnaXN0ZXIodWludDE2X3QgaGFuZGxlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC00NTEsNyArNDUxLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BZ09wZW4oVUlOVDE2IGhhbmRsZSwgQkRfQUREUiBiZF9hZGRyLCB0QlRBX1NFQyBzZWNfbWFzaywgdEJUQV9TRVJWSUNFX01BU0sgc2VydmljZXMpOwordm9pZCBCVEFfQWdPcGVuKHVpbnQxNl90IGhhbmRsZSwgQkRfQUREUiBiZF9hZGRyLCB0QlRBX1NFQyBzZWNfbWFzaywgdEJUQV9TRVJWSUNFX01BU0sgc2VydmljZXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTQ2NCw3ICs0NjQsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0FnQ2xvc2UoVUlOVDE2IGhhbmRsZSk7Cit2b2lkIEJUQV9BZ0Nsb3NlKHVpbnQxNl90IGhhbmRsZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtNDc3LDcgKzQ3Nyw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQWdBdWRpb09wZW4oVUlOVDE2IGhhbmRsZSk7Cit2b2lkIEJUQV9BZ0F1ZGlvT3Blbih1aW50MTZfdCBoYW5kbGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTQ5MCw3ICs0OTAsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0FnQXVkaW9DbG9zZShVSU5UMTYgaGFuZGxlKTsKK3ZvaWQgQlRBX0FnQXVkaW9DbG9zZSh1aW50MTZfdCBoYW5kbGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTUwNCw3ICs1MDQsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0FnUmVzdWx0KFVJTlQxNiBoYW5kbGUsIHRCVEFfQUdfUkVTIHJlc3VsdCwgdEJUQV9BR19SRVNfREFUQSAqcF9kYXRhKTsKK3ZvaWQgQlRBX0FnUmVzdWx0KHVpbnQxNl90IGhhbmRsZSwgdEJUQV9BR19SRVMgcmVzdWx0LCB0QlRBX0FHX1JFU19EQVRBICpwX2RhdGEpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTUxOCw3ICs1MTgsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0FnU2V0Q29kZWMoVUlOVDE2IGhhbmRsZSwgdEJUQV9BR19QRUVSX0NPREVDIGNvZGVjKTsKK3ZvaWQgQlRBX0FnU2V0Q29kZWModWludDE2X3QgaGFuZGxlLCB0QlRBX0FHX1BFRVJfQ09ERUMgY29kZWMpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL2J0YS9pbmNsdWRlL2J0YV9hZ19jaS5oIGIvYnRhL2luY2x1ZGUvYnRhX2FnX2NpLmgKaW5kZXggOWViMmIyNS4uNGMyYTRmZiAxMDA2NDQKLS0tIGEvYnRhL2luY2x1ZGUvYnRhX2FnX2NpLmgKKysrIGIvYnRhL2luY2x1ZGUvYnRhX2FnX2NpLmgKQEAgLTQ1LDcgKzQ1LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfYWdfY2lfcnhfd3JpdGUoVUlOVDE2IGhhbmRsZSwgY2hhciAqcF9kYXRhLCBVSU5UMTYgbGVuKTsKK2V4dGVybiB2b2lkIGJ0YV9hZ19jaV9yeF93cml0ZSh1aW50MTZfdCBoYW5kbGUsIGNoYXIgKnBfZGF0YSwgdWludDE2X3QgbGVuKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTU4LDcgKzU4LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9hZ19jaV9zbGNfcmVhZHkoVUlOVDE2IGhhbmRsZSk7CitleHRlcm4gdm9pZCBidGFfYWdfY2lfc2xjX3JlYWR5KHVpbnQxNl90IGhhbmRsZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC03MCw3ICs3MCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfYWdfY2lfd2JzX2NvbW1hbmQgKFVJTlQxNiBoYW5kbGUsIGNoYXIgKnBfZGF0YSwgVUlOVDE2IGxlbik7CitleHRlcm4gdm9pZCBidGFfYWdfY2lfd2JzX2NvbW1hbmQgKHVpbnQxNl90IGhhbmRsZSwgY2hhciAqcF9kYXRhLCB1aW50MTZfdCBsZW4pOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL2J0YS9pbmNsdWRlL2J0YV9hZ19jby5oIGIvYnRhL2luY2x1ZGUvYnRhX2FnX2NvLmgKaW5kZXggNmY2NjFlMC4uYjVkNTZiNCAxMDA2NDQKLS0tIGEvYnRhL2luY2x1ZGUvYnRhX2FnX2NvLmgKKysrIGIvYnRhL2luY2x1ZGUvYnRhX2FnX2NvLmgKQEAgLTYzLDEyICs2MywxMiBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFICkKLWV4dGVybiB2b2lkIGJ0YV9hZ19jb19hdWRpb19zdGF0ZShVSU5UMTYgaGFuZGxlLCBVSU5UOCBhcHBfaWQsIFVJTlQ4IHN0YXRlLAorI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUpCitleHRlcm4gdm9pZCBidGFfYWdfY29fYXVkaW9fc3RhdGUodWludDE2X3QgaGFuZGxlLCB1aW50OF90IGFwcF9pZCwgdWludDhfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQUdfUEVFUl9DT0RFQyBjb2RlYyk7CiAKICNlbHNlCi1leHRlcm4gdm9pZCBidGFfYWdfY29fYXVkaW9fc3RhdGUoVUlOVDE2IGhhbmRsZSwgVUlOVDggYXBwX2lkLCBVSU5UOCBzdGF0ZSk7CitleHRlcm4gdm9pZCBidGFfYWdfY29fYXVkaW9fc3RhdGUodWludDE2X3QgaGFuZGxlLCB1aW50OF90IGFwcF9pZCwgdWludDhfdCBzdGF0ZSk7CiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTg0LDcgKzg0LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfYWdfY29fZGF0YV9vcGVuKFVJTlQxNiBoYW5kbGUsIHRCVEFfU0VSVklDRV9JRCBzZXJ2aWNlKTsKK2V4dGVybiB2b2lkIGJ0YV9hZ19jb19kYXRhX29wZW4odWludDE2X3QgaGFuZGxlLCB0QlRBX1NFUlZJQ0VfSUQgc2VydmljZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtOTcsNyArOTcsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9hZ19jb19kYXRhX2Nsb3NlKFVJTlQxNiBoYW5kbGUpOworZXh0ZXJuIHZvaWQgYnRhX2FnX2NvX2RhdGFfY2xvc2UodWludDE2X3QgaGFuZGxlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0xMDYsMTIgKzEwNiwxMiBAQAogKiogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgQUcgdG8gc2VuZCBkYXRhIHRvIHRoZQogKiogICAgICAgICAgICAgICAgICBwaG9uZSB3aGVuIHRoZSBBRyBpcyBjb25maWd1cmVkIGZvciBBVCBjb21tYW5kIHBhc3MtdGhyb3VnaC4KICoqICAgICAgICAgICAgICAgICAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gbXVzdCBjb3B5IHRoZSBkYXRhIHRvCi0qKiAgICAgICAgICAgICAgICAgIHRoZSBwaG9uZZJzIG1lbW9yeS4KKyoqICAgICAgICAgICAgICAgICAgdGhlIHBob25lJ3MgbWVtb3J5LgogKioKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfYWdfY29fdHhfd3JpdGUoVUlOVDE2IGhhbmRsZSwgVUlOVDggKnBfZGF0YSwgVUlOVDE2IGxlbik7CitleHRlcm4gdm9pZCBidGFfYWdfY29fdHhfd3JpdGUodWludDE2X3QgaGFuZGxlLCB1aW50OF90ICpwX2RhdGEsIHVpbnQxNl90IGxlbik7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX2FwaS5oIGIvYnRhL2luY2x1ZGUvYnRhX2FwaS5oCmluZGV4IDY4YjBhZDguLjU0MjJjOWQgMTAwNjQ0Ci0tLSBhL2J0YS9pbmNsdWRlL2J0YV9hcGkuaAorKysgYi9idGEvaW5jbHVkZS9idGFfYXBpLmgKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlICJidF90eXBlcy5oIgogI2luY2x1ZGUgImJ0bV9hcGkuaCIKIAotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogI2luY2x1ZGUgImJ0bV9ibGVfYXBpLmgiCiAjZW5kaWYKIApAQCAtNDksNyArNDksNyBAQAogI2RlZmluZSBCVEFfTk9fUkVTT1VSQ0VTICAgICAgICA0CiAjZGVmaW5lIEJUQV9XUk9OR19NT0RFICAgICAgICAgIDUKIAotdHlwZWRlZiBVSU5UOCB0QlRBX1NUQVRVUzsKK3R5cGVkZWYgdWludDhfdCB0QlRBX1NUQVRVUzsKIAogLyoKICAqIFNlcnZpY2UgSUQKQEAgLTg5LDcgKzg5LDcgQEAKICNkZWZpbmUgQlRBX0hEUF9TRVJWSUNFX0lEICAgICAgMjcgICAgICAgICAgLyogSGVhbHRoIERldmljZSBQcm9maWxlICovCiAjZGVmaW5lIEJUQV9QQ0VfU0VSVklDRV9JRCAgICAgIDI4ICAgICAgICAgIC8qIFBob25lQm9vayBBY2Nlc3MgQ2xpZW50Ki8KICNkZWZpbmUgQlRBX1NEUF9TRVJWSUNFX0lEICAgICAgMjkgICAgICAgICAgLyogU0RQIFNlYXJjaCovCi0jaWYgQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSAmJiBCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFKQogLyogQkxFIHByb2ZpbGUgc2VydmljZSBJRCAqLwogI2RlZmluZSBCVEFfQkxFX1NFUlZJQ0VfSUQgICAgICAzMCAgICAgICAgICAvKiBHQVRUIHByb2ZpbGUgKi8KIApAQCAtMTA1LDcgKzEwNSw3IEBACiAjZGVmaW5lIEJUQV9GSVJTVF9KVl9TRVJWSUNFX0lEICAgICAoQlRNX1NFQ19TRVJWSUNFX0ZJUlNUX0VNUFRZICsgMSkKICNkZWZpbmUgQlRBX0xBU1RfSlZfU0VSVklDRV9JRCAgICAgIChCVE1fU0VDX01BWF9TRVJWSUNFUyAtIDEpCiAKLXR5cGVkZWYgVUlOVDggdEJUQV9TRVJWSUNFX0lEOwordHlwZWRlZiB1aW50OF90IHRCVEFfU0VSVklDRV9JRDsKIAogLyogU2VydmljZSBJRCBNYXNrICovCiAjZGVmaW5lIEJUQV9SRVNfU0VSVklDRV9NQVNLICAgICAgICAweDAwMDAwMDAxICAvKiBSZXNlcnZlZCAqLwpAQCAtMTM4LDI2ICsxMzgsMjYgQEAKICNkZWZpbmUgQlRBX0hMX1NFUlZJQ0VfTUFTSyAgICAgICAgIDB4MDgwMDAwMDAgIC8qIEhlYWx0aCBEZXZpY2UgUHJvZmlsZSAqLwogI2RlZmluZSBCVEFfUENFX1NFUlZJQ0VfTUFTSyAgICAgICAgMHgxMDAwMDAwMCAgLyogUGhvbmUgQm9vayBDbGllbnQgKi8KIAotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFICYmIEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRSkKICNkZWZpbmUgQlRBX0JMRV9TRVJWSUNFX01BU0sgICAgICAgIDB4MjAwMDAwMDAgIC8qIEdBVFQgYmFzZWQgc2VydmljZSAqLwogI2RlZmluZSBCVEFfVVNFUl9TRVJWSUNFX01BU0sgICAgICAgMHg0MDAwMDAwMCAgLyogTWVzc2FnZSBOb3RpZmljYXRpb24gUHJvZmlsZSAqLwogI2Vsc2UKICNkZWZpbmUgQlRBX1VTRVJfU0VSVklDRV9NQVNLICAgICAgIDB4MjAwMDAwMDAgIC8qIE1lc3NhZ2UgTm90aWZpY2F0aW9uIFByb2ZpbGUgKi8KICNlbmRpZgogCi0jaWYgQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgQlRBX0dBVFRfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSAmJiBCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFKQogI2RlZmluZSBCVEFfQUxMX1NFUlZJQ0VfTUFTSyAgICAgICAgMHgzRkZGRkZGRiAgLyogQWxsIHNlcnZpY2VzIHN1cHBvcnRlZCBieSBCVEEuICovCiAjZWxzZQogI2RlZmluZSBCVEFfQUxMX1NFUlZJQ0VfTUFTSyAgICAgICAgMHgxRkZGRkZGRiAgLyogQWxsIHNlcnZpY2VzIHN1cHBvcnRlZCBieSBCVEEuICovCiAjZW5kaWYKIAotdHlwZWRlZiBVSU5UMzIgdEJUQV9TRVJWSUNFX01BU0s7Cit0eXBlZGVmIHVpbnQzMl90IHRCVEFfU0VSVklDRV9NQVNLOwogCiAvKiBleHRlbmRlZCBzZXJ2aWNlIG1hc2ssIGluY2x1ZGluZyBtYXNrIHdpdGggb25lIG9yIG1vcmUgR0FUVCBVVUlEICovCiB0eXBlZGVmIHN0cnVjdAogewogICAgIHRCVEFfU0VSVklDRV9NQVNLICAgc3J2Y19tYXNrOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgbnVtX3V1aWQ7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIG51bV91dWlkOwogICAgIHRCVF9VVUlEICAgICAgICAgICAgKnBfdXVpZDsKIH10QlRBX1NFUlZJQ0VfTUFTS19FWFQ7CiAKQEAgLTE3MCw3ICsxNzAsNyBAQAogI2RlZmluZSBCVEFfU0VDX01JVE0gICAgICAgICAgICAoQlRNX1NFQ19JTl9NSVRNIHwgQlRNX1NFQ19PVVRfTUlUTSkgICAgICAgICAgICAgICAgIC8qIE1hbi1Jbi1UaGVfTWlkZGxlIHByb3RlY3Rpb24gKi8KICNkZWZpbmUgQlRBX1NFQ19JTl8xNl9ESUdJVFMgICAgKEJUTV9TRUNfSU5fTUlOXzE2X0RJR0lUX1BJTikgICAgICAgICAgICAgICAgICAgICAgICAvKiBNaW4gMTYgZGlnaXQgZm9yIHBpbiBjb2RlICovCiAKLXR5cGVkZWYgVUlOVDE2IHRCVEFfU0VDOwordHlwZWRlZiB1aW50MTZfdCB0QlRBX1NFQzsKIAogLyogSWdub3JlIGZvciBEaXNjb3ZlcmFibGUsIENvbm5lY3RhYmxlLCBQYWlyYWJsZSBhbmQgQ29ubmVjdGFibGUgUGFpcmVkIG9ubHkgZGV2aWNlIG1vZGVzICovCiAjZGVmaW5lIEJUQV9ETV9JR05PUkUgICAgICAgICAgIDB4MDBGRgpAQCAtMTg1LDIyICsxODUsMjIgQEAKICNkZWZpbmUgQlRBX0RNX05PTl9ESVNDICAgICAgICAgQlRNX05PTl9ESVNDT1ZFUkFCTEUgICAgICAgIC8qIERldmljZSBpcyBub3QgZGlzY292ZXJhYmxlLiAqLwogI2RlZmluZSBCVEFfRE1fR0VORVJBTF9ESVNDICAgICBCVE1fR0VORVJBTF9ESVNDT1ZFUkFCTEUgICAgLyogR2VuZXJhbCBkaXNjb3ZlcmFibGUuICovCiAjZGVmaW5lIEJUQV9ETV9MSU1JVEVEX0RJU0MgICAgIEJUTV9MSU1JVEVEX0RJU0NPVkVSQUJMRSAgICAvKiBMaW1pdGVkIGRpc2NvdmVyYWJsZS4gKi8KLSNpZiAoKGRlZmluZWQgQkxFX0lOQ0xVREVEKSAmJiAoQkxFX0lOQ0xVREVEID09IFRSVUUpKQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKICNkZWZpbmUgQlRBX0RNX0JMRV9OT05fRElTQ09WRVJBQkxFICAgICAgICBCVE1fQkxFX05PTl9ESVNDT1ZFUkFCTEUgICAgICAgIC8qIERldmljZSBpcyBub3QgTEUgZGlzY292ZXJhYmxlICovCiAjZGVmaW5lIEJUQV9ETV9CTEVfR0VORVJBTF9ESVNDT1ZFUkFCTEUgICAgQlRNX0JMRV9HRU5FUkFMX0RJU0NPVkVSQUJMRSAgICAvKiBEZXZpY2UgaXMgTEUgR2VuZXJhbCBkaXNjb3ZlcmFibGUgKi8KICNkZWZpbmUgQlRBX0RNX0JMRV9MSU1JVEVEX0RJU0NPVkVSQUJMRSAgICBCVE1fQkxFX0xJTUlURURfRElTQ09WRVJBQkxFICAgIC8qIERldmljZSBpcyBMRSBMaW1pdGVkIGRpc2NvdmVyYWJsZSAqLwogI2VuZGlmCi10eXBlZGVmIFVJTlQxNiB0QlRBX0RNX0RJU0M7ICAgICAgICAvKiB0aGlzIGRpc2NvdmVyYWJpbGl0eSBtb2RlIGlzIGEgYml0IG1hc2sgYW1vbmcgQlIgbW9kZSBhbmQgTEUgbW9kZSAqLwordHlwZWRlZiB1aW50MTZfdCB0QlRBX0RNX0RJU0M7ICAgICAgICAvKiB0aGlzIGRpc2NvdmVyYWJpbGl0eSBtb2RlIGlzIGEgYml0IG1hc2sgYW1vbmcgQlIgbW9kZSBhbmQgTEUgbW9kZSAqLwogCiAvKiBDb25uZWN0YWJsZSBNb2RlcyAqLwogI2RlZmluZSBCVEFfRE1fTk9OX0NPTk4gICAgICAgICBCVE1fTk9OX0NPTk5FQ1RBQkxFICAgICAgICAgLyogRGV2aWNlIGlzIG5vdCBjb25uZWN0YWJsZS4gKi8KICNkZWZpbmUgQlRBX0RNX0NPTk4gICAgICAgICAgICAgQlRNX0NPTk5FQ1RBQkxFICAgICAgICAgICAgIC8qIERldmljZSBpcyBjb25uZWN0YWJsZS4gKi8KLSNpZiAoKGRlZmluZWQgQkxFX0lOQ0xVREVEKSAmJiAoQkxFX0lOQ0xVREVEID09IFRSVUUpKQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKICNkZWZpbmUgQlRBX0RNX0JMRV9OT05fQ09OTkVDVEFCTEUgICAgICBCVE1fQkxFX05PTl9DT05ORUNUQUJMRSAgICAgLyogRGV2aWNlIGlzIExFIG5vbi1jb25uZWN0YWJsZS4gKi8KICNkZWZpbmUgQlRBX0RNX0JMRV9DT05ORUNUQUJMRSAgICAgICAgICBCVE1fQkxFX0NPTk5FQ1RBQkxFICAgICAgICAgLyogRGV2aWNlIGlzIExFIGNvbm5lY3RhYmxlLiAqLwogI2VuZGlmCiAKLXR5cGVkZWYgVUlOVDE2IHRCVEFfRE1fQ09OTjsKK3R5cGVkZWYgdWludDE2X3QgdEJUQV9ETV9DT05OOwogCiAjZGVmaW5lIEJUQV9UUkFOU1BPUlRfVU5LTk9XTiAgIDAKICNkZWZpbmUgQlRBX1RSQU5TUE9SVF9CUl9FRFIgICAgQlRfVFJBTlNQT1JUX0JSX0VEUgpAQCAtMjIwLDI2ICsyMjAsMjYgQEAKICNkZWZpbmUgQlRBX0RNX0dFTkVSQUxfSU5RVUlSWSAgQlRNX0dFTkVSQUxfSU5RVUlSWSAgICAgICAgIC8qIFBlcmZvcm0gZ2VuZXJhbCBpbnF1aXJ5LiAqLwogI2RlZmluZSBCVEFfRE1fTElNSVRFRF9JTlFVSVJZICBCVE1fTElNSVRFRF9JTlFVSVJZICAgICAgICAgLyogUGVyZm9ybSBsaW1pdGVkIGlucXVpcnkuICovCiAKLSNpZiAoKGRlZmluZWQgQkxFX0lOQ0xVREVEKSAmJiAoQkxFX0lOQ0xVREVEID09IFRSVUUpKQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKICNkZWZpbmUgQlRBX0JMRV9JTlFVSVJZX05PTkUgICAgQlRNX0JMRV9JTlFVSVJZX05PTkUKICNkZWZpbmUgQlRBX0JMRV9HRU5FUkFMX0lOUVVJUlkgQlRNX0JMRV9HRU5FUkFMX0lOUVVJUlkgICAgICAvKiBQZXJmb3JtIExFIGdlbmVyYWwgaW5xdWlyeS4gKi8KICNkZWZpbmUgQlRBX0JMRV9MSU1JVEVEX0lOUVVJUlkgQlRNX0JMRV9MSU1JVEVEX0lOUVVJUlkgICAgICAvKiBQZXJmb3JtIExFIGxpbWl0ZWQgaW5xdWlyeS4gKi8KICNlbmRpZgotdHlwZWRlZiBVSU5UOCB0QlRBX0RNX0lOUV9NT0RFOwordHlwZWRlZiB1aW50OF90IHRCVEFfRE1fSU5RX01PREU7CiAKIC8qIElucXVpcnkgRmlsdGVyIFR5cGUgKi8KICNkZWZpbmUgQlRBX0RNX0lOUV9DTFIgICAgICAgICAgQlRNX0NMUl9JTlFVSVJZX0ZJTFRFUiAgICAgICAgICAvKiBDbGVhciBpbnF1aXJ5IGZpbHRlci4gKi8KICNkZWZpbmUgQlRBX0RNX0lOUV9ERVZfQ0xBU1MgICAgQlRNX0ZJTFRFUl9DT05EX0RFVklDRV9DTEFTUyAgICAvKiBGaWx0ZXIgb24gZGV2aWNlIGNsYXNzLiAqLwogI2RlZmluZSBCVEFfRE1fSU5RX0JEX0FERFIgICAgICBCVE1fRklMVEVSX0NPTkRfQkRfQUREUiAgICAgICAgIC8qIEZpbHRlciBvbiBhIHNwZWNpZmljICBCRCBhZGRyZXNzLiAqLwogCi10eXBlZGVmIFVJTlQ4IHRCVEFfRE1fSU5RX0ZJTFQ7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9ETV9JTlFfRklMVDsKIAogLyogQXV0aG9yaXplIFJlc3BvbnNlICovCiAjZGVmaW5lIEJUQV9ETV9BVVRIX1BFUk0gICAgICAgIDAgICAgICAvKiBBdXRob3JpemVkIGZvciBmdXR1cmUgY29ubmVjdGlvbnMgdG8gdGhlIHNlcnZpY2UgKi8KICNkZWZpbmUgQlRBX0RNX0FVVEhfVEVNUCAgICAgICAgMSAgICAgIC8qIEF1dGhvcml6ZWQgZm9yIGN1cnJlbnQgY29ubmVjdGlvbiBvbmx5ICovCiAjZGVmaW5lIEJUQV9ETV9OT1RfQVVUSCAgICAgICAgIDIgICAgICAvKiBOb3QgYXV0aG9yaXplZCBmb3IgdGhlIHNlcnZpY2UgKi8KIAotdHlwZWRlZiBVSU5UOCB0QlRBX0FVVEhfUkVTUDsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0FVVEhfUkVTUDsKIAogLyogTS9TIHByZWZlcnJlZCByb2xlcyAqLwogI2RlZmluZSBCVEFfQU5ZX1JPTEUgICAgICAgICAgMHgwMApAQCAtMjQ3LDcgKzI0Nyw3IEBACiAjZGVmaW5lIEJUQV9NQVNURVJfUk9MRV9PTkxZICAweDAyCiAjZGVmaW5lIEJUQV9TTEFWRV9ST0xFX09OTFkgICAweDAzICAgICAvKiBVc2VkIGZvciBQQU5VIG9ubHksIHNraXAgcm9sZSBzd2l0Y2ggdG8gbWFzdGVyICovCiAKLXR5cGVkZWYgVUlOVDggdEJUQV9QUkVGX1JPTEVTOwordHlwZWRlZiB1aW50OF90IHRCVEFfUFJFRl9ST0xFUzsKIAogZW51bQogewpAQCAtMjg0LDM1ICsyODQsMzUgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgdEJUQV9ETV9JTlFfTU9ERSAgICBtb2RlOyAgICAgICAgICAgLyogSW5xdWlyeSBtb2RlLCBsaW1pdGVkIG9yIGdlbmVyYWwuICovCi0gICAgVUlOVDggICAgICAgICAgICAgICBkdXJhdGlvbjsgICAgICAgLyogSW5xdWlyeSBkdXJhdGlvbiBpbiAxLjI4IHNlYyB1bml0cy4gKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIG1heF9yZXNwczsgICAgICAvKiBNYXhpbXVtIGlucXVpcnkgcmVzcG9uc2VzLiAgU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZCByZXNwb25zZXMuICovCi0gICAgQk9PTEVBTiAgICAgICAgICAgICByZXBvcnRfZHVwOyAgICAgLyogcmVwb3J0IGR1cGxpY2F0ZWQgaW5xdWlyeSByZXNwb25zZSB3aXRoIGhpZ2hlciBSU1NJIHZhbHVlICovCisgICAgdWludDhfdCAgICAgICAgICAgICAgIGR1cmF0aW9uOyAgICAgICAvKiBJbnF1aXJ5IGR1cmF0aW9uIGluIDEuMjggc2VjIHVuaXRzLiAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBtYXhfcmVzcHM7ICAgICAgLyogTWF4aW11bSBpbnF1aXJ5IHJlc3BvbnNlcy4gIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQgcmVzcG9uc2VzLiAqLworICAgIGJvb2wgICAgICAgICAgICAgcmVwb3J0X2R1cDsgICAgIC8qIHJlcG9ydCBkdXBsaWNhdGVkIGlucXVpcnkgcmVzcG9uc2Ugd2l0aCBoaWdoZXIgUlNTSSB2YWx1ZSAqLwogICAgIHRCVEFfRE1fSU5RX0ZJTFQgICAgZmlsdGVyX3R5cGU7ICAgIC8qIEZpbHRlciBjb25kaXRpb24gdHlwZS4gKi8KICAgICB0QlRBX0RNX0lOUV9DT05EICAgIGZpbHRlcl9jb25kOyAgICAvKiBGaWx0ZXIgY29uZGl0aW9uIGRhdGEuICovCi0jaWYgKGRlZmluZWQoQlRBX0hPU1RfSU5URVJMRUFWRV9TRUFSQ0gpICYmIEJUQV9IT1NUX0lOVEVSTEVBVkVfU0VBUkNIID09IFRSVUUpCi0gICAgVUlOVDggICAgICAgICAgICAgICBpbnRsX2R1cmF0aW9uWzRdOy8qZHVyYXRpb24gYXJyYXkgc3RvcmluZyB0aGUgaW50ZXJsZWF2ZSBzY2FuJ3MgdGltZSBwb3J0aW9ucyovCisjaWYgKEJUQV9IT1NUX0lOVEVSTEVBVkVfU0VBUkNIID09IFRSVUUpCisgICAgdWludDhfdCAgICAgICAgICAgICAgIGludGxfZHVyYXRpb25bNF07LypkdXJhdGlvbiBhcnJheSBzdG9yaW5nIHRoZSBpbnRlcmxlYXZlIHNjYW4ncyB0aW1lIHBvcnRpb25zKi8KICNlbmRpZgogfSB0QlRBX0RNX0lOUTsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UOCAgIGJ0YV9kbV9laXJfbWluX25hbWVfbGVuOyAgICAgICAgLyogbWluaW11bSBsZW5ndGggb2YgbG9jYWwgbmFtZSB3aGVuIGl0IGlzIHNob3J0ZW5lZCAqLworICAgIHVpbnQ4X3QgICBidGFfZG1fZWlyX21pbl9uYW1lX2xlbjsgICAgICAgIC8qIG1pbmltdW0gbGVuZ3RoIG9mIGxvY2FsIG5hbWUgd2hlbiBpdCBpcyBzaG9ydGVuZWQgKi8KICNpZiAoQlRBX0VJUl9DQU5ORURfVVVJRF9MSVNUID09IFRSVUUpCi0gICAgVUlOVDggICBidGFfZG1fZWlyX3V1aWQxNl9sZW47ICAgICAgICAgIC8qIGxlbmd0aCBvZiAxNi1iaXQgVVVJRHMgKi8KLSAgICBVSU5UOCAgKmJ0YV9kbV9laXJfdXVpZDE2OyAgICAgICAgICAgICAgLyogMTYtYml0IFVVSURzICovCisgICAgdWludDhfdCAgIGJ0YV9kbV9laXJfdXVpZDE2X2xlbjsgICAgICAgICAgLyogbGVuZ3RoIG9mIDE2LWJpdCBVVUlEcyAqLworICAgIHVpbnQ4X3QgICpidGFfZG1fZWlyX3V1aWQxNjsgICAgICAgICAgICAgIC8qIDE2LWJpdCBVVUlEcyAqLwogI2Vsc2UKLSAgICBVSU5UMzIgIHV1aWRfbWFza1tCVE1fRUlSX1NFUlZJQ0VfQVJSQVlfU0laRV07IC8qIG1hc2sgb2YgVVVJRCBsaXN0IGluIEVJUiAqLworICAgIHVpbnQzMl90ICB1dWlkX21hc2tbQlRNX0VJUl9TRVJWSUNFX0FSUkFZX1NJWkVdOyAvKiBtYXNrIG9mIFVVSUQgbGlzdCBpbiBFSVIgKi8KICNlbmRpZgotICAgIElOVDggICAqYnRhX2RtX2Vpcl9pbnFfdHhfcG93ZXI7ICAgICAgICAvKiBJbnF1aXJ5IFRYIHBvd2VyICAgICAgICAgKi8KLSAgICBVSU5UOCAgIGJ0YV9kbV9laXJfZmxhZ19sZW47ICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGZsYWdzIGluIGJ5dGVzICovCi0gICAgVUlOVDggICpidGFfZG1fZWlyX2ZsYWdzOyAgICAgICAgICAgICAgIC8qIGZsYWdzIGZvciBFSVIgKi8KLSAgICBVSU5UOCAgIGJ0YV9kbV9laXJfbWFudWZhY19zcGVjX2xlbjsgICAgLyogbGVuZ3RoIG9mIG1hbnVmYWN0dXJlciBzcGVjaWZpYyBpbiBieXRlcyAqLwotICAgIFVJTlQ4ICAqYnRhX2RtX2Vpcl9tYW51ZmFjX3NwZWM7ICAgICAgICAvKiBtYW51ZmFjdHVyZXIgc3BlY2lmaWMgKi8KLSAgICBVSU5UOCAgIGJ0YV9kbV9laXJfYWRkaXRpb25hbF9sZW47ICAgICAgLyogbGVuZ3RoIG9mIGFkZGl0aW9uYWwgZGF0YSBpbiBieXRlcyAqLwotICAgIFVJTlQ4ICAqYnRhX2RtX2Vpcl9hZGRpdGlvbmFsOyAgICAgICAgICAvKiBhZGRpdGlvbmFsIGRhdGEgKi8KKyAgICBpbnQ4X3QgICAqYnRhX2RtX2Vpcl9pbnFfdHhfcG93ZXI7ICAgICAgICAvKiBJbnF1aXJ5IFRYIHBvd2VyICAgICAgICAgKi8KKyAgICB1aW50OF90ICAgYnRhX2RtX2Vpcl9mbGFnX2xlbjsgICAgICAgICAgICAvKiBsZW5ndGggb2YgZmxhZ3MgaW4gYnl0ZXMgKi8KKyAgICB1aW50OF90ICAqYnRhX2RtX2Vpcl9mbGFnczsgICAgICAgICAgICAgICAvKiBmbGFncyBmb3IgRUlSICovCisgICAgdWludDhfdCAgIGJ0YV9kbV9laXJfbWFudWZhY19zcGVjX2xlbjsgICAgLyogbGVuZ3RoIG9mIG1hbnVmYWN0dXJlciBzcGVjaWZpYyBpbiBieXRlcyAqLworICAgIHVpbnQ4X3QgICpidGFfZG1fZWlyX21hbnVmYWNfc3BlYzsgICAgICAgIC8qIG1hbnVmYWN0dXJlciBzcGVjaWZpYyAqLworICAgIHVpbnQ4X3QgICBidGFfZG1fZWlyX2FkZGl0aW9uYWxfbGVuOyAgICAgIC8qIGxlbmd0aCBvZiBhZGRpdGlvbmFsIGRhdGEgaW4gYnl0ZXMgKi8KKyAgICB1aW50OF90ICAqYnRhX2RtX2Vpcl9hZGRpdGlvbmFsOyAgICAgICAgICAvKiBhZGRpdGlvbmFsIGRhdGEgKi8KIH0gdEJUQV9ETV9FSVJfQ09ORjsKIAotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogLyogQURWIGRhdGEgZmxhZyBiaXQgZGVmaW5pdGlvbiB1c2VkIGZvciBCVE1fQkxFX0FEX1RZUEVfRkxBRyAqLwogI2RlZmluZSBCVEFfQkxFX0xJTUlUX0RJU0NfRkxBRyAgICAgQlRNX0JMRV9MSU1JVF9ESVNDX0ZMQUcKICNkZWZpbmUgQlRBX0JMRV9HRU5fRElTQ19GTEFHICAgICAgIEJUTV9CTEVfR0VOX0RJU0NfRkxBRwpAQCAtMzYyLDkgKzM2Miw5IEBACiAgICAgdEJUQV9CTEVfMTI4U0VSVklDRSAgICAgc29sX3NlcnZpY2VfMTI4YjsvKiBMaXN0IG9mIDEyOCBiaXQgU2VydmljZSBTb2xpY2l0YXRpb24gVVVJRHMgKi8KICAgICB0QlRBX0JMRV9QUk9QUklFVEFSWSAgICBwcm9wcmlldGFyeTsgICAgIC8qIHByb3ByaWV0YXJ5IGRhdGEgKi8KICAgICB0QlRBX0JMRV9TRVJWSUNFX0RBVEEgICBzZXJ2aWNlX2RhdGE7ICAgIC8qIHNlcnZpY2UgZGF0YSAqLwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U7ICAgICAgICAgLyogYXBwZWFyYW5jZSBkYXRhICovCi0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgZmxhZzsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICB0eF9wb3dlcjsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U7ICAgICAgICAgLyogYXBwZWFyYW5jZSBkYXRhICovCisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBmbGFnOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgdHhfcG93ZXI7CiB9dEJUQV9CTEVfQURWX0RBVEE7CiAKIHR5cGVkZWYgdm9pZCAodEJUQV9TRVRfQURWX0RBVEFfQ01QTF9DQkFDSykgKHRCVEFfU1RBVFVTIHN0YXR1cyk7CkBAIC0zODMsNyArMzgzLDcgQEAKICNkZWZpbmUgQlRBX0JMRV9DT05ORUNUX0RJUl9FVlQgICAgIEJUTV9CTEVfQ09OTkVDVF9ESVJfRVZUIC8qIENvbm5lY3RhYmxlIGRpcmVjdGVkIGFkdmVydGlzaW5nICovCiAjZGVmaW5lIEJUQV9CTEVfRElTQ09WRVJfRVZUICAgICAgICBCVE1fQkxFX0RJU0NPVkVSX0VWVCAgICAvKiBTY2FubmFibGUgdW5kaXJlY3RlZCBhZHZlcnRpc2luZyAqLwogI2RlZmluZSBCVEFfQkxFX05PTl9DT05ORUNUX0VWVCAgICAgQlRNX0JMRV9OT05fQ09OTkVDVF9FVlQgLyogTm9uIGNvbm5lY3RhYmxlIHVuZGlyZWN0ZWQgYWR2ZXJ0aXNpbmcgKi8KLXR5cGVkZWYgVUlOVDggdEJUQV9CTEVfQURWX0VWVDsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0JMRV9BRFZfRVZUOwogCiAvKiBhZHYgdHggcG93ZXIgbGV2ZWwgKi8KICNkZWZpbmUgQlRBX0JMRV9BRFZfVFhfUE9XRVJfTUlOICAgICAgICAwICAgICAgICAgICAvKiBtaW5pbXVtIHR4IHBvd2VyICovCkBAIC0zOTEsMTMgKzM5MSwxMyBAQAogI2RlZmluZSBCVEFfQkxFX0FEVl9UWF9QT1dFUl9NSUQgICAgICAgIDIgICAgICAgICAgIC8qIG1pZGRsZSB0eCBwb3dlciAgKi8KICNkZWZpbmUgQlRBX0JMRV9BRFZfVFhfUE9XRVJfVVBQRVIgICAgICAzICAgICAgICAgICAvKiB1cHBlciB0eCBwb3dlciAgICovCiAjZGVmaW5lIEJUQV9CTEVfQURWX1RYX1BPV0VSX01BWCAgICAgICAgNCAgICAgICAgICAgLyogbWF4aW11bSB0eCBwb3dlciAqLwotdHlwZWRlZiBVSU5UOCB0QlRBX0JMRV9BRFZfVFhfUE9XRVI7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9CTEVfQURWX1RYX1BPV0VSOwogCiAvKiBhZHZlcnRpc2luZyBpbnN0YW5jZSBwYXJhbWV0ZXJzICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIGFkdl9pbnRfbWluOyAgICAgICAgICAgIC8qIG1pbmltdW0gYWR2IGludGVydmFsICovCi0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgYWR2X2ludF9tYXg7ICAgICAgICAgICAgLyogbWF4aW11bSBhZHYgaW50ZXJ2YWwgKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIGFkdl9pbnRfbWluOyAgICAgICAgICAgIC8qIG1pbmltdW0gYWR2IGludGVydmFsICovCisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICBhZHZfaW50X21heDsgICAgICAgICAgICAvKiBtYXhpbXVtIGFkdiBpbnRlcnZhbCAqLwogICAgIHRCVEFfQkxFX0FEVl9FVlQgICAgICAgIGFkdl90eXBlOyAgICAgICAgICAgICAgIC8qIGFkdiBldmVudCB0eXBlICovCiAgICAgdEJUQV9CTEVfQURWX0NITkxfTUFQICAgY2hhbm5lbF9tYXA7ICAgICAgICAgICAgLyogYWR2IGNoYW5uZWwgbWFwICovCiAgICAgdEJUQV9CTEVfQUZQICAgICAgICAgICAgYWR2X2ZpbHRlcl9wb2xpY3k7ICAgICAgLyogYWR2ZXJ0aXNpbmcgZmlsdGVyIHBvbGljeSAqLwpAQCAtNDA5LDEyICs0MDksMTIgQEAKICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQ4ICAgICAgICAgICAgICAgY29ubl9tb2RlOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBjb25uX21vZGU7CiAgICAgdEJUQV9CTEVfQURfTUFTSyAgICBhZF9tYXNrOyAgICAgICAgLyogbWFzayBvZiB0aGUgdmFsaWQgYWR2IGRhdGEgZmllbGQgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIGZsYWc7Ci0gICAgVUlOVDggICAgICAgICAgICAgICB0eF9wb3dlcl9sZXZlbDsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIHJlbW90ZV9uYW1lX2xlbjsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICpwX3JlbW90ZV9uYW1lOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBmbGFnOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICB0eF9wb3dlcl9sZXZlbDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgcmVtb3RlX25hbWVfbGVuOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAqcF9yZW1vdGVfbmFtZTsKICAgICB0QlRBX0JMRV9TRVJWSUNFICAgIHNlcnZpY2U7CiB9IHRCVEFfQkxFX0lOUV9EQVRBOwogCkBAIC00MjQsMjEgKzQyNCwyMSBAQAogICAgIEJUQV9CTEVfQkFUQ0hfU0NBTl9NT0RFX0FDVEkgPSAyLAogICAgIEJUQV9CTEVfQkFUQ0hfU0NBTl9NT0RFX1BBU1NfQUNUSSA9IDMKIH07Ci10eXBlZGVmIFVJTlQ4IHRCVEFfQkxFX0JBVENIX1NDQU5fTU9ERTsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0JMRV9CQVRDSF9TQ0FOX01PREU7CiAKIGVudW0KIHsKICAgICBCVEFfQkxFX0RJU0NBUkRfT0xEX0lURU1TPTAsCiAgICAgQlRBX0JMRV9ESVNDQVJEX0xPV0VSX1JTU0lfSVRFTVM9MQogfTsKLXR5cGVkZWYgVUlOVDggdEJUQV9CTEVfRElTQ0FSRF9SVUxFOwordHlwZWRlZiB1aW50OF90IHRCVEFfQkxFX0RJU0NBUkRfUlVMRTsKIAogZW51bQogewogICAgIEJUQV9CTEVfQURWX1NFRU5fRklSU1RfVElNRT0wLAogICAgIEJUQV9CTEVfQURWX1RSQUNLSU5HX1RJTUVPVVQ9MQogfTsKLXR5cGVkZWYgVUlOVDggdEJUQV9CTEVfQURWX0NIQU5HRV9SRUFTT047Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9CTEVfQURWX0NIQU5HRV9SRUFTT047CiAKIGVudW0KIHsKQEAgLTQ1OSwxNiArNDU5LDE2IEBACiAjZGVmaW5lIEJUQV9CTEVfUlNTSV9BTEVSVF9ISSAgICAgICAgMAogI2RlZmluZSBCVEFfQkxFX1JTU0lfQUxFUlRfUkFOR0UgICAgIDEKICNkZWZpbmUgQlRBX0JMRV9SU1NJX0FMRVJUX0xPICAgICAgICAyCi10eXBlZGVmIFVJTlQ4IHRCVEFfRE1fQkxFX1JTU0lfQUxFUlRfVFlQRTsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0RNX0JMRV9SU1NJX0FMRVJUX1RZUEU7CiAKICNkZWZpbmUgQlRBX0JMRV9SU1NJX0FMRVJUX05PTkUgICAgICAgICBCVE1fQkxFX1JTU0lfQUxFUlRfTk9ORSAgICAgICAgIC8qICAgICgwKSAqLwogI2RlZmluZSBCVEFfQkxFX1JTU0lfQUxFUlRfSElfQklUICAgICAgIEJUTV9CTEVfUlNTSV9BTEVSVF9ISV9CSVQgICAgICAgLyogICAgKDEpICovCiAjZGVmaW5lIEJUQV9CTEVfUlNTSV9BTEVSVF9SQU5HRV9CSVQgICAgQlRNX0JMRV9SU1NJX0FMRVJUX1JBTkdFX0JJVCAgICAvKiAgICAoMSA8PCAxKSAqLwogI2RlZmluZSBCVEFfQkxFX1JTU0lfQUxFUlRfTE9fQklUICAgICAgIEJUTV9CTEVfUlNTSV9BTEVSVF9MT19CSVQgICAgICAgLyogICAgKDEgPDwgMikgKi8KLXR5cGVkZWYgVUlOVDggICAgIHRCVEFfRE1fQkxFX1JTU0lfQUxFUlRfTUFTSzsKK3R5cGVkZWYgdWludDhfdCAgICAgdEJUQV9ETV9CTEVfUlNTSV9BTEVSVF9NQVNLOwogCiAKLXR5cGVkZWYgdm9pZCAodEJUQV9ETV9CTEVfUlNTSV9DQkFDSykgKEJEX0FERFIgYmRfYWRkciwgdEJUQV9ETV9CTEVfUlNTSV9BTEVSVF9UWVBFIGFsZXJ0X3R5cGUsIElOVDggcnNzaSk7Cit0eXBlZGVmIHZvaWQgKHRCVEFfRE1fQkxFX1JTU0lfQ0JBQ0spIChCRF9BRERSIGJkX2FkZHIsIHRCVEFfRE1fQkxFX1JTU0lfQUxFUlRfVFlQRSBhbGVydF90eXBlLCBpbnQ4X3QgcnNzaSk7CiAKIC8qIG1heCBudW1iZXIgb2YgZmlsdGVyIHNwb3QgZm9yIGRpZmZlcmVudCBmaWx0ZXIgdHlwZSAqLwogI2RlZmluZSBCVEFfRE1fQkxFX01BWF9VVUlEX0ZJTFRFUiAgICAgQlRNX0JMRV9NQVhfVVVJRF9GSUxURVIgICAgLyogOCAqLwpAQCAtNDc4LDcgKzQ3OCw3IEBACiAKICNkZWZpbmUgQlRBX0RNX0JMRV9QRl9MT0dJQ19PUiAgICAgICAgICAgICAgMAogI2RlZmluZSBCVEFfRE1fQkxFX1BGX0xPR0lDX0FORCAgICAgICAgICAgICAxCi10eXBlZGVmIFVJTlQ4IHRCVEFfRE1fQkxFX1BGX0xPR0lDX1RZUEU7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9ETV9CTEVfUEZfTE9HSUNfVFlQRTsKIAogZW51bQogewpAQCAtNDg2LDcgKzQ4Niw3IEBACiAgICAgQlRBX0RNX0JMRV9TQ0FOX0NPTkRfREVMRVRFLAogICAgIEJUQV9ETV9CTEVfU0NBTl9DT05EX0NMRUFSID0gMgogfTsKLXR5cGVkZWYgVUlOVDggdEJUQV9ETV9CTEVfU0NBTl9DT05EX09QOwordHlwZWRlZiB1aW50OF90IHRCVEFfRE1fQkxFX1NDQU5fQ09ORF9PUDsKIAogLyogQURWIHBheWxvYWQgZmlsdGVyaW5nIHZlbmRvciBzcGVjaWZpYyBjYWxsIGV2ZW50ICovCiBlbnVtCkBAIC01MDUsMTMgKzUwNSwxMyBAQAogI2RlZmluZSBCVEFfRE1fQkxFX1BGX1NSVkNfREFUQV9QQVRURVJOICAgIEJUTV9CTEVfUEZfU1JWQ19EQVRBX1BBVFRFUk4KICNkZWZpbmUgQlRBX0RNX0JMRV9QRl9UWVBFX0FMTCAgICAgICAgICAgICBCVE1fQkxFX1BGX1RZUEVfQUxMCiAjZGVmaW5lIEJUQV9ETV9CTEVfUEZfVFlQRV9NQVggICAgICAgICAgICAgQlRNX0JMRV9QRl9UWVBFX01BWAotdHlwZWRlZiBVSU5UOCAgIHRCVEFfRE1fQkxFX1BGX0NPTkRfVFlQRTsKK3R5cGVkZWYgdWludDhfdCAgIHRCVEFfRE1fQkxFX1BGX0NPTkRfVFlQRTsKIAogdHlwZWRlZiB1bmlvbgogewotICAgICAgVUlOVDE2ICAgICAgICAgICAgICB1dWlkMTZfbWFzazsKLSAgICAgIFVJTlQzMiAgICAgICAgICAgICAgdXVpZDMyX21hc2s7Ci0gICAgICBVSU5UOCAgICAgICAgICAgICAgIHV1aWQxMjhfbWFza1tMRU5fVVVJRF8xMjhdOworICAgICAgdWludDE2X3QgICAgICAgICAgICAgIHV1aWQxNl9tYXNrOworICAgICAgdWludDMyX3QgICAgICAgICAgICAgIHV1aWQzMl9tYXNrOworICAgICAgdWludDhfdCAgICAgICAgICAgICAgIHV1aWQxMjhfbWFza1tMRU5fVVVJRF8xMjhdOwogfXRCVEFfRE1fQkxFX1BGX0NPTkRfTUFTSzsKIAogdHlwZWRlZiBzdHJ1Y3QKQEAgLTUyNCwyNiArNTI0LDI2IEBACiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgZGF0YV9sZW47ICAgICAgIC8qIDw9IDIwIGJ5dGVzICovCi0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgKnBfZGF0YTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIGRhdGFfbGVuOyAgICAgICAvKiA8PSAyMCBieXRlcyAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgKnBfZGF0YTsKIH10QlRBX0RNX0JMRV9QRl9MT0NBTF9OQU1FX0NPTkQ7CiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgY29tcGFueV9pZDsgICAgIC8qIGNvbXBhbnkgSUQgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBkYXRhX2xlbjsgICAgICAgLyogPD0gMjAgYnl0ZXMgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAqcF9wYXR0ZXJuOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIGNvbXBhbnlfaWRfbWFzazsgLyogVVVJRCB2YWx1ZSBtYXNrICovCi0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgKnBfcGF0dGVybl9tYXNrOyAvKiBNYW51ZmFjdHVyZXIgZGF0YSBtYXRjaGluZyBtYXNrLCBzYW1lIGxlbmd0aAorICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgY29tcGFueV9pZDsgICAgIC8qIGNvbXBhbnkgSUQgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIGRhdGFfbGVuOyAgICAgICAvKiA8PSAyMCBieXRlcyAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgKnBfcGF0dGVybjsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIGNvbXBhbnlfaWRfbWFzazsgLyogVVVJRCB2YWx1ZSBtYXNrICovCisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAqcF9wYXR0ZXJuX21hc2s7IC8qIE1hbnVmYWN0dXJlciBkYXRhIG1hdGNoaW5nIG1hc2ssIHNhbWUgbGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBkYXRhIHBhdHRlcm4sIHNldCB0byBhbGwgMHhmZiwgbWF0Y2ggZXhhY3QgZGF0YSAqLwogfXRCVEFfRE1fQkxFX1BGX01BTlVfQ09ORDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICB1dWlkOyAgICAgLyogc2VydmljZSBJRCAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIGRhdGFfbGVuOyAgICAgICAvKiA8PSAyMCBieXRlcyAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICpwX3BhdHRlcm47Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgKnBfcGF0dGVybl9tYXNrOyAvKiBTZXJ2aWNlIGRhdGEgbWF0Y2hpbmcgbWFzaywgc2FtZSBsZW5ndGgKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIHV1aWQ7ICAgICAvKiBzZXJ2aWNlIElEICovCisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBkYXRhX2xlbjsgICAgICAgLyogPD0gMjAgYnl0ZXMgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICpwX3BhdHRlcm47CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAqcF9wYXR0ZXJuX21hc2s7IC8qIFNlcnZpY2UgZGF0YSBtYXRjaGluZyBtYXNrLCBzYW1lIGxlbmd0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgZGF0YSBwYXR0ZXJuLCBzZXQgdG8gYWxsIDB4ZmYsIG1hdGNoIGV4YWN0IGRhdGEgKi8KIH10QlRBX0RNX0JMRV9QRl9TUlZDX1BBVFRFUk5fQ09ORDsKIApAQCAtNTU3LDE0ICs1NTcsMTQgQEAKICAgICB0QlRBX0RNX0JMRV9QRl9TUlZDX1BBVFRFUk5fQ09ORCAgICAgICAgICAgc3J2Y19kYXRhOyAgICAgIC8qIHNlcnZpY2UgZGF0YSBwYXR0ZXJuICovCiB9dEJUQV9ETV9CTEVfUEZfQ09ORF9QQVJBTTsKIAotdHlwZWRlZiBVSU5UOCB0QlRBX0RNX0JMRV9QRl9GSUxUX0lOREVYOwotdHlwZWRlZiBVSU5UOCB0QlRBX0RNX0JMRV9QRl9BVkJMX1NQQUNFOwordHlwZWRlZiB1aW50OF90IHRCVEFfRE1fQkxFX1BGX0ZJTFRfSU5ERVg7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9ETV9CTEVfUEZfQVZCTF9TUEFDRTsKIAotdHlwZWRlZiBJTlQ4IHRCVEFfRE1fUlNTSV9WQUxVRTsKLXR5cGVkZWYgVUlOVDggdEJUQV9ETV9MSU5LX1FVQUxJVFlfVkFMVUU7Cit0eXBlZGVmIGludDhfdCB0QlRBX0RNX1JTU0lfVkFMVUU7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9ETV9MSU5LX1FVQUxJVFlfVkFMVUU7CiAKIAotdHlwZWRlZiBVSU5UOCB0QlRBX1NJR19TVFJFTkdUSF9NQVNLOwordHlwZWRlZiB1aW50OF90IHRCVEFfU0lHX1NUUkVOR1RIX01BU0s7CiAKIAogLyogU2VjdXJpdHkgQ2FsbGJhY2sgRXZlbnRzICovCkBAIC01OTcsNyArNTk3LDcgQEAKICNkZWZpbmUgQlRBX0RNX0hXX0VSUk9SX0VWVCAgICAgICAgICAgICAyNiAgICAgIC8qIEJUIENoaXAgSC9XIGVycm9yICovCiAjZGVmaW5lIEJUQV9ETV9MRV9GRUFUVVJFU19SRUFEICAgICAgICAgMjcgICAgICAvKiBDb3Ryb2xsZXIgc3BlY2lmaWMgTEUgZmVhdHVyZXMgYXJlIHJlYWQgKi8KICNkZWZpbmUgQlRBX0RNX0VORVJfSU5GT19SRUFEICAgICAgICAgICAyOCAgICAgIC8qIEVuZXJneSBpbmZvIHJlYWQgKi8KLXR5cGVkZWYgVUlOVDggdEJUQV9ETV9TRUNfRVZUOwordHlwZWRlZiB1aW50OF90IHRCVEFfRE1fU0VDX0VWVDsKIAogLyogU3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBCVEFfRE1fRU5BQkxFX0VWVCAqLwogdHlwZWRlZiBzdHJ1Y3QKQEAgLTYxMiw3ICs2MTIsNyBAQAogICAgIEJEX0FERFIgICAgICAgICBiZF9hZGRyOyAgICAgICAgICAgIC8qIEJEIGFkZHJlc3MgcGVlciBkZXZpY2UuICovCiAgICAgREVWX0NMQVNTICAgICAgIGRldl9jbGFzczsgICAgICAgICAgLyogQ2xhc3Mgb2YgRGV2aWNlICovCiAgICAgQkRfTkFNRSAgICAgICAgIGJkX25hbWU7ICAgICAgICAgICAgLyogTmFtZSBvZiBwZWVyIGRldmljZS4gKi8KLSAgICBCT09MRUFOICAgICAgICAgbWluXzE2X2RpZ2l0OyAgICAgICAvKiBUUlVFIGlmIHRoZSBwaW4gcmV0dXJuZWQgbXVzdCBiZSBhdCBsZWFzdCAxNiBkaWdpdHMgKi8KKyAgICBib29sICAgICAgICAgbWluXzE2X2RpZ2l0OyAgICAgICAvKiB0cnVlIGlmIHRoZSBwaW4gcmV0dXJuZWQgbXVzdCBiZSBhdCBsZWFzdCAxNiBkaWdpdHMgKi8KIH0gdEJUQV9ETV9QSU5fUkVROwogCiAvKiBCTEUgcmVsYXRlZCBkZWZpbml0aW9uICovCkBAIC02NTYsNyArNjU2LDcgQEAKICNkZWZpbmUgQlRBX0xFX0tFWV9MRU5DICAgICAgQlRNX0xFX0tFWV9MRU5DICAgICAgICAvKiBtYXN0ZXIgcm9sZSBzZWN1cml0eSBpbmZvcm1hdGlvbjpkaXYgKi8KICNkZWZpbmUgQlRBX0xFX0tFWV9MSUQgICAgICAgQlRNX0xFX0tFWV9MSUQgICAgICAgICAvKiBtYXN0ZXIgZGV2aWNlIElEIGtleSAqLwogI2RlZmluZSBCVEFfTEVfS0VZX0xDU1JLICAgICBCVE1fTEVfS0VZX0xDU1JLICAgICAgICAvKiBsb2NhbCBDU1JLIGhhcyBiZWVuIGRlbGl2ZXIgdG8gcGVlciAqLwotdHlwZWRlZiBVSU5UOCB0QlRBX0xFX0tFWV9UWVBFOyAvKiBjYW4gYmUgdXNlZCBhcyBhIGJpdCBtYXNrICovCit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9MRV9LRVlfVFlQRTsgLyogY2FuIGJlIHVzZWQgYXMgYSBiaXQgbWFzayAqLwogCiAKIHR5cGVkZWYgdEJUTV9MRV9QRU5DX0tFWVMgIHRCVEFfTEVfUEVOQ19LRVlTIDsKQEAgLTY3Nyw3ICs2NzcsNyBAQAogCiAjZGVmaW5lIEJUQV9CTEVfTE9DQUxfS0VZX1RZUEVfSUQgICAgICAgICAxCiAjZGVmaW5lIEJUQV9CTEVfTE9DQUxfS0VZX1RZUEVfRVIgICAgICAgICAyCi10eXBlZGVmIFVJTlQ4IHRCVEFfRE1fQkxFX0xPQ0FMX0tFWV9NQVNLOwordHlwZWRlZiB1aW50OF90IHRCVEFfRE1fQkxFX0xPQ0FMX0tFWV9NQVNLOwogCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtNjg5LDE1ICs2ODksMTUgQEAKICNkZWZpbmUgQlRBX0RNX1NFQ19HUkFOVEVEICAgICAgICAgICAgICBCVEFfU1VDQ0VTUwogI2RlZmluZSBCVEFfRE1fU0VDX1BBSVJfTk9UX1NQVCAgICAgICAgIEJUQV9ETV9BVVRIX1NNUF9QQUlSX05PVF9TVVBQT1JUCiAjZGVmaW5lIEJUQV9ETV9TRUNfUkVQX0FUVEVNUFRTICAgICAgICAgQlRBX0RNX0FVVEhfU01QX1JFUEVBVEVEX0FUVEVNUFQKLXR5cGVkZWYgVUlOVDggdEJUQV9ETV9CTEVfU0VDX0dSQU5UOwordHlwZWRlZiB1aW50OF90IHRCVEFfRE1fQkxFX1NFQ19HUkFOVDsKIAogCiAjZGVmaW5lIEJUQV9ETV9CTEVfT05OX05PTkUgICAgICAgICAgICAgQlRNX0JMRV9DT05OX05PTkUKICNkZWZpbmUgQlRBX0RNX0JMRV9DT05OX0FVVE8gICAgICAgICAgICBCVE1fQkxFX0NPTk5fQVVUTwogI2RlZmluZSBCVEFfRE1fQkxFX0NPTk5fU0VMRUNUSVZFICAgICAgIEJUTV9CTEVfQ09OTl9TRUxFQ1RJVkUKLXR5cGVkZWYgVUlOVDggdEJUQV9ETV9CTEVfQ09OTl9UWVBFOwordHlwZWRlZiB1aW50OF90IHRCVEFfRE1fQkxFX0NPTk5fVFlQRTsKIAotdHlwZWRlZiBCT09MRUFOICh0QlRBX0RNX0JMRV9TRUxfQ0JBQ0spKEJEX0FERFIgcmFuZG9tX2JkYSwgVUlOVDggKnBfcmVtb3RlX25hbWUpOwordHlwZWRlZiBib29sICh0QlRBX0RNX0JMRV9TRUxfQ0JBQ0spKEJEX0FERFIgcmFuZG9tX2JkYSwgdWludDhfdCAqcF9yZW1vdGVfbmFtZSk7CiAKIC8qIFN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggQlRBX0RNX0JMRV9TRUNfUkVRX0VWVCAqLwogdHlwZWRlZiBzdHJ1Y3QKQEAgLTcxOCwxMSArNzE4LDExIEBACiB7CiAgICAgQkRfQUREUiAgICAgICAgIGJkX2FkZHI7ICAgICAgICAgICAgLyogQkQgYWRkcmVzcyBwZWVyIGRldmljZS4gKi8KICAgICBCRF9OQU1FICAgICAgICAgYmRfbmFtZTsgICAgICAgICAgICAvKiBOYW1lIG9mIHBlZXIgZGV2aWNlLiAqLwotICAgIEJPT0xFQU4gICAgICAgICBrZXlfcHJlc2VudDsgICAgICAgIC8qIFZhbGlkIGxpbmsga2V5IHZhbHVlIGluIGtleSBlbGVtZW50ICovCisgICAgYm9vbCAgICAgICAgIGtleV9wcmVzZW50OyAgICAgICAgLyogVmFsaWQgbGluayBrZXkgdmFsdWUgaW4ga2V5IGVsZW1lbnQgKi8KICAgICBMSU5LX0tFWSAgICAgICAga2V5OyAgICAgICAgICAgICAgICAvKiBMaW5rIGtleSBhc3NvY2lhdGVkIHdpdGggcGVlciBkZXZpY2UuICovCi0gICAgVUlOVDggICAgICAgICAgIGtleV90eXBlOyAgICAgICAgICAgLyogVGhlIHR5cGUgb2YgTGluayBLZXkgKi8KLSAgICBCT09MRUFOICAgICAgICAgc3VjY2VzczsgICAgICAgICAgICAvKiBUUlVFIG9mIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRlZCwgRkFMU0UgaWYgZmFpbGVkLiAqLwotICAgIFVJTlQ4ICAgICAgICAgICBmYWlsX3JlYXNvbjsgICAgICAgIC8qIFRoZSBIQ0kgcmVhc29uL2Vycm9yIGNvZGUgZm9yIHdoZW4gc3VjY2Vzcz1GQUxTRSAqLworICAgIHVpbnQ4X3QgICAgICAgICAgIGtleV90eXBlOyAgICAgICAgICAgLyogVGhlIHR5cGUgb2YgTGluayBLZXkgKi8KKyAgICBib29sICAgICAgICAgc3VjY2VzczsgICAgICAgICAgICAvKiB0cnVlIG9mIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRlZCwgZmFsc2UgaWYgZmFpbGVkLiAqLworICAgIHVpbnQ4X3QgICAgICAgICAgIGZhaWxfcmVhc29uOyAgICAgICAgLyogVGhlIEhDSSByZWFzb24vZXJyb3IgY29kZSBmb3Igd2hlbiBzdWNjZXNzPWZhbHNlICovCiAgICAgdEJMRV9BRERSX1RZUEUgIGFkZHJfdHlwZTsgICAgICAgICAgLyogUGVlciBkZXZpY2UgYWRkcmVzcyB0eXBlICovCiAgICAgdEJUX0RFVklDRV9UWVBFIGRldl90eXBlOwogfSB0QlRBX0RNX0FVVEhfQ01QTDsKQEAgLTc0MSw3ICs3NDEsNyBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCRF9BRERSICAgICAgICAgYmRfYWRkcjsgICAgICAgICAgICAvKiBCRCBhZGRyZXNzIHBlZXIgZGV2aWNlLiAqLwotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogICAgIHRCVEFfVFJBTlNQT1JUICBsaW5rX3R5cGU7CiAjZW5kaWYKIH0gdEJUQV9ETV9MSU5LX1VQOwpAQCAtNzUwLDkgKzc1MCw5IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJEX0FERFIgICAgICAgICBiZF9hZGRyOyAgICAgICAgICAgIC8qIEJEIGFkZHJlc3MgcGVlciBkZXZpY2UuICovCi0gICAgVUlOVDggICAgICAgICAgIHN0YXR1czsgICAgICAgICAgICAgLyogY29ubmVjdGlvbiBvcGVuL2Nsb3NlZCAqLwotICAgIEJPT0xFQU4gICAgICAgICBpc19yZW1vdmVkOyAgICAgICAgIC8qIFRSVUUgaWYgZGV2aWNlIGlzIHJlbW92ZWQgd2hlbiBsaW5rIGlzIGRvd24gKi8KLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRQorICAgIHVpbnQ4X3QgICAgICAgICAgIHN0YXR1czsgICAgICAgICAgICAgLyogY29ubmVjdGlvbiBvcGVuL2Nsb3NlZCAqLworICAgIGJvb2wgICAgICAgICBpc19yZW1vdmVkOyAgICAgICAgIC8qIHRydWUgaWYgZGV2aWNlIGlzIHJlbW92ZWQgd2hlbiBsaW5rIGlzIGRvd24gKi8KKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUpCiAgICAgdEJUQV9UUkFOU1BPUlQgIGxpbmtfdHlwZTsKICNlbmRpZgogfSB0QlRBX0RNX0xJTktfRE9XTjsKQEAgLTc2MSwyMiArNzYxLDIyIEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJEX0FERFIgICAgICAgICBiZF9hZGRyOyAgICAgICAgICAgIC8qIEJEIGFkZHJlc3MgcGVlciBkZXZpY2UuICovCi0gICAgVUlOVDggICAgICAgICAgIG5ld19yb2xlOyAgICAgICAgICAgLyogdGhlIG5ldyBjb25uZWN0aW9uIHJvbGUgKi8KKyAgICB1aW50OF90ICAgICAgICAgICBuZXdfcm9sZTsgICAgICAgICAgIC8qIHRoZSBuZXcgY29ubmVjdGlvbiByb2xlICovCiB9IHRCVEFfRE1fUk9MRV9DSEc7CiAKIC8qIFN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggQlRBX0RNX0JVU1lfTEVWRUxfRVZUICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQ4ICAgICAgICAgICBsZXZlbDsgICAgIC8qIHdoZW4gcGFnaW5nIG9yIGlucXVpcmluZywgbGV2ZWwgaXMgMTAuCisgICAgdWludDhfdCAgICAgICAgICAgbGV2ZWw7ICAgICAvKiB3aGVuIHBhZ2luZyBvciBpbnF1aXJpbmcsIGxldmVsIGlzIDEwLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgbnVtYmVyIG9mIEFDTCBsaW5rcyAqLwotICAgIFVJTlQ4ICAgICAgICAgICBsZXZlbF9mbGFnczsgLyogaW5kaWNhdGVzIGluZGl2aWR1YWwgZmxhZ3MgKi8KKyAgICB1aW50OF90ICAgICAgICAgICBsZXZlbF9mbGFnczsgLyogaW5kaWNhdGVzIGluZGl2aWR1YWwgZmxhZ3MgKi8KIH0gdEJUQV9ETV9CVVNZX0xFVkVMOwogCiAjZGVmaW5lIEJUQV9JT19DQVBfT1VUICAgICAgQlRNX0lPX0NBUF9PVVQgICAgICAvKiAwIERpc3BsYXlPbmx5ICovCiAjZGVmaW5lIEJUQV9JT19DQVBfSU8gICAgICAgQlRNX0lPX0NBUF9JTyAgICAgICAvKiAxIERpc3BsYXlZZXNObyAqLwogI2RlZmluZSBCVEFfSU9fQ0FQX0lOICAgICAgIEJUTV9JT19DQVBfSU4gICAgICAgLyogMiBLZXlib2FyZE9ubHkgKi8KICNkZWZpbmUgQlRBX0lPX0NBUF9OT05FICAgICBCVE1fSU9fQ0FQX05PTkUgICAgIC8qIDMgTm9JbnB1dE5vT3V0cHV0ICovCi0jaWYgQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgU01QX0lOQ0xVREVEID09IFRSVUUKKyNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgU01QX0lOQ0xVREVEID09IFRSVUUpCiAjZGVmaW5lIEJUQV9JT19DQVBfS0JESVNQICAgQlRNX0lPX0NBUF9LQkRJU1AgICAvKiA0IEtleWJvYXJkIGRpc3BsYXkgKi8KICNlbmRpZgogdHlwZWRlZiB0QlRNX0lPX0NBUCAgICAgdEJUQV9JT19DQVA7CkBAIC04MjIsOCArODIyLDggQEAKICAgICBCRF9BRERSICAgICAgICAgYmRfYWRkcjsgICAgICAgIC8qIHBlZXIgYWRkcmVzcyAqLwogICAgIERFVl9DTEFTUyAgICAgICBkZXZfY2xhc3M7ICAgICAgLyogcGVlciBDb0QgKi8KICAgICBCRF9OQU1FICAgICAgICAgYmRfbmFtZTsgICAgICAgIC8qIHBlZXIgZGV2aWNlIG5hbWUgKi8KLSAgICBVSU5UMzIgICAgICAgICAgbnVtX3ZhbDsgICAgICAgIC8qIHRoZSBudW1lcmljIHZhbHVlIGZvciBjb21wYXJpc29uLiBJZiBqdXN0X3dvcmtzLCBkbyBub3Qgc2hvdyB0aGlzIG51bWJlciB0byBVSSAqLwotICAgIEJPT0xFQU4gICAgICAgICBqdXN0X3dvcmtzOyAgICAgLyogVFJVRSwgaWYgIkp1c3QgV29ya3MiIGFzc29jaWF0aW9uIG1vZGVsICovCisgICAgdWludDMyX3QgICAgICAgICAgbnVtX3ZhbDsgICAgICAgIC8qIHRoZSBudW1lcmljIHZhbHVlIGZvciBjb21wYXJpc29uLiBJZiBqdXN0X3dvcmtzLCBkbyBub3Qgc2hvdyB0aGlzIG51bWJlciB0byBVSSAqLworICAgIGJvb2wgICAgICAgICBqdXN0X3dvcmtzOyAgICAgLyogdHJ1ZSwgaWYgIkp1c3QgV29ya3MiIGFzc29jaWF0aW9uIG1vZGVsICovCiAgICAgdEJUQV9BVVRIX1JFUSAgIGxvY19hdXRoX3JlcTsgICAvKiBBdXRoZW50aWNhdGlvbiByZXF1aXJlZCBmb3IgbG9jYWwgZGV2aWNlICovCiAgICAgdEJUQV9BVVRIX1JFUSAgIHJtdF9hdXRoX3JlcTsgICAvKiBBdXRoZW50aWNhdGlvbiByZXF1aXJlZCBmb3IgcGVlciBkZXZpY2UgKi8KICAgICB0QlRBX0lPX0NBUCAgICAgbG9jX2lvX2NhcHM7ICAgIC8qIElPIENhcGFiaWxpdGllcyBvZiBsb2NhbCBkZXZpY2UgKi8KQEAgLTgzOCw3ICs4MzgsNyBAQAogICAgIEJUQV9TUF9LRVlfQ0xFQVJFRCwgICAgICAgICAvKiBwYXNza2V5IGNsZWFyZWQgKi8KICAgICBCVEFfU1BfS0VZX0NPTVBMVCAgICAgICAgICAgLyogcGFzc2tleSBlbnRyeSBjb21wbGV0ZWQgKi8KIH07Ci10eXBlZGVmIFVJTlQ4ICAgdEJUQV9TUF9LRVlfVFlQRTsKK3R5cGVkZWYgdWludDhfdCAgIHRCVEFfU1BfS0VZX1RZUEU7CiAKIC8qIFN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggQlRBX0RNX1NQX0tFWVBSRVNTX0VWVCAqLwogdHlwZWRlZiBzdHJ1Y3QKQEAgLTg1NCw3ICs4NTQsNyBAQAogICAgIEJEX0FERFIgICAgICAgICBiZF9hZGRyOyAgICAgICAgLyogcGVlciBhZGRyZXNzICovCiAgICAgREVWX0NMQVNTICAgICAgIGRldl9jbGFzczsgICAgICAvKiBwZWVyIENvRCAqLwogICAgIEJEX05BTUUgICAgICAgICBiZF9uYW1lOyAgICAgICAgLyogcGVlciBkZXZpY2UgbmFtZSAqLwotICAgIFVJTlQzMiAgICAgICAgICBwYXNza2V5OyAgICAgICAgLyogdGhlIG51bWVyaWMgdmFsdWUgZm9yIGNvbXBhcmlzb24uIElmIGp1c3Rfd29ya3MsIGRvIG5vdCBzaG93IHRoaXMgbnVtYmVyIHRvIFVJICovCisgICAgdWludDMyX3QgICAgICAgICAgcGFzc2tleTsgICAgICAgIC8qIHRoZSBudW1lcmljIHZhbHVlIGZvciBjb21wYXJpc29uLiBJZiBqdXN0X3dvcmtzLCBkbyBub3Qgc2hvdyB0aGlzIG51bWJlciB0byBVSSAqLwogfSB0QlRBX0RNX1NQX0tFWV9OT1RJRjsKIAogLyogU3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBCVEFfRE1fU1BfUk1UX09PQl9FVlQgKi8KQEAgLTg2OSw3ICs4NjksNyBAQAogLyogU3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBCVEFfRE1fQk9ORF9DQU5DRUxfQ01QTF9FVlQgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgdEJUQV9TVEFUVVMgICAgIHJlc3VsdDsgICAgLyogVFJVRSBvZiBib25kIGNhbmNlbCBzdWNjZWVkZWQsIEZBTFNFIGlmIGZhaWxlZC4gKi8KKyAgICB0QlRBX1NUQVRVUyAgICAgcmVzdWx0OyAgICAvKiB0cnVlIG9mIGJvbmQgY2FuY2VsIHN1Y2NlZWRlZCwgZmFsc2UgaWYgZmFpbGVkLiAqLwogfSB0QlRBX0RNX0JPTkRfQ0FOQ0VMX0NNUEw7CiAKIC8qIFVuaW9uIG9mIGFsbCBzZWN1cml0eSBjYWxsYmFjayBzdHJ1Y3R1cmVzICovCkBAIC05MDUsMjAgKzkwNSwyMCBAQAogI2RlZmluZSBCVEFfQkxFX01VTFRJX0FEVl9QQVJBTV9FVlQgICAgICAgICAzCiAjZGVmaW5lIEJUQV9CTEVfTVVMVElfQURWX0RBVEFfRVZUICAgICAgICAgIDQKIAotdHlwZWRlZiBVSU5UOCB0QlRBX0JMRV9NVUxUSV9BRFZfRVZUOwordHlwZWRlZiB1aW50OF90IHRCVEFfQkxFX01VTFRJX0FEVl9FVlQ7CiAKIC8qIG11bHRpIGFkdiBjYWxsYmFjayAqLwogdHlwZWRlZiB2b2lkICh0QlRBX0JMRV9NVUxUSV9BRFZfQ0JBQ0spKHRCVEFfQkxFX01VTFRJX0FEVl9FVlQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggaW5zdF9pZCwgdm9pZCAqcF9yZWYsIHRCVEFfU1RBVFVTIHN0YXR1cyk7Ci10eXBlZGVmIFVJTlQzMiB0QlRBX0RNX0JMRV9SRUZfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpbnN0X2lkLCB2b2lkICpwX3JlZiwgdEJUQV9TVEFUVVMgc3RhdHVzKTsKK3R5cGVkZWYgdWludDMyX3QgdEJUQV9ETV9CTEVfUkVGX1ZBTFVFOwogCiAjZGVmaW5lIEJUQV9ETV9CTEVfUEZfRU5BQkxFX0VWVCAgICAgICBCVE1fQkxFX1BGX0VOQUJMRQogI2RlZmluZSBCVEFfRE1fQkxFX1BGX0NPTkZJR19FVlQgICAgICAgQlRNX0JMRV9QRl9DT05GSUcKLXR5cGVkZWYgVUlOVDggdEJUQV9ETV9CTEVfUEZfRVZUOwordHlwZWRlZiB1aW50OF90IHRCVEFfRE1fQkxFX1BGX0VWVDsKIAogI2RlZmluZSBCVEFfRE1fQkxFX1BGX0VOQUJMRSAgICAgICAxCiAjZGVmaW5lIEJUQV9ETV9CTEVfUEZfQ09ORklHICAgICAgIDIKLXR5cGVkZWYgVUlOVDggdEJUQV9ETV9CTEVfUEZfQUNUSU9OOwordHlwZWRlZiB1aW50OF90IHRCVEFfRE1fQkxFX1BGX0FDVElPTjsKIAogLyogQ29uZmlnIGNhbGxiYWNrICovCiB0eXBlZGVmIHZvaWQgKHRCVEFfRE1fQkxFX1BGX0NGR19DQkFDSykgKHRCVEFfRE1fQkxFX1BGX0FDVElPTiBhY3Rpb24sCkBAIC05MjYsMTEgKzkyNiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX0JMRV9QRl9BVkJMX1NQQUNFIGF2Ymxfc3BhY2UsIHRCVEFfU1RBVFVTIHN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9CTEVfUkVGX1ZBTFVFIHJlZl92YWx1ZSk7CiAvKiBQYXJhbSBjYWxsYmFjayAqLwotdHlwZWRlZiB2b2lkICh0QlRBX0RNX0JMRV9QRl9QQVJBTV9DQkFDSykgKFVJTlQ4IGFjdGlvbl90eXBlLCB0QlRBX0RNX0JMRV9QRl9BVkJMX1NQQUNFIGF2Ymxfc3BhY2UsCit0eXBlZGVmIHZvaWQgKHRCVEFfRE1fQkxFX1BGX1BBUkFNX0NCQUNLKSAodWludDhfdCBhY3Rpb25fdHlwZSwgdEJUQV9ETV9CTEVfUEZfQVZCTF9TUEFDRSBhdmJsX3NwYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfRE1fQkxFX1JFRl9WQUxVRSByZWZfdmFsdWUsIHRCVEFfU1RBVFVTIHN0YXR1cyk7CiAKIC8qIFN0YXR1cyBjYWxsYmFjayAqLwotdHlwZWRlZiB2b2lkICh0QlRBX0RNX0JMRV9QRl9TVEFUVVNfQ0JBQ0spIChVSU5UOCBhY3Rpb24sIHRCVEFfU1RBVFVTIHN0YXR1cywKK3R5cGVkZWYgdm9pZCAodEJUQV9ETV9CTEVfUEZfU1RBVFVTX0NCQUNLKSAodWludDhfdCBhY3Rpb24sIHRCVEFfU1RBVFVTIHN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9CTEVfUkVGX1ZBTFVFIHJlZl92YWx1ZSk7CiAKIApAQCAtOTQxLDIxICs5NDEsMjEgQEAKICNkZWZpbmUgQlRBX0RNX0JMRV9QRl9MT0NfTkFNRV9DSEVDSyAgICAxNgogI2RlZmluZSBCVEFfRE1fQkxFX1BGX01BTlVGX05BTUVfQ0hFQ0sgIDMyCiAjZGVmaW5lIEJUQV9ETV9CTEVfUEZfU0VSVl9EQVRBX0NIRUNLICAgNjQKLXR5cGVkZWYgVUlOVDE2IHRCVEFfRE1fQkxFX1BGX0ZFQVRfU0VMOwordHlwZWRlZiB1aW50MTZfdCB0QlRBX0RNX0JMRV9QRl9GRUFUX1NFTDsKIAogI2RlZmluZSBCVEFfRE1fQkxFX1BGX0xJU1RfTE9HSUNfT1IgICAxCiAjZGVmaW5lIEJUQV9ETV9CTEVfUEZfTElTVF9MT0dJQ19BTkQgIDIKLXR5cGVkZWYgVUlOVDE2IHRCVEFfRE1fQkxFX1BGX0xJU1RfTE9HSUNfVFlQRTsKK3R5cGVkZWYgdWludDE2X3QgdEJUQV9ETV9CTEVfUEZfTElTVF9MT0dJQ19UWVBFOwogCiAjZGVmaW5lIEJUQV9ETV9CTEVfUEZfRklMVF9MT0dJQ19PUiAgIDAKICNkZWZpbmUgQlRBX0RNX0JMRV9QRl9GSUxUX0xPR0lDX0FORCAgMQotdHlwZWRlZiBVSU5UMTYgdEJUQV9ETV9CTEVfUEZfRklMVF9MT0dJQ19UWVBFOwordHlwZWRlZiB1aW50MTZfdCB0QlRBX0RNX0JMRV9QRl9GSUxUX0xPR0lDX1RZUEU7CiAKLXR5cGVkZWYgVUlOVDggIHRCVEFfRE1fQkxFX1BGX1JTU0lfVEhSRVNIT0xEOwotdHlwZWRlZiBVSU5UOCAgdEJUQV9ETV9CTEVfUEZfREVMSVZFUllfTU9ERTsKLXR5cGVkZWYgVUlOVDE2IHRCVEFfRE1fQkxFX1BGX1RJTUVPVVQ7Ci10eXBlZGVmIFVJTlQ4ICB0QlRBX0RNX0JMRV9QRl9USU1FT1VUX0NOVDsKLXR5cGVkZWYgVUlOVDE2IHRCVEFfRE1fQkxFX1BGX0FEVl9UUkFDS19FTlRSSUVTOwordHlwZWRlZiB1aW50OF90ICB0QlRBX0RNX0JMRV9QRl9SU1NJX1RIUkVTSE9MRDsKK3R5cGVkZWYgdWludDhfdCAgdEJUQV9ETV9CTEVfUEZfREVMSVZFUllfTU9ERTsKK3R5cGVkZWYgdWludDE2X3QgdEJUQV9ETV9CTEVfUEZfVElNRU9VVDsKK3R5cGVkZWYgdWludDhfdCAgdEJUQV9ETV9CTEVfUEZfVElNRU9VVF9DTlQ7Cit0eXBlZGVmIHVpbnQxNl90IHRCVEFfRE1fQkxFX1BGX0FEVl9UUkFDS19FTlRSSUVTOwogCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtOTgwLDcgKzk4MCw3IEBACiAjZGVmaW5lIEJUQV9ETV9ESV9ESVNDX0NNUExfRVZUICAgICAgICAgNSAgICAgICAvKiBEaXNjb3ZlcnkgY29tcGxldGUuICovCiAjZGVmaW5lIEJUQV9ETV9TRUFSQ0hfQ0FOQ0VMX0NNUExfRVZUICAgNiAgICAgICAvKiBTZWFyY2ggY2FuY2VsbGVkICovCiAKLXR5cGVkZWYgVUlOVDggdEJUQV9ETV9TRUFSQ0hfRVZUOwordHlwZWRlZiB1aW50OF90IHRCVEFfRE1fU0VBUkNIX0VWVDsKIAogI2RlZmluZSBCVEFfRE1fSU5RX1JFU19JR05PUkVfUlNTSSAgICAgIEJUTV9JTlFfUkVTX0lHTk9SRV9SU1NJIC8qIDB4N2YgUlNTSSB2YWx1ZSBub3Qgc3VwcGxpZWQgKGlnbm9yZSBpdCkgKi8KIApAQCAtOTg5LDE3ICs5ODksMTcgQEAKIHsKICAgICBCRF9BRERSICAgICAgICAgYmRfYWRkcjsgICAgICAgICAgICAgICAgLyogQkQgYWRkcmVzcyBwZWVyIGRldmljZS4gKi8KICAgICBERVZfQ0xBU1MgICAgICAgZGV2X2NsYXNzOyAgICAgICAgICAgICAgLyogRGV2aWNlIGNsYXNzIG9mIHBlZXIgZGV2aWNlLiAqLwotICAgIEJPT0xFQU4gICAgICAgICByZW10X25hbWVfbm90X3JlcXVpcmVkOyAvKiBBcHBsaWNhdGlvbiBzZXRzIHRoaXMgZmxhZyBpZiBpdCBhbHJlYWR5IGtub3dzIHRoZSBuYW1lIG9mIHRoZSBkZXZpY2UgKi8KKyAgICBib29sICAgICAgICAgcmVtdF9uYW1lX25vdF9yZXF1aXJlZDsgLyogQXBwbGljYXRpb24gc2V0cyB0aGlzIGZsYWcgaWYgaXQgYWxyZWFkeSBrbm93cyB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBkZXZpY2UgbmFtZSBpcyBrbm93biB0byBhcHBsaWNhdGlvbiBCVEEgc2tpcHMgdGhlIHJlbW90ZSBuYW1lIHJlcXVlc3QgKi8KLSAgICBCT09MRUFOICAgICAgICAgaXNfbGltaXRlZDsgICAgICAgICAgICAgLyogVFJVRSwgaWYgdGhlIGxpbWl0ZWQgaW5xdWlyeSBiaXQgaXMgc2V0IGluIHRoZSBDb0QgKi8KLSAgICBJTlQ4ICAgICAgICAgICAgcnNzaTsgICAgICAgICAgICAgICAgICAgLyogVGhlIHJzc2kgdmFsdWUgKi8KLSAgICBVSU5UOCAgICAgICAgICAgKnBfZWlyOyAgICAgICAgICAgICAgICAgLyogcmVjZWl2ZWQgRUlSICovCisgICAgYm9vbCAgICAgICAgIGlzX2xpbWl0ZWQ7ICAgICAgICAgICAgIC8qIHRydWUsIGlmIHRoZSBsaW1pdGVkIGlucXVpcnkgYml0IGlzIHNldCBpbiB0aGUgQ29EICovCisgICAgaW50OF90ICAgICAgICAgICAgcnNzaTsgICAgICAgICAgICAgICAgICAgLyogVGhlIHJzc2kgdmFsdWUgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAqcF9laXI7ICAgICAgICAgICAgICAgICAvKiByZWNlaXZlZCBFSVIgKi8KICNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUpCi0gICAgVUlOVDggICAgICAgICAgICAgICBpbnFfcmVzdWx0X3R5cGU7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBibGVfYWRkcl90eXBlOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBpbnFfcmVzdWx0X3R5cGU7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIGJsZV9hZGRyX3R5cGU7CiAgICAgdEJUTV9CTEVfRVZUX1RZUEUgICBibGVfZXZ0X3R5cGU7CiAgICAgdEJUX0RFVklDRV9UWVBFICAgICBkZXZpY2VfdHlwZTsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGZsYWc7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIGZsYWc7CiAjZW5kaWYKIAogfSB0QlRBX0RNX0lOUV9SRVM7CkBAIC0xMDA3LDE0ICsxMDA3LDE0IEBACiAvKiBTdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIEJUQV9ETV9JTlFfQ01QTF9FVlQgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDggICAgICAgICAgIG51bV9yZXNwczsgICAgICAgICAgLyogTnVtYmVyIG9mIGlucXVpcnkgcmVzcG9uc2VzLiAqLworICAgIHVpbnQ4X3QgICAgICAgICAgIG51bV9yZXNwczsgICAgICAgICAgLyogTnVtYmVyIG9mIGlucXVpcnkgcmVzcG9uc2VzLiAqLwogfSB0QlRBX0RNX0lOUV9DTVBMOwogCiAvKiBTdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIEJUQV9ETV9ESV9ESVNDX0NNUExfRVZUICovCiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJEX0FERFIgICAgICAgICAgICAgYmRfYWRkcjsgICAgICAgIC8qIEJEIGFkZHJlc3MgcGVlciBkZXZpY2UuICovCi0gICAgVUlOVDggICAgICAgICAgICAgICBudW1fcmVjb3JkOyAgICAgLyogTnVtYmVyIG9mIERJIHJlY29yZCAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBudW1fcmVjb3JkOyAgICAgLyogTnVtYmVyIG9mIERJIHJlY29yZCAqLwogICAgIHRCVEFfU1RBVFVTICAgICAgICAgcmVzdWx0OwogfSB0QlRBX0RNX0RJX0RJU0NfQ01QTDsKIApAQCAtMTAyNCwxMSArMTAyNCwxMSBAQAogICAgIEJEX0FERFIgICAgICAgICAgICAgYmRfYWRkcjsgICAgICAgIC8qIEJEIGFkZHJlc3MgcGVlciBkZXZpY2UuICovCiAgICAgQkRfTkFNRSAgICAgICAgICAgICBiZF9uYW1lOyAgICAgICAgLyogTmFtZSBvZiBwZWVyIGRldmljZS4gKi8KICAgICB0QlRBX1NFUlZJQ0VfTUFTSyAgIHNlcnZpY2VzOyAgICAgICAvKiBTZXJ2aWNlcyBmb3VuZCBvbiBwZWVyIGRldmljZS4gKi8KLSAgICBVSU5UOCAgICAgICAgICAgKiAgIHBfcmF3X2RhdGE7ICAgICAvKiBSYXcgZGF0YSBmb3IgZGlzY292ZXJ5IERCICovCi0gICAgVUlOVDMyICAgICAgICAgICAgICByYXdfZGF0YV9zaXplOyAgLyogc2l6ZSBvZiByYXcgZGF0YSAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICogICBwX3Jhd19kYXRhOyAgICAgLyogUmF3IGRhdGEgZm9yIGRpc2NvdmVyeSBEQiAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgICByYXdfZGF0YV9zaXplOyAgLyogc2l6ZSBvZiByYXcgZGF0YSAqLwogICAgIHRCVF9ERVZJQ0VfVFlQRSAgICAgZGV2aWNlX3R5cGU7ICAgIC8qIGRldmljZSB0eXBlIGluIGNhc2UgaXQgaXMgQkxFIGRldmljZSAqLwotICAgIFVJTlQzMiAgICAgICAgICAgICAgbnVtX3V1aWRzOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgKnBfdXVpZF9saXN0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBudW1fdXVpZHM7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICpwX3V1aWRfbGlzdDsKICAgICB0QlRBX1NUQVRVUyAgICAgICAgIHJlc3VsdDsKIH0gdEJUQV9ETV9ESVNDX1JFUzsKIApAQCAtMTA2Nyw3ICsxMDY3LDcgQEAKICNkZWZpbmUgQlRBX0RNX0JMRV9TRUNfTUlUTSAgICAgICAgIEJUTV9CTEVfU0VDX0VOQ1JZUFRfTUlUTQogdHlwZWRlZiB0QlRNX0JMRV9TRUNfQUNUICAgICAgICAgICAgdEJUQV9ETV9CTEVfU0VDX0FDVDsKIAotI2lmIEJMRV9JTkNMVURFRCA9PSBUUlVFCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogdHlwZWRlZiB0QlRNX0JMRV9UWF9USU1FX01TICAgICAgICAgdEJUQV9ETV9CTEVfVFhfVElNRV9NUzsKIHR5cGVkZWYgdEJUTV9CTEVfUlhfVElNRV9NUyAgICAgICAgIHRCVEFfRE1fQkxFX1JYX1RJTUVfTVM7CiB0eXBlZGVmIHRCVE1fQkxFX0lETEVfVElNRV9NUyAgICAgICB0QlRBX0RNX0JMRV9JRExFX1RJTUVfTVM7CkBAIC0xMDc4LDIwICsxMDc4LDIwIEBACiAjZGVmaW5lIEJUQV9ETV9DT05UUkxfU0NBTiAgICAyICAgICAgIC8qIFNjYW4gc3RhdGUgLSBwYWdpbmcvaW5xdWlyeS90cnlpbmcgdG8gY29ubmVjdCovCiAjZGVmaW5lIEJUQV9ETV9DT05UUkxfSURMRSAgICAzICAgICAgIC8qIElkbGUgc3RhdGUgLSBwYWdlIHNjYW4sIExFIGFkdnQsIGlucXVpcnkgc2NhbiAqLwogCi10eXBlZGVmIFVJTlQ4IHRCVEFfRE1fQ09OVFJMX1NUQVRFOwordHlwZWRlZiB1aW50OF90IHRCVEFfRE1fQ09OVFJMX1NUQVRFOwogCi10eXBlZGVmIFVJTlQ4IHRCVEFfRE1fQkxFX0FEVl9TVEFURTsKLXR5cGVkZWYgVUlOVDggdEJUQV9ETV9CTEVfQURWX0lORk9fUFJFU0VOVDsKLXR5cGVkZWYgVUlOVDggdEJUQV9ETV9CTEVfUlNTSV9WQUxVRTsKLXR5cGVkZWYgVUlOVDE2IHRCVEFfRE1fQkxFX0FEVl9JTkZPX1RJTUVTVEFNUDsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0RNX0JMRV9BRFZfU1RBVEU7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9ETV9CTEVfQURWX0lORk9fUFJFU0VOVDsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0RNX0JMRV9SU1NJX1ZBTFVFOwordHlwZWRlZiB1aW50MTZfdCB0QlRBX0RNX0JMRV9BRFZfSU5GT19USU1FU1RBTVA7CiAKIHR5cGVkZWYgdEJUTV9CTEVfVFJBQ0tfQURWX0RBVEEgdEJUQV9ETV9CTEVfVFJBQ0tfQURWX0RBVEE7CiAKIHR5cGVkZWYgdm9pZCAodEJUQV9CTEVfU0NBTl9USFJFU0hPTERfQ0JBQ0spKHRCVEFfRE1fQkxFX1JFRl9WQUxVRSByZWZfdmFsdWUpOwogCi10eXBlZGVmIHZvaWQgKHRCVEFfQkxFX1NDQU5fUkVQX0NCQUNLKSAodEJUQV9ETV9CTEVfUkVGX1ZBTFVFIHJlZl92YWx1ZSwgVUlOVDggcmVwb3J0X2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBudW1fcmVjb3JkcywgVUlOVDE2IGRhdGFfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4KiBwX3JlcF9kYXRhLCB0QlRBX1NUQVRVUyBzdGF0dXMpOwordHlwZWRlZiB2b2lkICh0QlRBX0JMRV9TQ0FOX1JFUF9DQkFDSykgKHRCVEFfRE1fQkxFX1JFRl9WQUxVRSByZWZfdmFsdWUsIHVpbnQ4X3QgcmVwb3J0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9yZWNvcmRzLCB1aW50MTZfdCBkYXRhX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3JlcF9kYXRhLCB0QlRBX1NUQVRVUyBzdGF0dXMpOwogCiB0eXBlZGVmIHZvaWQgKHRCVEFfQkxFX1NDQU5fU0VUVVBfQ0JBQ0spICh0QlRBX0JMRV9CQVRDSF9TQ0FOX0VWVCBldnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX0JMRV9SRUZfVkFMVUUgcmVmX3ZhbHVlLApAQCAtMTExMSw3ICsxMTExLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfU1RBVFVTIHN0YXR1cyk7CiAKICNlbHNlCi10eXBlZGVmIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX0JMRV9TRUNfQUNUOwordHlwZWRlZiB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX0JMRV9TRUNfQUNUOwogI2VuZGlmCiAKIC8qIE1heGltdW0gc2VydmljZSBuYW1lIGxlbmd0aCAqLwpAQCAtMTEyNSw3ICsxMTI1LDcgQEAKICNkZWZpbmUgQlRBX0RNX0xQX0hPTEQgICAgICAgICAgSENJX0VOQUJMRV9IT0xEX01PREUKICNkZWZpbmUgQlRBX0RNX0xQX1NOSUZGICAgICAgICAgSENJX0VOQUJMRV9TTklGRl9NT0RFCiAjZGVmaW5lIEJUQV9ETV9MUF9QQVJLICAgICAgICAgIEhDSV9FTkFCTEVfUEFSS19NT0RFCi10eXBlZGVmIFVJTlQxNiB0QlRBX0RNX0xQX01BU0s7Cit0eXBlZGVmIHVpbnQxNl90IHRCVEFfRE1fTFBfTUFTSzsKIAogLyogcG93ZXIgbW9kZSBhY3Rpb25zICAqLwogI2RlZmluZSBCVEFfRE1fUE1fTk9fQUNUSU9OICAgIDB4MDAgICAgICAgLyogbm8gY2hhbmdlIHRvIHRoZSBjdXJyZW50IHBtIHNldHRpbmcgKi8KQEAgLTExNDUsNyArMTE0NSw3IEBACiAjZGVmaW5lIEJUQV9ETV9QTV9TVVNQRU5EICAgICAgMHgwNCAgICAgICAvKiBwcmVmZXJzIHN1c3BlbmQgbW9kZSAqLwogI2RlZmluZSBCVEFfRE1fUE1fTk9fUFJFRiAgICAgIDB4MDEgICAgICAgLyogc2VydmljZSBoYXMgbm8gcHJlZmVybmNlIG9uIHBvd2VyIG1vZGUgc2V0dGluZy4gZWcuIGNvbm5lY3Rpb24gdG8gc2VydmljZSBnb3QgY2xvc2VkICovCiAKLXR5cGVkZWYgVUlOVDggdEJUQV9ETV9QTV9BQ1RJT047Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9ETV9QTV9BQ1RJT047CiAKIC8qIGluZGV4IHRvIGJ0YV9kbV9zc3Jfc3BlYyAqLwogI2RlZmluZSBCVEFfRE1fUE1fU1NSMCAgICAgICAgICAwCkBAIC0xMjYzLDcgKzEyNjMsNyBAQAogLyogU3dpdGNoIGNhbGxiYWNrIGV2ZW50cyAqLwogI2RlZmluZSBCVEFfRE1fU1dJVENIX0NNUExfRVZUICAgICAgMCAgICAgICAvKiBDb21wbGV0aW9uIG9mIHRoZSBTd2l0Y2ggQVBJICovCiAKLXR5cGVkZWYgVUlOVDggdEJUQV9ETV9TV0lUQ0hfRVZUOwordHlwZWRlZiB1aW50OF90IHRCVEFfRE1fU1dJVENIX0VWVDsKIHR5cGVkZWYgdm9pZCAodEJUQV9ETV9TV0lUQ0hfQ0JBQ0spKHRCVEFfRE1fU1dJVENIX0VWVCBldmVudCwgdEJUQV9TVEFUVVMgc3RhdHVzKTsKIAogLyogQXVkaW8gcm91dGluZyBvdXQgY29uZmlndXJhdGlvbiAqLwpAQCAtMTI3Nyw3ICsxMjc3LDcgQEAKICNkZWZpbmUgQlRBX0RNX1JPVVRFX0ZNUlggICAgICAgMHg0MCAgICAvKiByb3V0aW5nIG92ZXIgRk1SWCAqLwogI2RlZmluZSBCVEFfRE1fUk9VVEVfQlRTTksgICAgICAweDgwICAgIC8qIHJvdXRpbmcgb3ZlciBCVCBTTksgKi8KIAotdHlwZWRlZiBVSU5UOCB0QlRBX0RNX1JPVVRFX1BBVEg7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9ETV9ST1VURV9QQVRIOwogCiAKIC8qIERldmljZSBJZGVudGlmaWNhdGlvbiAoREkpIGRhdGEgc3RydWN0dXJlCkBAIC0xMzAxLDcgKzEzMDEsNyBAQAogI2RlZmluZSBCVEFfRE1fTElOS19UWVBFX0JSX0VEUiAgICAweDAxCiAjZGVmaW5lIEJUQV9ETV9MSU5LX1RZUEVfTEUgICAgICAgIDB4MDIKICNkZWZpbmUgQlRBX0RNX0xJTktfVFlQRV9BTEwgICAgICAgMHhGRgotdHlwZWRlZiBVSU5UOCB0QlRBX0RNX0xJTktfVFlQRTsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0RNX0xJTktfVFlQRTsKIAogI2RlZmluZSBJTU1FRElBVEVfREVMWV9NT0RFICAweDAwCiAjZGVmaW5lIE9ORk9VTkRfREVMWV9NT0RFICAgIDB4MDEKQEAgLTEzOTMsNyArMTM5Myw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0RtU2V0VmlzaWJpbGl0eSh0QlRBX0RNX0RJU0MgZGlzY19tb2RlLCB0QlRBX0RNX0NPTk4gY29ubl9tb2RlLCBVSU5UOCBwYWlyYWJsZV9tb2RlLCBVSU5UOCBjb25uX2ZpbHRlcik7CitleHRlcm4gdm9pZCBCVEFfRG1TZXRWaXNpYmlsaXR5KHRCVEFfRE1fRElTQyBkaXNjX21vZGUsIHRCVEFfRE1fQ09OTiBjb25uX21vZGUsIHVpbnQ4X3QgcGFpcmFibGVfbW9kZSwgdWludDhfdCBjb25uX2ZpbHRlcik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMTQzNyw3ICsxNDM3LDcgQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogZXh0ZXJuIHZvaWQgQlRBX0RtRGlzY292ZXIoQkRfQUREUiBiZF9hZGRyLCB0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfRE1fU0VBUkNIX0NCQUNLICpwX2NiYWNrLCBCT09MRUFOIHNkcF9zZWFyY2gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sgKnBfY2JhY2ssIGJvb2wgc2RwX3NlYXJjaCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMTQ1MSw3ICsxNDUxLDcgQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogZXh0ZXJuIHZvaWQgQlRBX0RtRGlzY292ZXJVVUlEKEJEX0FERFIgYmRfYWRkciwgdFNEUF9VVUlEICp1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfRE1fU0VBUkNIX0NCQUNLICpwX2NiYWNrLCBCT09MRUFOIHNkcF9zZWFyY2gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfRE1fU0VBUkNIX0NCQUNLICpwX2NiYWNrLCBib29sIHNkcF9zZWFyY2gpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTE0NjMsNyArMTQ2Myw3IEBACiAqKiAgICAgICAgICAgICAgICAgIEJUQV9GQUlMVVJFIGlmIGNhY2hlZCBuYW1lIGlzIG5vdCBhdmFpbGFibGUKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9TVEFUVVMgQlRBX0RtR2V0Q2FjaGVkUmVtb3RlTmFtZShCRF9BRERSIHJlbW90ZV9kZXZpY2UsIFVJTlQ4ICoqcHBfY2FjaGVkX25hbWUpOwordEJUQV9TVEFUVVMgQlRBX0RtR2V0Q2FjaGVkUmVtb3RlTmFtZShCRF9BRERSIHJlbW90ZV9kZXZpY2UsIHVpbnQ4X3QgKipwcF9jYWNoZWRfbmFtZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMTUyMCw4ICsxNTIwLDggQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfRG1QaW5SZXBseShCRF9BRERSIGJkX2FkZHIsIEJPT0xFQU4gYWNjZXB0LCBVSU5UOCBwaW5fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfcGluKTsKK2V4dGVybiB2b2lkIEJUQV9EbVBpblJlcGx5KEJEX0FERFIgYmRfYWRkciwgYm9vbCBhY2NlcHQsIHVpbnQ4X3QgcGluX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfcGluKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0xNTQ1LDcgKzE1NDUsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9EbUNvbmZpcm0oQkRfQUREUiBiZF9hZGRyLCBCT09MRUFOIGFjY2VwdCk7CitleHRlcm4gdm9pZCBCVEFfRG1Db25maXJtKEJEX0FERFIgYmRfYWRkciwgYm9vbCBhY2NlcHQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTE1NjIsOCArMTU2Miw4IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogZXh0ZXJuIHZvaWQgQlRBX0RtQWRkRGV2aWNlKEJEX0FERFIgYmRfYWRkciwgREVWX0NMQVNTIGRldl9jbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU5LX0tFWSBsaW5rX2tleSwgdEJUQV9TRVJWSUNFX01BU0sgdHJ1c3RlZF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xFQU4gaXNfdHJ1c3RlZCwgVUlOVDgga2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9JT19DQVAgaW9fY2FwLCBVSU5UOCBwaW5fbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3RydXN0ZWQsIHVpbnQ4X3Qga2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9JT19DQVAgaW9fY2FwLCB1aW50OF90IHBpbl9sZW5ndGgpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTE1OTIsNyArMTU5Miw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIE5vbmUKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0dldEVpclNlcnZpY2UoIFVJTlQ4ICpwX2VpciwgdEJUQV9TRVJWSUNFX01BU0sgKnBfc2VydmljZXMgKTsKK2V4dGVybiB2b2lkIEJUQV9HZXRFaXJTZXJ2aWNlKCB1aW50OF90ICpwX2VpciwgdEJUQV9TRVJWSUNFX01BU0sgKnBfc2VydmljZXMgKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0xNjAzLDcgKzE2MDMsNyBAQAogKiogUmV0dXJucyAgICAgICAgICAwIGlmIHRoZSBkZXZpY2UgaXMgTk9UIGNvbm5lY3RlZC4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIFVJTlQxNiBCVEFfRG1HZXRDb25uZWN0aW9uU3RhdGUoIGNvbnN0IEJEX0FERFIgYmRfYWRkciApOworZXh0ZXJuIHVpbnQxNl90IEJUQV9EbUdldENvbm5lY3Rpb25TdGF0ZSggY29uc3QgQkRfQUREUiBiZF9hZGRyICk7CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE2MTYsNyArMTYxNiw3IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGV4dGVybiB0QlRBX1NUQVRVUyBCVEFfRG1TZXRMb2NhbERpUmVjb3JkKCB0QlRBX0RJX1JFQ09SRCAqcF9kZXZpY2VfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgKnBfaGFuZGxlICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBfaGFuZGxlICk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMTYzNCw3ICsxNjM0LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZC4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0RtQ2xvc2VBQ0woQkRfQUREUiBiZF9hZGRyLCBCT09MRUFOIHJlbW92ZV9kZXYsIHRCVEFfVFJBTlNQT1JUIHRyYW5zcG9ydCk7CitleHRlcm4gdm9pZCBCVEFfRG1DbG9zZUFDTChCRF9BRERSIGJkX2FkZHIsIGJvb2wgcmVtb3ZlX2RldiwgdEJUQV9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0xNjY0LDcgKzE2NjQsNyBAQAogKiogUmV0dXJucyAgICAgICAgICBub25lCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9EbVBjbUluaXRTYW1wbGVzIChVSU5UMzIgc3JjX3NwcywgVUlOVDMyIGJpdHMsIFVJTlQzMiBuX2NoYW5uZWxzKTsKK2V4dGVybiB2b2lkIEJUQV9EbVBjbUluaXRTYW1wbGVzICh1aW50MzJfdCBzcmNfc3BzLCB1aW50MzJfdCBiaXRzLCB1aW50MzJfdCBuX2NoYW5uZWxzKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKiBGdW5jdGlvbiAgICAgICAgIEJUQV9EbVBjbVJlc2FtcGxlCkBAIC0xNjc5LDEzICsxNjc5LDEzIEBACiAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb252ZXJ0ZWQgUENNIHNhbXBsZXMuCiAqKgogKioKLSoqIFJldHVybnMgICAgICAgICAgSU5UMzI6IG51bWJlciBvZiBzYW1wbGVzIGNvbnZlcnRlZC4KKyoqIFJldHVybnMgICAgICAgICAgaW50MzJfdDogbnVtYmVyIG9mIHNhbXBsZXMgY29udmVydGVkLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIElOVDMyIEJUQV9EbVBjbVJlc2FtcGxlICh2b2lkICpwX3NyYywgVUlOVDMyIGluX2J5dGVzLCB2b2lkICpwX2RzdCk7CitleHRlcm4gaW50MzJfdCBCVEFfRG1QY21SZXNhbXBsZSAodm9pZCAqcF9zcmMsIHVpbnQzMl90IGluX2J5dGVzLCB2b2lkICpwX2RzdCk7CiAjZW5kaWYKIAotI2lmICgoZGVmaW5lZCBCTEVfSU5DTFVERUQpICYmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkpCisjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFKQogLyogQkxFIHJlbGF0ZWQgQVBJIGZ1bmN0aW9ucyAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0xNzMzLDcgKzE3MzMsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9EbUJsZVBhc3NrZXlSZXBseShCRF9BRERSIGJkX2FkZHIsIEJPT0xFQU4gYWNjZXB0LCBVSU5UMzIgcGFzc2tleSk7CitleHRlcm4gdm9pZCBCVEFfRG1CbGVQYXNza2V5UmVwbHkoQkRfQUREUiBiZF9hZGRyLCBib29sIGFjY2VwdCwgdWludDMyX3QgcGFzc2tleSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMTc0Nyw3ICsxNzQ3LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfRG1CbGVDb25maXJtUmVwbHkoQkRfQUREUiBiZF9hZGRyLCBCT09MRUFOIGFjY2VwdCk7CitleHRlcm4gdm9pZCBCVEFfRG1CbGVDb25maXJtUmVwbHkoQkRfQUREUiBiZF9hZGRyLCBib29sIGFjY2VwdCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMTgwNSw4ICsxODA1LDggQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogZXh0ZXJuIHZvaWQgQlRBX0RtU2V0QmxlUHJlZkNvbm5QYXJhbXMoY29uc3QgQkRfQUREUiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IG1pbl9jb25uX2ludCwgVUlOVDE2IG1heF9jb25uX2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBzbGF2ZV9sYXRlbmN5LCBVSU5UMTYgc3VwZXJ2aXNpb25fdG91dCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX2Nvbm5faW50LCB1aW50MTZfdCBtYXhfY29ubl9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzbGF2ZV9sYXRlbmN5LCB1aW50MTZfdCBzdXBlcnZpc2lvbl90b3V0ICk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMTgyMSw4ICsxODIxLDggQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfRG1TZXRCbGVDb25uU2NhblBhcmFtcyhVSU5UMzIgc2Nhbl9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBzY2FuX3dpbmRvdyk7CitleHRlcm4gdm9pZCBCVEFfRG1TZXRCbGVDb25uU2NhblBhcmFtcyh1aW50MzJfdCBzY2FuX2ludGVydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2Nhbl93aW5kb3cpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTE4MzksOCArMTgzOSw4IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0RtU2V0QmxlU2NhblBhcmFtcyh0R0FUVF9JRiBjbGllbnRfaWYsIFVJTlQzMiBzY2FuX2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgc2Nhbl93aW5kb3csIHRCTEVfU0NBTl9NT0RFIHNjYW5fbW9kZSwKK2V4dGVybiB2b2lkIEJUQV9EbVNldEJsZVNjYW5QYXJhbXModEdBVFRfSUYgY2xpZW50X2lmLCB1aW50MzJfdCBzY2FuX2ludGVydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzY2FuX3dpbmRvdywgdEJMRV9TQ0FOX01PREUgc2Nhbl9tb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX1NDQU5fUEFSQU1fU0VUVVBfQ0JBQ0sgc2Nhbl9wYXJhbV9zZXR1cF9zdGF0dXNfY2JhY2spOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTg1OCw3ICsxODU4LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfRG1TZXRCbGVBZHZQYXJhbXMgKFVJTlQxNiBhZHZfaW50X21pbiwgVUlOVDE2IGFkdl9pbnRfbWF4LAorZXh0ZXJuIHZvaWQgQlRBX0RtU2V0QmxlQWR2UGFyYW1zICh1aW50MTZfdCBhZHZfaW50X21pbiwgdWludDE2X3QgYWR2X2ludF9tYXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQkRfQUREUiAqcF9kaXJfYmRhKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMTg5OCw3ICsxODk4LDcgQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogZXh0ZXJuIHZvaWQgQlRBX0RtRGlzY292ZXJFeHQoQkRfQUREUiBiZF9hZGRyLCB0QlRBX1NFUlZJQ0VfTUFTS19FWFQgKnBfc2VydmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX1NFQVJDSF9DQkFDSyAqcF9jYmFjaywgQk9PTEVBTiBzZHBfc2VhcmNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfRE1fU0VBUkNIX0NCQUNLICpwX2NiYWNrLCBib29sIHNkcF9zZWFyY2gpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTE5MTcsNyArMTkxNyw3IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGV4dGVybiB2b2lkIEJUQV9EbURpc2NvdmVyQnlUcmFuc3BvcnQoQkRfQUREUiBiZF9hZGRyLCB0QlRBX1NFUlZJQ0VfTUFTS19FWFQgKnBfc2VydmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfRE1fU0VBUkNIX0NCQUNLICpwX2NiYWNrLCBCT09MRUFOIHNkcF9zZWFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfRE1fU0VBUkNIX0NCQUNLICpwX2NiYWNrLCBib29sIHNkcF9zZWFyY2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfVFJBTlNQT1JUIHRyYW5zcG9ydCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xOTYyLDEzICsxOTYyLDEzIEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0RtQmxlT2JzZXJ2ZShCT09MRUFOIHN0YXJ0LCBVSU5UOCBkdXJhdGlvbiwKK2V4dGVybiB2b2lkIEJUQV9EbUJsZU9ic2VydmUoYm9vbCBzdGFydCwgdWludDhfdCBkdXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sgKnBfcmVzdWx0c19jYik7CiAKIAogI2VuZGlmCiAKLSNpZiBCTEVfSU5DTFVERUQgPT0gVFJVRQorI2lmIChCTEVfSU5DTFVERUQgPT0gVFJVRSkKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgogKiogRnVuY3Rpb24gICAgICAgICBCVEFfRG1CbGVDb25maWdMb2NhbFByaXZhY3kKQEAgLTE5ODAsNyArMTk4MCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0RtQmxlQ29uZmlnTG9jYWxQcml2YWN5KEJPT0xFQU4gcHJpdmFjeV9lbmFibGUpOworZXh0ZXJuIHZvaWQgQlRBX0RtQmxlQ29uZmlnTG9jYWxQcml2YWN5KGJvb2wgcHJpdmFjeV9lbmFibGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTE5OTQsNyArMTk5NCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0RtQmxlRW5hYmxlUmVtb3RlUHJpdmFjeShCRF9BRERSIGJkX2FkZHIsIEJPT0xFQU4gcHJpdmFjeV9lbmFibGUpOworZXh0ZXJuIHZvaWQgQlRBX0RtQmxlRW5hYmxlUmVtb3RlUHJpdmFjeShCRF9BRERSIGJkX2FkZHIsIGJvb2wgcHJpdmFjeV9lbmFibGUpOwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMDM4LDcgKzIwMzgsNyBAQAogKiogUmV0dXJucyAgICAgICAgICBOb25lCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9EbUJsZUJyb2FkY2FzdCAoQk9PTEVBTiBzdGFydCk7CitleHRlcm4gdm9pZCBCVEFfRG1CbGVCcm9hZGNhc3QgKGJvb2wgc3RhcnQpOwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMDY5LDcgKzIwNjksNyBAQAogKiogUmV0dXJucyAgICAgICAgICBOb25lCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9CbGVVcGRhdGVBZHZJbnN0UGFyYW0gKFVJTlQ4IGluc3RfaWQsCitleHRlcm4gdm9pZCBCVEFfQmxlVXBkYXRlQWR2SW5zdFBhcmFtICh1aW50OF90IGluc3RfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQkxFX0FEVl9QQVJBTVMgKnBfcGFyYW1zKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIwODQsNyArMjA4NCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIE5vbmUKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0JsZUNmZ0Fkdkluc3REYXRhIChVSU5UOCBpbnN0X2lkLCBCT09MRUFOIGlzX3NjYW5fcnNwLAorZXh0ZXJuIHZvaWQgQlRBX0JsZUNmZ0Fkdkluc3REYXRhICh1aW50OF90IGluc3RfaWQsIGJvb2wgaXNfc2Nhbl9yc3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQkxFX0FEX01BU0sgZGF0YV9tYXNrLCB0QlRBX0JMRV9BRFZfREFUQSAqcF9kYXRhKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIwOTgsNyArMjA5OCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIE5vbmUKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0JsZURpc2FibGVBZHZJbnN0YW5jZShVSU5UOCBpbnN0X2lkKTsKK2V4dGVybiB2b2lkIEJUQV9CbGVEaXNhYmxlQWR2SW5zdGFuY2UodWludDhfdCBpbnN0X2lkKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0yMTE1LDggKzIxMTUsOCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9EbUJsZVVwZGF0ZUNvbm5lY3Rpb25QYXJhbXMoY29uc3QgQkRfQUREUiBiZF9hZGRyLCBVSU5UMTYgbWluX2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IG1heF9pbnQsIFVJTlQxNiBsYXRlbmN5LCBVSU5UMTYgdGltZW91dCk7CitleHRlcm4gdm9pZCBCVEFfRG1CbGVVcGRhdGVDb25uZWN0aW9uUGFyYW1zKGNvbnN0IEJEX0FERFIgYmRfYWRkciwgdWludDE2X3QgbWluX2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4X2ludCwgdWludDE2X3QgbGF0ZW5jeSwgdWludDE2X3QgdGltZW91dCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMjEyNyw3ICsyMTI3LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfRG1CbGVTZXREYXRhTGVuZ3RoKEJEX0FERFIgcmVtb3RlX2RldmljZSwgVUlOVDE2IHR4X2RhdGFfbGVuZ3RoKTsKK2V4dGVybiB2b2lkIEJUQV9EbUJsZVNldERhdGFMZW5ndGgoQkRfQUREUiByZW1vdGVfZGV2aWNlLCB1aW50MTZfdCB0eF9kYXRhX2xlbmd0aCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMjE0Nyw5ICsyMTQ3LDkgQEAKICoqIFJldHVybnMgICAgICAgICAgIE5vbmUKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0RtQmxlU2V0U3RvcmFnZVBhcmFtcyhVSU5UOCBiYXRjaF9zY2FuX2Z1bGxfbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBiYXRjaF9zY2FuX3RydW5jX21heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggYmF0Y2hfc2Nhbl9ub3RpZnlfdGhyZXNob2xkLAorZXh0ZXJuIHZvaWQgQlRBX0RtQmxlU2V0U3RvcmFnZVBhcmFtcyh1aW50OF90IGJhdGNoX3NjYW5fZnVsbF9tYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmF0Y2hfc2Nhbl90cnVuY19tYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmF0Y2hfc2Nhbl9ub3RpZnlfdGhyZXNob2xkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0JMRV9TQ0FOX1NFVFVQX0NCQUNLICpwX3NldHVwX2NiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0JMRV9TQ0FOX1RIUkVTSE9MRF9DQkFDSyAqcF90aHJlc19jYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9CTEVfU0NBTl9SRVBfQ0JBQ0sqIHBfcmVwX2NiYWNrLApAQCAtMjE3Miw3ICsyMTcyLDcgQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogZXh0ZXJuIHZvaWQgQlRBX0RtQmxlRW5hYmxlQmF0Y2hTY2FuKHRCVEFfQkxFX0JBVENIX1NDQU5fTU9ERSBzY2FuX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBzY2FuX2ludGVydmFsLCBVSU5UMzIgc2Nhbl93aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNjYW5faW50ZXJ2YWwsIHVpbnQzMl90IHNjYW5fd2luZG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0JMRV9ESVNDQVJEX1JVTEUgZGlzY2FyZF9ydWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSAgICAgICAgYWRkcl90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX0JMRV9SRUZfVkFMVUUgcmVmX3ZhbHVlKTsKQEAgLTIyMTgsNyArMjIxOCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0RtRW5hYmxlU2NhbkZpbHRlcihVSU5UOCBhY3Rpb24sCitleHRlcm4gdm9pZCBCVEFfRG1FbmFibGVTY2FuRmlsdGVyKHVpbnQ4X3QgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfRE1fQkxFX1BGX1NUQVRVU19DQkFDSyAqcF9jbXBsX2NiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfRE1fQkxFX1JFRl9WQUxVRSByZWZfdmFsdWUpOwogCkBAIC0yMjM4LDcgKzIyMzgsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9EbUJsZVNjYW5GaWx0ZXJTZXR1cChVSU5UOCBhY3Rpb24sCitleHRlcm4gdm9pZCBCVEFfRG1CbGVTY2FuRmlsdGVyU2V0dXAodWludDhfdCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX0JMRV9QRl9GSUxUX0lOREVYIGZpbHRfaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX0JMRV9QRl9GSUxUX1BBUkFNUyAqcF9maWx0X3BhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQkRfQUREUiAqcF90YXJnZXQsCmRpZmYgLS1naXQgYS9idGEvaW5jbHVkZS9idGFfYXJfYXBpLmggYi9idGEvaW5jbHVkZS9idGFfYXJfYXBpLmgKaW5kZXggMzAyODMzYy4uMzdiMDYwYiAxMDA2NDQKLS0tIGEvYnRhL2luY2x1ZGUvYnRhX2FyX2FwaS5oCisrKyBiL2J0YS9pbmNsdWRlL2J0YV9hcl9hcGkuaApAQCAtOTYsNyArOTYsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9hcl9yZWdfYXZjdChVSU5UMTYgbXR1LCBVSU5UMTYgbXR1X2JyLCBVSU5UOCBzZWNfbWFzaywgdEJUQV9TWVNfSUQgc3lzX2lkKTsKK2V4dGVybiB2b2lkIGJ0YV9hcl9yZWdfYXZjdCh1aW50MTZfdCBtdHUsIHVpbnQxNl90IG10dV9iciwgdWludDhfdCBzZWNfbWFzaywgdEJUQV9TWVNfSUQgc3lzX2lkKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0xMTgsOSArMTE4LDkgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9hcl9yZWdfYXZyYyhVSU5UMTYgc2VydmljZV91dWlkLCBjaGFyICpwX3NlcnZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwX3Byb3ZpZGVyX25hbWUsIFVJTlQxNiBjYXRlZ29yaWVzLCB0QlRBX1NZU19JRCBzeXNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTEVBTiBicm93c2Vfc3VwcG9ydGVkLCBVSU5UMTYgcHJvZmlsZV92ZXJzaW9uKTsKK2V4dGVybiB2b2lkIGJ0YV9hcl9yZWdfYXZyYyh1aW50MTZfdCBzZXJ2aWNlX3V1aWQsIGNoYXIgKnBfc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBfcHJvdmlkZXJfbmFtZSwgdWludDE2X3QgY2F0ZWdvcmllcywgdEJUQV9TWVNfSUQgc3lzX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYnJvd3NlX3N1cHBvcnRlZCwgdWludDE2X3QgcHJvZmlsZV92ZXJzaW9uKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTEzMSw3ICsxMzEsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2FyX2RlcmVnX2F2cmMoVUlOVDE2IHNlcnZpY2VfdXVpZCwgdEJUQV9TWVNfSUQgc3lzX2lkKTsKK2V4dGVybiB2b2lkIGJ0YV9hcl9kZXJlZ19hdnJjKHVpbnQxNl90IHNlcnZpY2VfdXVpZCwgdEJUQV9TWVNfSUQgc3lzX2lkKTsKIAogCiAjaWZkZWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL2J0YS9pbmNsdWRlL2J0YV9hdl9hcGkuaCBiL2J0YS9pbmNsdWRlL2J0YV9hdl9hcGkuaAppbmRleCBmODc4ZGMwLi42ZTllZmYyIDEwMDY0NAotLS0gYS9idGEvaW5jbHVkZS9idGFfYXZfYXBpLmgKKysrIGIvYnRhL2luY2x1ZGUvYnRhX2F2X2FwaS5oCkBAIC0zOCwxMCArMzgsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiogIENvbnN0YW50cyBhbmQgZGF0YSB0eXBlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTZXQgdG8gVFJVRSBpZiBzZXBlcmF0ZSBhdXRob3JpemF0aW9uIHByb21wdCBkZXNpcmVkIGZvciBBVkNUUCBiZXNpZGVzIEEyRFAgYXV0aG9yaXphdGlvbiAqLwotLyogVHlwaWNhbGx5IEZBTFNFIHdoZW4gQVZSQ1AgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIEEyRFAgKi8KKy8qIFNldCB0byB0cnVlIGlmIHNlcGVyYXRlIGF1dGhvcml6YXRpb24gcHJvbXB0IGRlc2lyZWQgZm9yIEFWQ1RQIGJlc2lkZXMgQTJEUCBhdXRob3JpemF0aW9uICovCisvKiBUeXBpY2FsbHkgZmFsc2Ugd2hlbiBBVlJDUCBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggQTJEUCAqLwogI2lmbmRlZiBCVEFfQVZfV0lUSF9BVkNUUF9BVVRIT1JJWkFUSU9OCi0jZGVmaW5lIEJUQV9BVl9XSVRIX0FWQ1RQX0FVVEhPUklaQVRJT04gICAgIEZBTFNFCisjZGVmaW5lIEJUQV9BVl9XSVRIX0FWQ1RQX0FVVEhPUklaQVRJT04gICAgIGZhbHNlCiAjZW5kaWYKIAogLyogQVYgc3RhdHVzIHZhbHVlcyAqLwpAQCAtNTMsNyArNTMsNyBAQAogI2RlZmluZSBCVEFfQVZfRkFJTF9ST0xFICAgICAgICA1ICAgICAgIC8qIGZhaWxlZCBkdWUgdG8gcm9sZSBtYW5hZ2VtZW50IHJlbGF0ZWQgaXNzdWVzICovCiAjZGVmaW5lIEJUQV9BVl9GQUlMX0dFVF9DQVAgICAgIDYgICAgICAgLyogZ2V0IGNhcGFiaWxpdHkgZmFpbGVkIGR1ZSB0byBubyBTRVAgYXZhaWxhbGUgb24gdGhlIHBlZXIgICovCiAKLXR5cGVkZWYgVUlOVDggdEJUQV9BVl9TVEFUVVM7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9BVl9TVEFUVVM7CiAKIC8qIEFWIGZlYXR1cmVzIG1hc2tzICovCiAjZGVmaW5lIEJUQV9BVl9GRUFUX1JDVEcgICAgICAgIDB4MDAwMSAgLyogcmVtb3RlIGNvbnRyb2wgdGFyZ2V0ICovCkBAIC03MywyMiArNzMsMjIgQEAKIC8qIEludGVybmFsIGZlYXR1cmVzICovCiAjZGVmaW5lIEJUQV9BVl9GRUFUX05PX1NDT19TU1BEIDB4ODAwMCAgLyogRG8gbm90IHN1c3BlbmQgYXYgc3RyZWFtaW5nIGFzIHRvIEFHIGV2ZW50cyhTQ08gb3IgQ2FsbCkgKi8KIAotdHlwZWRlZiBVSU5UMTYgdEJUQV9BVl9GRUFUOwordHlwZWRlZiB1aW50MTZfdCB0QlRBX0FWX0ZFQVQ7CiAKIC8qIEFWIGNoYW5uZWwgdmFsdWVzICovCiAjZGVmaW5lIEJUQV9BVl9DSE5MX01TSyAgICAgICAgICAgICAweEMwCiAjZGVmaW5lIEJUQV9BVl9DSE5MX0FVRElPICAgICAgICAgICAweDQwICAvKiBhdWRpbyBjaGFubmVsICovCiAjZGVmaW5lIEJUQV9BVl9DSE5MX1ZJREVPICAgICAgICAgICAweDgwICAvKiB2aWRlbyBjaGFubmVsICovCi10eXBlZGVmIFVJTlQ4IHRCVEFfQVZfQ0hOTDsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0FWX0NITkw7CiAKIAogI2RlZmluZSBCVEFfQVZfSE5ETF9NU0sgICAgICAgICAgICAgMHgzRgotdHlwZWRlZiBVSU5UOCB0QlRBX0FWX0hOREw7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9BVl9ITkRMOwogLyogaGFuZGxlIGluZGV4IHRvIG1hc2sgKi8KLSNkZWZpbmUgQlRBX0FWX0hORExfVE9fTVNLKGgpICAgICAgICgoVUlOVDgpKDEgPDwgKGgpKSkKKyNkZWZpbmUgQlRBX0FWX0hORExfVE9fTVNLKGgpICAgICAgICgodWludDhfdCkoMSA8PCAoaCkpKQogCiAvKiB0QlRBX0FWX0hOREwgdG8gbWFzayAqLwotI2RlZmluZSBCVEFfQVZfSE5ETF9UWVBFX1RPX01TSyhoKSAgKChVSU5UOCkoMSA8PCAoKGgpJkJUQV9BVl9ITkRMX01TSykpKQorI2RlZmluZSBCVEFfQVZfSE5ETF9UWVBFX1RPX01TSyhoKSAgKCh1aW50OF90KSgxIDw8ICgoaCkmQlRBX0FWX0hORExfTVNLKSkpCiAKIC8qIG9mZnNldCBvZiBjb2RlYyB0eXBlIGluIGNvZGVjIGluZm8gYnl0ZSBhcnJheSAqLwogI2RlZmluZSBCVEFfQVZfQ09ERUNfVFlQRV9JRFggICAgICAgQVZEVF9DT0RFQ19UWVBFX0lOREVYICAgLyogMiAqLwpAQCAtMTI1LDcgKzEyNSw3IEBACiAjZGVmaW5lIEJUQV9BVl9DT0RFQ19IMjYzX1A4ICAgIFZEUF9NRURJQV9DVF9IMjYzX1A4ICAgIC8qIEguMjYzIHByb2ZpbGUgOCAqLwogI2RlZmluZSBCVEFfQVZfQ09ERUNfVkVORCAgICAgICBWRFBfTUVESUFfQ1RfVkVORCAgICAgICAvKiBOb24tVkRQICovCiAKLXR5cGVkZWYgVUlOVDggdEJUQV9BVl9DT0RFQzsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0FWX0NPREVDOwogCiAvKiBDb21wYW55IElEIGluIEJUIGFzc2lnbmVkIG51bWJlcnMgKi8KICNkZWZpbmUgQlRBX0FWX0JUX1ZFTkRPUl9JRCAgICAgVkRQX0JUX1ZFTkRPUl9JRCAgICAgICAgLyogQnJvYWRjb20gQ29ycG9yYXRpb24gKi8KQEAgLTE5MywxMyArMTkzLDEzIEBACiAjZGVmaW5lIEJUQV9BVl9SQ19GNSAgICAgICAgICAgIEFWUkNfSURfRjUgICAgICAgICAgLyogRjUgKi8KICNkZWZpbmUgQlRBX0FWX1ZFTkRPUiAgICAgICAgICAgQVZSQ19JRF9WRU5ET1IgICAgICAvKiB2ZW5kb3IgdW5pcXVlICovCiAKLXR5cGVkZWYgVUlOVDggdEJUQV9BVl9SQzsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0FWX1JDOwogCiAvKiBzdGF0ZSBmbGFnIGZvciBwYXNzIHRocm91Z2ggY29tbWFuZCAqLwogI2RlZmluZSBCVEFfQVZfU1RBVEVfUFJFU1MgICAgICBBVlJDX1NUQVRFX1BSRVNTICAgIC8qIGtleSBwcmVzc2VkICovCiAjZGVmaW5lIEJUQV9BVl9TVEFURV9SRUxFQVNFICAgIEFWUkNfU1RBVEVfUkVMRUFTRSAgLyoga2V5IHJlbGVhc2VkICovCiAKLXR5cGVkZWYgVUlOVDggdEJUQV9BVl9TVEFURTsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0FWX1NUQVRFOwogCiAvKiBjb21tYW5kIGNvZGVzIGZvciBCVEFfQXZWZW5kb3JDbWQgKi8KICNkZWZpbmUgQlRBX0FWX0NNRF9DVFJMICAgICAgICAgQVZSQ19DTURfQ1RSTApAQCAtMjA4LDcgKzIwOCw3IEBACiAjZGVmaW5lIEJUQV9BVl9DTURfTk9USUYgICAgICAgIEFWUkNfQ01EX05PVElGCiAjZGVmaW5lIEJUQV9BVl9DTURfR0VOX0lOUSAgICAgIEFWUkNfQ01EX0dFTl9JTlEKIAotdHlwZWRlZiBVSU5UOCB0QlRBX0FWX0NNRDsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0FWX0NNRDsKIAogLyogcmVzcG9uc2UgY29kZXMgZm9yIEJUQV9BdlZlbmRvclJzcCAqLwogI2RlZmluZSBCVEFfQVZfUlNQX05PVF9JTVBMICAgICBBVlJDX1JTUF9OT1RfSU1QTApAQCAtMjE5LDcgKzIxOSw3IEBACiAjZGVmaW5lIEJUQV9BVl9SU1BfQ0hBTkdFRCAgICAgIEFWUkNfUlNQX0NIQU5HRUQKICNkZWZpbmUgQlRBX0FWX1JTUF9JTlRFUklNICAgICAgQVZSQ19SU1BfSU5URVJJTQogCi10eXBlZGVmIFVJTlQ4IHRCVEFfQVZfQ09ERTsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0FWX0NPREU7CiAKIC8qIGVycm9yIGNvZGVzIGZvciBCVEFfQXZQcm90ZWN0UnNwICovCiAjZGVmaW5lIEJUQV9BVl9FUlJfTk9ORSAgICAgICAgICAgICBBMkRfU1VDQ0VTUyAgICAgICAgIC8qIFN1Y2Nlc3MsIG5vIGVycm9yICovCkBAIC0yMjgsNyArMjI4LDcgQEAKICNkZWZpbmUgQlRBX0FWX0VSUl9CQURfQ1BfVFlQRSAgICAgIEEyRF9CQURfQ1BfVFlQRSAgICAgLyogVGhlIHJlcXVlc3RlZCBDb250ZW50IFByb3RlY3Rpb24gVHlwZSBpcyBub3Qgc3VwcG9ydGVkICovCiAjZGVmaW5lIEJUQV9BVl9FUlJfQkFEX0NQX0ZPUk1BVCAgICBBMkRfQkFEX0NQX0ZPUk1BVCAgIC8qIFRoZSBmb3JtYXQgb2YgQ29udGVudCBQcm90ZWN0aW9uIERhdGEgaXMgbm90IGNvcnJlY3QgKi8KIAotdHlwZWRlZiBVSU5UOCB0QlRBX0FWX0VSUjsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0FWX0VSUjsKIAogCiAvKiBBViBjYWxsYmFjayBldmVudHMgKi8KQEAgLTI2Miw3ICsyNjIsNyBAQAogI2RlZmluZSBCVEFfQVZfTUFYX0VWVCAgICAgICAgICAyMwogCiAKLXR5cGVkZWYgVUlOVDggdEJUQV9BVl9FVlQ7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9BVl9FVlQ7CiAKIC8qIEV2ZW50IGFzc29jaWF0ZWQgd2l0aCBCVEFfQVZfRU5BQkxFX0VWVCAqLwogdHlwZWRlZiBzdHJ1Y3QKQEAgLTI3NSwxNCArMjc1LDE0IEBACiB7CiAgICAgdEJUQV9BVl9DSE5MICAgIGNobmw7ICAgICAgIC8qIGF1ZGlvL3ZpZGVvICovCiAgICAgdEJUQV9BVl9ITkRMICAgIGhuZGw7ICAgICAgIC8qIEhhbmRsZSBhc3NvY2lhdGVkIHdpdGggdGhlIHN0cmVhbS4gKi8KLSAgICBVSU5UOCAgICAgICAgICAgYXBwX2lkOyAgICAgLyogSUQgYXNzb2NpYXRlZCB3aXRoIGNhbGwgdG8gQlRBX0F2UmVnaXN0ZXIoKSAqLworICAgIHVpbnQ4X3QgICAgICAgICAgIGFwcF9pZDsgICAgIC8qIElEIGFzc29jaWF0ZWQgd2l0aCBjYWxsIHRvIEJUQV9BdlJlZ2lzdGVyKCkgKi8KICAgICB0QlRBX0FWX1NUQVRVUyAgc3RhdHVzOwogfSB0QlRBX0FWX1JFR0lTVEVSOwogCiAvKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfQVZfT1BFTl9FVlQgKi8KICNkZWZpbmUgQlRBX0FWX0VEUl8yTUJQUyAgICAgICAgMHgwMQogI2RlZmluZSBCVEFfQVZfRURSXzNNQlBTICAgICAgICAweDAyCi10eXBlZGVmIFVJTlQ4IHRCVEFfQVZfRURSOwordHlwZWRlZiB1aW50OF90IHRCVEFfQVZfRURSOwogCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtMjkwLDkgKzI5MCw5IEBACiAgICAgdEJUQV9BVl9ITkRMICAgIGhuZGw7CiAgICAgQkRfQUREUiAgICAgICAgIGJkX2FkZHI7CiAgICAgdEJUQV9BVl9TVEFUVVMgIHN0YXR1czsKLSAgICBCT09MRUFOICAgICAgICAgc3RhcnRpbmc7CisgICAgYm9vbCAgICAgICAgIHN0YXJ0aW5nOwogICAgIHRCVEFfQVZfRURSICAgICBlZHI7ICAgICAgICAvKiAwLCBpZiBwZWVyIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IEVEUiAqLwotICAgIFVJTlQ4ICAgICAgICAgICBzZXA7ICAgICAgICAvKiAgc2VwIHR5cGUgb2YgcGVlciBkZXZpY2UgKi8KKyAgICB1aW50OF90ICAgICAgICAgICBzZXA7ICAgICAgICAvKiAgc2VwIHR5cGUgb2YgcGVlciBkZXZpY2UgKi8KIH0gdEJUQV9BVl9PUEVOOwogCiAvKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfQVZfQ0xPU0VfRVZUICovCkBAIC0zMDgsOCArMzA4LDggQEAKICAgICB0QlRBX0FWX0NITkwgICAgY2hubDsKICAgICB0QlRBX0FWX0hOREwgICAgaG5kbDsKICAgICB0QlRBX0FWX1NUQVRVUyAgc3RhdHVzOwotICAgIEJPT0xFQU4gICAgICAgICBpbml0aWF0b3I7IC8qIFRSVUUsIGlmIGxvY2FsIGRldmljZSBpbml0aWF0ZXMgdGhlIFNUQVJUICovCi0gICAgQk9PTEVBTiAgICAgICAgIHN1c3BlbmRpbmc7CisgICAgYm9vbCAgICAgICAgIGluaXRpYXRvcjsgLyogdHJ1ZSwgaWYgbG9jYWwgZGV2aWNlIGluaXRpYXRlcyB0aGUgU1RBUlQgKi8KKyAgICBib29sICAgICAgICAgc3VzcGVuZGluZzsKIH0gdEJUQV9BVl9TVEFSVDsKIAogLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0FWX1NVU1BFTkRfRVZUICovCkBAIC0zMTcsNyArMzE3LDcgQEAKIHsKICAgICB0QlRBX0FWX0NITkwgICAgY2hubDsKICAgICB0QlRBX0FWX0hOREwgICAgaG5kbDsKLSAgICBCT09MRUFOICAgICAgICAgaW5pdGlhdG9yOyAvKiBUUlVFLCBpZiBsb2NhbCBkZXZpY2UgaW5pdGlhdGVzIHRoZSBTVVNQRU5EICovCisgICAgYm9vbCAgICAgICAgIGluaXRpYXRvcjsgLyogdHJ1ZSwgaWYgbG9jYWwgZGV2aWNlIGluaXRpYXRlcyB0aGUgU1VTUEVORCAqLwogICAgIHRCVEFfQVZfU1RBVFVTICBzdGF0dXM7CiB9IHRCVEFfQVZfU1VTUEVORDsKIApAQCAtMzM0LDggKzMzNCw4IEBACiB7CiAgICAgdEJUQV9BVl9DSE5MICAgIGNobmw7CiAgICAgdEJUQV9BVl9ITkRMICAgIGhuZGw7Ci0gICAgVUlOVDggICAgICAgICAgICpwX2RhdGE7Ci0gICAgVUlOVDE2ICAgICAgICAgIGxlbjsKKyAgICB1aW50OF90ICAgICAgICAgICAqcF9kYXRhOworICAgIHVpbnQxNl90ICAgICAgICAgIGxlbjsKIH0gdEJUQV9BVl9QUk9URUNUX1JFUTsKIAogLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0FWX1BST1RFQ1RfUlNQX0VWVCAqLwpAQCAtMzQzLDE1ICszNDMsMTUgQEAKIHsKICAgICB0QlRBX0FWX0NITkwgICAgY2hubDsKICAgICB0QlRBX0FWX0hOREwgICAgaG5kbDsKLSAgICBVSU5UOCAgICAgICAgICAgKnBfZGF0YTsKLSAgICBVSU5UMTYgICAgICAgICAgbGVuOworICAgIHVpbnQ4X3QgICAgICAgICAgICpwX2RhdGE7CisgICAgdWludDE2X3QgICAgICAgICAgbGVuOwogICAgIHRCVEFfQVZfRVJSICAgICBlcnJfY29kZTsKIH0gdEJUQV9BVl9QUk9URUNUX1JTUDsKIAogLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0FWX1JDX09QRU5fRVZUICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQ4ICAgICAgICAgICByY19oYW5kbGU7CisgICAgdWludDhfdCAgICAgICAgICAgcmNfaGFuZGxlOwogICAgIHRCVEFfQVZfRkVBVCAgICBwZWVyX2ZlYXR1cmVzOwogICAgIEJEX0FERFIgICAgICAgICBwZWVyX2FkZHI7CiAgICAgdEJUQV9BVl9TVEFUVVMgIHN0YXR1czsKQEAgLTM2MCwxNCArMzYwLDE0IEBACiAvKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfQVZfUkNfQ0xPU0VfRVZUICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQ4ICAgICAgICAgICByY19oYW5kbGU7CisgICAgdWludDhfdCAgICAgICAgICAgcmNfaGFuZGxlOwogICAgIEJEX0FERFIgICAgICAgICBwZWVyX2FkZHI7CiB9IHRCVEFfQVZfUkNfQ0xPU0U7CiAKIC8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9BVl9SQ19GRUFUX0VWVCAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UOCAgICAgICAgICAgcmNfaGFuZGxlOworICAgIHVpbnQ4X3QgICAgICAgICAgIHJjX2hhbmRsZTsKICAgICB0QlRBX0FWX0ZFQVQgICAgcGVlcl9mZWF0dXJlczsKICAgICBCRF9BRERSICAgICAgICAgcGVlcl9hZGRyOwogfSB0QlRBX0FWX1JDX0ZFQVQ7CkBAIC0zNzUsNDcgKzM3NSw0NyBAQAogLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0FWX1JFTU9URV9DTURfRVZUICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQ4ICAgICAgICAgICByY19oYW5kbGU7CisgICAgdWludDhfdCAgICAgICAgICAgcmNfaGFuZGxlOwogICAgIHRCVEFfQVZfUkMgICAgICByY19pZDsKICAgICB0QlRBX0FWX1NUQVRFICAga2V5X3N0YXRlOwotICAgIFVJTlQ4ICAgICAgICAgICBsZW47Ci0gICAgVUlOVDggICAgICAgICAgICpwX2RhdGE7CisgICAgdWludDhfdCAgICAgICAgICAgbGVuOworICAgIHVpbnQ4X3QgICAgICAgICAgICpwX2RhdGE7CiAgICAgdEFWUkNfSERSICAgICAgIGhkcjsgICAgLyogTWVzc2FnZSBoZWFkZXIuICovCi0gICAgVUlOVDggICAgICAgICAgIGxhYmVsOworICAgIHVpbnQ4X3QgICAgICAgICAgIGxhYmVsOwogfSB0QlRBX0FWX1JFTU9URV9DTUQ7CiAKIC8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9BVl9SRU1PVEVfUlNQX0VWVCAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UOCAgICAgICAgICAgcmNfaGFuZGxlOworICAgIHVpbnQ4X3QgICAgICAgICAgIHJjX2hhbmRsZTsKICAgICB0QlRBX0FWX1JDICAgICAgcmNfaWQ7CiAgICAgdEJUQV9BVl9TVEFURSAgIGtleV9zdGF0ZTsKLSAgICBVSU5UOCAgICAgICAgICAgbGVuOwotICAgIFVJTlQ4ICAgICAgICAgICAqcF9kYXRhOworICAgIHVpbnQ4X3QgICAgICAgICAgIGxlbjsKKyAgICB1aW50OF90ICAgICAgICAgICAqcF9kYXRhOwogICAgIHRCVEFfQVZfQ09ERSAgICByc3BfY29kZTsKLSAgICBVSU5UOCAgICAgICAgICAgbGFiZWw7CisgICAgdWludDhfdCAgICAgICAgICAgbGFiZWw7CiB9IHRCVEFfQVZfUkVNT1RFX1JTUDsKIAogLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0FWX1ZFTkRPUl9DTURfRVZULCBCVEFfQVZfVkVORE9SX1JTUF9FVlQgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDggICAgICAgICAgIHJjX2hhbmRsZTsKLSAgICBVSU5UMTYgICAgICAgICAgbGVuOyAgICAgICAgICAgIC8qIE1heCB2ZW5kb3IgZGVwZW5kZW50IG1lc3NhZ2UgaXMgNTEyICovCi0gICAgVUlOVDggICAgICAgICAgIGxhYmVsOworICAgIHVpbnQ4X3QgICAgICAgICAgIHJjX2hhbmRsZTsKKyAgICB1aW50MTZfdCAgICAgICAgICBsZW47ICAgICAgICAgICAgLyogTWF4IHZlbmRvciBkZXBlbmRlbnQgbWVzc2FnZSBpcyA1MTIgKi8KKyAgICB1aW50OF90ICAgICAgICAgICBsYWJlbDsKICAgICB0QlRBX0FWX0NPREUgICAgY29kZTsKLSAgICBVSU5UMzIgICAgICAgICAgY29tcGFueV9pZDsKLSAgICBVSU5UOCAgICAgICAgICAgKnBfZGF0YTsKKyAgICB1aW50MzJfdCAgICAgICAgICBjb21wYW55X2lkOworICAgIHVpbnQ4X3QgICAgICAgICAgICpwX2RhdGE7CiB9IHRCVEFfQVZfVkVORE9SOwogCiAvKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfQVZfTUVUQV9NU0dfRVZUICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQ4ICAgICAgICAgICByY19oYW5kbGU7Ci0gICAgVUlOVDE2ICAgICAgICAgIGxlbjsKLSAgICBVSU5UOCAgICAgICAgICAgbGFiZWw7CisgICAgdWludDhfdCAgICAgICAgICAgcmNfaGFuZGxlOworICAgIHVpbnQxNl90ICAgICAgICAgIGxlbjsKKyAgICB1aW50OF90ICAgICAgICAgICBsYWJlbDsKICAgICB0QlRBX0FWX0NPREUgICAgY29kZTsKLSAgICBVSU5UMzIgICAgICAgICAgY29tcGFueV9pZDsKLSAgICBVSU5UOCAgICAgICAgICAgKnBfZGF0YTsKKyAgICB1aW50MzJfdCAgICAgICAgICBjb21wYW55X2lkOworICAgIHVpbnQ4X3QgICAgICAgICAgICpwX2RhdGE7CiAgICAgdEFWUkNfTVNHICAgICAgICpwX21zZzsKIH0gdEJUQV9BVl9NRVRBX01TRzsKIApAQCAtNDYxLDcgKzQ2MSw3IEBACiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDggKmNvZGVjX2luZm87CisgICAgdWludDhfdCAqY29kZWNfaW5mbzsKICAgICBCRF9BRERSIGJkX2FkZHI7OwogfSB0QlRBX0FWS19DT05GSUc7CiAKQEAgLTUwMSwyMyArNTAxLDIzIEBACiAvKiBBViBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UMzIgIGNvbXBhbnlfaWQ7ICAgICAgICAgLyogQVZSQ1AgQ29tcGFueSBJRCAqLwotICAgIFVJTlQxNiAgYXZyY19tdHU7ICAgICAgICAgICAvKiBBVlJDUCBNVFUgYXQgTDJDQVAgZm9yIGNvbnRyb2wgY2hhbm5lbCAqLwotICAgIFVJTlQxNiAgYXZyY19icl9tdHU7ICAgICAgICAvKiBBVlJDUCBNVFUgYXQgTDJDQVAgZm9yIGJyb3dzaW5nIGNoYW5uZWwgKi8KLSAgICBVSU5UMTYgIGF2cmNfY3RfY2F0OyAgICAgICAgLyogQVZSQ1AgY29udHJvbGxlciBjYXRlZ29yaWVzICovCi0gICAgVUlOVDE2ICBhdnJjX3RnX2NhdDsgICAgICAgIC8qIEFWUkNQIHRhcmdldCBjYXRlZ29yaWVzICovCi0gICAgVUlOVDE2ICBzaWdfbXR1OyAgICAgICAgICAgIC8qIEFWRFRQIHNpZ25hbGluZyBjaGFubmVsIE1UVSBhdCBMMkNBUCAqLwotICAgIFVJTlQxNiAgYXVkaW9fbXR1OyAgICAgICAgICAvKiBBVkRUUCBhdWRpbyB0cmFuc3BvcnQgY2hhbm5lbCBNVFUgYXQgTDJDQVAgKi8KLSAgICBjb25zdCBVSU5UMTYgKnBfYXVkaW9fZmx1c2hfdG87LyogQVZEVFAgYXVkaW8gdHJhbnNwb3J0IGNoYW5uZWwgZmx1c2ggdGltZW91dCAqLwotICAgIFVJTlQxNiAgYXVkaW9fbXFzOyAgICAgICAgICAvKiBBVkRUUCBhdWRpbyBjaGFubmVsIG1heCBkYXRhIHF1ZXVlIHNpemUgKi8KLSAgICBVSU5UMTYgIHZpZGVvX210dTsgICAgICAgICAgLyogQVZEVFAgdmlkZW8gdHJhbnNwb3J0IGNoYW5uZWwgTVRVIGF0IEwyQ0FQICovCi0gICAgVUlOVDE2ICB2aWRlb19mbHVzaF90bzsgICAgIC8qIEFWRFRQIHZpZGVvIHRyYW5zcG9ydCBjaGFubmVsIGZsdXNoIHRpbWVvdXQgKi8KLSAgICBCT09MRUFOIGF2cmNfZ3JvdXA7ICAgICAgICAgLyogVFJVRSwgdG8gYWNjZXB0IEFWUkMgMS4zIGdyb3VwIG5ldmlnYXRpb24gY29tbWFuZCAqLwotICAgIFVJTlQ4ICAgbnVtX2NvX2lkczsgICAgICAgICAvKiBjb21wYW55IGlkIGNvdW50IGluIHBfbWV0YV9jb19pZHMgKi8KLSAgICBVSU5UOCAgIG51bV9ldnRfaWRzOyAgICAgICAgLyogZXZlbnQgaWQgY291bnQgaW4gcF9tZXRhX2V2dF9pZHMgKi8KKyAgICB1aW50MzJfdCAgY29tcGFueV9pZDsgICAgICAgICAvKiBBVlJDUCBDb21wYW55IElEICovCisgICAgdWludDE2X3QgIGF2cmNfbXR1OyAgICAgICAgICAgLyogQVZSQ1AgTVRVIGF0IEwyQ0FQIGZvciBjb250cm9sIGNoYW5uZWwgKi8KKyAgICB1aW50MTZfdCAgYXZyY19icl9tdHU7ICAgICAgICAvKiBBVlJDUCBNVFUgYXQgTDJDQVAgZm9yIGJyb3dzaW5nIGNoYW5uZWwgKi8KKyAgICB1aW50MTZfdCAgYXZyY19jdF9jYXQ7ICAgICAgICAvKiBBVlJDUCBjb250cm9sbGVyIGNhdGVnb3JpZXMgKi8KKyAgICB1aW50MTZfdCAgYXZyY190Z19jYXQ7ICAgICAgICAvKiBBVlJDUCB0YXJnZXQgY2F0ZWdvcmllcyAqLworICAgIHVpbnQxNl90ICBzaWdfbXR1OyAgICAgICAgICAgIC8qIEFWRFRQIHNpZ25hbGluZyBjaGFubmVsIE1UVSBhdCBMMkNBUCAqLworICAgIHVpbnQxNl90ICBhdWRpb19tdHU7ICAgICAgICAgIC8qIEFWRFRQIGF1ZGlvIHRyYW5zcG9ydCBjaGFubmVsIE1UVSBhdCBMMkNBUCAqLworICAgIGNvbnN0IHVpbnQxNl90ICpwX2F1ZGlvX2ZsdXNoX3RvOy8qIEFWRFRQIGF1ZGlvIHRyYW5zcG9ydCBjaGFubmVsIGZsdXNoIHRpbWVvdXQgKi8KKyAgICB1aW50MTZfdCAgYXVkaW9fbXFzOyAgICAgICAgICAvKiBBVkRUUCBhdWRpbyBjaGFubmVsIG1heCBkYXRhIHF1ZXVlIHNpemUgKi8KKyAgICB1aW50MTZfdCAgdmlkZW9fbXR1OyAgICAgICAgICAvKiBBVkRUUCB2aWRlbyB0cmFuc3BvcnQgY2hhbm5lbCBNVFUgYXQgTDJDQVAgKi8KKyAgICB1aW50MTZfdCAgdmlkZW9fZmx1c2hfdG87ICAgICAvKiBBVkRUUCB2aWRlbyB0cmFuc3BvcnQgY2hhbm5lbCBmbHVzaCB0aW1lb3V0ICovCisgICAgYm9vbCBhdnJjX2dyb3VwOyAgICAgICAgIC8qIHRydWUsIHRvIGFjY2VwdCBBVlJDIDEuMyBncm91cCBuZXZpZ2F0aW9uIGNvbW1hbmQgKi8KKyAgICB1aW50OF90ICAgbnVtX2NvX2lkczsgICAgICAgICAvKiBjb21wYW55IGlkIGNvdW50IGluIHBfbWV0YV9jb19pZHMgKi8KKyAgICB1aW50OF90ICAgbnVtX2V2dF9pZHM7ICAgICAgICAvKiBldmVudCBpZCBjb3VudCBpbiBwX21ldGFfZXZ0X2lkcyAqLwogICAgIHRCVEFfQVZfQ09ERSAgcmNfcGFzc19yc3A7ICAvKiB0aGUgZGVmYXVsdCByZXNwb25zZSBjb2RlIGZvciBwYXNzIHRocm91Z2ggY29tbWFuZHMgKi8KLSAgICBjb25zdCBVSU5UMzIgKnBfbWV0YV9jb19pZHM7LyogdGhlIG1ldGFkYXRhIEdldCBDYXBhYmlsaXRpZXMgcmVzcG9uc2UgZm9yIGNvbXBhbnkgaWQgKi8KLSAgICBjb25zdCBVSU5UOCAqcF9tZXRhX2V2dF9pZHM7LyogdGhlIHRoZSBtZXRhZGF0YSBHZXQgQ2FwYWJpbGl0aWVzIHJlc3BvbnNlIGZvciBldmVudCBpZCAqLworICAgIGNvbnN0IHVpbnQzMl90ICpwX21ldGFfY29faWRzOy8qIHRoZSBtZXRhZGF0YSBHZXQgQ2FwYWJpbGl0aWVzIHJlc3BvbnNlIGZvciBjb21wYW55IGlkICovCisgICAgY29uc3QgdWludDhfdCAqcF9tZXRhX2V2dF9pZHM7LyogdGhlIHRoZSBtZXRhZGF0YSBHZXQgQ2FwYWJpbGl0aWVzIHJlc3BvbnNlIGZvciBldmVudCBpZCAqLwogICAgIGNvbnN0IHRCVEFfQVZfQUNUICpwX2FjdF90Ymw7LyogdGhlIGFjdGlvbiBmdW5jdGlvbiB0YWJsZSBmb3IgVkRQIHN0cmVhbSAqLwogICAgIHRCVEFfQVZfUkVHICAgICAgICpwX3JlZzsgICAvKiBhY3Rpb24gZnVuY3Rpb24gdG8gcmVnaXN0ZXIgVkRQICovCiAgICAgY2hhciAgICAgICAgICAgICAgYXZyY19jb250cm9sbGVyX25hbWVbQlRBX1NFUlZJQ0VfTkFNRV9MRU5dOyAvKiBEZWZhdWx0IEFWUkNQIGNvbnRyb2xsZXIgbmFtZSAqLwpAQCAtNTcwLDcgKzU3MCw3IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgQlRBX0F2UmVnaXN0ZXIodEJUQV9BVl9DSE5MIGNobmwsIGNvbnN0IGNoYXIgKnBfc2VydmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICBVSU5UOCBhcHBfaWQsIHRCVEFfQVZfREFUQV9DQkFDSyAgKnBfZGF0YV9jYmFjaywgVUlOVDE2IHNlcnZpY2VfdXVpZCk7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXBwX2lkLCB0QlRBX0FWX0RBVEFfQ0JBQ0sgICpwX2RhdGFfY2JhY2ssIHVpbnQxNl90IHNlcnZpY2VfdXVpZCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtNTk1LDcgKzU5NSw3IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgQlRBX0F2T3BlbihCRF9BRERSIGJkX2FkZHIsIHRCVEFfQVZfSE5ETCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBCT09MRUFOIHVzZV9yYywgdEJUQV9TRUMgc2VjX21hc2ssIFVJTlQxNiB1dWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX3JjLCB0QlRBX1NFQyBzZWNfbWFzaywgdWludDE2X3QgdXVpZCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtNjQ2LDI5ICs2NDYsMjkgQEAKICoqIEZ1bmN0aW9uICAgICAgICAgQlRBX0F2U3RvcAogKioKICoqIERlc2NyaXB0aW9uICAgICAgU3RvcCBhdWRpby92aWRlbyBzdHJlYW0gZGF0YSB0cmFuc2Zlci4KLSoqICAgICAgICAgICAgICAgICAgSWYgc3VzcGVuZCBpcyBUUlVFLCB0aGlzIGZ1bmN0aW9uIHNlbmRzIEFWRFQgc3VzcGVuZCBzaWduYWwKKyoqICAgICAgICAgICAgICAgICAgSWYgc3VzcGVuZCBpcyB0cnVlLCB0aGlzIGZ1bmN0aW9uIHNlbmRzIEFWRFQgc3VzcGVuZCBzaWduYWwKICoqICAgICAgICAgICAgICAgICAgdG8gdGhlIGNvbm5lY3RlZCBwZWVyKHMpLgogKioKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BdlN0b3AoQk9PTEVBTiBzdXNwZW5kKTsKK3ZvaWQgQlRBX0F2U3RvcChib29sIHN1c3BlbmQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKICoqIEZ1bmN0aW9uICAgICAgICAgQlRBX0F2UmVjb25maWcKICoqCiAqKiBEZXNjcmlwdGlvbiAgICAgIFJlY29uZmlndXJlIHRoZSBhdWRpby92aWRlbyBzdHJlYW0uCi0qKiAgICAgICAgICAgICAgICAgIElmIHN1c3BlbmQgaXMgVFJVRSwgdGhpcyBmdW5jdGlvbiB0cmllcyB0aGUgc3VzcGVuZC9yZWNvbmZpZ3VyZQorKiogICAgICAgICAgICAgICAgICBJZiBzdXNwZW5kIGlzIHRydWUsIHRoaXMgZnVuY3Rpb24gdHJpZXMgdGhlIHN1c3BlbmQvcmVjb25maWd1cmUKICoqICAgICAgICAgICAgICAgICAgcHJvY2VkdXJlIGZpcnN0LgotKiogICAgICAgICAgICAgICAgICBJZiBzdXNwZW5kIGlzIEZBTFNFIG9yIHdoZW4gc3VzcGVuZC9yZWNvbmZpZ3VyZSBmYWlscywKKyoqICAgICAgICAgICAgICAgICAgSWYgc3VzcGVuZCBpcyBmYWxzZSBvciB3aGVuIHN1c3BlbmQvcmVjb25maWd1cmUgZmFpbHMsCiAqKiAgICAgICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gY2xvc2VzIGFuZCByZS1vcGVucyB0aGUgQVZEVCBjb25uZWN0aW9uLgogKioKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BdlJlY29uZmlnKHRCVEFfQVZfSE5ETCBobmRsLCBCT09MRUFOIHN1c3BlbmQsIFVJTlQ4IHNlcF9pbmZvX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9jb2RlY19pbmZvLCBVSU5UOCBudW1fcHJvdGVjdCwgVUlOVDggKnBfcHJvdGVjdF9pbmZvKTsKK3ZvaWQgQlRBX0F2UmVjb25maWcodEJUQV9BVl9ITkRMIGhuZGwsIGJvb2wgc3VzcGVuZCwgdWludDhfdCBzZXBfaW5mb19pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9jb2RlY19pbmZvLCB1aW50OF90IG51bV9wcm90ZWN0LCB1aW50OF90ICpwX3Byb3RlY3RfaW5mbyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtNjgwLDcgKzY4MCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQXZQcm90ZWN0UmVxKHRCVEFfQVZfSE5ETCBobmRsLCBVSU5UOCAqcF9kYXRhLCBVSU5UMTYgbGVuKTsKK3ZvaWQgQlRBX0F2UHJvdGVjdFJlcSh0QlRBX0FWX0hOREwgaG5kbCwgdWludDhfdCAqcF9kYXRhLCB1aW50MTZfdCBsZW4pOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTY5NCw4ICs2OTQsOCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2UHJvdGVjdFJzcCh0QlRBX0FWX0hOREwgaG5kbCwgVUlOVDggZXJyb3JfY29kZSwgVUlOVDggKnBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBsZW4pOwordm9pZCBCVEFfQXZQcm90ZWN0UnNwKHRCVEFfQVZfSE5ETCBobmRsLCB1aW50OF90IGVycm9yX2NvZGUsIHVpbnQ4X3QgKnBfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtNzA3LDcgKzcwNyw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQXZSZW1vdGVDbWQoVUlOVDggcmNfaGFuZGxlLCBVSU5UOCBsYWJlbCwgdEJUQV9BVl9SQyByY19pZCwKK3ZvaWQgQlRBX0F2UmVtb3RlQ21kKHVpbnQ4X3QgcmNfaGFuZGxlLCB1aW50OF90IGxhYmVsLCB0QlRBX0FWX1JDIHJjX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0FWX1NUQVRFIGtleV9zdGF0ZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC03MjEsOCArNzIxLDggQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BdlJlbW90ZVZlbmRvclVuaXF1ZUNtZChVSU5UOCByY19oYW5kbGUsIFVJTlQ4IGxhYmVsLCB0QlRBX0FWX1NUQVRFIGtleV9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDgqIHBfbXNnLCBVSU5UOCBidWZfbGVuKTsKK3ZvaWQgQlRBX0F2UmVtb3RlVmVuZG9yVW5pcXVlQ21kKHVpbnQ4X3QgcmNfaGFuZGxlLCB1aW50OF90IGxhYmVsLCB0QlRBX0FWX1NUQVRFIGtleV9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9tc2csIHVpbnQ4X3QgYnVmX2xlbik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtNzM1LDggKzczNSw4IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQXZWZW5kb3JDbWQoVUlOVDggcmNfaGFuZGxlLCBVSU5UOCBsYWJlbCwgdEJUQV9BVl9DT0RFIGNtZF9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9kYXRhLCBVSU5UMTYgbGVuKTsKK3ZvaWQgQlRBX0F2VmVuZG9yQ21kKHVpbnQ4X3QgcmNfaGFuZGxlLCB1aW50OF90IGxhYmVsLCB0QlRBX0FWX0NPREUgY21kX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfZGF0YSwgdWludDE2X3QgbGVuKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC03NTAsOCArNzUwLDggQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BdlZlbmRvclJzcChVSU5UOCByY19oYW5kbGUsIFVJTlQ4IGxhYmVsLCB0QlRBX0FWX0NPREUgcnNwX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4ICpwX2RhdGEsIFVJTlQxNiBsZW4sIFVJTlQzMiBjb21wYW55X2lkKTsKK3ZvaWQgQlRBX0F2VmVuZG9yUnNwKHVpbnQ4X3QgcmNfaGFuZGxlLCB1aW50OF90IGxhYmVsLCB0QlRBX0FWX0NPREUgcnNwX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfZGF0YSwgdWludDE2X3QgbGVuLCB1aW50MzJfdCBjb21wYW55X2lkKTsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNzc1LDcgKzc3NSw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQXZDbG9zZVJjKFVJTlQ4IHJjX2hhbmRsZSk7Cit2b2lkIEJUQV9BdkNsb3NlUmModWludDhfdCByY19oYW5kbGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTc4OSw3ICs3ODksNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2TWV0YVJzcChVSU5UOCByY19oYW5kbGUsIFVJTlQ4IGxhYmVsLCB0QlRBX0FWX0NPREUgcnNwX2NvZGUsCit2b2lkIEJUQV9Bdk1ldGFSc3AodWludDhfdCByY19oYW5kbGUsIHVpbnQ4X3QgbGFiZWwsIHRCVEFfQVZfQ09ERSByc3BfY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIgKnBfcGt0KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTgwNiw3ICs4MDYsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2TWV0YUNtZChVSU5UOCByY19oYW5kbGUsIFVJTlQ4IGxhYmVsLCB0QlRBX0FWX0NNRCBjbWRfY29kZSwgQlRfSERSICpwX3BrdCk7Cit2b2lkIEJUQV9Bdk1ldGFDbWQodWludDhfdCByY19oYW5kbGUsIHVpbnQ4X3QgbGFiZWwsIHRCVEFfQVZfQ01EIGNtZF9jb2RlLCBCVF9IRFIgKnBfcGt0KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCmRpZmYgLS1naXQgYS9idGEvaW5jbHVkZS9idGFfYXZfY2kuaCBiL2J0YS9pbmNsdWRlL2J0YV9hdl9jaS5oCmluZGV4IDllMmM2MmMuLmViZmE5N2EgMTAwNjQ0Ci0tLSBhL2J0YS9pbmNsdWRlL2J0YV9hdl9jaS5oCisrKyBiL2J0YS9pbmNsdWRlL2J0YV9hdl9jaS5oCkBAIC02MSw5ICs2MSw5IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2F2X2NpX3NldGNvbmZpZyh0QlRBX0FWX0hOREwgaG5kbCwgVUlOVDggZXJyX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggY2F0ZWdvcnksIFVJTlQ4IG51bV9zZWlkLCBVSU5UOCAqcF9zZWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xFQU4gcmVjZmdfbmVlZGVkLCBVSU5UOCBhdmR0X2hhbmRsZSk7CitleHRlcm4gdm9pZCBidGFfYXZfY2lfc2V0Y29uZmlnKHRCVEFfQVZfSE5ETCBobmRsLCB1aW50OF90IGVycl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2F0ZWdvcnksIHVpbnQ4X3QgbnVtX3NlaWQsIHVpbnQ4X3QgKnBfc2VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlY2ZnX25lZWRlZCwgdWludDhfdCBhdmR0X2hhbmRsZSk7CiAKIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9idGEvaW5jbHVkZS9idGFfYXZfY28uaCBiL2J0YS9pbmNsdWRlL2J0YV9hdl9jby5oCmluZGV4IDhjZDNjOGIuLmZjMzA2ZWQgMTAwNjQ0Ci0tLSBhL2J0YS9pbmNsdWRlL2J0YV9hdl9jby5oCisrKyBiL2J0YS9pbmNsdWRlL2J0YV9hdl9jby5oCkBAIC0zNSw5ICszNSw5IEBACiAqKiAgQ29uc3RhbnRzIGFuZCBkYXRhIHR5cGVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyogVFJVRSB0byB1c2UgU0NNUy1UIGNvbnRlbnQgcHJvdGVjdGlvbiAqLworLyogdHJ1ZSB0byB1c2UgU0NNUy1UIGNvbnRlbnQgcHJvdGVjdGlvbiAqLwogI2lmbmRlZiBCVEFfQVZfQ09fQ1BfU0NNU19UCi0jZGVmaW5lIEJUQV9BVl9DT19DUF9TQ01TX1QgICAgIEZBTFNFCisjZGVmaW5lIEJUQV9BVl9DT19DUF9TQ01TX1QgICAgIGZhbHNlCiAjZW5kaWYKIAogLyogdGhlIGNvbnRlbnQgcHJvdGVjdGlvbiBJRHMgYXNzaWduZWQgYnkgQlQgU0lHICovCkBAIC02NywxMiArNjcsMTIgQEAKIC8qIGRhdGEgdHlwZSBmb3IgdGhlIEF1ZGlvIENvZGVjIEluZm9ybWF0aW9uKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDE2ICBiaXRfcmF0ZTsgICAgICAgLyogU0JDIGVuY29kZXIgYml0IHJhdGUgaW4ga2JwcyAqLwotICAgIFVJTlQxNiAgYml0X3JhdGVfYnVzeTsgIC8qIFNCQyBlbmNvZGVyIGJpdCByYXRlIGluIGticHMgKi8KLSAgICBVSU5UMTYgIGJpdF9yYXRlX3N3YW1wZDsvKiBTQkMgZW5jb2RlciBiaXQgcmF0ZSBpbiBrYnBzICovCi0gICAgVUlOVDggICBidXN5X2xldmVsOyAgICAgLyogQnVzeSBsZXZlbCBpbmRpY2F0aW5nIHRoZSBiaXQtcmF0ZSB0byBiZSB1c2VkICovCi0gICAgVUlOVDggICBjb2RlY19pbmZvW0FWRFRfQ09ERUNfU0laRV07Ci0gICAgVUlOVDggICBjb2RlY190eXBlOyAgICAgLyogQ29kZWMgdHlwZSAqLworICAgIHVpbnQxNl90ICBiaXRfcmF0ZTsgICAgICAgLyogU0JDIGVuY29kZXIgYml0IHJhdGUgaW4ga2JwcyAqLworICAgIHVpbnQxNl90ICBiaXRfcmF0ZV9idXN5OyAgLyogU0JDIGVuY29kZXIgYml0IHJhdGUgaW4ga2JwcyAqLworICAgIHVpbnQxNl90ICBiaXRfcmF0ZV9zd2FtcGQ7LyogU0JDIGVuY29kZXIgYml0IHJhdGUgaW4ga2JwcyAqLworICAgIHVpbnQ4X3QgICBidXN5X2xldmVsOyAgICAgLyogQnVzeSBsZXZlbCBpbmRpY2F0aW5nIHRoZSBiaXQtcmF0ZSB0byBiZSB1c2VkICovCisgICAgdWludDhfdCAgIGNvZGVjX2luZm9bQVZEVF9DT0RFQ19TSVpFXTsKKyAgICB1aW50OF90ICAgY29kZWNfdHlwZTsgICAgIC8qIENvZGVjIHR5cGUgKi8KIH0gdEJUQV9BVl9BVURJT19DT0RFQ19JTkZPOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODgsOCArODgsOCBAQAogKiogUmV0dXJucyAgICAgICAgICBTdHJlYW0gY29kZWMgYW5kIGNvbnRlbnQgcHJvdGVjdGlvbiBjYXBhYmlsaXRpZXMgaW5mby4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIEJPT0xFQU4gYnRhX2F2X2NvX2F1ZGlvX2luaXQoVUlOVDggKnBfY29kZWNfdHlwZSwgVUlOVDggKnBfY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4ICpwX251bV9wcm90ZWN0LCBVSU5UOCAqcF9wcm90ZWN0X2luZm8sIFVJTlQ4IGluZGV4KTsKK2V4dGVybiBib29sIGJ0YV9hdl9jb19hdWRpb19pbml0KHVpbnQ4X3QgKnBfY29kZWNfdHlwZSwgdWludDhfdCAqcF9jb2RlY19pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9udW1fcHJvdGVjdCwgdWludDhfdCAqcF9wcm90ZWN0X2luZm8sIHVpbnQ4X3QgaW5kZXgpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTEwMyw4ICsxMDMsOCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfYXZfY29fYXVkaW9fZGlzY19yZXModEJUQV9BVl9ITkRMIGhuZGwsIFVJTlQ4IG51bV9zZXBzLAotICAgICAgICAgICAgICAgICAgICBVSU5UOCBudW1fc25rLCBVSU5UOCBudW1fc3JjLCBCRF9BRERSIGFkZHIsIFVJTlQxNiB1dWlkX2xvY2FsKTsKK2V4dGVybiB2b2lkIGJ0YV9hdl9jb19hdWRpb19kaXNjX3Jlcyh0QlRBX0FWX0hOREwgaG5kbCwgdWludDhfdCBudW1fc2VwcywKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fc25rLCB1aW50OF90IG51bV9zcmMsIEJEX0FERFIgYWRkciwgdWludDE2X3QgdXVpZF9sb2NhbCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMTE4LDggKzExOCw4IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9hdl9jb192aWRlb19kaXNjX3Jlcyh0QlRBX0FWX0hOREwgaG5kbCwgVUlOVDggbnVtX3NlcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggbnVtX3NuaywgQkRfQUREUiBhZGRyKTsKK2V4dGVybiB2b2lkIGJ0YV9hdl9jb192aWRlb19kaXNjX3Jlcyh0QlRBX0FWX0hOREwgaG5kbCwgdWludDhfdCBudW1fc2VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9zbmssIEJEX0FERFIgYWRkcik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMTMzLDkgKzEzMyw5IEBACiAqKiBSZXR1cm5zICAgICAgICAgIFN0cmVhbSBjb2RlYyBhbmQgY29udGVudCBwcm90ZWN0aW9uIGNvbmZpZ3VyYXRpb24gaW5mby4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIFVJTlQ4IGJ0YV9hdl9jb19hdWRpb19nZXRjb25maWcodEJUQV9BVl9ITkRMIGhuZGwsIHRCVEFfQVZfQ09ERUMgY29kZWNfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4ICpwX2NvZGVjX2luZm8sIFVJTlQ4ICpwX3NlcF9pbmZvX2lkeCwgVUlOVDggc2VpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4ICpwX251bV9wcm90ZWN0LCBVSU5UOCAqcF9wcm90ZWN0X2luZm8pOworZXh0ZXJuIHVpbnQ4X3QgYnRhX2F2X2NvX2F1ZGlvX2dldGNvbmZpZyh0QlRBX0FWX0hOREwgaG5kbCwgdEJUQV9BVl9DT0RFQyBjb2RlY190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9jb2RlY19pbmZvLCB1aW50OF90ICpwX3NlcF9pbmZvX2lkeCwgdWludDhfdCBzZWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9udW1fcHJvdGVjdCwgdWludDhfdCAqcF9wcm90ZWN0X2luZm8pOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTE0OSw5ICsxNDksOSBAQAogKiogUmV0dXJucyAgICAgICAgICBTdHJlYW0gY29kZWMgYW5kIGNvbnRlbnQgcHJvdGVjdGlvbiBjb25maWd1cmF0aW9uIGluZm8uCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBVSU5UOCBidGFfYXZfY29fdmlkZW9fZ2V0Y29uZmlnKHRCVEFfQVZfSE5ETCBobmRsLCB0QlRBX0FWX0NPREVDIGNvZGVjX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9jb2RlY19pbmZvLCBVSU5UOCAqcF9zZXBfaW5mb19pZHgsIFVJTlQ4IHNlaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9udW1fcHJvdGVjdCwgVUlOVDggKnBfcHJvdGVjdF9pbmZvKTsKK2V4dGVybiB1aW50OF90IGJ0YV9hdl9jb192aWRlb19nZXRjb25maWcodEJUQV9BVl9ITkRMIGhuZGwsIHRCVEFfQVZfQ09ERUMgY29kZWNfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfY29kZWNfaW5mbywgdWludDhfdCAqcF9zZXBfaW5mb19pZHgsIHVpbnQ4X3Qgc2VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfbnVtX3Byb3RlY3QsIHVpbnQ4X3QgKnBfcHJvdGVjdF9pbmZvKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0xNjUsOCArMTY1LDggQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogZXh0ZXJuIHZvaWQgYnRhX2F2X2NvX2F1ZGlvX3NldGNvbmZpZyh0QlRBX0FWX0hOREwgaG5kbCwgdEJUQV9BVl9DT0RFQyBjb2RlY190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4ICpwX2NvZGVjX2luZm8sIFVJTlQ4IHNlaWQsIEJEX0FERFIgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBudW1fcHJvdGVjdCwgVUlOVDggKnBfcHJvdGVjdF9pbmZvLFVJTlQ4IHRfbG9jYWxfc2VwLCBVSU5UOCBhdmR0X2hhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9jb2RlY19pbmZvLCB1aW50OF90IHNlaWQsIEJEX0FERFIgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9wcm90ZWN0LCB1aW50OF90ICpwX3Byb3RlY3RfaW5mbyx1aW50OF90IHRfbG9jYWxfc2VwLCB1aW50OF90IGF2ZHRfaGFuZGxlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0xODAsOCArMTgwLDggQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogZXh0ZXJuIHZvaWQgYnRhX2F2X2NvX3ZpZGVvX3NldGNvbmZpZyh0QlRBX0FWX0hOREwgaG5kbCwgdEJUQV9BVl9DT0RFQyBjb2RlY190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9jb2RlY19pbmZvLCBVSU5UOCBzZWlkLCBCRF9BRERSIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4IG51bV9wcm90ZWN0LCBVSU5UOCAqcF9wcm90ZWN0X2luZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwX2NvZGVjX2luZm8sIHVpbnQ4X3Qgc2VpZCwgQkRfQUREUiBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9wcm90ZWN0LCB1aW50OF90ICpwX3Byb3RlY3RfaW5mbyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMTk3LDggKzE5Nyw4IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGV4dGVybiB2b2lkIGJ0YV9hdl9jb19hdWRpb19vcGVuKHRCVEFfQVZfSE5ETCBobmRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9BVl9DT0RFQyBjb2RlY190eXBlLCBVSU5UOCAqcF9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IG10dSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0FWX0NPREVDIGNvZGVjX3R5cGUsIHVpbnQ4X3QgKnBfY29kZWNfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG10dSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMjEyLDggKzIxMiw4IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGV4dGVybiB2b2lkIGJ0YV9hdl9jb192aWRlb19vcGVuKHRCVEFfQVZfSE5ETCBobmRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9BVl9DT0RFQyBjb2RlY190eXBlLCBVSU5UOCAqcF9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IG10dSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0FWX0NPREVDIGNvZGVjX3R5cGUsIHVpbnQ4X3QgKnBfY29kZWNfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG10dSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMjMwLDcgKzIzMCw3IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGV4dGVybiB2b2lkIGJ0YV9hdl9jb19hdWRpb19jbG9zZSh0QlRBX0FWX0hOREwgaG5kbCwgdEJUQV9BVl9DT0RFQyBjb2RlY190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBtdHUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG10dSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMjQ0LDcgKzI0NCw3IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGV4dGVybiB2b2lkIGJ0YV9hdl9jb192aWRlb19jbG9zZSh0QlRBX0FWX0hOREwgaG5kbCwgdEJUQV9BVl9DT0RFQyBjb2RlY190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBtdHUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG10dSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMjU4LDcgKzI1OCw3IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGV4dGVybiB2b2lkIGJ0YV9hdl9jb19hdWRpb19zdGFydCh0QlRBX0FWX0hOREwgaG5kbCwgdEJUQV9BVl9DT0RFQyBjb2RlY190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4ICpwX2NvZGVjX2luZm8sIEJPT0xFQU4gKnBfbm9fcnRwX2hkcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9jb2RlY19pbmZvLCBib29sICpwX25vX3J0cF9oZHIpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTI3Miw3ICsyNzIsNyBAQAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBleHRlcm4gdm9pZCBidGFfYXZfY29fdmlkZW9fc3RhcnQodEJUQV9BVl9ITkRMIGhuZGwsIHRCVEFfQVZfQ09ERUMgY29kZWNfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9jb2RlY19pbmZvLCBCT09MRUFOICpwX25vX3J0cF9oZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfY29kZWNfaW5mbywgYm9vbCAqcF9ub19ydHBfaGRyKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0zMTIsNyArMzEyLDcgQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogZXh0ZXJuIHZvaWQgKiBidGFfYXZfY29fYXVkaW9fc3JjX2RhdGFfcGF0aCh0QlRBX0FWX0NPREVDIGNvZGVjX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiAqcF9sZW4sIFVJTlQzMiAqcF90aW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcF9sZW4sIHVpbnQzMl90ICpwX3RpbWVzdGFtcCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMzIyLDExICszMjIsMTEgQEAKICoqICAgICAgICAgICAgICAgICAgdGhlIHZpZGVvIGNvZGVjLgogKioKICoqIFJldHVybnMgICAgICAgICAgTlVMTCBpZiBkYXRhIGlzIG5vdCByZWFkeS4KLSoqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCBhIHZpZGVvIGRhdGEgYnVmZmVyIChVSU5UOCopLgorKiogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIGEgdmlkZW8gZGF0YSBidWZmZXIgKHVpbnQ4X3QqKS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogZXh0ZXJuIHZvaWQgKiBidGFfYXZfY29fdmlkZW9fc3JjX2RhdGFfcGF0aCh0QlRBX0FWX0NPREVDIGNvZGVjX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiAqcF9sZW4sIFVJTlQzMiAqcF90aW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcF9sZW4sIHVpbnQzMl90ICpwX3RpbWVzdGFtcCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMzQ3LDEyICszNDcsMTIgQEAKICoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2NvX3ZpZGVvX3JlcG9ydF9jb25uCiAqKgogKiogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBBViB3aGVuIHRoZSByZXBvcnRpbmcgY2hhbm5lbCBpcwotKiogICAgICAgICAgICAgICAgICBvcGVuZWQgKG9wZW49VFJVRSkgb3IgY2xvc2VkIChvcGVuPUZBTFNFKS4KKyoqICAgICAgICAgICAgICAgICAgb3BlbmVkIChvcGVuPXRydWUpIG9yIGNsb3NlZCAob3Blbj1mYWxzZSkuCiAqKgogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9hdl9jb192aWRlb19yZXBvcnRfY29ubiAoQk9PTEVBTiBvcGVuLCBVSU5UOCBhdmR0X2hhbmRsZSk7CitleHRlcm4gdm9pZCBidGFfYXZfY29fdmlkZW9fcmVwb3J0X2Nvbm4gKGJvb2wgb3BlbiwgdWludDhfdCBhdmR0X2hhbmRsZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMzY0LDcgKzM2NCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2F2X2NvX3ZpZGVvX3JlcG9ydF9yciAoVUlOVDMyIHBhY2tldF9sb3N0KTsKK2V4dGVybiB2b2lkIGJ0YV9hdl9jb192aWRlb19yZXBvcnRfcnIgKHVpbnQzMl90IHBhY2tldF9sb3N0KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0zNzcsNyArMzc3LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfYXZfY29fYXVkaW9fZGVsYXkodEJUQV9BVl9ITkRMIGhuZGwsIFVJTlQxNiBkZWxheSk7CitleHRlcm4gdm9pZCBidGFfYXZfY29fYXVkaW9fZGVsYXkodEJUQV9BVl9ITkRMIGhuZGwsIHVpbnQxNl90IGRlbGF5KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0zOTAsNyArMzkwLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfYXZfY29fdmlkZW9fZGVsYXkodEJUQV9BVl9ITkRMIGhuZGwsIFVJTlQxNiBkZWxheSk7CitleHRlcm4gdm9pZCBidGFfYXZfY29fdmlkZW9fZGVsYXkodEJUQV9BVl9ITkRMIGhuZGwsIHVpbnQxNl90IGRlbGF5KTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9idGEvaW5jbHVkZS9idGFfYXZfc2JjLmggYi9idGEvaW5jbHVkZS9idGFfYXZfc2JjLmgKaW5kZXggODU4ZjgzMi4uNTdiZTQ2ZSAxMDA2NDQKLS0tIGEvYnRhL2luY2x1ZGUvYnRhX2F2X3NiYy5oCisrKyBiL2J0YS9pbmNsdWRlL2J0YV9hdl9zYmMuaApAQCAtNTAsOCArNTAsOCBAQAogKiogUmV0dXJucyAgICAgICAgICBub25lCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9hdl9zYmNfaW5pdF91cF9zYW1wbGUgKFVJTlQzMiBzcmNfc3BzLCBVSU5UMzIgZHN0X3NwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBiaXRzLCBVSU5UMTYgbl9jaGFubmVscyk7CitleHRlcm4gdm9pZCBidGFfYXZfc2JjX2luaXRfdXBfc2FtcGxlICh1aW50MzJfdCBzcmNfc3BzLCB1aW50MzJfdCBkc3Rfc3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYml0cywgdWludDE2X3Qgbl9jaGFubmVscyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtNzksOCArNzksOCBAQAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBleHRlcm4gaW50IGJ0YV9hdl9zYmNfdXBfc2FtcGxlICh2b2lkICpwX3NyYywgdm9pZCAqcF9kc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgc3JjX3NhbXBsZXMsIFVJTlQzMiBkc3Rfc2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiAqcF9yZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NhbXBsZXMsIHVpbnQzMl90IGRzdF9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBfcmV0KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0xMDAsOCArMTAwLDggQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogZXh0ZXJuIGludCBidGFfYXZfc2JjX3VwX3NhbXBsZV8xNnMgKHZvaWQgKnBfc3JjLCB2b2lkICpwX2RzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBzcmNfc2FtcGxlcywgVUlOVDMyIGRzdF9zYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyICpwX3JldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc2FtcGxlcywgdWludDMyX3QgZHN0X3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcF9yZXQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTEyMSw4ICsxMjEsOCBAQAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBleHRlcm4gaW50IGJ0YV9hdl9zYmNfdXBfc2FtcGxlXzE2bSAodm9pZCAqcF9zcmMsIHZvaWQgKnBfZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBzcmNfc2FtcGxlcywgVUlOVDMyIGRzdF9zYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiAqcF9yZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY19zYW1wbGVzLCB1aW50MzJfdCBkc3Rfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcF9yZXQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTE0Miw4ICsxNDIsOCBAQAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBleHRlcm4gaW50IGJ0YV9hdl9zYmNfdXBfc2FtcGxlXzhzICh2b2lkICpwX3NyYywgdm9pZCAqcF9kc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgc3JjX3NhbXBsZXMsIFVJTlQzMiBkc3Rfc2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiAqcF9yZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NhbXBsZXMsIHVpbnQzMl90IGRzdF9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBfcmV0KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0xNjMsOCArMTYzLDggQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogZXh0ZXJuIGludCBidGFfYXZfc2JjX3VwX3NhbXBsZV84bSAodm9pZCAqcF9zcmMsIHZvaWQgKnBfZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBzcmNfc2FtcGxlcywgVUlOVDMyIGRzdF9zYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiAqcF9yZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY19zYW1wbGVzLCB1aW50MzJfdCBkc3Rfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcF9yZXQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTE4Miw3ICsxODIsNyBAQAogKiogICAgICAgICAgICAgICAgICBDb2RlYyBjb25maWd1cmF0aW9uIGluIHBfY2FwLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gVUlOVDggYnRhX2F2X3NiY19jZmdfZm9yX2NhcChVSU5UOCAqcF9wZWVyLCB0QTJEX1NCQ19DSUUgKnBfY2FwLCB0QTJEX1NCQ19DSUUgKnBfcHJlZik7CitleHRlcm4gdWludDhfdCBidGFfYXZfc2JjX2NmZ19mb3JfY2FwKHVpbnQ4X3QgKnBfcGVlciwgdEEyRF9TQkNfQ0lFICpwX2NhcCwgdEEyRF9TQkNfQ0lFICpwX3ByZWYpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTE5NCw3ICsxOTQsNyBAQAogKiogUmV0dXJucyAgICAgICAgICAwIGlmIG9rLCBub256ZXJvIGlmIGVycm9yLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gVUlOVDggYnRhX2F2X3NiY19jZmdfaW5fY2FwKFVJTlQ4ICpwX2NmZywgdEEyRF9TQkNfQ0lFICpwX2NhcCk7CitleHRlcm4gdWludDhfdCBidGFfYXZfc2JjX2NmZ19pbl9jYXAodWludDhfdCAqcF9jZmcsIHRBMkRfU0JDX0NJRSAqcF9jYXApOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTIwNiw3ICsyMDYsNyBAQAogKiogUmV0dXJucyAgICAgICAgICAwIGlmIG9rLCBub256ZXJvIGlmIGVycm9yLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gVUlOVDggYnRhX2F2X3NiY19jZmdfbWF0Y2hlc19jYXAoVUlOVDggKnBfY2ZnLCB0QTJEX1NCQ19DSUUgKnBfY2FwKTsKK2V4dGVybiB1aW50OF90IGJ0YV9hdl9zYmNfY2ZnX21hdGNoZXNfY2FwKHVpbnQ4X3QgKnBfY2ZnLCB0QTJEX1NCQ19DSUUgKnBfY2FwKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0yMTcsNyArMjE3LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfYXZfc2JjX2JsZF9oZHIoQlRfSERSICpwX2J1ZiwgVUlOVDE2IGZyX3Blcl9wa3QpOworZXh0ZXJuIHZvaWQgYnRhX2F2X3NiY19ibGRfaGRyKEJUX0hEUiAqcF9idWYsIHVpbnQxNl90IGZyX3Blcl9wa3QpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL2J0YS9pbmNsdWRlL2J0YV9kbV9jaS5oIGIvYnRhL2luY2x1ZGUvYnRhX2RtX2NpLmgKaW5kZXggNTU5M2I5ZS4uNGQ0YmI4MSAxMDA2NDQKLS0tIGEvYnRhL2luY2x1ZGUvYnRhX2RtX2NpLmgKKysrIGIvYnRhL2luY2x1ZGUvYnRhX2RtX2NpLmgKQEAgLTU5LDcgKzU5LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfZG1fY2lfcm10X29vYihCT09MRUFOIGFjY2VwdCwgQkRfQUREUiBiZF9hZGRyLAorZXh0ZXJuIHZvaWQgYnRhX2RtX2NpX3JtdF9vb2IoYm9vbCBhY2NlcHQsIEJEX0FERFIgYmRfYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX09DVEVUMTYgYywgQlRfT0NURVQxNiByKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtNzEsNyArNzEsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9kbV9zY29fY2lfZGF0YV9yZWFkeShVSU5UMTYgZXZlbnQsIFVJTlQxNiBzY29faGFuZGxlKTsKK2V4dGVybiB2b2lkIGJ0YV9kbV9zY29fY2lfZGF0YV9yZWFkeSh1aW50MTZfdCBldmVudCwgdWludDE2X3Qgc2NvX2hhbmRsZSk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX2RtX2NvLmggYi9idGEvaW5jbHVkZS9idGFfZG1fY28uaAppbmRleCBjZmI3MWZjLi40N2Y2YWJiIDEwMDY0NAotLS0gYS9idGEvaW5jbHVkZS9idGFfZG1fY28uaAorKysgYi9idGEvaW5jbHVkZS9idGFfZG1fY28uaApAQCAtMzYsNyArMzYsNyBAQAogCiAjZGVmaW5lIEJUQV9TQ09fQ09ERUNfUENNICAgICAgIDAgICAgICAgLyogdXNlZCBmb3IgcmVndWxhciBTQ08gKi8KICNkZWZpbmUgQlRBX1NDT19DT0RFQ19TQkMgICAgICAgMSAgICAgICAvKiB1c2VkIGZvciBXQlMgKi8KLXR5cGVkZWYgVUlOVDggICB0QlRBX1NDT19DT0RFQ19UWVBFOwordHlwZWRlZiB1aW50OF90ICAgdEJUQV9TQ09fQ09ERUNfVFlQRTsKIAogI2RlZmluZSBCVEFfRE1fU0NPX1NBTVBfUkFURV84SyAgICAgODAwMAogI2RlZmluZSBCVEFfRE1fU0NPX1NBTVBfUkFURV8xNksgICAgMTYwMDAKQEAgLTY2LDE1ICs2NiwxNSBAQAogKioKICoqIFBhcmFtZXRlcnMgICAgICAgYmRfYWRkciAgLSBUaGUgcGVlciBkZXZpY2UKICoqICAgICAgICAgICAgICAgICAgKnBfaW9fY2FwIC0gVGhlIGxvY2FsIElucHV0L091dHB1dCBjYXBhYmlsaXRpZXMKLSoqICAgICAgICAgICAgICAgICAgKnBfb29iX2RhdGEgLSBUUlVFLCBpZiBPT0IgZGF0YSBpcyBhdmFpbGFibGUgZm9yIHRoZSBwZWVyIGRldmljZS4KLSoqICAgICAgICAgICAgICAgICAgKnBfYXV0aF9yZXEgLSBUUlVFLCBpZiBNSVRNIHByb3RlY3Rpb24gaXMgcmVxdWlyZWQuCisqKiAgICAgICAgICAgICAgICAgICpwX29vYl9kYXRhIC0gdHJ1ZSwgaWYgT09CIGRhdGEgaXMgYXZhaWxhYmxlIGZvciB0aGUgcGVlciBkZXZpY2UuCisqKiAgICAgICAgICAgICAgICAgICpwX2F1dGhfcmVxIC0gdHJ1ZSwgaWYgTUlUTSBwcm90ZWN0aW9uIGlzIHJlcXVpcmVkLgogKioKICoqIFJldHVybnMgICAgICAgICAgdm9pZC4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogZXh0ZXJuIHZvaWQgYnRhX2RtX2NvX2lvX3JlcShCRF9BRERSIGJkX2FkZHIsIHRCVEFfSU9fQ0FQICpwX2lvX2NhcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9PT0JfREFUQSAqcF9vb2JfZGF0YSwgdEJUQV9BVVRIX1JFUSAqcF9hdXRoX3JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTEVBTiBpc19vcmlnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19vcmlnKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC04NSw4ICs4NSw4IEBACiAqKgogKiogUGFyYW1ldGVycyAgICAgICBiZF9hZGRyICAtIFRoZSBwZWVyIGRldmljZQogKiogICAgICAgICAgICAgICAgICBpb19jYXAgLSBUaGUgcmVtb3RlIElucHV0L091dHB1dCBjYXBhYmlsaXRpZXMKLSoqICAgICAgICAgICAgICAgICAgb29iX2RhdGEgLSBUUlVFLCBpZiBPT0IgZGF0YSBpcyBhdmFpbGFibGUgZm9yIHRoZSBwZWVyIGRldmljZS4KLSoqICAgICAgICAgICAgICAgICAgYXV0aF9yZXEgLSBUUlVFLCBpZiBNSVRNIHByb3RlY3Rpb24gaXMgcmVxdWlyZWQuCisqKiAgICAgICAgICAgICAgICAgIG9vYl9kYXRhIC0gdHJ1ZSwgaWYgT09CIGRhdGEgaXMgYXZhaWxhYmxlIGZvciB0aGUgcGVlciBkZXZpY2UuCisqKiAgICAgICAgICAgICAgICAgIGF1dGhfcmVxIC0gdHJ1ZSwgaWYgTUlUTSBwcm90ZWN0aW9uIGlzIHJlcXVpcmVkLgogKioKICoqIFJldHVybnMgICAgICAgICAgdm9pZC4KICoqCkBAIC0xMDIsMTIgKzEwMiwxMiBAQAogKiogICAgICAgICAgICAgICAgICBwbGF0Zm9ybSB3YW50cyBhbGxvdyBsaW5rIGtleSB1cGdyYWRlCiAqKgogKiogUGFyYW1ldGVycyAgICAgICBiZF9hZGRyICAtIFRoZSBwZWVyIGRldmljZQotKiogICAgICAgICAgICAgICAgICAqcF91cGdyYWRlIC0gVFJVRSwgaWYgbGluayBrZXkgdXBncmFkZSBpcyBkZXNpcmVkLgorKiogICAgICAgICAgICAgICAgICAqcF91cGdyYWRlIC0gdHJ1ZSwgaWYgbGluayBrZXkgdXBncmFkZSBpcyBkZXNpcmVkLgogKioKICoqIFJldHVybnMgICAgICAgICAgdm9pZC4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgIGJ0YV9kbV9jb19sa191cGdyYWRlKEJEX0FERFIgYmRfYWRkciwgQk9PTEVBTiAqcF91cGdyYWRlICk7CitleHRlcm4gdm9pZCAgYnRhX2RtX2NvX2xrX3VwZ3JhZGUoQkRfQUREUiBiZF9hZGRyLCBib29sICpwX3VwZ3JhZGUgKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0xMTYsMTQgKzExNiwxNCBAQAogKiogRGVzY3JpcHRpb24gICAgICBUaGlzIGNhbGxvdXQgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYnkgRE0gdG8gcmVwb3J0IHRoZSBPT0IKICoqICAgICAgICAgICAgICAgICAgZGF0YSBvZiB0aGUgbG9jYWwgZGV2aWNlIGZvciB0aGUgU2ltcGxlIFBhaXJpbmcgcHJvY2VzcwogKioKLSoqIFBhcmFtZXRlcnMgICAgICAgdmFsaWQgLSBUUlVFLCBpZiB0aGUgbG9jYWwgT09CIGRhdGEgaXMgcmV0cmlldmVkIGZyb20gTE0KKyoqIFBhcmFtZXRlcnMgICAgICAgdmFsaWQgLSB0cnVlLCBpZiB0aGUgbG9jYWwgT09CIGRhdGEgaXMgcmV0cmlldmVkIGZyb20gTE0KICoqICAgICAgICAgICAgICAgICAgYyAgICAgLSBTaW1wbGUgUGFpcmluZyBIYXNoIEMKICoqICAgICAgICAgICAgICAgICAgciAgICAgLSBTaW1wbGUgUGFpcmluZyBSYW5kb21uaXplciBSCiAqKgogKiogUmV0dXJucyAgICAgICAgICB2b2lkLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfZG1fY29fbG9jX29vYihCT09MRUFOIHZhbGlkLCBCVF9PQ1RFVDE2IGMsIEJUX09DVEVUMTYgcik7CitleHRlcm4gdm9pZCBidGFfZG1fY29fbG9jX29vYihib29sIHZhbGlkLCBCVF9PQ1RFVDE2IGMsIEJUX09DVEVUMTYgcik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMTU0LDggKzE1NCw4IEBACiAqKiBSZXR1cm5zICAgICAgICAgIFZvaWQuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0QlRBX0RNX1NDT19ST1VURV9UWVBFIGJ0YV9kbV9zY29fY29faW5pdChVSU5UMzIgcnhfYncsIFVJTlQzMiB0eF9idywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0NPREVDX0lORk8gKnBfY29kZWNfaW5mbywgVUlOVDggYXBwX2lkKTsKK2V4dGVybiB0QlRBX0RNX1NDT19ST1VURV9UWVBFIGJ0YV9kbV9zY29fY29faW5pdCh1aW50MzJfdCByeF9idywgdWludDMyX3QgdHhfYncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9DT0RFQ19JTkZPICpwX2NvZGVjX2luZm8sIHVpbnQ4X3QgYXBwX2lkKTsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTY4LDcgKzE2OCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2RtX3Njb19jb19vcGVuKFVJTlQxNiBoYW5kbGUsIFVJTlQ4IHBrdF9zaXplLCBVSU5UMTYgZXZlbnQpOworZXh0ZXJuIHZvaWQgYnRhX2RtX3Njb19jb19vcGVuKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBwa3Rfc2l6ZSwgdWludDE2X3QgZXZlbnQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTIxNSw3ICsyMTUsNyBAQAogKioKICoqIFBhcmFtZXRlcnMgICAgICAgYmRfYWRkciAgLSBUaGUgcGVlciBkZXZpY2UKICoqICAgICAgICAgICAgICAgICAgKnBfaW9fY2FwIC0gVGhlIGxvY2FsIElucHV0L091dHB1dCBjYXBhYmlsaXRpZXMKLSoqICAgICAgICAgICAgICAgICAgKnBfb29iX2RhdGEgLSBUUlVFLCBpZiBPT0IgZGF0YSBpcyBhdmFpbGFibGUgZm9yIHRoZSBwZWVyIGRldmljZS4KKyoqICAgICAgICAgICAgICAgICAgKnBfb29iX2RhdGEgLSB0cnVlLCBpZiBPT0IgZGF0YSBpcyBhdmFpbGFibGUgZm9yIHRoZSBwZWVyIGRldmljZS4KICoqICAgICAgICAgICAgICAgICAgKnBfYXV0aF9yZXEgLSAgQXV0aCByZXF1ZXN0IHNldHRpbmcgKEJvbmRpbmcgYW5kIE1JVE0gcmVxdWlyZWQgb3Igbm90KQogKiogICAgICAgICAgICAgICAgICAqcF9tYXhfa2V5X3NpemUgLSBtYXgga2V5IHNpemUgbG9jYWwgZGV2aWNlIHN1cHBvcnRlZC4KICoqICAgICAgICAgICAgICAgICAgKnBfaW5pdF9rZXkgLSBpbml0aWF0b3Iga2V5cy4KQEAgLTIyNyw3ICsyMjcsNyBAQAogZXh0ZXJuIHZvaWQgYnRhX2RtX2NvX2JsZV9pb19yZXEoQkRfQUREUiBiZF9hZGRyLCAgdEJUQV9JT19DQVAgKnBfaW9fY2FwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9PT0JfREFUQSAqcF9vb2JfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfTEVfQVVUSF9SRVEgKnBfYXV0aF9yZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9tYXhfa2V5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwX21heF9rZXlfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfTEVfS0VZX1RZUEUgKnBfaW5pdF9rZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0xFX0tFWV9UWVBFICAqcF9yZXNwX2tleSApOwogCkBAIC0yNTYsNyArMjU2LDcgQEAKICoqCiAqKiBQYXJhbWV0ZXJzICAgICAgIGJkX2FkZHIgIC0gVGhlIHBlZXIgZGV2aWNlCiAqKiAgICAgICAgICAgICAgICAgICpwX2lvX2NhcCAtIFRoZSBsb2NhbCBJbnB1dC9PdXRwdXQgY2FwYWJpbGl0aWVzCi0qKiAgICAgICAgICAgICAgICAgICpwX29vYl9kYXRhIC0gVFJVRSwgaWYgT09CIGRhdGEgaXMgYXZhaWxhYmxlIGZvciB0aGUgcGVlciBkZXZpY2UuCisqKiAgICAgICAgICAgICAgICAgICpwX29vYl9kYXRhIC0gdHJ1ZSwgaWYgT09CIGRhdGEgaXMgYXZhaWxhYmxlIGZvciB0aGUgcGVlciBkZXZpY2UuCiAqKiAgICAgICAgICAgICAgICAgICpwX2F1dGhfcmVxIC0gIEF1dGggcmVxdWVzdCBzZXR0aW5nIChCb25kaW5nIGFuZCBNSVRNIHJlcXVpcmVkIG9yIG5vdCkKICoqICAgICAgICAgICAgICAgICAgKnBfbWF4X2tleV9zaXplIC0gbWF4IGtleSBzaXplIGxvY2FsIGRldmljZSBzdXBwb3J0ZWQuCiAqKiAgICAgICAgICAgICAgICAgICpwX2luaXRfa2V5IC0gaW5pdGlhdG9yIGtleXMuCkBAIC0yNjgsNyArMjY4LDcgQEAKIGV4dGVybiB2b2lkIGJ0YV9kbV9jb19ibGVfaW9fcmVxKEJEX0FERFIgYmRfYWRkciwgIHRCVEFfSU9fQ0FQICpwX2lvX2NhcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfT09CX0RBVEEgKnBfb29iX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0xFX0FVVEhfUkVRICpwX2F1dGhfcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfbWF4X2tleV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9tYXhfa2V5X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0xFX0tFWV9UWVBFICpwX2luaXRfa2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9MRV9LRVlfVFlQRSAgKnBfcmVzcF9rZXkgKTsKIApkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX2dhdHRfYXBpLmggYi9idGEvaW5jbHVkZS9idGFfZ2F0dF9hcGkuaAppbmRleCAwMWFlMDkyLi5lOTA2NzAxIDEwMDY0NAotLS0gYS9idGEvaW5jbHVkZS9idGFfZ2F0dF9hcGkuaAorKysgYi9idGEvaW5jbHVkZS9idGFfZ2F0dF9hcGkuaApAQCAtMzUsMTcgKzM1LDE3IEBACiAKICNpZm5kZWYgICAgIEJUQV9HQVRUX0lOQ0xVREVECiAjd2FybmluZyBCVEFfR0FUVF9JTkNMVURFRCBub3QgZGVmaW5lZAotI2RlZmluZSAgICAgQlRBX0dBVFRfSU5DTFVERUQgICAgIEZBTFNFCisjZGVmaW5lICAgICBCVEFfR0FUVF9JTkNMVURFRCAgICAgZmFsc2UKICNlbmRpZgogCi0jaWYgKChCTEVfSU5DTFVERUQgPT0gRkFMU0UpICYmIChCVEFfR0FUVF9JTkNMVURFRCA9PSBUUlVFKSkKKyNpZiAoQkxFX0lOQ0xVREVEID09IEZBTFNFICYmIEJUQV9HQVRUX0lOQ0xVREVEID09IFRSVUUpCiAjdW5kZWYgQlRBX0dBVFRfSU5DTFVERUQKLSNkZWZpbmUgQlRBX0dBVFRfSU5DTFVERUQgICAgICAgIEZBTFNFCisjZGVmaW5lIEJUQV9HQVRUX0lOQ0xVREVEICAgICAgICBmYWxzZQogI2VuZGlmCiAKIAogI2lmbmRlZiAgICAgQlRBX0dBVFRfREVCVUcKLSNkZWZpbmUgICAgIEJUQV9HQVRUX0RFQlVHICAgICAgIEZBTFNFCisjZGVmaW5lICAgICBCVEFfR0FUVF9ERUJVRyAgICAgICBmYWxzZQogI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNTgsNyArNTgsNyBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICB0QlRfVVVJRCAgICB1dWlkOyAgICAgICAgICAgLyogdXVpZCBvZiB0aGUgYXR0cmlidXRlICovCi0gICAgVUlOVDggICAgICAgaW5zdF9pZDsgICAgICAgIC8qIGluc3RhbmNlIElEICovCisgICAgdWludDhfdCAgICAgICBpbnN0X2lkOyAgICAgICAgLyogaW5zdGFuY2UgSUQgKi8KIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdEJUQV9HQVRUX0lEOwogCiAvKiBTdWNjZXNzIGNvZGUgYW5kIGVycm9yIGNvZGVzICovCkBAIC0xMDksNyArMTA5LDcgQEAKICNkZWZpbmUgIEJUQV9HQVRUX1BSQ19JTl9QUk9HUkVTUyAgICAgICAgICAgIEdBVFRfUFJDX0lOX1BST0dSRVNTIC8qIDB4RkUgUHJvY2VkdXJlIEFscmVhZHkgaW4gcHJvZ3Jlc3MgKi8KICNkZWZpbmUgIEJUQV9HQVRUX09VVF9PRl9SQU5HRSAgICAgICAgICAgICAgIEdBVFRfT1VUX09GX1JBTkdFICAgIC8qIDB4RkZBdHRyaWJ1dGUgdmFsdWUgb3V0IG9mIHJhbmdlICovCiAKLXR5cGVkZWYgVUlOVDggdEJUQV9HQVRUX1NUQVRVUzsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0dBVFRfU1RBVFVTOwogCiAjZGVmaW5lIEJUQV9HQVRUX0lOVkFMSURfQ09OTl9JRCAgIEdBVFRfSU5WQUxJRF9DT05OX0lECiAKQEAgLTEzNiw1MSArMTM2LDUxIEBACiAjZGVmaW5lIEJUQV9HQVRUQ19DRkdfTVRVX0VWVCAgICAgICAxOCAgLyogY29uZmlndXJlIE1UVSBjb21wbGV0ZSBldmVudCAqLwogI2RlZmluZSBCVEFfR0FUVENfQ09OR0VTVF9FVlQgICAgICAgMjQgIC8qIENvbmdlc3Rpb24gZXZlbnQgKi8KIAotdHlwZWRlZiBVSU5UOCB0QlRBX0dBVFRDX0VWVDsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0dBVFRDX0VWVDsKIAogdHlwZWRlZiB0R0FUVF9JRiB0QlRBX0dBVFRDX0lGOwogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQxNiAgICAgICAgICAgICAgdW5pdDsgICAgICAgLyogYXMgVVVJVUQgZGVmaW5lZCBieSBTSUcgKi8KLSAgICBVSU5UMTYgICAgICAgICAgICAgIGRlc2NyOyAgICAgICAvKiBhcyBVVUlEIGFzIGRlZmluZWQgYnkgU0lHICovCisgICAgdWludDE2X3QgICAgICAgICAgICAgIHVuaXQ7ICAgICAgIC8qIGFzIFVVSVVEIGRlZmluZWQgYnkgU0lHICovCisgICAgdWludDE2X3QgICAgICAgICAgICAgIGRlc2NyOyAgICAgICAvKiBhcyBVVUlEIGFzIGRlZmluZWQgYnkgU0lHICovCiAgICAgdEdBVFRfRk9STUFUICAgICAgICBmb3JtYXQ7Ci0gICAgSU5UOCAgICAgICAgICAgICAgICBleHA7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBuYW1lX3NwYzsgICAvKiBUaGUgbmFtZSBzcGFjZSBvZiB0aGUgZGVzY3JpcHRpb24gKi8KKyAgICBpbnQ4X3QgICAgICAgICAgICAgICAgZXhwOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBuYW1lX3NwYzsgICAvKiBUaGUgbmFtZSBzcGFjZSBvZiB0aGUgZGVzY3JpcHRpb24gKi8KIH10QlRBX0dBVFRfQ0hBUl9QUkVTOwogCiAjZGVmaW5lIEJUQV9HQVRUX0NMVF9DT05GSUdfTk9ORSAgICAgICAgICAgICAgIEdBVFRfQ0xUX0NPTkZJR19OT05FICAgICAgICAgLyogMHgwMDAwICAgICovCiAjZGVmaW5lIEJUQV9HQVRUX0NMVF9DT05GSUdfTk9USUZJQ0FUSU9OICAgICAgIEdBVFRfQ0xUX0NPTkZJR19OT1RJRklDQVRJT04gLyogMHgwMDAxICovCiAjZGVmaW5lIEJUQV9HQVRUX0NMVF9DT05GSUdfSU5ESUNBVElPTiAgICAgICAgIEdBVFRfQ0xUX0NPTkZJR19JTkRJQ0FUSU9OICAgLyogMHgwMDAyICovCi10eXBlZGVmIFVJTlQxNiAgdEJUQV9HQVRUX0NMVF9DSEFSX0NPTkZJRzsKK3R5cGVkZWYgdWludDE2X3QgIHRCVEFfR0FUVF9DTFRfQ0hBUl9DT05GSUc7CiAKIC8qIGNoYXJhY3RlcmlzdGljIGRlc2NyaXB0b3I6IHNlcnZlciBjb25maWd1cmF0aW9uIHZhbHVlCiAqLwogI2RlZmluZSBCVEFfR0FUVF9TVlJfQ09ORklHX05PTkUgICAgICAgICAgICBHQVRUX1NWUl9DT05GSUdfTk9ORSAgICAgICAgICAgIC8qIDB4MDAwMCAqLwogI2RlZmluZSBCVEFfR0FUVF9TVlJfQ09ORklHX0JST0FEQ0FTVCAgICAgICBHQVRUX1NWUl9DT05GSUdfQlJPQURDQVNUICAgICAgIC8qICAweDAwMDEgKi8KLXR5cGVkZWYgVUlOVDE2ICB0QlRBX0dBVFRfU1ZSX0NIQVJfQ09ORklHOwordHlwZWRlZiB1aW50MTZfdCAgdEJUQV9HQVRUX1NWUl9DSEFSX0NPTkZJRzsKIAogLyogQ2hhcmFjdGVyaXN0aWMgQWdncmVnYXRlIEZvcm1hdCBhdHRyaWJ1dGUgdmFsdWUKICovCiAjZGVmaW5lIEJUQV9HQVRUX0FHR1JfSEFORExFX05VTV9NQVggICAgICAgIDEwCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIG51bV9oYW5kbGU7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgaGFuZGxlX2xpc3RbQlRBX0dBVFRfQUdHUl9IQU5ETEVfTlVNX01BWF07CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBudW1faGFuZGxlOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgaGFuZGxlX2xpc3RbQlRBX0dBVFRfQUdHUl9IQU5ETEVfTlVNX01BWF07CiB9IHRCVEFfR0FUVF9DSEFSX0FHR1JFOwogdHlwZWRlZiB0R0FUVF9WQUxJRF9SQU5HRSAgICAgICAgICAgdEJUQV9HQVRUX1ZBTElEX1JBTkdFOwogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQxNiAgbGVuOwotICAgIFVJTlQ4ICAgKnBfdmFsdWU7CisgICAgdWludDE2X3QgIGxlbjsKKyAgICB1aW50OF90ICAgKnBfdmFsdWU7CiB9dEJUQV9HQVRUX1VORk1UOwogCiAjZGVmaW5lIEJUQV9HQVRUX01BWF9BVFRSX0xFTiAgICAgICBHQVRUX01BWF9BVFRSX0xFTgogCiAjZGVmaW5lIEJUQV9HQVRUQ19UWVBFX1dSSVRFICAgICAgICAgICAgIEdBVFRfV1JJVEUKICNkZWZpbmUgQlRBX0dBVFRDX1RZUEVfV1JJVEVfTk9fUlNQICAgICAgR0FUVF9XUklURV9OT19SU1AKLXR5cGVkZWYgVUlOVDggdEJUQV9HQVRUQ19XUklURV9UWVBFOwordHlwZWRlZiB1aW50OF90IHRCVEFfR0FUVENfV1JJVEVfVFlQRTsKIAogI2RlZmluZSBCVEFfR0FUVF9DT05OX1VOS05PV04gICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBCVEFfR0FUVF9DT05OX0wyQ19GQUlMVVJFICAgICAgICAgICAgICAgR0FUVF9DT05OX0wyQ19GQUlMVVJFICAgICAgICAgLyogZ2VuZXJhbCBsMmNhcCByZXNvdXJjZSBmYWlsdXJlICovCkBAIC0xOTEsMTQgKzE5MSwxNCBAQAogI2RlZmluZSBCVEFfR0FUVF9DT05OX0xNUF9USU1FT1VUICAgICAgICAgICAgICAgR0FUVF9DT05OX0xNUF9USU1FT1VUICAgICAgICAgIC8qIDB4MjIgY29ubmVjdGlvbiBmYWlsIGZvciBMTVAgcmVzcG9uc2UgdG91dCAqLwogI2RlZmluZSBCVEFfR0FUVF9DT05OX0NBTkNFTCAgICAgICAgICAgICAgICAgICAgR0FUVF9DT05OX0NBTkNFTCAgICAgICAgICAgICAgIC8qIDB4MDEwMCBMMkNBUCBjb25uZWN0aW9uIGNhbmNlbGxlZCAgKi8KICNkZWZpbmUgQlRBX0dBVFRfQ09OTl9OT05FICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMTAxIG5vIGNvbm5lY3Rpb24gdG8gY2FuY2VsICAqLwotdHlwZWRlZiBVSU5UMTYgdEJUQV9HQVRUX1JFQVNPTjsKK3R5cGVkZWYgdWludDE2X3QgdEJUQV9HQVRUX1JFQVNPTjsKIAogI2RlZmluZSBCVEFfR0FUVENfTVVMVElfTUFYICAgIEdBVFRfTUFYX1JFQURfTVVMVElfSEFORExFUwogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICBudW1fYXR0cjsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlc1tCVEFfR0FUVENfTVVMVElfTUFYXTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICBudW1fYXR0cjsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVzW0JUQV9HQVRUQ19NVUxUSV9NQVhdOwogfXRCVEFfR0FUVENfTVVMVEk7CiAKICNkZWZpbmUgQlRBX0dBVFRfQVVUSF9SRVFfTk9ORSAgICAgICAgICAgR0FUVF9BVVRIX1JFUV9OT05FCkBAIC0yMTYsMTkgKzIxNiwxOSBAQAogICAgIEJUQV9HQVRUQ19BVFRSX1RZUEVfQ0hBUl9ERVNDUiwKICAgICBCVEFfR0FUVENfQVRUUl9UWVBFX1NSVkMKIH07Ci10eXBlZGVmIFVJTlQ4IHRCVEFfR0FUVENfQVRUUl9UWVBFOwordHlwZWRlZiB1aW50OF90IHRCVEFfR0FUVENfQVRUUl9UWVBFOwogCiAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgdEJUX1VVSUQgICAgdXVpZDsKLSAgICBVSU5UMTYgICAgICBzX2hhbmRsZTsKLSAgICBVSU5UMTYgICAgICBlX2hhbmRsZTsgICAvKiB1c2VkIGZvciBzZXJ2aWNlIG9ubHkgKi8KLSAgICBVSU5UOCAgICAgICBhdHRyX3R5cGU7Ci0gICAgVUlOVDggICAgICAgaWQ7Ci0gICAgVUlOVDggICAgICAgcHJvcDsgICAgICAgLyogdXNlZCB3aGVuIGF0dHJpYnV0ZSB0eXBlIGlzIGNoYXJhY3RlcmlzdGljICovCi0gICAgQk9PTEVBTiAgICAgaXNfcHJpbWFyeTsgLyogdXNlZCB3aGVuIGF0dHJpYnV0ZSB0eXBlIGlzIHNlcnZpY2UgKi8KLSAgICBVSU5UMTYgICAgICBpbmNsX3NydmNfaGFuZGxlOyAvKiB1c2VkIHdoZW4gYXR0cmlidXRlIHR5cGUgaXMgaW5jbHVkZWQgc2VydmljZSAqLworICAgIHVpbnQxNl90ICAgICAgc19oYW5kbGU7CisgICAgdWludDE2X3QgICAgICBlX2hhbmRsZTsgICAvKiB1c2VkIGZvciBzZXJ2aWNlIG9ubHkgKi8KKyAgICB1aW50OF90ICAgICAgIGF0dHJfdHlwZTsKKyAgICB1aW50OF90ICAgICAgIGlkOworICAgIHVpbnQ4X3QgICAgICAgcHJvcDsgICAgICAgLyogdXNlZCB3aGVuIGF0dHJpYnV0ZSB0eXBlIGlzIGNoYXJhY3RlcmlzdGljICovCisgICAgYm9vbCAgICAgaXNfcHJpbWFyeTsgLyogdXNlZCB3aGVuIGF0dHJpYnV0ZSB0eXBlIGlzIHNlcnZpY2UgKi8KKyAgICB1aW50MTZfdCAgICAgIGluY2xfc3J2Y19oYW5kbGU7IC8qIHVzZWQgd2hlbiBhdHRyaWJ1dGUgdHlwZSBpcyBpbmNsdWRlZCBzZXJ2aWNlICovCiB9dEJUQV9HQVRUQ19OVl9BVFRSOwogCiAvKiBjYWxsYmFjayBkYXRhIHN0cnVjdHVyZSAqLwpAQCAtMjQxLDU4ICsyNDEsNTggQEAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIGNvbm5faWQ7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIGNvbm5faWQ7CiAgICAgdEJUQV9HQVRUX1NUQVRVUyAgICBzdGF0dXM7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBoYW5kbGU7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIGhhbmRsZTsKICAgICB0QlRBX0dBVFRfVU5GTVQgICpwX3ZhbHVlOwogfXRCVEFfR0FUVENfUkVBRDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIGNvbm5faWQ7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIGNvbm5faWQ7CiAgICAgdEJUQV9HQVRUX1NUQVRVUyAgICBzdGF0dXM7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBoYW5kbGU7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIGhhbmRsZTsKIH10QlRBX0dBVFRDX1dSSVRFOwogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQxNiAgICAgICAgICAgICAgY29ubl9pZDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgY29ubl9pZDsKICAgICB0QlRBX0dBVFRfU1RBVFVTICAgIHN0YXR1czsKIH10QlRBX0dBVFRDX0VYRUNfQ01QTDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIGNvbm5faWQ7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIGNvbm5faWQ7CiAgICAgdEJUQV9HQVRUX1NUQVRVUyAgICBzdGF0dXM7CiB9dEJUQV9HQVRUQ19TRUFSQ0hfQ01QTDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIGNvbm5faWQ7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIGNvbm5faWQ7CiAgICAgdEJUQV9HQVRUX0lEICAgc2VydmljZV91dWlkOwogfXRCVEFfR0FUVENfU1JWQ19SRVM7CiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBjb25uX2lkOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBjb25uX2lkOwogICAgIHRCVEFfR0FUVF9TVEFUVVMgICAgc3RhdHVzOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgbXR1OworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBtdHU7CiB9dEJUQV9HQVRUQ19DRkdfTVRVOwogCiB0eXBlZGVmIHN0cnVjdAogewogICAgIHRCVEFfR0FUVF9TVEFUVVMgICAgc3RhdHVzOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgY29ubl9pZDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgY29ubl9pZDsKICAgICB0QlRBX0dBVFRDX0lGICAgICAgIGNsaWVudF9pZjsKICAgICBCRF9BRERSICAgICAgICAgICAgIHJlbW90ZV9iZGE7CiAgICAgdEJUQV9UUkFOU1BPUlQgICAgICB0cmFuc3BvcnQ7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBtdHU7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIG10dTsKIH10QlRBX0dBVFRDX09QRU47CiAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgdEJUQV9HQVRUX1NUQVRVUyAgICBzdGF0dXM7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBjb25uX2lkOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBjb25uX2lkOwogICAgIHRCVEFfR0FUVENfSUYgICAgICAgY2xpZW50X2lmOwogICAgIEJEX0FERFIgICAgICAgICAgICAgcmVtb3RlX2JkYTsKICAgICB0QlRBX0dBVFRfUkVBU09OICAgIHJlYXNvbjsgICAgICAgICAvKiBkaXNjb25uZWN0IHJlYXNvbiBjb2RlLCBub3QgdXNlZnVsIHdoZW4gY29ubmVjdCBldmVudCBpcyByZXBvcnRlZCAqLwpAQCAtMzAwLDI1ICszMDAsMjUgQEAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIGNvbm5faWQ7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIGNvbm5faWQ7CiAgICAgQkRfQUREUiAgICAgICAgICAgICBiZGE7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBoYW5kbGU7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBsZW47Ci0gICAgVUlOVDggICAgICAgICAgICAgICB2YWx1ZVtCVEFfR0FUVF9NQVhfQVRUUl9MRU5dOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgaXNfbm90aWZ5OworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBoYW5kbGU7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIGxlbjsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgdmFsdWVbQlRBX0dBVFRfTUFYX0FUVFJfTEVOXTsKKyAgICBib29sICAgICAgICAgICAgIGlzX25vdGlmeTsKIH10QlRBX0dBVFRDX05PVElGWTsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UMTYgY29ubl9pZDsKLSAgICBCT09MRUFOIGNvbmdlc3RlZDsgLyogY29uZ2VzdGlvbiBpbmRpY2F0b3IgKi8KKyAgICB1aW50MTZfdCBjb25uX2lkOworICAgIGJvb2wgY29uZ2VzdGVkOyAvKiBjb25nZXN0aW9uIGluZGljYXRvciAqLwogfXRCVEFfR0FUVENfQ09OR0VTVDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICB0QlRBX0dBVFRfU1RBVFVTICAgICAgICBzdGF0dXM7CiAgICAgdEJUQV9HQVRUQ19JRiAgICAgICAgICAgY2xpZW50X2lmOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIGNvbm5faWQ7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICBjb25uX2lkOwogICAgIEJEX0FERFIgICAgICAgICAgICAgICAgIHJlbW90ZV9iZGE7CiB9dEJUQV9HQVRUQ19PUEVOX0NMT1NFOwogCkBAIC0zNzgsNyArMzc4LDcgQEAKICNkZWZpbmUgQlRBX0dBVFRTX0xJU1RFTl9FVlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkKICNkZWZpbmUgQlRBX0dBVFRTX0NPTkdFU1RfRVZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAKIAotdHlwZWRlZiBVSU5UOCAgdEJUQV9HQVRUU19FVlQ7Cit0eXBlZGVmIHVpbnQ4X3QgIHRCVEFfR0FUVFNfRVZUOwogdHlwZWRlZiB0R0FUVF9JRiB0QlRBX0dBVFRTX0lGOwogCiAvKiBBdHRyaWJ1dGUgcGVybWlzc2lvbnMKQEAgLTM5MSw3ICszOTEsNyBAQAogI2RlZmluZSBCVEFfR0FUVF9QRVJNX1dSSVRFX0VOQ19NSVRNICAgIEdBVFRfUEVSTV9XUklURV9FTkNfTUlUTSAgICAvKiBiaXQgNiAtICAweDAwNDAgKi8KICNkZWZpbmUgQlRBX0dBVFRfUEVSTV9XUklURV9TSUdORUQgICAgICBHQVRUX1BFUk1fV1JJVEVfU0lHTkVEICAgICAgLyogYml0IDcgLSAgMHgwMDgwICovCiAjZGVmaW5lIEJUQV9HQVRUX1BFUk1fV1JJVEVfU0lHTkVEX01JVE0gR0FUVF9QRVJNX1dSSVRFX1NJR05FRF9NSVRNIC8qIGJpdCA4IC0gIDB4MDEwMCAqLwotdHlwZWRlZiBVSU5UMTYgdEJUQV9HQVRUX1BFUk07Cit0eXBlZGVmIHVpbnQxNl90IHRCVEFfR0FUVF9QRVJNOwogCiAjZGVmaW5lIEJUQV9HQVRUU19JTlZBTElEX0FQUCAgIDB4ZmYKIApAQCAtNDA2LDcgKzQwNiw3IEBACiAjZGVmaW5lIEJUQV9HQVRUX0NIQVJfUFJPUF9CSVRfSU5ESUNBVEUgICAgIEdBVFRfQ0hBUl9QUk9QX0JJVF9JTkRJQ0FURSAgICAvKiAweDIwICovCiAjZGVmaW5lIEJUQV9HQVRUX0NIQVJfUFJPUF9CSVRfQVVUSCAgICAgICAgIEdBVFRfQ0hBUl9QUk9QX0JJVF9BVVRIICAgICAgICAvKiAweDQwICovCiAjZGVmaW5lIEJUQV9HQVRUX0NIQVJfUFJPUF9CSVRfRVhUX1BST1AgICAgIEdBVFRfQ0hBUl9QUk9QX0JJVF9FWFRfUFJPUCAgICAvKiAweDgwICovCi10eXBlZGVmIFVJTlQ4IHRCVEFfR0FUVF9DSEFSX1BST1A7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9HQVRUX0NIQVJfUFJPUDsKIAogI2lmbmRlZiBCVEFfR0FUVENfQ0hBUl9ERVNDUl9NQVgKICNkZWZpbmUgQlRBX0dBVFRDX0NIQVJfREVTQ1JfTUFYICAgICAgICA3CkBAIC00MTgsMTAgKzQxOCwxMCBAQAogewogICAgIHRCVF9VVUlEIGFwcF91dWlkMTI4OwogICAgIHRCVF9VVUlEIHN2Y191dWlkOwotICAgIFVJTlQxNiAgIHN2Y19pbnN0OwotICAgIFVJTlQxNiAgIHNfaGFuZGxlOwotICAgIFVJTlQxNiAgIGVfaGFuZGxlOwotICAgIEJPT0xFQU4gIGlzX3ByaW1hcnk7ICAgICAgLyogcHJpbWFyeSBzZXJ2aWNlIG9yIHNlY29uZGFyeSAqLworICAgIHVpbnQxNl90ICAgc3ZjX2luc3Q7CisgICAgdWludDE2X3QgICBzX2hhbmRsZTsKKyAgICB1aW50MTZfdCAgIGVfaGFuZGxlOworICAgIGJvb2wgIGlzX3ByaW1hcnk7ICAgICAgLyogcHJpbWFyeSBzZXJ2aWNlIG9yIHNlY29uZGFyeSAqLwogfSB0QlRBX0dBVFRTX0hORExfUkFOR0U7CiAKICNkZWZpbmUgQlRBX0dBVFRTX1NSVl9DSEdfQ01EX0FERF9DTElFTlQgICAgICAgR0FUVFNfU1JWX0NIR19DTURfQUREX0NMSUVOVApAQCAtNDM4LDcgKzQzOCw3IEBACiAjZGVmaW5lIEJUQV9HQVRUX1RSQU5TUE9SVF9MRSAgICAgICBHQVRUX1RSQU5TUE9SVF9MRQogI2RlZmluZSBCVEFfR0FUVF9UUkFOU1BPUlRfQlJfRURSICAgR0FUVF9UUkFOU1BPUlRfQlJfRURSCiAjZGVmaW5lIEJUQV9HQVRUX1RSQU5TUE9SVF9MRV9CUl9FRFIgICAgR0FUVF9UUkFOU1BPUlRfTEVfQlJfRURSCi10eXBlZGVmIFVJTlQ4IHRCVEFfR0FUVF9UUkFOU1BPUlQ7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9HQVRUX1RSQU5TUE9SVDsKIAogLyogYXR0cmlidXRlIHZhbHVlICovCiB0eXBlZGVmIHRHQVRUX1ZBTFVFIHRCVEFfR0FUVF9WQUxVRTsKQEAgLTQ2NCw4ICs0NjQsOCBAQAogewogICAgIHRCVEFfR0FUVF9TVEFUVVMgICAgc3RhdHVzOwogICAgIEJEX0FERFIgICAgICAgICAgICAgcmVtb3RlX2JkYTsKLSAgICBVSU5UMzIgICAgICAgICAgICAgIHRyYW5zX2lkOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgY29ubl9pZDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgdHJhbnNfaWQ7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIGNvbm5faWQ7CiAgICAgdEJUQV9HQVRUU19SRVFfREFUQSAqcF9kYXRhOwogfXRCVEFfR0FUVFNfUkVROwogCkBAIC00ODAsOSArNDgwLDkgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgdEJUQV9HQVRUU19JRiAgICAgICBzZXJ2ZXJfaWY7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBzZXJ2aWNlX2lkOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgc3ZjX2luc3RhbmNlOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgaXNfcHJpbWFyeTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgc2VydmljZV9pZDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgc3ZjX2luc3RhbmNlOworICAgIGJvb2wgICAgICAgICAgICAgaXNfcHJpbWFyeTsKICAgICB0QlRBX0dBVFRfU1RBVFVTICAgIHN0YXR1czsKICAgICB0QlRfVVVJRCAgICAgICAgICAgIHV1aWQ7CiB9dEJUQV9HQVRUU19DUkVBVEU7CkBAIC00OTAsOCArNDkwLDggQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgdEJUQV9HQVRUU19JRiAgICAgICBzZXJ2ZXJfaWY7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBzZXJ2aWNlX2lkOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgYXR0cl9pZDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgc2VydmljZV9pZDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgYXR0cl9pZDsKICAgICB0QlRBX0dBVFRfU1RBVFVTICAgIHN0YXR1czsKICAgICB0QlRfVVVJRCAgICAgICAgICAgIGNoYXJfdXVpZDsKIH10QlRBX0dBVFRTX0FERF9SRVNVTFQ7CkBAIC00OTksNyArNDk5LDcgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgdEJUQV9HQVRUU19JRiAgICAgICBzZXJ2ZXJfaWY7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBzZXJ2aWNlX2lkOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBzZXJ2aWNlX2lkOwogICAgIHRCVEFfR0FUVF9TVEFUVVMgICAgc3RhdHVzOwogfXRCVEFfR0FUVFNfU1JWQ19PUEVSOwogCkBAIC01MDgsMjAgKzUwOCwyMCBAQAogewogICAgIHRCVEFfR0FUVFNfSUYgICAgICAgc2VydmVyX2lmOwogICAgIEJEX0FERFIgICAgICAgICAgICAgcmVtb3RlX2JkYTsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIGNvbm5faWQ7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIGNvbm5faWQ7CiAgICAgdEJUQV9HQVRUX1JFQVNPTiAgICByZWFzb247IC8qIHJlcG9ydCBkaXNjb25uZWN0IHJlYXNvbiAqLwogICAgIHRCVEFfR0FUVF9UUkFOU1BPUlQgdHJhbnNwb3J0OwogfXRCVEFfR0FUVFNfQ09OTjsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UMTYgY29ubl9pZDsKLSAgICBCT09MRUFOIGNvbmdlc3RlZDsgLyogcmVwb3J0IGNoYW5uZWwgY29uZ2VzdGlvbiBpbmRpY2F0b3IgKi8KKyAgICB1aW50MTZfdCBjb25uX2lkOworICAgIGJvb2wgY29uZ2VzdGVkOyAvKiByZXBvcnQgY2hhbm5lbCBjb25nZXN0aW9uIGluZGljYXRvciAqLwogfXRCVEFfR0FUVFNfQ09OR0VTVDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UMTYgY29ubl9pZDsgLyogY29ubmVjdGlvbiBJRCAqLworICAgIHVpbnQxNl90IGNvbm5faWQ7IC8qIGNvbm5lY3Rpb24gSUQgKi8KICAgICB0QlRBX0dBVFRfU1RBVFVTIHN0YXR1czsgLyogbm90aWZpY2F0aW9uL2luZGljYXRpb24gc3RhdHVzICovCiB9dEJUQV9HQVRUU19DT05GOwogCkBAIC01NTAsMTAgKzU1MCwxMCBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICB0QlRfVVVJRCAgICAgICAgICAgICAgICB1dWlkOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgIGlzX3ByaW1hcnk7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgaGFuZGxlOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIHNfaGFuZGxlOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIGVfaGFuZGxlOworICAgIGJvb2wgICAgICAgICAgICAgICAgIGlzX3ByaW1hcnk7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICBoYW5kbGU7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICBzX2hhbmRsZTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIGVfaGFuZGxlOwogICAgIGxpc3RfdCAgICAgICAgICAgICAgICAgKmNoYXJhY3RlcmlzdGljczsgLyogbGlzdCBvZiB0QlRBX0dBVFRDX0NIQVJBQ1RFUklTVElDICovCiAgICAgbGlzdF90ICAgICAgICAgICAgICAgICAqaW5jbHVkZWRfc3ZjOyAvKiBsaXN0IG9mIHRCVEFfR0FUVENfSU5DTFVERURfU1ZDICovCiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHRCVEFfR0FUVENfU0VSVklDRTsKQEAgLTU2MSw3ICs1NjEsNyBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICB0QlRfVVVJRCAgICAgICAgICAgICAgICB1dWlkOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIGhhbmRsZTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIGhhbmRsZTsKICAgICB0QlRBX0dBVFRfQ0hBUl9QUk9QICAgICBwcm9wZXJ0aWVzOwogICAgIHRCVEFfR0FUVENfU0VSVklDRSAgICAgKnNlcnZpY2U7IC8qIG93bmluZyBzZXJ2aWNlKi8KICAgICBsaXN0X3QgICAgICAgICAgICAgICAgICpkZXNjcmlwdG9yczsgLyogbGlzdCBvZiB0QlRBX0dBVFRDX0RFU0NSSVBUT1IgKi8KQEAgLTU3MCwxNCArNTcwLDE0IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIHRCVF9VVUlEICAgICAgICAgICAgICAgICAgICB1dWlkOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGU7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlOwogICAgIHRCVEFfR0FUVENfQ0hBUkFDVEVSSVNUSUMgICpjaGFyYWN0ZXJpc3RpYzsgLyogb3duaW5nIGNoYXJhY3RlcmlzdGljICovCiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHRCVEFfR0FUVENfREVTQ1JJUFRPUjsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICB0QlRfVVVJRCAgICAgICAgICAgICAgICB1dWlkOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIGhhbmRsZTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIGhhbmRsZTsKICAgICB0QlRBX0dBVFRDX1NFUlZJQ0UgICAgICpvd25pbmdfc2VydmljZTsgLyogb3duaW5nIHNlcnZpY2UqLwogICAgIHRCVEFfR0FUVENfU0VSVklDRSAgICAgKmluY2x1ZGVkX3NlcnZpY2U7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHRCVEFfR0FUVENfSU5DTFVERURfU1ZDOwpAQCAtNjQ3LDcgKzY0Nyw3IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGV4dGVybiB2b2lkIEJUQV9HQVRUQ19PcGVuKHRCVEFfR0FUVENfSUYgY2xpZW50X2lmLCBCRF9BRERSIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MRUFOIGlzX2RpcmVjdCwgdEJUQV9HQVRUX1RSQU5TUE9SVCB0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kaXJlY3QsIHRCVEFfR0FUVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC02NjMsNyArNjYzLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfR0FUVENfQ2FuY2VsT3Blbih0QlRBX0dBVFRDX0lGIGNsaWVudF9pZiwgQkRfQUREUiByZW1vdGVfYmRhLCBCT09MRUFOIGlzX2RpcmVjdCk7CitleHRlcm4gdm9pZCBCVEFfR0FUVENfQ2FuY2VsT3Blbih0QlRBX0dBVFRDX0lGIGNsaWVudF9pZiwgQkRfQUREUiByZW1vdGVfYmRhLCBib29sIGlzX2RpcmVjdCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtNjc2LDcgKzY3Niw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0dBVFRDX0Nsb3NlKFVJTlQxNiBjb25uX2lkKTsKK2V4dGVybiB2b2lkIEJUQV9HQVRUQ19DbG9zZSh1aW50MTZfdCBjb25uX2lkKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC02OTQsNyArNjk0LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgTm9uZQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfR0FUVENfU2VydmljZVNlYXJjaFJlcXVlc3QoVUlOVDE2IGNvbm5faWQsIHRCVF9VVUlEICpwX3NydmNfdXVpZCk7CitleHRlcm4gdm9pZCBCVEFfR0FUVENfU2VydmljZVNlYXJjaFJlcXVlc3QodWludDE2X3QgY29ubl9pZCwgdEJUX1VVSUQgKnBfc3J2Y191dWlkKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC03MDcsNyArNzA3LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgcmV0dXJucyBsaXN0X3Qgb2YgdEJUQV9HQVRUQ19TRVJWSUNFIG9yIE5VTEwuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBjb25zdCBsaXN0X3QqIEJUQV9HQVRUQ19HZXRTZXJ2aWNlcyhVSU5UMTYgY29ubl9pZCk7CitleHRlcm4gY29uc3QgbGlzdF90KiBCVEFfR0FUVENfR2V0U2VydmljZXModWludDE2X3QgY29ubl9pZCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtNzIxLDcgKzcyMSw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHJldHVybnMgcG9pbnRlciB0byB0QlRBX0dBVFRDX0NIQVJBQ1RFUklTVElDIG9yIE5VTEwuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBjb25zdCB0QlRBX0dBVFRDX0NIQVJBQ1RFUklTVElDKiBCVEFfR0FUVENfR2V0Q2hhcmFjdGVyaXN0aWMoVUlOVDE2IGNvbm5faWQsIFVJTlQxNiBoYW5kbGUpOworZXh0ZXJuIGNvbnN0IHRCVEFfR0FUVENfQ0hBUkFDVEVSSVNUSUMqIEJUQV9HQVRUQ19HZXRDaGFyYWN0ZXJpc3RpYyh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTczNSw3ICs3MzUsNyBAQAogKiogUmV0dXJucyAgICAgICAgICByZXR1cm5zIHBvaW50ZXIgdG8gdEJUQV9HQVRUQ19ERVNDUklQVE9SIG9yIE5VTEwuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBjb25zdCB0QlRBX0dBVFRDX0RFU0NSSVBUT1IqIEJUQV9HQVRUQ19HZXREZXNjcmlwdG9yKFVJTlQxNiBjb25uX2lkLCBVSU5UMTYgaGFuZGxlKTsKK2V4dGVybiBjb25zdCB0QlRBX0dBVFRDX0RFU0NSSVBUT1IqIEJUQV9HQVRUQ19HZXREZXNjcmlwdG9yKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtNzQ5LDcgKzc0OSw3IEBACiAqKiAgICAgICAgICAgICAgICAgIGNvdW50OiBudW1iZXIgb2YgZWxlbWVudHMgaW4gZGIuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9HQVRUQ19HZXRHYXR0RGIoVUlOVDE2IGNvbm5faWQsIFVJTlQxNiBzdGFydF9oYW5kbGUsIFVJTlQxNiBlbmRfaGFuZGxlLAorZXh0ZXJuIHZvaWQgQlRBX0dBVFRDX0dldEdhdHREYih1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBzdGFydF9oYW5kbGUsIHVpbnQxNl90IGVuZF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0Z2F0dF9kYl9lbGVtZW50X3QgKipkYiwgaW50ICpjb3VudCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC03NjQsNyArNzY0LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgTm9uZQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9HQVRUQ19SZWFkQ2hhcmFjdGVyaXN0aWMoVUlOVDE2IGNvbm5faWQsIFVJTlQxNiBoYW5kbGUsIHRCVEFfR0FUVF9BVVRIX1JFUSBhdXRoX3JlcSk7Cit2b2lkIEJUQV9HQVRUQ19SZWFkQ2hhcmFjdGVyaXN0aWModWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLCB0QlRBX0dBVFRfQVVUSF9SRVEgYXV0aF9yZXEpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTc3OCw3ICs3NzgsNyBAQAogKiogUmV0dXJucyAgICAgICAgICBOb25lCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRDX1JlYWRDaGFyRGVzY3IgKFVJTlQxNiBjb25uX2lkLCBVSU5UMTYgaGFuZGxlLCB0QlRBX0dBVFRfQVVUSF9SRVEgYXV0aF9yZXEpOwordm9pZCBCVEFfR0FUVENfUmVhZENoYXJEZXNjciAodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLCB0QlRBX0dBVFRfQVVUSF9SRVEgYXV0aF9yZXEpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTc5NCw4ICs3OTQsOCBAQAogKiogUmV0dXJucyAgICAgICAgICBOb25lCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRDX1dyaXRlQ2hhclZhbHVlICggVUlOVDE2IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBoYW5kbGUsCit2b2lkIEJUQV9HQVRUQ19Xcml0ZUNoYXJWYWx1ZSAoIHVpbnQxNl90IGNvbm5faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9HQVRUQ19XUklURV9UWVBFICB3cml0ZV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8dWludDhfdD4gdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVF9BVVRIX1JFUSBhdXRoX3JlcSk7CkBAIC04MTQsOCArODE0LDggQEAKICoqIFJldHVybnMgICAgICAgICAgTm9uZQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9HQVRUQ19Xcml0ZUNoYXJEZXNjciAoVUlOVDE2IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IGhhbmRsZSwKK3ZvaWQgQlRBX0dBVFRDX1dyaXRlQ2hhckRlc2NyICh1aW50MTZfdCBjb25uX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRDX1dSSVRFX1RZUEUgIHdyaXRlX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHVpbnQ4X3Q+IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVF9BVVRIX1JFUSBhdXRoX3JlcSk7CkBAIC04MzIsNyArODMyLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgTm9uZQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfR0FUVENfU2VuZEluZENvbmZpcm0gKFVJTlQxNiBjb25uX2lkLCBVSU5UMTYgaGFuZGxlKTsKK2V4dGVybiB2b2lkIEJUQV9HQVRUQ19TZW5kSW5kQ29uZmlybSAodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC04NDksNyArODQ5LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBleHRlcm4gdEJUQV9HQVRUX1NUQVRVUyBCVEFfR0FUVENfUmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zICh0QlRBX0dBVFRDX0lGICAgICAgY2xpZW50X2lmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQkRfQUREUiAgICAgIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgICAgICAgICAgICAgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgICAgIGhhbmRsZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtODY2LDcgKzg2Niw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogZXh0ZXJuIHRCVEFfR0FUVF9TVEFUVVMgQlRBX0dBVFRDX0RlcmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zICh0QlRBX0dBVFRDX0lGICAgICAgY2xpZW50X2lmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCRF9BRERSICAgICAgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2ICAgICAgICAgICAgIGhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgICAgIGhhbmRsZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtODgyLDkgKzg4Miw5IEBACiAqKiBSZXR1cm5zICAgICAgICAgIE5vbmUKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0dBVFRDX1ByZXBhcmVXcml0ZSAgKFVJTlQxNiBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IG9mZnNldCwKK2V4dGVybiB2b2lkIEJUQV9HQVRUQ19QcmVwYXJlV3JpdGUgICh1aW50MTZfdCBjb25uX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHVpbnQ4X3Q+IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVF9BVVRIX1JFUSBhdXRoX3JlcSk7CiAKQEAgLTkwMCw3ICs5MDAsNyBAQAogKiogUmV0dXJucyAgICAgICAgICBOb25lCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9HQVRUQ19FeGVjdXRlV3JpdGUgIChVSU5UMTYgY29ubl9pZCwgQk9PTEVBTiBpc19leGVjdXRlKTsKK2V4dGVybiB2b2lkIEJUQV9HQVRUQ19FeGVjdXRlV3JpdGUgICh1aW50MTZfdCBjb25uX2lkLCBib29sIGlzX2V4ZWN1dGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTkxNSw3ICs5MTUsNyBAQAogKiogUmV0dXJucyAgICAgICAgICBOb25lCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9HQVRUQ19SZWFkTXVsdGlwbGUoVUlOVDE2IGNvbm5faWQsIHRCVEFfR0FUVENfTVVMVEkgKnBfcmVhZF9tdWx0aSwKK2V4dGVybiB2b2lkIEJUQV9HQVRUQ19SZWFkTXVsdGlwbGUodWludDE2X3QgY29ubl9pZCwgdEJUQV9HQVRUQ19NVUxUSSAqcF9yZWFkX211bHRpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRfQVVUSF9SRVEgYXV0aF9yZXEpOwogCiAKQEAgLTk0Nyw3ICs5NDcsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9HQVRUQ19MaXN0ZW4odEJUQV9HQVRUQ19JRiBjbGllbnRfaWYsIEJPT0xFQU4gc3RhcnQsIEJEX0FERFJfUFRSIHRhcmdldF9iZGEpOworZXh0ZXJuIHZvaWQgQlRBX0dBVFRDX0xpc3Rlbih0QlRBX0dBVFRDX0lGIGNsaWVudF9pZiwgYm9vbCBzdGFydCwgQkRfQUREUl9QVFIgdGFyZ2V0X2JkYSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtOTYxLDcgKzk2MSw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0dBVFRDX0Jyb2FkY2FzdCh0QlRBX0dBVFRDX0lGIGNsaWVudF9pZiwgQk9PTEVBTiBzdGFydCk7CitleHRlcm4gdm9pZCBCVEFfR0FUVENfQnJvYWRjYXN0KHRCVEFfR0FUVENfSUYgY2xpZW50X2lmLCBib29sIHN0YXJ0KTsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTc3LDcgKzk3Nyw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0dBVFRDX0NvbmZpZ3VyZU1UVSAoVUlOVDE2IGNvbm5faWQsIFVJTlQxNiBtdHUpOworZXh0ZXJuIHZvaWQgQlRBX0dBVFRDX0NvbmZpZ3VyZU1UVSAodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgbXR1KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqICBCVEEgR0FUVCBTZXJ2ZXIgQVBJCkBAIC0xMDU4LDcgKzEwNTgsNyBAQAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBleHRlcm4gdm9pZCBCVEFfR0FUVFNfQ3JlYXRlU2VydmljZSh0QlRBX0dBVFRTX0lGIHNlcnZlcl9pZiwgdEJUX1VVSUQgKnBfc2VydmljZV91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggaW5zdCwgVUlOVDE2IG51bV9oYW5kbGUsIEJPT0xFQU4gaXNfcHJpbWFyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGluc3QsIHVpbnQxNl90IG51bV9oYW5kbGUsIGJvb2wgaXNfcHJpbWFyeSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMTA3NSw3ICsxMDc1LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfR0FUVFNfQWRkSW5jbHVkZVNlcnZpY2UoVUlOVDE2IHNlcnZpY2VfaWQsIFVJTlQxNiBpbmNsdWRlZF9zZXJ2aWNlX2lkKTsKK2V4dGVybiB2b2lkIEJUQV9HQVRUU19BZGRJbmNsdWRlU2VydmljZSh1aW50MTZfdCBzZXJ2aWNlX2lkLCB1aW50MTZfdCBpbmNsdWRlZF9zZXJ2aWNlX2lkKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0xMDkyLDcgKzEwOTIsNyBAQAogKiogUmV0dXJucyAgICAgICAgICBOb25lCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9HQVRUU19BZGRDaGFyYWN0ZXJpc3RpYyAoVUlOVDE2IHNlcnZpY2VfaWQsICB0QlRfVVVJRCAgICpwX2NoYXJfdXVpZCwKK2V4dGVybiB2b2lkIEJUQV9HQVRUU19BZGRDaGFyYWN0ZXJpc3RpYyAodWludDE2X3Qgc2VydmljZV9pZCwgIHRCVF9VVUlEICAgKnBfY2hhcl91dWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRfUEVSTSBwZXJtLCB0QlRBX0dBVFRfQ0hBUl9QUk9QIHByb3BlcnR5KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTExMTIsNyArMTExMiw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHJldHVybnMgc3RhdHVzLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfR0FUVFNfQWRkQ2hhckRlc2NyaXB0b3IgKFVJTlQxNiBzZXJ2aWNlX2lkLAorZXh0ZXJuIHZvaWQgQlRBX0dBVFRTX0FkZENoYXJEZXNjcmlwdG9yICh1aW50MTZfdCBzZXJ2aWNlX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRfUEVSTSBwZXJtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVVVJRCAgKiBwX2Rlc2NyX3V1aWQpOwogCkBAIC0xMTI4LDcgKzExMjgsNyBAQAogKiogUmV0dXJucyAgICAgICAgICByZXR1cm5zIG5vbmUuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkICBCVEFfR0FUVFNfRGVsZXRlU2VydmljZShVSU5UMTYgc2VydmljZV9pZCk7CitleHRlcm4gdm9pZCAgQlRBX0dBVFRTX0RlbGV0ZVNlcnZpY2UodWludDE2X3Qgc2VydmljZV9pZCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMTE0Miw3ICsxMTQyLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgTm9uZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgIEJUQV9HQVRUU19TdGFydFNlcnZpY2UoVUlOVDE2IHNlcnZpY2VfaWQsIHRCVEFfR0FUVF9UUkFOU1BPUlQgc3VwX3RyYW5zcG9ydCk7CitleHRlcm4gdm9pZCAgQlRBX0dBVFRTX1N0YXJ0U2VydmljZSh1aW50MTZfdCBzZXJ2aWNlX2lkLCB0QlRBX0dBVFRfVFJBTlNQT1JUIHN1cF90cmFuc3BvcnQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTExNTUsNyArMTE1NSw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIE5vbmUKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0dBVFRTX1N0b3BTZXJ2aWNlKFVJTlQxNiBzZXJ2aWNlX2lkKTsKK2V4dGVybiB2b2lkIEJUQV9HQVRUU19TdG9wU2VydmljZSh1aW50MTZfdCBzZXJ2aWNlX2lkKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0xMTcxLDkgKzExNzEsOSBAQAogKiogUmV0dXJucyAgICAgICAgICBOb25lCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9HQVRUU19IYW5kbGVWYWx1ZUluZGljYXRpb24gKFVJTlQxNiBjb25uX2lkLCBVSU5UMTYgYXR0cl9pZCwKK2V4dGVybiB2b2lkIEJUQV9HQVRUU19IYW5kbGVWYWx1ZUluZGljYXRpb24gKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGF0dHJfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8dWludDhfdD4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MRUFOIG5lZWRfY29uZmlybSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRfY29uZmlybSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMTE4OSw3ICsxMTg5LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgTm9uZQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfR0FUVFNfU2VuZFJzcCAoVUlOVDE2IGNvbm5faWQsIFVJTlQzMiB0cmFuc19pZCwKK2V4dGVybiB2b2lkIEJUQV9HQVRUU19TZW5kUnNwICh1aW50MTZfdCBjb25uX2lkLCB1aW50MzJfdCB0cmFuc19pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRfU1RBVFVTIHN0YXR1cywgdEJUQV9HQVRUU19SU1AgKnBfbXNnKTsKIAogCkBAIC0xMjA4LDcgKzEyMDgsNyBAQAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBleHRlcm4gdm9pZCBCVEFfR0FUVFNfT3Blbih0QlRBX0dBVFRTX0lGIHNlcnZlcl9pZiwgQkRfQUREUiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTEVBTiBpc19kaXJlY3QsIHRCVEFfR0FUVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZGlyZWN0LCB0QlRBX0dBVFRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEyMjUsNyArMTIyNSw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0dBVFRTX0NhbmNlbE9wZW4odEJUQV9HQVRUU19JRiBzZXJ2ZXJfaWYsIEJEX0FERFIgcmVtb3RlX2JkYSwgQk9PTEVBTiBpc19kaXJlY3QpOworZXh0ZXJuIHZvaWQgQlRBX0dBVFRTX0NhbmNlbE9wZW4odEJUQV9HQVRUU19JRiBzZXJ2ZXJfaWYsIEJEX0FERFIgcmVtb3RlX2JkYSwgYm9vbCBpc19kaXJlY3QpOwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMjM5LDcgKzEyMzksNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9HQVRUU19DbG9zZShVSU5UMTYgY29ubl9pZCk7CitleHRlcm4gdm9pZCBCVEFfR0FUVFNfQ2xvc2UodWludDE2X3QgY29ubl9pZCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMTI1Niw3ICsxMjU2LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfR0FUVFNfTGlzdGVuKHRCVEFfR0FUVFNfSUYgc2VydmVyX2lmLCBCT09MRUFOIHN0YXJ0LAorZXh0ZXJuIHZvaWQgQlRBX0dBVFRTX0xpc3Rlbih0QlRBX0dBVFRTX0lGIHNlcnZlcl9pZiwgYm9vbCBzdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRfQUREUl9QVFIgdGFyZ2V0X2JkYSk7CiAKICNlbmRpZiAvKiBCVEFfR0FUVF9BUElfSCAqLwpkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX2dhdHRzX2NvLmggYi9idGEvaW5jbHVkZS9idGFfZ2F0dHNfY28uaAppbmRleCBjMmEwNDhmLi5jMjFhYTcwIDEwMDY0NAotLS0gYS9idGEvaW5jbHVkZS9idGFfZ2F0dHNfY28uaAorKysgYi9idGEvaW5jbHVkZS9idGFfZ2F0dHNfY28uaApAQCAtNDMsNyArNDMsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfZ2F0dHNfY29fdXBkYXRlX2hhbmRsZV9yYW5nZShCT09MRUFOIGlzX2FkZCwgdEJUQV9HQVRUU19ITkRMX1JBTkdFICpwX2huZGxfcmFuZ2UpOworZXh0ZXJuIHZvaWQgYnRhX2dhdHRzX2NvX3VwZGF0ZV9oYW5kbGVfcmFuZ2UoYm9vbCBpc19hZGQsIHRCVEFfR0FUVFNfSE5ETF9SQU5HRSAqcF9obmRsX3JhbmdlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC01NywxMiArNTcsMTIgQEAKICoqICAgICAgICAgICAgICAgICAgcF9yZXEgLSByZXF1ZXN0IHBhcmFtdGVycwogKiogICAgICAgICAgICAgICAgICBwX3JzcCAtIHJlc3BvbnNlIGRhdGEgZm9yIHRoZSByZXF1ZXN0CiAqKgotKiogUmV0dXJucyAgICAgICAgICBUUlVFIC0gaWYgdGhlIHJlcXVlc3QgaXMgcHJvY2Vzc2VkIHN1Y2Nlc3NmdWxseSBhbmQKKyoqIFJldHVybnMgICAgICAgICAgdHJ1ZSAtIGlmIHRoZSByZXF1ZXN0IGlzIHByb2Nlc3NlZCBzdWNjZXNzZnVsbHkgYW5kCiAqKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzcG9uc2UgaXMgcmV0dXJuZWQgaW4gcF9yc3AuCiAqKiAgICAgICAgICAgICAgICAgIEZBU0xFIC0gaWYgdGhlIHJlcXVlc3QgY2FuIG5vdCBiZSBwcm9jZXNzZWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIEJPT0xFQU4gYnRhX2dhdHRzX2NvX3Nydl9jaGcodEJUQV9HQVRUU19TUlZfQ0hHX0NNRCBjbWQsCitleHRlcm4gYm9vbCBidGFfZ2F0dHNfY29fc3J2X2NoZyh0QlRBX0dBVFRTX1NSVl9DSEdfQ01EIGNtZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVFNfU1JWX0NIR19SRVEgKnBfcmVxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9HQVRUU19TUlZfQ0hHX1JTUCAqcF9yc3ApOwogCkBAIC03OCw3ICs3OCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiAgQk9PTEVBTiBidGFfZ2F0dHNfY29fbG9hZF9oYW5kbGVfcmFuZ2UoVUlOVDggaW5kZXgsCitleHRlcm4gIGJvb2wgYnRhX2dhdHRzX2NvX2xvYWRfaGFuZGxlX3JhbmdlKHVpbnQ4X3QgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVFNfSE5ETF9SQU5HRSAqcF9oYW5kbGUpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL2J0YS9pbmNsdWRlL2J0YV9oZl9jbGllbnRfYXBpLmggYi9idGEvaW5jbHVkZS9idGFfaGZfY2xpZW50X2FwaS5oCmluZGV4IDYwNTU1MGEuLjNhZDZjY2QgMTAwNjQ0Ci0tLSBhL2J0YS9pbmNsdWRlL2J0YV9oZl9jbGllbnRfYXBpLmgKKysrIGIvYnRhL2luY2x1ZGUvYnRhX2hmX2NsaWVudF9hcGkuaApAQCAtNDcsNyArNDcsNyBAQAogI2RlZmluZSBCVEFfSEZfQ0xJRU5UX1BFRVJfRVhURVJSICAgICAgMHgwMDAwMDEwMCAgLyogRXh0ZW5kZWQgZXJyb3IgY29kZXMgKi8KICNkZWZpbmUgQlRBX0hGX0NMSUVOVF9QRUVSX0NPREVDICAgICAgIDB4MDAwMDAyMDAgIC8qIENvZGVjIE5lZ290aWF0aW9uICovCiAKLXR5cGVkZWYgVUlOVDE2IHRCVEFfSEZfQ0xJRU5UX1BFRVJfRkVBVDsKK3R5cGVkZWYgdWludDE2X3QgdEJUQV9IRl9DTElFTlRfUEVFUl9GRUFUOwogCiAvKiBIRlAgSEYgZmVhdHVyZXMgKi8KICNkZWZpbmUgQlRBX0hGX0NMSUVOVF9GRUFUX0VDTlIgICAgICAgIDB4MDAwMDAwMDEgIC8qIEVjaG8gY2FuY2VsbGF0aW9uIGFuZC9vciBub2lzZSByZWR1Y3Rpb24gKi8KQEAgLTY4LDcgKzY4LDcgQEAKICNkZWZpbmUgQlRBX0hGX0NMSUVOVF9DSExEX01FUkdFICAgICAgICAweDAwMDAwMDIwICAvKiAzICBBZGQgaGVsZCBjYWxsIHRvIG11bHRpcGFydHkgKi8KICNkZWZpbmUgQlRBX0hGX0NMSUVOVF9DSExEX01FUkdFX0RFVEFDSCAweDAwMDAwMDQwICAvKiA0ICBBZGQgaGVsZCBjYWxsIHRvIG11bHRpcGFydHkgKi8KIAotdHlwZWRlZiBVSU5UMTYgdEJUQV9IRl9DTElFTlRfQ0hMRF9GRUFUOwordHlwZWRlZiB1aW50MTZfdCB0QlRBX0hGX0NMSUVOVF9DSExEX0ZFQVQ7CiAKIC8qIEhGUCBBRyBlcnJvcnMgb3QgT0sgc2VudCB0byBIRiBVbml0ICovCiAjZGVmaW5lIEJUQV9IRl9DTElFTlRfQVRfUkVTVUxUX09LICAgICAgICAgICAgMApAQCAtODAsNyArODAsNyBAQAogI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0FUX1JFU1VMVF9CTEFDS0xJU1RFRCAgIDYKICNkZWZpbmUgQlRBX0hGX0NMSUVOVF9BVF9SRVNVTFRfQ01FICAgICAgICAgICA3CiAKLXR5cGVkZWYgVUlOVDggdEJUQV9IRl9DTElFTlRfQVRfUkVTVUxUX1RZUEU7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9IRl9DTElFTlRfQVRfUkVTVUxUX1RZUEU7CiAKIC8qIEhGIENsaWVudCBjYWxsYmFjayBldmVudHMgKi8KICNkZWZpbmUgQlRBX0hGX0NMSUVOVF9FTkFCTEVfRVZUICAgICAgICAgICAgMCAgLyogSEYgQ2xpZW50IGVuYWJsZWQgKi8KQEAgLTEwNyw3ICsxMDcsNyBAQAogI2RlZmluZSBCVEFfSEZfQ0xJRU5UX1JJTkdfSU5ESUNBVElPTiAgICAgICAyMSAvKiBIRiBDbGllbnQgcmluZyBpbmRpY2F0aW9uICovCiAjZGVmaW5lIEJUQV9IRl9DTElFTlRfRElTQUJMRV9FVlQgICAgICAgICAgIDMwIC8qIEhGIENsaWVudCBkaXNhYmxlZCAqLwogCi10eXBlZGVmIFVJTlQ4IHRCVEFfSEZfQ0xJRU5UX0VWVDsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0hGX0NMSUVOVF9FVlQ7CiAKIC8qIEhGIENsaWVudCBvcGVuIHN0YXR1cyAqLwogI2RlZmluZSBCVEFfSEZfQ0xJRU5UX1NVQ0NFU1MgICAgICAgICAgMCAvKiBDb25uZWN0aW9uIHN1Y2Nlc3NmdWxseSBvcGVuZWQgKi8KQEAgLTExNSw3ICsxMTUsNyBAQAogI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0ZBSUxfUkZDT01NICAgICAgMiAvKiBPcGVuIGZhaWxlZCBkdWUgdG8gUkZDT01NICovCiAjZGVmaW5lIEJUQV9IRl9DTElFTlRfRkFJTF9SRVNPVVJDRVMgICAzIC8qIG91dCBvZiByZXNvdXJjZXMgZmFpbHVyZSAgKi8KIAotdHlwZWRlZiBVSU5UOCB0QlRBX0hGX0NMSUVOVF9TVEFUVVM7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9IRl9DTElFTlRfU1RBVFVTOwogCiAvKiBpbmRpY2F0b3IgdHlwZSAqLwogI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0lORF9CQVRUQ0ggICAgMCAgLyogQmF0dGVyeSBjaGFyZ2UgaW5kaWNhdG9yICovCkBAIC0xMjYsNyArMTI2LDcgQEAKICNkZWZpbmUgQlRBX0hGX0NMSUVOVF9JTkRfQ0FMTFNFVFVQIDUgIC8qIENhbGwgc2V0dXAgc3RhdHVzIGluZGljYXRvciAqLwogI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0lORF9DQUxMSEVMRCAgNiAgLyogQ2FsbCBob2xkIHN0YXR1cyBpbmRpY2F0b3IgKi8KIAotdHlwZWRlZiBVSU5UOCB0QlRBX0hGX0NMSUVOVF9JTkRfVFlQRTsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0hGX0NMSUVOVF9JTkRfVFlQRTsKIAogLyogQVQgY29tbWFuZHMgKi8KICNkZWZpbmUgQlRBX0hGX0NMSUVOVF9BVF9DTURfVlRTICAgIDAKQEAgLTE0NiwxMyArMTQ2LDEzIEBACiAjZGVmaW5lIEJUQV9IRl9DTElFTlRfQVRfQ01EX0JMRE4gICAxNAogI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9OUkVDICAgMTUKIAotdHlwZWRlZiBVSU5UOCB0QlRBX0hGX0NMSUVOVF9BVF9DTURfVFlQRTsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0hGX0NMSUVOVF9BVF9DTURfVFlQRTsKIAogCiAvKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfSEZfQ0xJRU5UX1JFR0lTVEVSX0VWVCAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBoYW5kbGU7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICBoYW5kbGU7CiAgICAgdEJUQV9IRl9DTElFTlRfU1RBVFVTICAgc3RhdHVzOwogfSB0QlRBX0hGX0NMSUVOVF9SRUdJU1RFUjsKIApAQCAtMTc0LDcgKzE3NCw3IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIHRCVEFfSEZfQ0xJRU5UX0lORF9UWVBFICAgIHR5cGU7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgdmFsdWU7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICB2YWx1ZTsKIH0gdEJUQV9IRl9DTElFTlRfSU5EOwogCiAvKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfSEZfQ0xJRU5UX09QRVJBVE9SX05BTUVfRVZUICovCkBAIC0xOTUsMzEgKzE5NSwzMSBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICB0QlRBX0hGX0NMSUVOVF9BVF9SRVNVTFRfVFlQRSAgICB0eXBlOwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZTsKIH0gdEJUQV9IRl9DTElFTlRfQVRfUkVTVUxUOwogCiAvKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfSEZfQ0xJRU5UX0NMQ0NfRVZUIGV2ZW50ICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgIGlkeDsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICBpbmM7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgIG1wdHk7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgbnVtYmVyX3ByZXNlbnQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICBpZHg7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgaW5jOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1wdHk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbnVtYmVyX3ByZXNlbnQ7CiAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyW0JUQV9IRl9DTElFTlRfTlVNQkVSX0xFTiArIDFdOwogfSB0QlRBX0hGX0NMSUVOVF9DTENDOwogCiAvKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfSEZfQ0xJRU5UX0NOVU1fRVZUIGV2ZW50ICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2U7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlOwogICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcltCVEFfSEZfQ0xJRU5UX05VTUJFUl9MRU4gKyAxXTsKIH0gdEJUQV9IRl9DTElFTlRfQ05VTTsKIAogLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggb3RoZXIgZXZlbnRzICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgIHZhbHVlOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgdmFsdWU7CiB9IHRCVEFfSEZfQ0xJRU5UX1ZBTDsKIAogLyogdW5pb24gb2YgZGF0YSBhc3NvY2lhdGVkIHdpdGggQUcgY2FsbGJhY2sgKi8KQEAgLTIzNyw3ICsyMzcsNyBAQAogICAgIHRCVEFfSEZfQ0xJRU5UX0NOVU0gICAgICAgICAgICAgY251bTsKIH0gdEJUQV9IRl9DTElFTlQ7CiAKLXR5cGVkZWYgVUlOVDMyIHRCVEFfSEZfQ0xJRU5UX0ZFQVQ7Cit0eXBlZGVmIHVpbnQzMl90IHRCVEFfSEZfQ0xJRU5UX0ZFQVQ7CiAKIC8qIEhGIENsaWVudCBjYWxsYmFjayAqLwogdHlwZWRlZiB2b2lkICh0QlRBX0hGX0NMSUVOVF9DQkFDSykodEJUQV9IRl9DTElFTlRfRVZUIGV2ZW50LCB0QlRBX0hGX0NMSUVOVCAqcF9kYXRhKTsKQEAgLTI5Niw3ICsyOTYsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0hmQ2xpZW50RGVyZWdpc3RlcihVSU5UMTYgaGFuZGxlKTsKK3ZvaWQgQlRBX0hmQ2xpZW50RGVyZWdpc3Rlcih1aW50MTZfdCBoYW5kbGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTMxMSw3ICszMTEsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0hmQ2xpZW50T3BlbihVSU5UMTYgaGFuZGxlLCBCRF9BRERSIGJkX2FkZHIsIHRCVEFfU0VDIHNlY19tYXNrKTsKK3ZvaWQgQlRBX0hmQ2xpZW50T3Blbih1aW50MTZfdCBoYW5kbGUsIEJEX0FERFIgYmRfYWRkciwgdEJUQV9TRUMgc2VjX21hc2spOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTMyNCw3ICszMjQsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0hmQ2xpZW50Q2xvc2UoVUlOVDE2IGhhbmRsZSk7Cit2b2lkIEJUQV9IZkNsaWVudENsb3NlKHVpbnQxNl90IGhhbmRsZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMzM3LDcgKzMzNyw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfSGZDbGllbnRBdWRpb09wZW4oVUlOVDE2IGhhbmRsZSk7Cit2b2lkIEJUQV9IZkNsaWVudEF1ZGlvT3Blbih1aW50MTZfdCBoYW5kbGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTM1MCw3ICszNTAsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0hmQ2xpZW50QXVkaW9DbG9zZShVSU5UMTYgaGFuZGxlKTsKK3ZvaWQgQlRBX0hmQ2xpZW50QXVkaW9DbG9zZSh1aW50MTZfdCBoYW5kbGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTM2Miw3ICszNjIsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0hmQ2xpZW50U2VuZEFUKFVJTlQxNiBoYW5kbGUsIHRCVEFfSEZfQ0xJRU5UX0FUX0NNRF9UWVBFIGF0LCBVSU5UMzIgdmFsMSwgVUlOVDMyIHZhbDIsIGNvbnN0IGNoYXIgKnN0cik7Cit2b2lkIEJUQV9IZkNsaWVudFNlbmRBVCh1aW50MTZfdCBoYW5kbGUsIHRCVEFfSEZfQ0xJRU5UX0FUX0NNRF9UWVBFIGF0LCB1aW50MzJfdCB2YWwxLCB1aW50MzJfdCB2YWwyLCBjb25zdCBjaGFyICpzdHIpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL2J0YS9pbmNsdWRlL2J0YV9oaF9hcGkuaCBiL2J0YS9pbmNsdWRlL2J0YV9oaF9hcGkuaAppbmRleCA5MDQ1NjI5Li5jMWY5ZDc5IDEwMDY0NAotLS0gYS9idGEvaW5jbHVkZS9idGFfaGhfYXBpLmgKKysrIGIvYnRhL2luY2x1ZGUvYnRhX2hoX2FwaS5oCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSAiYnRhX2FwaS5oIgogI2luY2x1ZGUgImhpZGhfYXBpLmgiCiAKLSNpZiAoZGVmaW5lZCBCVEFfSEhfTEVfSU5DTFVERUQgJiYgQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9ISF9MRV9JTkNMVURFRCA9PSBUUlVFKQogI2luY2x1ZGUgImdhdHRfYXBpLmgiCiAjZW5kaWYKIApAQCAtMzMsNyArMzMsNyBAQAogKiogIENvbnN0YW50cyBhbmQgVHlwZSBEZWZpbml0aW9ucwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIEJUQV9ISF9ERUJVRwotI2RlZmluZSBCVEFfSEhfREVCVUcgICAgVFJVRQorI2RlZmluZSBCVEFfSEhfREVCVUcgICAgdHJ1ZQogI2VuZGlmCiAKICNpZm5kZWYgQlRBX0hIX1NTUl9NQVhfTEFURU5DWV9ERUYKQEAgLTYzLDcgKzYzLDcgQEAKICNkZWZpbmUgQlRBX0hIX0FQSV9FUlJfRVZUICAgICAgMTYgICAgICAvKiBBUEkgZXJyb3IgaXMgY2F1Z2h0ICovCiAjZGVmaW5lIEJUQV9ISF9VUERBVEVfU0NQUF9FVlQgIDE3ICAgICAgIC8qIHVwZGF0ZSBzY2FuIHBhcmFtdGVyIGNvbXBsZXRlICovCiAKLXR5cGVkZWYgVUlOVDE2IHRCVEFfSEhfRVZUOwordHlwZWRlZiB1aW50MTZfdCB0QlRBX0hIX0VWVDsKIAogLyogYXBwbGljYXRpb24gSUQobm9uZS16ZXJvKSBmb3IgZWFjaCB0eXBlIG9mIGRldmljZSAqLwogI2RlZmluZSBCVEFfSEhfQVBQX0lEX01JICAgICAgICAgICAgMQpAQCAtODEsNyArODEsNyBAQAogI2RlZmluZSBCVEFfSEhfSURYX0lOVkFMSUQgICAgICAweGZmCiAjZGVmaW5lIEJUQV9ISF9NQVhfS05PV04gICAgICAgIEhJRF9IT1NUX01BWF9ERVZJQ0VTCiAKLSNpZiAoZGVmaW5lZCBCVEFfSEhfTEVfSU5DTFVERUQgJiYgQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUpCisjaWYgKEJUQV9ISF9MRV9JTkNMVURFRCA9PSBUUlVFKQogLyogR0FUVF9NQVhfUEhZX0NIQU5ORUwgY2FuIG5vdCBleGNlZWQgMTQgZm9yIHRoZSBkZXNpZ24gb2YgQlRBIEhIICovCiAjZGVmaW5lIEJUQV9ISF9MRV9NQVhfS05PV04gICAgIEdBVFRfTUFYX1BIWV9DSEFOTkVMCiAjZGVmaW5lIEJUQV9ISF9NQVhfREVWSUNFICAgICAgICAoSElEX0hPU1RfTUFYX0RFVklDRVMgKyBHQVRUX01BWF9QSFlfQ0hBTk5FTCkKQEAgLTk1LDE0ICs5NSwxNCBAQAogI2RlZmluZSBCVEFfSEhfUFJPVE9fUlBUX01PREUgICAgICAgICAgICAgICAgICAgKDB4MDApCiAjZGVmaW5lIEJUQV9ISF9QUk9UT19CT09UX01PREUgICAgICAgICAgICAgICAgICAoMHgwMSkKICNkZWZpbmUgQlRBX0hIX1BST1RPX1VOS05PV04gICAgICAgICAgICAgICAgICAgICgweGZmKQotdHlwZWRlZiBVSU5UOCAgIHRCVEFfSEhfUFJPVE9fTU9ERTsKK3R5cGVkZWYgdWludDhfdCAgIHRCVEFfSEhfUFJPVE9fTU9ERTsKIAogZW51bQogewogICAgIEJUQV9ISF9LRVlCRF9SUFRfSUQgID0gICAgICAgICAgICAgICAxLAogICAgIEJUQV9ISF9NT1VTRV9SUFRfSUQKIH07Ci10eXBlZGVmIFVJTlQ4IHRCVEFfSEhfQk9PVF9SUFRfSUQ7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9ISF9CT09UX1JQVF9JRDsKIAogLyogdHlwZSBvZiBkZXZpY2VzLCBiaXQgbWFzayAqLwogI2RlZmluZSBCVEFfSEhfREVWVF9VTktOT1dOICAgICAgMHgwMApAQCAtMTE2LDcgKzExNiw3IEBACiAjZGVmaW5lIEJUQV9ISF9ERVZUX01JQyAgICAgICAgICAweDIwICAgICAgICAgICAvKiBwb2ludGluZyBkZXZpY2UgKi8KICNkZWZpbmUgQlRBX0hIX0RFVlRfQ09NICAgICAgICAgIDB4MzAgICAgICAgICAgIC8qIENvbWJvIGtleWJvYXJkL3BvaW50aW5nICovCiAjZGVmaW5lIEJUQV9ISF9ERVZUX09USEVSICAgICAgICAweDgwCi10eXBlZGVmIFVJTlQ4ICB0QlRBX0hIX0RFVlQ7Cit0eXBlZGVmIHVpbnQ4X3QgIHRCVEFfSEhfREVWVDsKIAogZW51bQogewpAQCAtMTM5LDcgKzEzOSw3IEBACiAgICAgQlRBX0hIX0VSUl9IREwsCiAgICAgQlRBX0hIX0VSUl9TRUMKIH07Ci10eXBlZGVmIFVJTlQ4IHRCVEFfSEhfU1RBVFVTOwordHlwZWRlZiB1aW50OF90IHRCVEFfSEhfU1RBVFVTOwogCiAKICNkZWZpbmUgQlRBX0hIX1ZJUlRVQUxfQ0FCTEUgICAgICAgICAgIEhJRF9WSVJUVUFMX0NBQkxFCkBAIC0xNTAsMjEgKzE1MCwyMSBAQAogI2RlZmluZSBCVEFfSEhfUkVNT1RFX1dBS0UgICAgICAgICAgICAgSElEX1JFTU9URV9XQUtFCiAjZGVmaW5lIEJUQV9ISF9TVVBfVE9VVF9BVkxCTCAgICAgICAgICBISURfU1VQX1RPVVRfQVZMQkwKICNkZWZpbmUgQlRBX0hIX1NFQ19SRVFVSVJFRCAgICAgICAgICAgICBISURfU0VDX1JFUVVJUkVECi10eXBlZGVmIFVJTlQxNiB0QlRBX0hIX0FUVFJfTUFTSzsKK3R5cGVkZWYgdWludDE2X3QgdEJUQV9ISF9BVFRSX01BU0s7CiAKIC8qIHN1cHBvcnRlZCB0eXBlIG9mIGRldmljZSBhbmQgY29ycmVzcG9uZGluZyBhcHBsaWNhdGlvbiBJRCAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICB0QlRBX0hIX0RFVlQgICAgICAgIHRvZDsgICAgICAgIC8qIHR5cGUgb2YgZGV2aWNlICAgICAgICAgICAgICAgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIGFwcF9pZDsgICAgIC8qIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb24gSUQgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgYXBwX2lkOyAgICAgLyogY29ycmVzcG9uZGluZyBhcHBsaWNhdGlvbiBJRCAqLwogfXRCVEFfSEhfU1BUX1RPRDsKIAogLyogY29uZmlndXJhdGlvbiBzdHJ1Y3QgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgbWF4X2RldnRfc3B0OyAvKiBtYXggbnVtYmVyIG9mIHR5cGVzIG9mIGRldmljZXMgc3B0ICovCisgICAgdWludDhfdCAgICAgICAgICAgICAgICBtYXhfZGV2dF9zcHQ7IC8qIG1heCBudW1iZXIgb2YgdHlwZXMgb2YgZGV2aWNlcyBzcHQgKi8KICAgICB0QlRBX0hIX1NQVF9UT0QgICAgICpwX2RldnRfbGlzdDsgIC8qIHN1cHBvcnRlZCB0eXBlcyBvZiBkZXZpY2UgbGlzdCAgICAgKi8KLSAgICBVSU5UMTYgICAgICAgICAgICAgICBzZHBfZGJfc2l6ZTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgIHNkcF9kYl9zaXplOwogfXRCVEFfSEhfQ0ZHOwogCiBlbnVtCkBAIC0xNzQsNyArMTc0LDcgQEAKICAgICBCVEFfSEhfUlBUVF9PVVRQVVQsICAgICAvKiBvdXRwdXQgcmVwb3J0ICAgICovCiAgICAgQlRBX0hIX1JQVFRfRkVBVFVSRSAgICAgLyogZmVhdHVyZSByZXBvcnQgICAqLwogfTsKLXR5cGVkZWYgVUlOVDggdEJUQV9ISF9SUFRfVFlQRTsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0hIX1JQVF9UWVBFOwogCiAvKiBISURfQ09OVFJPTCBvcGVyYXRpb24gY29kZSB1c2VkIGluIEJUQV9IaFNlbmRDdHJsKCkKICovCkBAIC0xODcsNyArMTg3LDcgQEAKICAgICBCVEFfSEhfQ1RSTF9FWElUX1NVU1BFTkQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleGl0IHN1c3BlbmQgICAgICovCiAgICAgQlRBX0hIX0NUUkxfVklSVFVBTF9DQUJMRV9VTlBMVUcgICAgICAgICAgICAgICAgICAgLyogdmlydHVhbCB1bnBsdWcgICAqLwogfTsKLXR5cGVkZWYgVUlOVDggdEJUQV9ISF9UUkFOU19DVFJMX1RZUEU7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9ISF9UUkFOU19DVFJMX1RZUEU7CiAKIHR5cGVkZWYgdEhJRF9ERVZfRFNDUF9JTkZPIHRCVEFfSEhfREVWX0RFU0NSOwogCkBAIC0yMDAsMTcgKzIwMCwxNyBAQAogLyogcmVwb3J0IGRlc2NyaXB0b3IgaW5mb3JtYXRpb24gKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICB2ZW5kb3JfaWQ7ICAgICAgLyogdmVuZG9yIElEICovCi0gICAgVUlOVDE2ICAgICAgICAgICAgICBwcm9kdWN0X2lkOyAgICAgLyogcHJvZHVjdCBJRCAqLwotICAgIFVJTlQxNiAgICAgICAgICAgICAgdmVyc2lvbjsgICAgICAgIC8qIHZlcnNpb24gKi8KLSAgICBVSU5UMTYgICAgICAgICAgICAgIHNzcl9tYXhfbGF0ZW5jeTsgICAgLyogU1NSIG1heCBsYXRlbmN5LCBCVEFfSEhfU1NSX1BBUkFNX0lOVkFMSUQgaWYgdW5rbm93biAqLwotICAgIFVJTlQxNiAgICAgICAgICAgICAgc3NyX21pbl90b3V0OyAgICAgICAvKiBTU1IgbWluIHRpbWVvdXQsIEJUQV9ISF9TU1JfUEFSQU1fSU5WQUxJRCBpZiB1bmtub3duICovCi0gICAgVUlOVDggICAgICAgICAgICAgICBjdHJ5X2NvZGU7ICAgICAgLypDb3VudHJ5IENvZGUuKi8KLSNpZiAoZGVmaW5lZCBCVEFfSEhfTEVfSU5DTFVERUQgJiYgQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUpCisgICAgdWludDE2X3QgICAgICAgICAgICAgIHZlbmRvcl9pZDsgICAgICAvKiB2ZW5kb3IgSUQgKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgcHJvZHVjdF9pZDsgICAgIC8qIHByb2R1Y3QgSUQgKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgdmVyc2lvbjsgICAgICAgIC8qIHZlcnNpb24gKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgc3NyX21heF9sYXRlbmN5OyAgICAvKiBTU1IgbWF4IGxhdGVuY3ksIEJUQV9ISF9TU1JfUEFSQU1fSU5WQUxJRCBpZiB1bmtub3duICovCisgICAgdWludDE2X3QgICAgICAgICAgICAgIHNzcl9taW5fdG91dDsgICAgICAgLyogU1NSIG1pbiB0aW1lb3V0LCBCVEFfSEhfU1NSX1BBUkFNX0lOVkFMSUQgaWYgdW5rbm93biAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBjdHJ5X2NvZGU7ICAgICAgLypDb3VudHJ5IENvZGUuKi8KKyNpZiAoQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUpCiAjZGVmaW5lIEJUQV9ISF9MRV9SRU1PVEVfV0FLRSAgICAgICAweDAxCiAjZGVmaW5lIEJUQV9ISF9MRV9OT1JNQUxfQ09OTiAgICAgICAweDAyCiAKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGZsYWc7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIGZsYWc7CiAjZW5kaWYKICAgICB0QlRBX0hIX0RFVl9ERVNDUiAgIGRlc2NyaXB0b3I7CiB9dEJUQV9ISF9ERVZfRFNDUF9JTkZPOwpAQCAtMjIwLDEwICsyMjAsMTAgQEAKIHsKICAgICBCRF9BRERSICAgICAgICAgYmRhOyAgICAgICAgICAgICAgICAvKiBISUQgZGV2aWNlIGJkIGFkZHJlc3MgICAgKi8KICAgICB0QlRBX0hIX1NUQVRVUyAgc3RhdHVzOyAgICAgICAgICAgICAvKiBvcGVyYXRpb24gc3RhdHVzICAgICAgICAgKi8KLSAgICBVSU5UOCAgICAgICAgICAgaGFuZGxlOyAgICAgICAgICAgICAvKiBkZXZpY2UgaGFuZGxlICAgICAgICAgICAgKi8KLSNpZiAoZGVmaW5lZCBCVEFfSEhfTEVfSU5DTFVERUQgJiYgQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUpCi0gICAgQk9PTEVBTiAgICAgICAgIGxlX2hpZDsgICAgICAgICAgICAgLyogaXMgTEUgZGV2aWNlcz8gKi8KLSAgICBCT09MRUFOICAgICAgICAgc2Nwc19zdXBwb3J0ZWQ7ICAgICAvKiBzY2FuIHBhcmFtZXRlciBzZXJ2aWNlIHN1cHBvcnRlZCAqLworICAgIHVpbnQ4X3QgICAgICAgICAgIGhhbmRsZTsgICAgICAgICAgICAgLyogZGV2aWNlIGhhbmRsZSAgICAgICAgICAgICovCisjaWYgKEJUQV9ISF9MRV9JTkNMVURFRCA9PSBUUlVFKQorICAgIGJvb2wgICAgICAgICBsZV9oaWQ7ICAgICAgICAgICAgIC8qIGlzIExFIGRldmljZXM/ICovCisgICAgYm9vbCAgICAgICAgIHNjcHNfc3VwcG9ydGVkOyAgICAgLyogc2NhbiBwYXJhbWV0ZXIgc2VydmljZSBzdXBwb3J0ZWQgKi8KICNlbmRpZgogCiB9IHRCVEFfSEhfQ09OTjsKQEAgLTIzNCw3ICsyMzQsNyBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICB0QlRBX0hIX1NUQVRVUyAgICAgICAgICAgICAgc3RhdHVzOyAgICAgLyogb3BlcmF0aW9uIHN0YXR1cyAgICAgICAgICovCi0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZTsgICAgIC8qIGRldmljZSBoYW5kbGUgICAgICAgICAgICAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZTsgICAgIC8qIGRldmljZSBoYW5kbGUgICAgICAgICAgICAqLwogfSB0QlRBX0hIX0NCREFUQTsKIAogZW51bQpAQCAtMjQ5LDIzICsyNDksMjMgQEAKIC8qIHBhcnNlZCBib290IG1vZGUga2V5Ym9hcmQgcmVwb3J0ICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQ4ICAgICAgICAgICAgICAgdGhpc19jaGFyWzZdOyAgICAgICAvKiB2aXJ0dWFsIGtleSBjb2RlICAgICAqLwotICAgIEJPT0xFQU4gICAgICAgICAgICAgbW9kX2tleVtCVEFfSEhfTU9EX01BWF9LRVldOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICB0aGlzX2NoYXJbNl07ICAgICAgIC8qIHZpcnR1YWwga2V5IGNvZGUgICAgICovCisgICAgYm9vbCAgICAgICAgICAgICBtb2Rfa2V5W0JUQV9ISF9NT0RfTUFYX0tFWV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN0cmwsIHNoaWZ0LCBBbHQsIEdVSSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2RpZmllciBrZXk6IGlzIFNoaWZ0IGtleSBwcmVzc2VkICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZGlmaWVyIGtleTogaXMgQ3RybCBrZXkgcHJlc3NlZCAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kaWZpZXIga2V5OiBpcyBBbHQga2V5IHByZXNzZWQgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2RpZmllciBrZXk6IEdVSSB1cC9kb3duICovCi0gICAgQk9PTEVBTiAgICAgICAgICAgICBjYXBzX2xvY2s7ICAgICAgICAgIC8qIGlzIGNhcHMgbG9ja2VkICAgICAgICovCi0gICAgQk9PTEVBTiAgICAgICAgICAgICBudW1fbG9jazsgICAgICAgICAgIC8qIGlzIE51bSBrZXkgcHJlc3NlZCAgICovCisgICAgYm9vbCAgICAgICAgICAgICBjYXBzX2xvY2s7ICAgICAgICAgIC8qIGlzIGNhcHMgbG9ja2VkICAgICAgICovCisgICAgYm9vbCAgICAgICAgICAgICBudW1fbG9jazsgICAgICAgICAgIC8qIGlzIE51bSBrZXkgcHJlc3NlZCAgICovCiB9IHRCVEFfSEhfS0VZQkRfUlBUOwogCiAvKiBwYXJzZWQgYm9vdCBtb2RlIG1vdXNlIHJlcG9ydCAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIG1vdXNlX2J1dHRvbjsgICAgICAgLyogbW91c2UgYnV0dG9uIGlzIGNsaWNrZWQgICAqLwotICAgIElOVDggICAgICAgICAgICAgICAgZGVsdGFfeDsgICAgICAgICAgICAvKiBkaXNwbGFjZW1lbnQgeCAgICAgICAgICAgICovCi0gICAgSU5UOCAgICAgICAgICAgICAgICBkZWx0YV95OyAgICAgICAgICAgIC8qIGRpc3BsYWNlbWVudCB5ICAgICAgICAgICAgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgbW91c2VfYnV0dG9uOyAgICAgICAvKiBtb3VzZSBidXR0b24gaXMgY2xpY2tlZCAgICovCisgICAgaW50OF90ICAgICAgICAgICAgICAgIGRlbHRhX3g7ICAgICAgICAgICAgLyogZGlzcGxhY2VtZW50IHggICAgICAgICAgICAqLworICAgIGludDhfdCAgICAgICAgICAgICAgICBkZWx0YV95OyAgICAgICAgICAgIC8qIGRpc3BsYWNlbWVudCB5ICAgICAgICAgICAgKi8KIH10QlRBX0hIX01JQ0VfUlBUOwogCiAvKiBwYXJzZWQgQm9vdCByZXBvcnQgKi8KQEAgLTI4MywxMiArMjgzLDEyIEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIHRCVEFfSEhfU1RBVFVTICBzdGF0dXM7ICAgICAgICAgICAgICAgICAvKiBoYW5kc2hha2Ugc3RhdHVzICovCi0gICAgVUlOVDggICAgICAgICAgIGhhbmRsZTsgICAgICAgICAgICAgICAgIC8qIGRldmljZSBoYW5kbGUgICAgKi8KKyAgICB1aW50OF90ICAgICAgICAgICBoYW5kbGU7ICAgICAgICAgICAgICAgICAvKiBkZXZpY2UgaGFuZGxlICAgICovCiAgICAgdW5pb24KICAgICB7CiAgICAgICAgIHRCVEFfSEhfUFJPVE9fTU9ERSAgICAgIHByb3RvX21vZGU7IC8qIEdFVF9QUk9UT19FVlQgOnByb3RvY29sIG1vZGUgKi8KICAgICAgICAgQlRfSERSICAgICAgICAgICAgICAgICAgKnBfcnB0X2RhdGE7ICAgLyogR0VUX1JQVF9FVlQgICA6IHJlcG9ydCBkYXRhICAqLwotICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBpZGxlX3JhdGU7ICAvKiBHRVRfSURMRV9FVlQgIDogaWRsZSByYXRlICAgICovCisgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgaWRsZV9yYXRlOyAgLyogR0VUX0lETEVfRVZUICA6IGlkbGUgcmF0ZSAgICAqLwogICAgIH0gICAgICAgICAgICAgICByc3BfZGF0YTsKIAogfXRCVEFfSEhfSFNEQVRBOwpAQCAtMzY2LDcgKzM2Niw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0hoQ2xvc2UoVUlOVDggZGV2X2hhbmRsZSk7CitleHRlcm4gdm9pZCBCVEFfSGhDbG9zZSh1aW50OF90IGRldl9oYW5kbGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTM3Nyw3ICszNzcsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9IaFNldFByb3RvTW9kZShVSU5UOCBoYW5kbGUsIHRCVEFfSEhfUFJPVE9fTU9ERSB0X3R5cGUpOworZXh0ZXJuIHZvaWQgQlRBX0hoU2V0UHJvdG9Nb2RlKHVpbnQ4X3QgaGFuZGxlLCB0QlRBX0hIX1BST1RPX01PREUgdF90eXBlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0zODgsNyArMzg4LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfSGhHZXRQcm90b01vZGUoVUlOVDggZGV2X2hhbmRsZSk7CitleHRlcm4gdm9pZCBCVEFfSGhHZXRQcm90b01vZGUodWludDhfdCBkZXZfaGFuZGxlKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgogKiogRnVuY3Rpb24gICAgICAgICBCVEFfSGhTZXRSZXBvcnQKQEAgLTM5OCw3ICszOTgsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9IaFNldFJlcG9ydChVSU5UOCBkZXZfaGFuZGxlLCB0QlRBX0hIX1JQVF9UWVBFIHJfdHlwZSwKK2V4dGVybiB2b2lkIEJUQV9IaFNldFJlcG9ydCh1aW50OF90IGRldl9oYW5kbGUsIHRCVEFfSEhfUlBUX1RZUEUgcl90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiAqcF9kYXRhKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQxMCw4ICs0MTAsOCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9IaEdldFJlcG9ydChVSU5UOCBkZXZfaGFuZGxlLCB0QlRBX0hIX1JQVF9UWVBFIHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBycHRfaWQsIFVJTlQxNiBidWZfc2l6ZSk7CitleHRlcm4gdm9pZCBCVEFfSGhHZXRSZXBvcnQodWludDhfdCBkZXZfaGFuZGxlLCB0QlRBX0hIX1JQVF9UWVBFIHJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJwdF9pZCwgdWludDE2X3QgYnVmX3NpemUpOwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCiAqKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IaFNldElkbGUKQEAgLTQyMSw3ICs0MjEsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9IaFNldElkbGUoVUlOVDggZGV2X2hhbmRsZSwgVUlOVDE2IGlkbGVfcmF0ZSk7CitleHRlcm4gdm9pZCBCVEFfSGhTZXRJZGxlKHVpbnQ4X3QgZGV2X2hhbmRsZSwgdWludDE2X3QgaWRsZV9yYXRlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC00MzIsNyArNDMyLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfSGhHZXRJZGxlKFVJTlQ4IGRldl9oYW5kbGUpOworZXh0ZXJuIHZvaWQgQlRBX0hoR2V0SWRsZSh1aW50OF90IGRldl9oYW5kbGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTQ0Myw3ICs0NDMsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9IaFNlbmRDdHJsKFVJTlQ4IGRldl9oYW5kbGUsCitleHRlcm4gdm9pZCBCVEFfSGhTZW5kQ3RybCh1aW50OF90IGRldl9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hIX1RSQU5TX0NUUkxfVFlQRSBjX3R5cGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDU1LDcgKzQ1NSw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0hoU2V0SWRsZShVSU5UOCBkZXZfaGFuZGxlLCBVSU5UMTYgaWRsZV9yYXRlKTsKK2V4dGVybiB2b2lkIEJUQV9IaFNldElkbGUodWludDhfdCBkZXZfaGFuZGxlLCB1aW50MTZfdCBpZGxlX3JhdGUpOwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00NjcsNyArNDY3LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfSGhHZXRJZGxlKFVJTlQ4IGRldl9oYW5kbGUpOworZXh0ZXJuIHZvaWQgQlRBX0hoR2V0SWRsZSh1aW50OF90IGRldl9oYW5kbGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTQ3OCw3ICs0NzgsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9IaFNlbmREYXRhKFVJTlQ4IGRldl9oYW5kbGUsIEJEX0FERFIgZGV2X2JkYSwgQlRfSERSICAqcF9idWYpOworZXh0ZXJuIHZvaWQgQlRBX0hoU2VuZERhdGEodWludDhfdCBkZXZfaGFuZGxlLCBCRF9BRERSIGRldl9iZGEsIEJUX0hEUiAgKnBfYnVmKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC00ODksNyArNDg5LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfSGhHZXREc2NwSW5mbyhVSU5UOCBkZXZfaGFuZGxlKTsKK2V4dGVybiB2b2lkIEJUQV9IaEdldERzY3BJbmZvKHVpbnQ4X3QgZGV2X2hhbmRsZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IaEFkZERldgpAQCAtNTAzLDcgKzUwMyw3IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGV4dGVybiB2b2lkIEJUQV9IaEFkZERldihCRF9BRERSIGJkYSwgdEJUQV9ISF9BVFRSX01BU0sgYXR0cl9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4IHN1Yl9jbGFzcywgVUlOVDggYXBwX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3ViX2NsYXNzLCB1aW50OF90IGFwcF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hIX0RFVl9EU0NQX0lORk8gZHNjcF9pbmZvKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtNTE0LDcgKzUxNCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0hoUmVtb3ZlRGV2KFVJTlQ4IGRldl9oYW5kbGUgKTsKK2V4dGVybiB2b2lkIEJUQV9IaFJlbW92ZURldih1aW50OF90IGRldl9oYW5kbGUgKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC01MzAsMTEgKzUzMCwxMSBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9IaFBhcnNlQm9vdFJwdCh0QlRBX0hIX0JPT1RfUlBUICpwX2RhdGEsIFVJTlQ4ICpwX3JlcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgcmVwb3J0X2xlbik7CitleHRlcm4gdm9pZCBCVEFfSGhQYXJzZUJvb3RScHQodEJUQV9ISF9CT09UX1JQVCAqcF9kYXRhLCB1aW50OF90ICpwX3JlcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZXBvcnRfbGVuKTsKIAogLyogdGVzdCBjb21tYW5kcyAqLwotZXh0ZXJuIHZvaWQgYnRhX2hoX2xlX2hpZF9yZWFkX3JwdF9jbHRfY2ZnKEJEX0FERFIgYmRfYWRkciwgVUlOVDggcnB0X2lkKTsKK2V4dGVybiB2b2lkIGJ0YV9oaF9sZV9oaWRfcmVhZF9ycHRfY2x0X2NmZyhCRF9BRERSIGJkX2FkZHIsIHVpbnQ4X3QgcnB0X2lkKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9idGEvaW5jbHVkZS9idGFfaGhfY28uaCBiL2J0YS9pbmNsdWRlL2J0YV9oaF9jby5oCmluZGV4IGU5NjM0MTIuLmQ5MDg0ZmUgMTAwNzU1Ci0tLSBhL2J0YS9pbmNsdWRlL2J0YV9oaF9jby5oCisrKyBiL2J0YS9pbmNsdWRlL2J0YV9oaF9jby5oCkBAIC0zMiwxMSArMzIsMTEgQEAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIHJwdF91dWlkOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgcnB0X2lkOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBycHRfdXVpZDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgcnB0X2lkOwogICAgIHRCVEFfSEhfUlBUX1RZUEUgICAgcnB0X3R5cGU7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBzcnZjX2luc3RfaWQ7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBjaGFyX2luc3RfaWQ7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIHNydmNfaW5zdF9pZDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgY2hhcl9pbnN0X2lkOwogfXRCVEFfSEhfUlBUX0NBQ0hFX0VOVFJZOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNTAsOSArNTAsOSBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfaGhfY29fZGF0YShVSU5UOCBkZXZfaGFuZGxlLCBVSU5UOCAqcF9ycHQsIFVJTlQxNiBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hIX1BST1RPX01PREUgIG1vZGUsIFVJTlQ4IHN1Yl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4IGN0cnlfY29kZSwgQkRfQUREUiBwZWVyX2FkZHIsIFVJTlQ4IGFwcF9pZCk7CitleHRlcm4gdm9pZCBidGFfaGhfY29fZGF0YSh1aW50OF90IGRldl9oYW5kbGUsIHVpbnQ4X3QgKnBfcnB0LCB1aW50MTZfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hIX1BST1RPX01PREUgIG1vZGUsIHVpbnQ4X3Qgc3ViX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjdHJ5X2NvZGUsIEJEX0FERFIgcGVlcl9hZGRyLCB1aW50OF90IGFwcF9pZCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtNjUsOCArNjUsOCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfaGhfY29fb3BlbihVSU5UOCBkZXZfaGFuZGxlLCBVSU5UOCBzdWJfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgYXR0cl9tYXNrLCBVSU5UOCBhcHBfaWQpOworZXh0ZXJuIHZvaWQgYnRhX2hoX2NvX29wZW4odWludDhfdCBkZXZfaGFuZGxlLCB1aW50OF90IHN1Yl9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGF0dHJfbWFzaywgdWludDhfdCBhcHBfaWQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTc4LDcgKzc4LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZC4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2hoX2NvX2Nsb3NlKFVJTlQ4IGRldl9oYW5kbGUsIFVJTlQ4IGFwcF9pZCk7CitleHRlcm4gdm9pZCBidGFfaGhfY29fY2xvc2UodWludDhfdCBkZXZfaGFuZGxlLCB1aW50OF90IGFwcF9pZCk7CiAKICNpZiAoQkxFX0lOQ0xVREVEID09IFRSVUUgJiYgQlRBX0hIX0xFX0lOQ0xVREVEID09IFRSVUUpCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTksNyArOTksNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGV4dGVybiB2b2lkIGJ0YV9oaF9sZV9jb19ycHRfaW5mbyhCRF9BRERSIHJlbW90ZV9iZGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hIX1JQVF9DQUNIRV9FTlRSWSAqcF9lbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4IGFwcF9pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFwcF9pZCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMTE3LDggKzExNyw4IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGV4dGVybiB0QlRBX0hIX1JQVF9DQUNIRV9FTlRSWSAqYnRhX2hoX2xlX2NvX2NhY2hlX2xvYWQgKEJEX0FERFIgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfbnVtX3JwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggYXBwX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9udW1fcnB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFwcF9pZCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMTMxLDkgKzEzMSw5IEBACiAqKiBSZXR1cm5zICAgICAgICAgIG5vbmUKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2hoX2xlX2NvX3Jlc2V0X3JwdF9jYWNoZSAoQkRfQUREUiByZW1vdGVfYmRhLCBVSU5UOCBhcHBfaWQpOworZXh0ZXJuIHZvaWQgYnRhX2hoX2xlX2NvX3Jlc2V0X3JwdF9jYWNoZSAoQkRfQUREUiByZW1vdGVfYmRhLCB1aW50OF90IGFwcF9pZCk7CiAKLSNlbmRpZiAvKiAjaWYgKEJMRV9JTkNMVURFRCA9PSBUUlVFICYmIEJUQV9ISF9MRV9JTkNMVURFRCA9PSBUUlVFKSAqLworI2VuZGlmIC8qICNpZiAoQkxFX0lOQ0xVREVEID09IHRydWUgJiYgQlRBX0hIX0xFX0lOQ0xVREVEID09IHRydWUpICovCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX2hsX2FwaS5oIGIvYnRhL2luY2x1ZGUvYnRhX2hsX2FwaS5oCmluZGV4IDBjYWE5MGQuLjYzNTcxOGYgMTAwNjQ0Ci0tLSBhL2J0YS9pbmNsdWRlL2J0YV9obF9hcGkuaAorKysgYi9idGEvaW5jbHVkZS9idGFfaGxfYXBpLmgKQEAgLTM5LDcgKzM5LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRXh0cmEgRGVidWcgQ29kZSAqLwogI2lmbmRlZiBCVEFfSExfREVCVUcKLSNkZWZpbmUgQlRBX0hMX0RFQlVHICAgICAgICAgICBUUlVFCisjZGVmaW5lIEJUQV9ITF9ERUJVRyAgICAgICAgICAgdHJ1ZQogI2VuZGlmCiAKICNpZm5kZWYgQlRBX0hMX05VTV9BUFBTCkBAIC0xNDIsNyArMTQyLDcgQEAKICNkZWZpbmUgQlRBX0hMX1NUQVRVU19JTlZBTElEX0NUUkxfUFNNICAgICAgMjcKICNkZWZpbmUgQlRBX0hMX1NUQVRVU19EVVBMSUNBVEVfQ0NIX09QRU4gICAgMjgKIAotdHlwZWRlZiBVSU5UOCB0QlRBX0hMX1NUQVRVUzsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0hMX1NUQVRVUzsKIHR5cGVkZWYgdE1DQV9IQU5ETEUgdEJUQV9ITF9BUFBfSEFORExFOwogdHlwZWRlZiB0TUNBX0NMICAgICB0QlRBX0hMX01DTF9IQU5ETEU7CiB0eXBlZGVmIHRNQ0FfREwgICAgIHRCVEFfSExfTURMX0hBTkRMRTsKQEAgLTE1Myw3ICsxNTMsNyBAQAogICAgIEJUQV9ITF9ERVZJQ0VfVFlQRV9EVUFMCiB9OwogCi10eXBlZGVmIFVJTlQ4IHRCVEFfSExfREVWSUNFX1RZUEU7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9ITF9ERVZJQ0VfVFlQRTsKIAogCiAKQEAgLTE3MSwxMSArMTcxLDExIEBACiAjZGVmaW5lIEJUQV9ITF9NREVQX1JPTEVfU09VUkNFICAgICAgICAgMHgwMAogI2RlZmluZSBCVEFfSExfTURFUF9ST0xFX1NJTksgICAgICAgICAgIDB4MDEKIAotdHlwZWRlZiBVSU5UOCB0QlRBX0hMX01ERVBfUk9MRTsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0hMX01ERVBfUk9MRTsKIAogI2RlZmluZSBCVEFfSExfTURFUF9ST0xFX01BU0tfU09VUkNFICAgIDB4MDEgICAgIC8qIGJpdCBtYXNrICovCiAjZGVmaW5lIEJUQV9ITF9NREVQX1JPTEVfTUFTS19TSU5LICAgICAgMHgwMgotdHlwZWRlZiBVSU5UOCB0QlRBX0hMX01ERVBfUk9MRV9NQVNLOwordHlwZWRlZiB1aW50OF90IHRCVEFfSExfTURFUF9ST0xFX01BU0s7CiAKIAogI2RlZmluZSBCVEFfSExfRUNIT19URVNUX01ERVBfSUQgICAgICAgIDAKQEAgLTE4OSw3ICsxODksNyBAQAogCiAjZGVmaW5lIEJUQV9ITF9ERUxFVEVfQUxMX01ETF9JRFMgICAweEZGRkYKICNkZWZpbmUgQlRBX0hMX01BWF9NRExfVkFMICAgICAgICAgIDB4RkVGRgotdHlwZWRlZiBVSU5UMTYgdEJUQV9ITF9NRExfSUQ7ICAvKiAweDAwMDAgcmVzZXJ2ZWQsCit0eXBlZGVmIHVpbnQxNl90IHRCVEFfSExfTURMX0lEOyAgLyogMHgwMDAwIHJlc2VydmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEtMHhGRUZGIGR5bmFtaWMgcmFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkYwMC0weEZGRkUgcmVzZXJ2ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRiBpbmRpY2F0ZXMgYWxsIE1ETHMqLwpAQCAtMTk5LDE0ICsxOTksMTQgQEAKICNkZWZpbmUgQlRBX0hMX0RDSF9NT0RFX1JFTElBQkxFICAgIDAKICNkZWZpbmUgQlRBX0hMX0RDSF9NT0RFX1NUUkVBTUlORyAgIDEKIAotdHlwZWRlZiBVSU5UOCB0QlRBX0hMX0RDSF9NT0RFOwordHlwZWRlZiB1aW50OF90IHRCVEFfSExfRENIX01PREU7CiAKICNkZWZpbmUgQlRBX0hMX0RDSF9DRkdfTk9fUFJFRiAgICAgIDAKICNkZWZpbmUgQlRBX0hMX0RDSF9DRkdfUkVMSUFCTEUgICAgIDEKICNkZWZpbmUgQlRBX0hMX0RDSF9DRkdfU1RSRUFNSU5HICAgIDIKICNkZWZpbmUgQlRBX0hMX0RDSF9DRkdfVU5LTk9XTiAgICAgIDB4RkYKIAotdHlwZWRlZiBVSU5UOCB0QlRBX0hMX0RDSF9DRkc7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9ITF9EQ0hfQ0ZHOwogCiAvKiBUaGUgRGVmYXVsdCBEQ0ggQ0ZHIGZvciB0aGUgZWNobyB0ZXN0IHdoZW4gdGhlIGRldmljZSBpcyBhIFNvdXJjZSAqLwogI2RlZmluZSBCVEFfSExfREVGQVVMVF9FQ0hPX1RFU1RfU1JDX0RDSF9DRkcgQlRBX0hMX0RDSF9DRkdfUkVMSUFCTEUKQEAgLTIxNCwyNyArMjE0LDI3IEBACiAjZGVmaW5lIEJUQV9ITF9EQ0hfQ1JFQVRFX1JTUF9TVUNDRVNTIDAKICNkZWZpbmUgQlRBX0hMX0RDSF9DUkVBVEVfUlNQX0NGR19SRUogMQogCi10eXBlZGVmIFVJTlQ4IHRCVEFfSExfRENIX0NSRUFURV9SU1A7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9ITF9EQ0hfQ1JFQVRFX1JTUDsKIAogI2RlZmluZSBCVEFfSExfTUNBUF9TVVBfUFJPQ19SRUNPTk5FQ1RfSU5JVCAweDAyCiAjZGVmaW5lIEJUQV9ITF9NQ0FQX1NVUF9QUk9DX1JFQ09OTkVDVF9BUFQgIDB4MDQKICNkZWZpbmUgQlRBX0hMX01DQVBfU1VQX1BST0NfQ1NQX1NMQVZFICAgICAgMHgwOAogI2RlZmluZSBCVEFfSExfTUNBUF9TVVBfUFJPQ19DU1BfTUFTVEVSICAgICAweDEwCiAKLXR5cGVkZWYgVUlOVDggdEJUQV9ITF9TVVBfUFJPQ19NQVNLOwordHlwZWRlZiB1aW50OF90IHRCVEFfSExfU1VQX1BST0NfTUFTSzsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBtYXhfcnhfYXBkdV9zaXplOyAgLyogbG9jYWwgcmN2IE1UVSAqLwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIG1heF90eF9hcGR1X3NpemU7ICAvKiBtYXhpbXVtIFRYIEFQRFUgc2l6ZSovCisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICBtYXhfcnhfYXBkdV9zaXplOyAgLyogbG9jYWwgcmN2IE1UVSAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgbWF4X3R4X2FwZHVfc2l6ZTsgIC8qIG1heGltdW0gVFggQVBEVSBzaXplKi8KIH0gdEJUQV9ITF9FQ0hPX0NGRzsKIAogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIGRhdGFfdHlwZTsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBtYXhfcnhfYXBkdV9zaXplOyAgLyogbG9jYWwgcmN2IE1UVSAqLwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIG1heF90eF9hcGR1X3NpemU7ICAvKiBtYXhpbXVtIFRYIEFQRFUgc2l6ZSovCisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICBkYXRhX3R5cGU7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICBtYXhfcnhfYXBkdV9zaXplOyAgLyogbG9jYWwgcmN2IE1UVSAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgbWF4X3R4X2FwZHVfc2l6ZTsgIC8qIG1heGltdW0gVFggQVBEVSBzaXplKi8KICAgICBjaGFyICAgICAgICAgICAgICAgICAgICBkZXNwW0JUQV9ITF9NREVQX0RFU1BfTEVOKzFdOwogfSB0QlRBX0hMX01ERVBfREFUQV9UWVBFX0NGRzsKIApAQCAtMjQyLDcgKzI0Miw3IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIHRCVEFfSExfTURFUF9ST0xFICAgICAgICAgICBtZGVwX3JvbGU7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgIG51bV9vZl9tZGVwX2RhdGFfdHlwZXM7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgbnVtX29mX21kZXBfZGF0YV90eXBlczsKICAgICB0QlRBX0hMX01ERVBfREFUQV9UWVBFX0NGRyAgZGF0YV9jZmdbQlRBX0hMX05VTV9EQVRBX1RZUEVTXTsKIH0gdEJUQV9ITF9NREVQX0NGRzsKIApAQCAtMjUwLDcgKzI1MCw3IEBACiB7CiAgICAgdEJUQV9ITF9NREVQX0lEICAgICAgICAgbWRlcF9pZDsgIC8qIE1ERVAgSUQgMHgwMS0weDdGICovCiAgICAgdEJUQV9ITF9NREVQX0NGRyAgICAgICAgbWRlcF9jZmc7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgb3JpX2FwcF9pZDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIG9yaV9hcHBfaWQ7CiB9IHRCVEFfSExfTURFUDsKIAogdHlwZWRlZiBzdHJ1Y3QKQEAgLTI1OCwyNyArMjU4LDI3IEBACiAgICAgdEJUQV9ITF9NREVQICAgICAgICAgICAgbWRlcFtCVEFfSExfTlVNX01ERVBTXTsKICAgICB0QlRBX0hMX0VDSE9fQ0ZHICAgICAgICBlY2hvX2NmZzsKICAgICB0QlRBX0hMX01ERVBfUk9MRV9NQVNLICBhcHBfcm9sZV9tYXNrOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgIGFkdmVydGl6ZV9zb3VyY2Vfc2RwOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIG51bV9vZl9tZGVwczsKKyAgICBib29sICAgICAgICAgICAgICAgICBhZHZlcnRpemVfc291cmNlX3NkcDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIG51bV9vZl9tZGVwczsKIH0gdEJUQV9ITF9TVVBfRkVBVFVSRTsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICBkZWxldGVfcmVxX3BlbmRpbmc7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgZGVsZXRlX3JlcV9wZW5kaW5nOwogICAgIHRCVEFfSExfTURMX0lEICAgICAgICAgIG1kbF9pZDsKICAgICB0QlRBX0hMX01DTF9IQU5ETEUgICAgICBtY2xfaGFuZGxlOwogfSB0QlRBX0hMX0RFTEVURV9NREw7CiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgdGltZTsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBtdHU7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICB0aW1lOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgbXR1OwogICAgIHRCVEFfSExfTURMX0lEICAgICAgICAgIG1kbF9pZDsKICAgICB0QlRBX0hMX01ERVBfSUQgICAgICAgICBsb2NhbF9tZGVwX2lkOwogICAgIHRCVEFfSExfTURFUF9ST0xFICAgICAgIGxvY2FsX21kZXBfcm9sZTsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICBhY3RpdmU7ICAgICAvKiB0cnVlIGlmIHRoaXMgaXRlbSBpcyBpbiB1c2UgKi8KKyAgICBib29sICAgICAgICAgICAgICAgICBhY3RpdmU7ICAgICAvKiB0cnVlIGlmIHRoaXMgaXRlbSBpcyBpbiB1c2UgKi8KICAgICB0QlRBX0hMX0RDSF9NT0RFICAgICAgICBkY2hfbW9kZTsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBmY3M7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBmY3M7CiAgICAgQkRfQUREUiAgICAgICAgICAgICAgICAgcGVlcl9iZF9hZGRyOwogfSB0QlRBX0hMX01ETF9DRkc7CiAKQEAgLTI4OSwxNSArMjg5LDE1IEBACiAvKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGFkZCBzdXBwb3J0ZWQgZmVhdHVyZSBsaXN0cyBhbmQgZmluZCBzdXBwb3J0ZWQgZmVhdHVyZSBlbGVtZW50cyAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UOCAgICAgICBtZGVwX2lkOwotICAgIFVJTlQxNiAgICAgIGRhdGFfdHlwZTsKKyAgICB1aW50OF90ICAgICAgIG1kZXBfaWQ7CisgICAgdWludDE2X3QgICAgICBkYXRhX3R5cGU7CiAgICAgdEJUQV9ITF9NREVQX1JPTEUgICAgICAgbWRlcF9yb2xlOwogICAgIGNoYXIgICAgICAgICpwX21kZXBfZGVzcDsKIH0gdEJUQV9ITF9TVVBfRkVBVFVSRV9FTEVNOwogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICBudW1fZWxlbXM7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgbnVtX2VsZW1zOwogICAgIHRCVEFfSExfU1VQX0ZFQVRVUkVfRUxFTSAgIGxpc3RfZWxlbVtCVEFfSExfTlVNX1NVUF9GRUFUVVJFX0VMRU1TXTsKIH0gdEJUQV9ITF9TVVBfRkVBVFVSRV9MSVNUX0VMRU07CiAKQEAgLTMxMyw3ICszMTMsNyBAQAogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIGN0cmxfcHNtOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgY3RybF9wc207CiAgICAgQkRfQUREUiAgICAgICAgICAgICAgICAgYmRfYWRkcjsgICAgICAgICAgIC8qIEFkZHJlc3Mgb2YgcGVlciBkZXZpY2UgKi8KICAgICB0QlRBX1NFQyAgICAgICAgICAgICAgICBzZWNfbWFzazsgICAgICAgICAgLyogc2VjdXJpdHkgbWFzayBmb3IgaW5pdGlhdGluZyBjb25uZWN0aW9uKi8KIH0gdEJUQV9ITF9DQ0hfT1BFTl9QQVJBTTsKQEAgLTMyMSw3ICszMjEsNyBAQAogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIGN0cmxfcHNtOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgY3RybF9wc207CiAgICAgdEJUQV9ITF9NREVQX0lEICAgICAgICAgbG9jYWxfbWRlcF9pZDsgICAgIC8qIGxvY2FsIE1ERVAgSUQgKi8KICAgICB0QlRBX0hMX01ERVBfSUQgICAgICAgICBwZWVyX21kZXBfaWQ7ICAgICAgLyogcGVlciBtZGVwIGlkICovCiAgICAgdEJUQV9ITF9EQ0hfQ0ZHICAgICAgICAgbG9jYWxfY2ZnOwpAQCAtMzMxLDIyICszMzEsMjIgQEAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBjdHJsX3BzbTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIGN0cmxfcHNtOwogICAgIHRCVEFfSExfTURMX0lEICAgICAgICAgIG1kbF9pZDsKIH0gdEJUQV9ITF9EQ0hfUkVDT05ORUNUX1BBUkFNOwogCiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgY3RybF9wc207Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgcGt0X3NpemU7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICBjdHJsX3BzbTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIHBrdF9zaXplOwogICAgIHRCVEFfSExfRENIX0NGRyAgICAgICAgIGxvY2FsX2NmZzsKIH0gdEJUQV9ITF9EQ0hfRUNIT19URVNUX1BBUkFNOwogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIHBfYnVmOyAgICAgICAgLyogYnVmZmVyIHBvaW50ZXIgKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgcF9idWY7ICAgICAgICAvKiBidWZmZXIgcG9pbnRlciAqLwogfSB0QlRBX0hMX0RDSF9CVUZfSU5GTzsKIAogdHlwZWRlZiBzdHJ1Y3QKQEAgLTM1OSwxOCArMzU5LDE4IEBACiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBkYXRhX3R5cGU7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBtZGVwX2lkOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBkYXRhX3R5cGU7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIG1kZXBfaWQ7CiAgICAgdEJUQV9ITF9NREVQX1JPTEUgICBtZGVwX3JvbGU7CiAgICAgY2hhciAgICAgICAgICAgICAgICBtZGVwX2Rlc3BbQlRBX0hMX01ERVBfREVTUF9MRU4rMV07CiB9dEJUQV9ITF9TRFBfTURFUF9DRkc7CiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgY3RybF9wc207Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgZGF0YV9wc207Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgbWNhcF9zdXBfcHJvYzsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBudW1fbWRlcHM7IC8qIG51bWJlciBvZiBtZGVwIGVsZW1lbnRzIGZyb20gU0RQKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIGN0cmxfcHNtOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgZGF0YV9wc207CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBtY2FwX3N1cF9wcm9jOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgbnVtX21kZXBzOyAvKiBudW1iZXIgb2YgbWRlcCBlbGVtZW50cyBmcm9tIFNEUCovCiAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgc3J2X25hbWVbQlRBX1NFUlZJQ0VfTkFNRV9MRU4rMV07CiAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgc3J2X2Rlc3BbQlRBX1NFUlZJQ0VfREVTUF9MRU4rMV07CiAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJfbmFtZVtCVEFfUFJPVklERVJfTkFNRV9MRU4rMV07CkBAIC0zNzksNyArMzc5LDcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICBudW1fcmVjczsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgIG51bV9yZWNzOwogICAgIHRCVEFfSExfU0RQX1JFQyAgICAgIHNkcF9yZWNbQlRBX0hMX05VTV9TRFBfUkVDU107CiB9IHRCVEFfSExfU0RQOwogCkBAIC0zODksNyArMzg5LDcgQEAKICAgICBCVEFfSExfQ1RSTF9FTkFCTEVfQ0ZNX0VWVCAgICAgICAgICAgID0gMCwKICAgICBCVEFfSExfQ1RSTF9ESVNBQkxFX0NGTV9FVlQKIH07Ci10eXBlZGVmIFVJTlQ4IHRCVEFfSExfQ1RSTF9FVlQ7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9ITF9DVFJMX0VWVDsKIC8qIFN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggQlRBX0hMX0VOQUJMRV9FVlQKICAgIEJUQV9ITF9ESVNBQkxFX0VWVCAqLwogCkBAIC00MzIsMTMgKzQzMiwxMyBAQAogICAgIEJUQV9ITF9TRFBfUVVFUllfQ0ZNX0VWVCwKICAgICBCVEFfSExfU0RQX0lORk9fSU5EX0VWVAogfTsKLXR5cGVkZWYgVUlOVDggdEJUQV9ITF9FVlQ7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9ITF9FVlQ7CiAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICB0QlRBX0hMX1NUQVRVUyAgICAgICAgICBzdGF0dXM7ICAgICAgICAvKiBzdGFydCBzdGF0dXMgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBhcHBfaWQ7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBhcHBfaWQ7CiAgICAgdEJUQV9ITF9BUFBfSEFORExFICAgICAgYXBwX2hhbmRsZTsKIH0gdEJUQV9ITF9SRUdJU1RFUl9DRk07CiAKQEAgLTQ0NiwxNCArNDQ2LDE0IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIHRCVEFfSExfU1RBVFVTICAgICAgICAgIHN0YXR1czsgICAgICAgIC8qIHN0YXJ0IHN0YXR1cyAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIGFwcF9pZDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIGFwcF9pZDsKICAgICB0QlRBX0hMX0FQUF9IQU5ETEUgICAgICBhcHBfaGFuZGxlOwogfSB0QlRBX0hMX0RFUkVHSVNURVJfQ0ZNOwogCiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgaW50ZW50aW9uYWw7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgaW50ZW50aW9uYWw7CiAgICAgdEJUQV9ITF9NQ0xfSEFORExFICAgICAgbWNsX2hhbmRsZTsKICAgICB0QlRBX0hMX0FQUF9IQU5ETEUgICAgICBhcHBfaGFuZGxlOwogfSB0QlRBX0hMX0NDSF9DTE9TRV9JTkQ7CkBAIC00ODIsNyArNDgyLDcgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgdEJUQV9ITF9TVEFUVVMgICAgICAgICAgc3RhdHVzOyAgICAgICAgICAgICAvKiBjb25uZWN0aW9uIHN0YXR1cyAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIGFwcF9pZDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIGFwcF9pZDsKICAgICB0QlRBX0hMX01DTF9IQU5ETEUgICAgICBtY2xfaGFuZGxlOwogICAgIHRCVEFfSExfQVBQX0hBTkRMRSAgICAgIGFwcF9oYW5kbGU7CiAgICAgQkRfQUREUiAgICAgICAgICAgICAgICAgYmRfYWRkcjsgICAgICAgICAgICAvKiBhZGRyZXNzIG9mIHBlZXIgZGV2aWNlICovCkBAIC01MTAsOCArNTEwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgY2hhbm5lbCBjb25lbmN0aW9uICAgICovCiAgICAgdEJUQV9ITF9EQ0hfTU9ERSAgICAgICAgZGNoX21vZGU7ICAgICAgICAgICAvKiBkYXRhIGNoYW5uZWwgbW9kZSAtIHJlbGlhYmxlIG9yIHN0cmVhbWluZyovCiAKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICBmaXJzdF9yZWxpYWJsZTsgIC8qIHdoZXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgcmVsaWFibGUgZGF0YSBjaGFubmVsICovCi0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgbXR1OworICAgIGJvb2wgICAgICAgICAgICAgICAgIGZpcnN0X3JlbGlhYmxlOyAgLyogd2hldGhlciB0aGlzIGlzIHRoZSBmaXJzdCByZWxpYWJsZSBkYXRhIGNoYW5uZWwgKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIG10dTsKIH0gdEJUQV9ITF9EQ0hfT1BFTl9JTkQ7CiAKIHR5cGVkZWYgc3RydWN0CkBAIC01MjQsMTQgKzUyNCwxNCBAQAogICAgIHRCVEFfSExfTURMX0lEICAgICAgICAgIG1kbF9pZDsgICAgICAgICAgICAgLyogTUNBUCBkYXRhIGxpbmsgSUQgZm9yIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgY2hhbm5lbCBjb25lbmN0aW9uICAgICovCiAgICAgdEJUQV9ITF9EQ0hfTU9ERSAgICAgICAgZGNoX21vZGU7ICAgICAgICAgICAvKiBkYXRhIGNoYW5uZWwgbW9kZSAtIHJlbGlhYmxlIG9yIHN0cmVhbWluZyovCi0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgZmlyc3RfcmVsaWFibGU7ICAgICAvKiB3aGV0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IHJlbGlhYmxlIGRhdGEgY2hhbm5lbCAqLwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIG10dTsKKyAgICBib29sICAgICAgICAgICAgICAgICBmaXJzdF9yZWxpYWJsZTsgICAgIC8qIHdoZXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgcmVsaWFibGUgZGF0YSBjaGFubmVsICovCisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICBtdHU7CiB9IHRCVEFfSExfRENIX09QRU5fQ0ZNOwogCiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgaW50ZW50aW9uYWw7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgaW50ZW50aW9uYWw7CiAgICAgdEJUQV9ITF9NRExfSEFORExFICAgICAgbWRsX2hhbmRsZTsKICAgICB0QlRBX0hMX01DTF9IQU5ETEUgICAgICBtY2xfaGFuZGxlOwogICAgIHRCVEFfSExfQVBQX0hBTkRMRSAgICAgIGFwcF9oYW5kbGU7CkBAIC01NzMsMjIgKzU3MywyMiBAQAogICAgIHRCVEFfSExfTURMX0hBTkRMRSAgICAgIG1kbF9oYW5kbGU7CiAgICAgdEJUQV9ITF9NQ0xfSEFORExFICAgICAgbWNsX2hhbmRsZTsKICAgICB0QlRBX0hMX0FQUF9IQU5ETEUgICAgICBhcHBfaGFuZGxlOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgIGNvbmc7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgY29uZzsKIH0gdEJUQV9ITF9EQ0hfQ09OR19JTkQ7CiAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgdEJUQV9ITF9BUFBfSEFORExFICAgICAgYXBwX2hhbmRsZTsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBjdHJsX3BzbTsKLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBkYXRhX3BzbTsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBkYXRhX3hfc3BlYzsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBtY2FwX3N1cF9wcm9jczsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIGN0cmxfcHNtOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgZGF0YV9wc207CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBkYXRhX3hfc3BlYzsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIG1jYXBfc3VwX3Byb2NzOwogfSB0QlRBX0hMX1NEUF9JTkZPX0lORDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICB0QlRBX0hMX1NUQVRVUyAgICAgICAgICBzdGF0dXM7Ci0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgYXBwX2lkOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgYXBwX2lkOwogICAgIHRCVEFfSExfQVBQX0hBTkRMRSAgICAgIGFwcF9oYW5kbGU7CiAgICAgQkRfQUREUiAgICAgICAgICAgICAgICAgYmRfYWRkcjsKICAgICB0QlRBX0hMX1NEUCAgICAgICAgICAgICAqcF9zZHA7CkBAIC02NzUsOCArNjc1LDggQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfSGxVcGRhdGUoVUlOVDggIGFwcF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX1JFR19QQVJBTSAqcF9yZWdfcGFyYW0sIEJPT0xFQU4gaXNfcmVnaXN0ZXIsCitleHRlcm4gdm9pZCBCVEFfSGxVcGRhdGUodWludDhfdCAgYXBwX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfUkVHX1BBUkFNICpwX3JlZ19wYXJhbSwgYm9vbCBpc19yZWdpc3RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0NCQUNLICpwX2NiYWNrKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTY5NCw3ICs2OTQsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9IbFJlZ2lzdGVyKFVJTlQ4ICBhcHBfaWQsCitleHRlcm4gdm9pZCBCVEFfSGxSZWdpc3Rlcih1aW50OF90ICBhcHBfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX1JFR19QQVJBTSAqcF9yZWdfcGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0NCQUNLICpwX2NiYWNrKTsKIApAQCAtNzA5LDcgKzcwOSw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfSGxEZXJlZ2lzdGVyKFVJTlQ4IGFwcF9pZCx0QlRBX0hMX0FQUF9IQU5ETEUgYXBwX2hhbmRsZSk7CitleHRlcm4gdm9pZCBCVEFfSGxEZXJlZ2lzdGVyKHVpbnQ4X3QgYXBwX2lkLHRCVEFfSExfQVBQX0hBTkRMRSBhcHBfaGFuZGxlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC03MjksNyArNzI5LDcgQEAKICoqICAgICAgICAgICAgICAgICAgTm90ZTogSWYgdGhlIGNvbnRyb2wgUFNNIHZhbHVlIGlzIHplcm8gdGhlbiB0aGUgZmlyc3QgSERQCiAqKiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIGlzIHVzZWQgZm9yIHRoZSBjb250cm9sIGNoYW5uZWwgc2V0dXAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfSGxDY2hPcGVuKFVJTlQ4IGFwcF9pZCwgdEJUQV9ITF9BUFBfSEFORExFIGFwcF9oYW5kbGUsCitleHRlcm4gdm9pZCBCVEFfSGxDY2hPcGVuKHVpbnQ4X3QgYXBwX2lkLCB0QlRBX0hMX0FQUF9IQU5ETEUgYXBwX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9DQ0hfT1BFTl9QQVJBTSAqcF9vcGVuX3BhcmFtKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTgxNSw3ICs4MTUsNyBAQAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBleHRlcm4gdm9pZCBCVEFfSGxTZW5kRGF0YSh0QlRBX0hMX01ETF9IQU5ETEUgbWRsX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiAgICAgICAgICAgcGt0X3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgIHBrdF9zaXplKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC04NjQsNyArODY0LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gIHZvaWQgQlRBX0hsU2RwUXVlcnkoVUlOVDggIGFwcF9pZCx0QlRBX0hMX0FQUF9IQU5ETEUgYXBwX2hhbmRsZSwKK2V4dGVybiAgdm9pZCBCVEFfSGxTZHBRdWVyeSh1aW50OF90ICBhcHBfaWQsdEJUQV9ITF9BUFBfSEFORExFIGFwcF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRfQUREUiBiZF9hZGRyKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2J0YS9pbmNsdWRlL2J0YV9obF9jaS5oIGIvYnRhL2luY2x1ZGUvYnRhX2hsX2NpLmgKaW5kZXggNzA5MmZiYy4uMDljZGU1NiAxMDA2NDQKLS0tIGEvYnRhL2luY2x1ZGUvYnRhX2hsX2NpLmgKKysrIGIvYnRhL2luY2x1ZGUvYnRhX2hsX2NpLmgKQEAgLTYyLDcgKzYyLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBleHRlcm4gIHZvaWQgYnRhX2hsX2NpX2dldF90eF9kYXRhKCAgdEJUQV9ITF9NRExfSEFORExFIG1kbF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBldnQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBldnQgKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC04MSw3ICs4MSw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogZXh0ZXJuICB2b2lkIGJ0YV9obF9jaV9wdXRfcnhfZGF0YSggIHRCVEFfSExfTURMX0hBTkRMRSBtZGxfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgZXZ0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZXZ0ICk7CiAKIAogCkBAIC0xMDIsNyArMTAyLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBleHRlcm4gIHZvaWQgYnRhX2hsX2NpX2dldF9lY2hvX2RhdGEoICB0QlRBX0hMX01DTF9IQU5ETEUgbWNsX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBldnQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGV2dCApOwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMjIsNyArMTIyLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBleHRlcm4gdm9pZCBidGFfaGxfY2lfcHV0X2VjaG9fZGF0YSggIHRCVEFfSExfTUNMX0hBTkRMRSBtY2xfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBldnQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZXZ0ICk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX2hsX2NvLmggYi9idGEvaW5jbHVkZS9idGFfaGxfY28uaAppbmRleCBjZjI3YzgwLi44ZTY4NDdmIDEwMDY0NAotLS0gYS9idGEvaW5jbHVkZS9idGFfaGxfY28uaAorKysgYi9idGEvaW5jbHVkZS9idGFfaGxfY28uaApAQCAtNTEsMTAgKzUxLDEwIEBACiAqKiAgICAgICAgICAgICAgICAgcF9udW1fb2ZfbWRlcCAob3V0cHV0KSAtIG51bWJlciBvZiBNREVQIGNvbmZpZ3VyYXRpb25zIHN1cHBvcnRlZAogKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgYXBwbGljYXRpb24KICoqCi0qKiBSZXR1cm5zICAgICAgICAgQmxvb2xlYW4gLSBUUlVFIHN1Y2Nlc3MKKyoqIFJldHVybnMgICAgICAgICBCbG9vbGVhbiAtIHRydWUgc3VjY2VzcwogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gQk9PTEVBTiBidGFfaGxfY29fZ2V0X251bV9vZl9tZGVwKFVJTlQ4IGFwcF9pZCwgVUlOVDggKnBfbnVtX29mX21kZXApOworZXh0ZXJuIGJvb2wgYnRhX2hsX2NvX2dldF9udW1fb2ZfbWRlcCh1aW50OF90IGFwcF9pZCwgdWludDhfdCAqcF9udW1fb2ZfbWRlcCk7CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKICoqIEZ1bmN0aW9uICAgICAgICBidGFfaGxfY29fYWR2cnRpc2Vfc291cmNlX3NkcApAQCAtNjQsMTEgKzY0LDExIEBACiAqKgogKiogUGFyYW1ldGVycyAgICAgIGFwcF9pZCAtIGFwcGxpY2F0aW9uIElECiAqKgotKiogUmV0dXJucyAgICAgICAgIEJsb29sZWFuIC0gVFJVRSBhZHZlcnRpc2UgdGhlIFNPVVJDRSBNREVQIGNvbmZpZ3VyYXRpb24KKyoqIFJldHVybnMgICAgICAgICBCbG9vbGVhbiAtIHRydWUgYWR2ZXJ0aXNlIHRoZSBTT1VSQ0UgTURFUCBjb25maWd1cmF0aW9uCiAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gQk9PTEVBTiBidGFfaGxfY29fYWR2cnRpc2Vfc291cmNlX3NkcChVSU5UOCBhcHBfaWQpOworZXh0ZXJuIGJvb2wgYnRhX2hsX2NvX2FkdnJ0aXNlX3NvdXJjZV9zZHAodWludDhfdCBhcHBfaWQpOwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCiAqKiBGdW5jdGlvbiAgICAgICAgYnRhX2hsX2NvX2dldF9tZGVwX2NvbmZpZwpAQCAtODQsMTEgKzg0LDExIEBACiAqKiAgICAgICAgICAgICAgICAgcF9tZGxfY2ZnIChvdXRwdXQpIC0gcG9pbnRlciB0byB0aGUgTURFUCBjb25maWd1cmF0aW9uCiAqKgogKioKLSoqIFJldHVybnMgICAgICAgICBCbG9vbGVhbiAtIFRSVUUgc3VjY2VzcworKiogUmV0dXJucyAgICAgICAgIEJsb29sZWFuIC0gdHJ1ZSBzdWNjZXNzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIEJPT0xFQU4gYnRhX2hsX2NvX2dldF9tZGVwX2NvbmZpZyhVSU5UOCBhcHBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4IG1kZXBfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBtZGVwX2NvdW50ZXIsCitleHRlcm4gYm9vbCBidGFfaGxfY29fZ2V0X21kZXBfY29uZmlnKHVpbnQ4X3QgYXBwX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1kZXBfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1kZXBfY291bnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9NREVQX0lEIG1kZXBfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSExfTURFUF9DRkcgKnBfbWRlcF9jZmcpOwogCkBAIC0xMDQsOSArMTA0LDkgQEAKICoqICAgICAgICAgICAgICAgICBwX2VjaG9fY2ZnIChvdXRwdXQpIC0gcG9pbnRlciB0byB0aGUgRWNobyB0ZXN0IG1heGltdW0gQVBEVSBzaXplCiAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24KICoqCi0qKiBSZXR1cm5zICAgICAgICAgQmxvb2xlYW4gLSBUUlVFIHN1Y2Nlc3MKKyoqIFJldHVybnMgICAgICAgICBCbG9vbGVhbiAtIHRydWUgc3VjY2VzcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBCT09MRUFOIGJ0YV9obF9jb19nZXRfZWNob19jb25maWcoVUlOVDggIGFwcF9pZCwKK2V4dGVybiBib29sIGJ0YV9obF9jb19nZXRfZWNob19jb25maWcodWludDhfdCAgYXBwX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hMX0VDSE9fQ0ZHICpwX2VjaG9fY2ZnKTsKIAogCkBAIC0xMjQsNyArMTI0LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfaGxfY29fc2F2ZV9tZGwoVUlOVDggYXBwX2lkLCBVSU5UOCBpdGVtX2lkeCwgdEJUQV9ITF9NRExfQ0ZHICpwX21kbF9jZmcgKTsKK2V4dGVybiB2b2lkIGJ0YV9obF9jb19zYXZlX21kbCh1aW50OF90IGFwcF9pZCwgdWludDhfdCBpdGVtX2lkeCwgdEJUQV9ITF9NRExfQ0ZHICpwX21kbF9jZmcgKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgogKiogRnVuY3Rpb24gICAgICAgIGJ0YV9obF9jb19kZWxldGVfbWRsCkBAIC0xMzgsNyArMTM4LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfaGxfY29fZGVsZXRlX21kbChVSU5UOCBhcHBfaWQsIFVJTlQ4IGl0ZW1faWR4KTsKK2V4dGVybiB2b2lkIGJ0YV9obF9jb19kZWxldGVfbWRsKHVpbnQ4X3QgYXBwX2lkLCB1aW50OF90IGl0ZW1faWR4KTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgogKiogRnVuY3Rpb24gICAgICAgICBidGFfaGxfY29fZ2V0X21kbF9jb25maWcKQEAgLTE1MSwxMSArMTUxLDExIEBACiAqKiAgICAgICAgICAgICAgICAgYnVmZmVyX3NpemUgLSB0aGUgdW5pdCBvZiB0aGUgYnVmZmVyIHNpemUgaXMgc2l6ZW9mKHRCVEFfSExfTURMX0NGRykKICoqICAgICAgICAgICAgICAgICBwX21kbF9idWYgLSBQb2ludCB0byB0aGUgc3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGJ1ZmZlcgogKioKLSoqIFJldHVybnMgICAgICAgICBCT09MRUFOCisqKiBSZXR1cm5zICAgICAgICAgYm9vbAogKioKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIEJPT0xFQU4gYnRhX2hsX2NvX2xvYWRfbWRsX2NvbmZpZyAoVUlOVDggYXBwX2lkLCBVSU5UOCBidWZmZXJfc2l6ZSwKK2V4dGVybiBib29sIGJ0YV9obF9jb19sb2FkX21kbF9jb25maWcgKHVpbnQ4X3QgYXBwX2lkLCB1aW50OF90IGJ1ZmZlcl9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ITF9NRExfQ0ZHICpwX21kbF9idWYgKTsKIAogCkBAIC0xNzUsOCArMTc1LDggQEAKICoqIFJldHVybnMgICAgICAgIFZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2hsX2NvX2dldF90eF9kYXRhIChVSU5UOCBhcHBfaWQsIHRCVEFfSExfTURMX0hBTkRMRSBtZGxfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgYnVmX3NpemUsIFVJTlQ4ICpwX2J1ZiwgVUlOVDE2IGV2dCk7CitleHRlcm4gdm9pZCBidGFfaGxfY29fZ2V0X3R4X2RhdGEgKHVpbnQ4X3QgYXBwX2lkLCB0QlRBX0hMX01ETF9IQU5ETEUgbWRsX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYnVmX3NpemUsIHVpbnQ4X3QgKnBfYnVmLCB1aW50MTZfdCBldnQpOwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xOTUsOCArMTk1LDggQEAKICoqIFJldHVybnMgICAgICAgIFZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2hsX2NvX3B1dF9yeF9kYXRhIChVSU5UOCBhcHBfaWQsIHRCVEFfSExfTURMX0hBTkRMRSBtZGxfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgZGF0YV9zaXplLCBVSU5UOCAqcF9kYXRhLCBVSU5UMTYgZXZ0KTsKK2V4dGVybiB2b2lkIGJ0YV9obF9jb19wdXRfcnhfZGF0YSAodWludDhfdCBhcHBfaWQsIHRCVEFfSExfTURMX0hBTkRMRSBtZGxfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBkYXRhX3NpemUsIHVpbnQ4X3QgKnBfZGF0YSwgdWludDE2X3QgZXZ0KTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgogKiogRnVuY3Rpb24gICAgICAgICBidGFfaGxfY29fZ2V0X3R4X2RhdGEKQEAgLTIxMyw4ICsyMTMsOCBAQAogKiogUmV0dXJucyAgICAgICAgVm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfaGxfY29fZ2V0X2VjaG9fZGF0YSAoVUlOVDggYXBwX2lkLCB0QlRBX0hMX01DTF9IQU5ETEUgbWNsX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgYnVmX3NpemUsIFVJTlQ4ICpwX2J1ZiwgVUlOVDE2IGV2dCk7CitleHRlcm4gdm9pZCBidGFfaGxfY29fZ2V0X2VjaG9fZGF0YSAodWludDhfdCBhcHBfaWQsIHRCVEFfSExfTUNMX0hBTkRMRSBtY2xfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJ1Zl9zaXplLCB1aW50OF90ICpwX2J1ZiwgdWludDE2X3QgZXZ0KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0yMzIsOCArMjMyLDggQEAKICoqIFJldHVybnMgICAgICAgIFZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2hsX2NvX3B1dF9lY2hvX2RhdGEgKFVJTlQ4IGFwcF9pZCwgdEJUQV9ITF9NQ0xfSEFORExFIG1jbF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IGRhdGFfc2l6ZSwgVUlOVDggKnBfZGF0YSwgVUlOVDE2IGV2dCk7CitleHRlcm4gdm9pZCBidGFfaGxfY29fcHV0X2VjaG9fZGF0YSAodWludDhfdCBhcHBfaWQsIHRCVEFfSExfTUNMX0hBTkRMRSBtY2xfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfc2l6ZSwgdWludDhfdCAqcF9kYXRhLCB1aW50MTZfdCBldnQpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL2J0YS9pbmNsdWRlL2J0YV9qdl9hcGkuaCBiL2J0YS9pbmNsdWRlL2J0YV9qdl9hcGkuaAppbmRleCA0NTI0NWEyLi4zZmMwM2Q5IDEwMDY0NAotLS0gYS9idGEvaW5jbHVkZS9idGFfanZfYXBpLmgKKysrIGIvYnRhL2luY2x1ZGUvYnRhX2p2X2FwaS5oCkBAIC00NCw3ICs0NCw3IEBACiAjZGVmaW5lIEJUQV9KVl9OT19EQVRBICAgICAgICAgICAgIDMgICAgICAgICAgICAvKiBubyBkYXRhLiAqLwogI2RlZmluZSBCVEFfSlZfTk9fUkVTT1VSQ0UgICAgICAgICA0ICAgICAgICAgICAgLyogTm8gbW9yZSBzZXQgcG0gY29udHJvbCBibG9jayAqLwogCi10eXBlZGVmIFVJTlQ4IHRCVEFfSlZfU1RBVFVTOwordHlwZWRlZiB1aW50OF90IHRCVEFfSlZfU1RBVFVTOwogI2RlZmluZSBCVEFfSlZfSU5URVJOQUxfRVJSICAgICAgICAoLTEpIC8qIGludGVybmFsIGVycm9yLiAqLwogCiAjZGVmaW5lIEJUQV9KVl9NQVhfVVVJRFMgICAgICAgIFNEUF9NQVhfVVVJRF9GSUxURVJTCkBAIC03OSwxMSArNzksMTEgQEAKICAgICBCVEFfSlZfRElTQ19MSU1JVEVELAogICAgIEJUQV9KVl9ESVNDX0dFTkVSQUwKIH07Ci10eXBlZGVmIFVJTlQxNiB0QlRBX0pWX0RJU0M7Cit0eXBlZGVmIHVpbnQxNl90IHRCVEFfSlZfRElTQzsKIAogI2RlZmluZSBCVEFfSlZfUk9MRV9TTEFWRSAgICAgICBCVE1fUk9MRV9TTEFWRQogI2RlZmluZSBCVEFfSlZfUk9MRV9NQVNURVIgICAgICBCVE1fUk9MRV9NQVNURVIKLXR5cGVkZWYgVUlOVDMyIHRCVEFfSlZfUk9MRTsKK3R5cGVkZWYgdWludDMyX3QgdEJUQV9KVl9ST0xFOwogCiAjZGVmaW5lIEJUQV9KVl9TRVJWSUNFX0xNVERfRElTQ09WRVIgICAgQlRNX0NPRF9TRVJWSUNFX0xNVERfRElTQ09WRVIgICAvKiAweDAwMjAgKi8KICNkZWZpbmUgQlRBX0pWX1NFUlZJQ0VfUE9TSVRJT05JTkcgICAgICBCVE1fQ09EX1NFUlZJQ0VfUE9TSVRJT05JTkcgICAgIC8qIDB4MDEwMCAqLwpAQCAtMTAwLDcgKzEwMCw3IEBACiAjZGVmaW5lIEJUQV9KVl9QTV9JRF8yICAgICAgICAgICAgIDIgICAgLyogUE0gZXhhbXBsZSBwcm9maWxlIDIgKi8KICNkZWZpbmUgQlRBX0pWX1BNX0lEX0NMRUFSICAgICAgICAgMCAgICAvKiBTcGVjaWFsIEpWIElEIHVzZWQgdG8gY2xlYXIgUE0gcHJvZmlsZSAqLwogI2RlZmluZSBCVEFfSlZfUE1fQUxMICAgICAgICAgICAgICAweEZGIC8qIEdlbmVyaWMgbWF0Y2ggYWxsIGlkLCBzZWUgYnRhX2RtX2NmZy5jICovCi10eXBlZGVmIFVJTlQ4IHRCVEFfSlZfUE1fSUQ7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9KVl9QTV9JRDsKIAogI2RlZmluZSBCVEFfSlZfUE1fSEFORExFX0NMRUFSICAgICAweEZGIC8qIFNwZWNpYWwgSlYgSUQgdXNlZCB0byBjbGVhciBQTSBwcm9maWxlICAqLwogCkBAIC0xMjIsNyArMTIyLDcgQEAKICAgICBCVEFfSlZfQ09OTl9CVVNZLCAgICAgICAvKiBDb25uZWN0aW9uIGJ1c3kgc3RhdGUgKi8KICAgICBCVEFfSlZfTUFYX0NPTk5fU1RBVEUgICAvKiBNYXggbnVtYmVyIG9mIGNvbm5lY3Rpb24gc3RhdGUgKi8KIH07Ci10eXBlZGVmIFVJTlQ4IHRCVEFfSlZfQ09OTl9TVEFURTsKK3R5cGVkZWYgdWludDhfdCB0QlRBX0pWX0NPTk5fU1RBVEU7CiAKIC8qIEpWIENvbm5lY3Rpb24gdHlwZXMgKi8KICNkZWZpbmUgQlRBX0pWX0NPTk5fVFlQRV9SRkNPTU0gICAgMApAQCAtMTU4LDcgKzE1OCw3IEBACiAjZGVmaW5lIEJUQV9KVl9SRkNPTU1fU1JWX09QRU5fRVZUICAzNCAvKiBvcGVuIHN0YXR1cyBvZiBTZXJ2ZXIgUkZDT01NIGNvbm5lY3Rpb24gKi8KICNkZWZpbmUgQlRBX0pWX01BWF9FVlQgICAgICAgICAgICAgIDM1IC8qIG1heCBudW1iZXIgb2YgSlYgZXZlbnRzICovCiAKLXR5cGVkZWYgVUlOVDE2IHRCVEFfSlZfRVZUOwordHlwZWRlZiB1aW50MTZfdCB0QlRBX0pWX0VWVDsKIAogLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0pWX1NFVF9ESVNDT1ZFUl9FVlQgKi8KIHR5cGVkZWYgc3RydWN0CkBAIC0xODQsMTggKzE4NCwxOCBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICB0QlRBX0pWX1NUQVRVUyAgc3RhdHVzOyAgICAgLyogV2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCBvciBmYWlsZWQuICovCi0gICAgVUlOVDMyICAgICAgICAgIGhhbmRsZTsgICAgIC8qIFRoZSBjb25uZWN0aW9uIGhhbmRsZSAqLworICAgIHVpbnQzMl90ICAgICAgICAgIGhhbmRsZTsgICAgIC8qIFRoZSBjb25uZWN0aW9uIGhhbmRsZSAqLwogICAgIEJEX0FERFIgICAgICAgICByZW1fYmRhOyAgICAvKiBUaGUgcGVlciBhZGRyZXNzICovCi0gICAgSU5UMzIgICAgICAgICAgIHR4X210dTsgICAgIC8qIFRoZSB0cmFuc21pdCBNVFUgKi8KKyAgICBpbnQzMl90ICAgICAgICAgICB0eF9tdHU7ICAgICAvKiBUaGUgdHJhbnNtaXQgTVRVICovCiB9IHRCVEFfSlZfTDJDQVBfT1BFTjsKIAogLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0pWX0wyQ0FQX09QRU5fRVZUIGZvciBMRSBzb2NrZXRzICovCiB0eXBlZGVmIHN0cnVjdAogewogICAgIHRCVEFfSlZfU1RBVFVTICBzdGF0dXM7ICAgICAvKiBXaGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkIG9yIGZhaWxlZC4gKi8KLSAgICBVSU5UMzIgICAgICAgICAgaGFuZGxlOyAgICAgLyogVGhlIGNvbm5lY3Rpb24gaGFuZGxlICovCisgICAgdWludDMyX3QgICAgICAgICAgaGFuZGxlOyAgICAgLyogVGhlIGNvbm5lY3Rpb24gaGFuZGxlICovCiAgICAgQkRfQUREUiAgICAgICAgIHJlbV9iZGE7ICAgIC8qIFRoZSBwZWVyIGFkZHJlc3MgKi8KLSAgICBJTlQzMiAgICAgICAgICAgdHhfbXR1OyAgICAgLyogVGhlIHRyYW5zbWl0IE1UVSAqLworICAgIGludDMyX3QgICAgICAgICAgIHR4X210dTsgICAgIC8qIFRoZSB0cmFuc21pdCBNVFUgKi8KICAgICB2b2lkICAgICAgICAgICoqcF9wX2NiYWNrOyAgLyogc2V0IHRoZW0gZm9yIG5ldyBzb2NrZXQgKi8KICAgICB2b2lkICAgICAgICAgICoqcF91c2VyX2RhdGE7Lyogc2V0IHRoZW0gZm9yIG5ldyBzb2NrZXQgKi8KIApAQCAtMjA2LDUzICsyMDYsNTMgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgdEJUQV9KVl9TVEFUVVMgIHN0YXR1czsgICAgIC8qIFdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQgb3IgZmFpbGVkLiAqLwotICAgIFVJTlQzMiAgICAgICAgICBoYW5kbGU7ICAgICAvKiBUaGUgY29ubmVjdGlvbiBoYW5kbGUgKi8KLSAgICBCT09MRUFOICAgICAgICAgYXN5bmM7ICAgICAgLyogRkFMU0UsIGlmIGxvY2FsIGluaXRpYXRlcyBkaXNjb25uZWN0ICovCisgICAgdWludDMyX3QgICAgICAgICAgaGFuZGxlOyAgICAgLyogVGhlIGNvbm5lY3Rpb24gaGFuZGxlICovCisgICAgYm9vbCAgICAgICAgIGFzeW5jOyAgICAgIC8qIGZhbHNlLCBpZiBsb2NhbCBpbml0aWF0ZXMgZGlzY29ubmVjdCAqLwogfSB0QlRBX0pWX0wyQ0FQX0NMT1NFOwogCiAvKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfSlZfTDJDQVBfU1RBUlRfRVZUICovCiB0eXBlZGVmIHN0cnVjdAogewogICAgIHRCVEFfSlZfU1RBVFVTICBzdGF0dXM7ICAgICAvKiBXaGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkIG9yIGZhaWxlZC4gKi8KLSAgICBVSU5UMzIgICAgICAgICAgaGFuZGxlOyAgICAgLyogVGhlIGNvbm5lY3Rpb24gaGFuZGxlICovCi0gICAgVUlOVDggICAgICAgICAgIHNlY19pZDsgICAgIC8qIHNlY3VyaXR5IElEIHVzZWQgYnkgdGhpcyBzZXJ2ZXIgKi8KKyAgICB1aW50MzJfdCAgICAgICAgICBoYW5kbGU7ICAgICAvKiBUaGUgY29ubmVjdGlvbiBoYW5kbGUgKi8KKyAgICB1aW50OF90ICAgICAgICAgICBzZWNfaWQ7ICAgICAvKiBzZWN1cml0eSBJRCB1c2VkIGJ5IHRoaXMgc2VydmVyICovCiB9IHRCVEFfSlZfTDJDQVBfU1RBUlQ7CiAKIC8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9KVl9MMkNBUF9DTF9JTklUX0VWVCAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICB0QlRBX0pWX1NUQVRVUyAgc3RhdHVzOyAgICAgLyogV2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCBvciBmYWlsZWQuICovCi0gICAgVUlOVDMyICAgICAgICAgIGhhbmRsZTsgICAgIC8qIFRoZSBjb25uZWN0aW9uIGhhbmRsZSAqLwotICAgIFVJTlQ4ICAgICAgICAgICBzZWNfaWQ7ICAgICAvKiBzZWN1cml0eSBJRCB1c2VkIGJ5IHRoaXMgY2xpZW50ICovCisgICAgdWludDMyX3QgICAgICAgICAgaGFuZGxlOyAgICAgLyogVGhlIGNvbm5lY3Rpb24gaGFuZGxlICovCisgICAgdWludDhfdCAgICAgICAgICAgc2VjX2lkOyAgICAgLyogc2VjdXJpdHkgSUQgdXNlZCBieSB0aGlzIGNsaWVudCAqLwogfSB0QlRBX0pWX0wyQ0FQX0NMX0lOSVQ7CiAKIC8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9KVl9MMkNBUF9DT05HX0VWVCAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICB0QlRBX0pWX1NUQVRVUyAgc3RhdHVzOyAgICAgLyogV2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCBvciBmYWlsZWQuICovCi0gICAgVUlOVDMyICAgICAgICAgIGhhbmRsZTsgICAgIC8qIFRoZSBjb25uZWN0aW9uIGhhbmRsZSAqLwotICAgIEJPT0xFQU4gICAgICAgICBjb25nOyAgICAgICAvKiBUUlVFLCBjb25nZXN0ZWQuIEZBTFNFLCB1bmNvbmdlc3RlZCAqLworICAgIHVpbnQzMl90ICAgICAgICAgIGhhbmRsZTsgICAgIC8qIFRoZSBjb25uZWN0aW9uIGhhbmRsZSAqLworICAgIGJvb2wgICAgICAgICBjb25nOyAgICAgICAvKiB0cnVlLCBjb25nZXN0ZWQuIGZhbHNlLCB1bmNvbmdlc3RlZCAqLwogfSB0QlRBX0pWX0wyQ0FQX0NPTkc7CiAKIC8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9KVl9MMkNBUF9SRUFEX0VWVCAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICB0QlRBX0pWX1NUQVRVUyAgc3RhdHVzOyAgICAgLyogV2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCBvciBmYWlsZWQuICovCi0gICAgVUlOVDMyICAgICAgICAgIGhhbmRsZTsgICAgIC8qIFRoZSBjb25uZWN0aW9uIGhhbmRsZSAqLwotICAgIFVJTlQzMiAgICAgICAgICByZXFfaWQ7ICAgICAvKiBUaGUgcmVxX2lkIGluIHRoZSBhc3NvY2lhdGVkIEJUQV9KdkwyY2FwUmVhZCgpICovCi0gICAgVUlOVDggICAgICAgICAgICpwX2RhdGE7ICAgIC8qIFRoaXMgcG9pbnRzIHRoZSBzYW1lIGxvY2F0aW9uIGFzIHRoZSBwX2RhdGEKKyAgICB1aW50MzJfdCAgICAgICAgICBoYW5kbGU7ICAgICAvKiBUaGUgY29ubmVjdGlvbiBoYW5kbGUgKi8KKyAgICB1aW50MzJfdCAgICAgICAgICByZXFfaWQ7ICAgICAvKiBUaGUgcmVxX2lkIGluIHRoZSBhc3NvY2lhdGVkIEJUQV9KdkwyY2FwUmVhZCgpICovCisgICAgdWludDhfdCAgICAgICAgICAgKnBfZGF0YTsgICAgLyogVGhpcyBwb2ludHMgdGhlIHNhbWUgbG9jYXRpb24gYXMgdGhlIHBfZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwYXJhbWV0ZXIgaW4gQlRBX0p2TDJjYXBSZWFkICgpICovCi0gICAgVUlOVDE2ICAgICAgICAgIGxlbjsgICAgICAgIC8qIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgcmVhZC4gKi8KKyAgICB1aW50MTZfdCAgICAgICAgICBsZW47ICAgICAgICAvKiBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHJlYWQuICovCiB9IHRCVEFfSlZfTDJDQVBfUkVBRDsKIAogLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0pWX0wyQ0FQX1dSSVRFX0VWVCAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICB0QlRBX0pWX1NUQVRVUyAgc3RhdHVzOyAgICAgLyogV2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCBvciBmYWlsZWQuICovCi0gICAgVUlOVDMyICAgICAgICAgIGhhbmRsZTsgICAgIC8qIFRoZSBjb25uZWN0aW9uIGhhbmRsZSAqLwotICAgIFVJTlQzMiAgICAgICAgICByZXFfaWQ7ICAgICAvKiBUaGUgcmVxX2lkIGluIHRoZSBhc3NvY2lhdGVkIEJUQV9KdkwyY2FwV3JpdGUoKSAqLwotICAgIFVJTlQxNiAgICAgICAgICBsZW47ICAgICAgICAvKiBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHdyaXR0ZW4uICovCi0gICAgQk9PTEVBTiAgICAgICAgIGNvbmc7ICAgICAgIC8qIGNvbmdlc3Rpb24gc3RhdHVzICovCisgICAgdWludDMyX3QgICAgICAgICAgaGFuZGxlOyAgICAgLyogVGhlIGNvbm5lY3Rpb24gaGFuZGxlICovCisgICAgdWludDMyX3QgICAgICAgICAgcmVxX2lkOyAgICAgLyogVGhlIHJlcV9pZCBpbiB0aGUgYXNzb2NpYXRlZCBCVEFfSnZMMmNhcFdyaXRlKCkgKi8KKyAgICB1aW50MTZfdCAgICAgICAgICBsZW47ICAgICAgICAvKiBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHdyaXR0ZW4uICovCisgICAgYm9vbCAgICAgICAgIGNvbmc7ICAgICAgIC8qIGNvbmdlc3Rpb24gc3RhdHVzICovCiB9IHRCVEFfSlZfTDJDQVBfV1JJVEU7CiAKIApAQCAtMjYwLDI2ICsyNjAsMjYgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgdEJUQV9KVl9TVEFUVVMgIHN0YXR1czsgICAgIC8qIFdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQgb3IgZmFpbGVkLiAqLwotICAgIFVJTlQxNiAgICAgICAgICBjaGFubmVsOyAgICAvKiBUaGUgY29ubmVjdGlvbiBjaGFubmVsICovCisgICAgdWludDE2X3QgICAgICAgICAgY2hhbm5lbDsgICAgLyogVGhlIGNvbm5lY3Rpb24gY2hhbm5lbCAqLwogICAgIEJEX0FERFIgICAgICAgICBhZGRyOyAgICAgICAvKiBUaGUgcGVlciBhZGRyZXNzICovCi0gICAgVUlOVDMyICAgICAgICAgIHJlcV9pZDsgICAgIC8qIFRoZSByZXFfaWQgaW4gdGhlIGFzc29jaWF0ZWQgQlRBX0p2TDJjYXBXcml0ZSgpICovCi0gICAgVUlOVDE2ICAgICAgICAgIGxlbjsgICAgICAgIC8qIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgd3JpdHRlbi4gKi8KLSAgICBCT09MRUFOICAgICAgICAgY29uZzsgICAgICAgLyogY29uZ2VzdGlvbiBzdGF0dXMgKi8KKyAgICB1aW50MzJfdCAgICAgICAgICByZXFfaWQ7ICAgICAvKiBUaGUgcmVxX2lkIGluIHRoZSBhc3NvY2lhdGVkIEJUQV9KdkwyY2FwV3JpdGUoKSAqLworICAgIHVpbnQxNl90ICAgICAgICAgIGxlbjsgICAgICAgIC8qIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgd3JpdHRlbi4gKi8KKyAgICBib29sICAgICAgICAgY29uZzsgICAgICAgLyogY29uZ2VzdGlvbiBzdGF0dXMgKi8KIH0gdEJUQV9KVl9MMkNBUF9XUklURV9GSVhFRDsKIAogLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0pWX1JGQ09NTV9PUEVOX0VWVCAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICB0QlRBX0pWX1NUQVRVUyAgc3RhdHVzOyAgICAgLyogV2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCBvciBmYWlsZWQuICovCi0gICAgVUlOVDMyICAgICAgICAgIGhhbmRsZTsgICAgIC8qIFRoZSBjb25uZWN0aW9uIGhhbmRsZSAqLworICAgIHVpbnQzMl90ICAgICAgICAgIGhhbmRsZTsgICAgIC8qIFRoZSBjb25uZWN0aW9uIGhhbmRsZSAqLwogICAgIEJEX0FERFIgICAgICAgICByZW1fYmRhOyAgICAvKiBUaGUgcGVlciBhZGRyZXNzICovCiB9IHRCVEFfSlZfUkZDT01NX09QRU47CiAvKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfSlZfUkZDT01NX1NSVl9PUEVOX0VWVCAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICB0QlRBX0pWX1NUQVRVUyAgc3RhdHVzOyAgICAgICAgICAgICAvKiBXaGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkIG9yIGZhaWxlZC4gKi8KLSAgICBVSU5UMzIgICAgICAgICAgaGFuZGxlOyAgICAgICAgICAgICAvKiBUaGUgY29ubmVjdGlvbiBoYW5kbGUgKi8KLSAgICBVSU5UMzIgICAgICAgICAgbmV3X2xpc3Rlbl9oYW5kbGU7ICAvKiBUaGUgbmV3IGxpc3RlbiBoYW5kbGUgKi8KKyAgICB1aW50MzJfdCAgICAgICAgICBoYW5kbGU7ICAgICAgICAgICAgIC8qIFRoZSBjb25uZWN0aW9uIGhhbmRsZSAqLworICAgIHVpbnQzMl90ICAgICAgICAgIG5ld19saXN0ZW5faGFuZGxlOyAgLyogVGhlIG5ldyBsaXN0ZW4gaGFuZGxlICovCiAgICAgQkRfQUREUiAgICAgICAgIHJlbV9iZGE7ICAgICAgICAgICAgLyogVGhlIHBlZXIgYWRkcmVzcyAqLwogfSB0QlRBX0pWX1JGQ09NTV9TUlZfT1BFTjsKIApAQCAtMjg4LDM4ICsyODgsMzggQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgdEJUQV9KVl9TVEFUVVMgIHN0YXR1czsgICAgICAvKiBXaGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkIG9yIGZhaWxlZC4gKi8KLSAgICBVSU5UMzIgICAgICAgICAgcG9ydF9zdGF0dXM7IC8qIFBPUlQgc3RhdHVzICovCi0gICAgVUlOVDMyICAgICAgICAgIGhhbmRsZTsgICAgICAvKiBUaGUgY29ubmVjdGlvbiBoYW5kbGUgKi8KLSAgICBCT09MRUFOICAgICAgICAgYXN5bmM7ICAgICAgIC8qIEZBTFNFLCBpZiBsb2NhbCBpbml0aWF0ZXMgZGlzY29ubmVjdCAqLworICAgIHVpbnQzMl90ICAgICAgICAgIHBvcnRfc3RhdHVzOyAvKiBQT1JUIHN0YXR1cyAqLworICAgIHVpbnQzMl90ICAgICAgICAgIGhhbmRsZTsgICAgICAvKiBUaGUgY29ubmVjdGlvbiBoYW5kbGUgKi8KKyAgICBib29sICAgICAgICAgYXN5bmM7ICAgICAgIC8qIGZhbHNlLCBpZiBsb2NhbCBpbml0aWF0ZXMgZGlzY29ubmVjdCAqLwogfSB0QlRBX0pWX1JGQ09NTV9DTE9TRTsKIAogLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0pWX1JGQ09NTV9TVEFSVF9FVlQgKi8KIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgdEJUQV9KVl9TVEFUVVMgIHN0YXR1czsgICAgIC8qIFdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQgb3IgZmFpbGVkLiAqLwotICAgIFVJTlQzMiAgICAgICAgICBoYW5kbGU7ICAgICAvKiBUaGUgY29ubmVjdGlvbiBoYW5kbGUgKi8KLSAgICBVSU5UOCAgICAgICAgICAgc2VjX2lkOyAgICAgLyogc2VjdXJpdHkgSUQgdXNlZCBieSB0aGlzIHNlcnZlciAqLwotICAgIEJPT0xFQU4gICAgICAgICB1c2VfY287ICAgICAvKiBUUlVFIHRvIHVzZSBjb19yZmNfZGF0YSAqLworICAgIHVpbnQzMl90ICAgICAgICAgIGhhbmRsZTsgICAgIC8qIFRoZSBjb25uZWN0aW9uIGhhbmRsZSAqLworICAgIHVpbnQ4X3QgICAgICAgICAgIHNlY19pZDsgICAgIC8qIHNlY3VyaXR5IElEIHVzZWQgYnkgdGhpcyBzZXJ2ZXIgKi8KKyAgICBib29sICAgICAgICAgdXNlX2NvOyAgICAgLyogdHJ1ZSB0byB1c2UgY29fcmZjX2RhdGEgKi8KIH0gdEJUQV9KVl9SRkNPTU1fU1RBUlQ7CiAKIC8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9KVl9SRkNPTU1fQ0xfSU5JVF9FVlQgKi8KIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgdEJUQV9KVl9TVEFUVVMgIHN0YXR1czsgICAgIC8qIFdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQgb3IgZmFpbGVkLiAqLwotICAgIFVJTlQzMiAgICAgICAgICBoYW5kbGU7ICAgICAvKiBUaGUgY29ubmVjdGlvbiBoYW5kbGUgKi8KLSAgICBVSU5UOCAgICAgICAgICAgc2VjX2lkOyAgICAgLyogc2VjdXJpdHkgSUQgdXNlZCBieSB0aGlzIGNsaWVudCAqLwotICAgIEJPT0xFQU4gICAgICAgICB1c2VfY287ICAgICAvKiBUUlVFIHRvIHVzZSBjb19yZmNfZGF0YSAqLworICAgIHVpbnQzMl90ICAgICAgICAgIGhhbmRsZTsgICAgIC8qIFRoZSBjb25uZWN0aW9uIGhhbmRsZSAqLworICAgIHVpbnQ4X3QgICAgICAgICAgIHNlY19pZDsgICAgIC8qIHNlY3VyaXR5IElEIHVzZWQgYnkgdGhpcyBjbGllbnQgKi8KKyAgICBib29sICAgICAgICAgdXNlX2NvOyAgICAgLyogdHJ1ZSB0byB1c2UgY29fcmZjX2RhdGEgKi8KIH0gdEJUQV9KVl9SRkNPTU1fQ0xfSU5JVDsKIC8qZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0pWX0wyQ0FQX0RBVEFfSU5EX0VWVCAmIEJUQV9KVl9SRkNPTU1fREFUQV9JTkRfRVZUICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQzMiAgICAgICAgICBoYW5kbGU7ICAgICAvKiBUaGUgY29ubmVjdGlvbiBoYW5kbGUgKi8KKyAgICB1aW50MzJfdCAgICAgICAgICBoYW5kbGU7ICAgICAvKiBUaGUgY29ubmVjdGlvbiBoYW5kbGUgKi8KIH0gdEJUQV9KVl9EQVRBX0lORDsKIAogLypkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfSlZfTDJDQVBfREFUQV9JTkRfRVZUIGlmIHVzZWQgZm9yIExFICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQzMiAgICAgICAgICBoYW5kbGU7ICAgICAvKiBUaGUgY29ubmVjdGlvbiBoYW5kbGUgKi8KKyAgICB1aW50MzJfdCAgICAgICAgICBoYW5kbGU7ICAgICAvKiBUaGUgY29ubmVjdGlvbiBoYW5kbGUgKi8KICAgICBCVF9IRFIgICAgICAgICAqcF9idWY7ICAgICAgLyogVGhlIGluY29taW5nIGRhdGEgKi8KIH0gdEJUQV9KVl9MRV9EQVRBX0lORDsKIApAQCAtMzI4LDMyICszMjgsMzIgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgdEJUQV9KVl9TVEFUVVMgIHN0YXR1czsgICAgIC8qIFdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQgb3IgZmFpbGVkLiAqLwotICAgIFVJTlQzMiAgICAgICAgICBoYW5kbGU7ICAgICAvKiBUaGUgY29ubmVjdGlvbiBoYW5kbGUgKi8KLSAgICBCT09MRUFOICAgICAgICAgY29uZzsgICAgICAgLyogVFJVRSwgY29uZ2VzdGVkLiBGQUxTRSwgdW5jb25nZXN0ZWQgKi8KKyAgICB1aW50MzJfdCAgICAgICAgICBoYW5kbGU7ICAgICAvKiBUaGUgY29ubmVjdGlvbiBoYW5kbGUgKi8KKyAgICBib29sICAgICAgICAgY29uZzsgICAgICAgLyogdHJ1ZSwgY29uZ2VzdGVkLiBmYWxzZSwgdW5jb25nZXN0ZWQgKi8KIH0gdEJUQV9KVl9SRkNPTU1fQ09ORzsKIAogLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0pWX1JGQ09NTV9XUklURV9FVlQgKi8KIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgdEJUQV9KVl9TVEFUVVMgIHN0YXR1czsgICAgIC8qIFdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQgb3IgZmFpbGVkLiAqLwotICAgIFVJTlQzMiAgICAgICAgICBoYW5kbGU7ICAgICAvKiBUaGUgY29ubmVjdGlvbiBoYW5kbGUgKi8KLSAgICBVSU5UMzIgICAgICAgICAgcmVxX2lkOyAgICAgLyogVGhlIHJlcV9pZCBpbiB0aGUgYXNzb2NpYXRlZCBCVEFfSnZSZmNvbW1Xcml0ZSgpICovCisgICAgdWludDMyX3QgICAgICAgICAgaGFuZGxlOyAgICAgLyogVGhlIGNvbm5lY3Rpb24gaGFuZGxlICovCisgICAgdWludDMyX3QgICAgICAgICAgcmVxX2lkOyAgICAgLyogVGhlIHJlcV9pZCBpbiB0aGUgYXNzb2NpYXRlZCBCVEFfSnZSZmNvbW1Xcml0ZSgpICovCiAgICAgaW50ICAgICAgICAgICAgIGxlbjsgICAgICAgIC8qIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgd3JpdHRlbi4gKi8KLSAgICBCT09MRUFOICAgICAgICAgY29uZzsgICAgICAgLyogY29uZ2VzdGlvbiBzdGF0dXMgKi8KKyAgICBib29sICAgICAgICAgY29uZzsgICAgICAgLyogY29uZ2VzdGlvbiBzdGF0dXMgKi8KIH0gdEJUQV9KVl9SRkNPTU1fV1JJVEU7CiAKIC8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9KVl9BUElfU0VUX1BNX1BST0ZJTEVfRVZUICovCiB0eXBlZGVmIHN0cnVjdAogewogICAgIHRCVEFfSlZfU1RBVFVTICBzdGF0dXM7ICAgICAvKiBTdGF0dXMgb2YgdGhlIG9wZXJhdGlvbiAqLwotICAgIFVJTlQzMiAgICAgICAgICBoYW5kbGU7ICAgICAvKiBDb25uZWN0aW9uIGhhbmRsZSAqLworICAgIHVpbnQzMl90ICAgICAgICAgIGhhbmRsZTsgICAgIC8qIENvbm5lY3Rpb24gaGFuZGxlICovCiAgICAgdEJUQV9KVl9QTV9JRCAgIGFwcF9pZDsgICAgICAvKiBKViBhcHAgSUQgKi8KIH0gdEJUQV9KVl9TRVRfUE1fUFJPRklMRTsKIAogLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0pWX0FQSV9OT1RJRllfUE1fU1RBVEVfQ0hBTkdFX0VWVCAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UMzIgICAgICAgICAgaGFuZGxlOyAgICAgLyogQ29ubmVjdGlvbiBoYW5kbGUgKi8KKyAgICB1aW50MzJfdCAgICAgICAgICBoYW5kbGU7ICAgICAvKiBDb25uZWN0aW9uIGhhbmRsZSAqLwogICAgIHRCVEFfSlZfQ09OTl9TVEFURSAgc3RhdGU7ICAvKiBKViBjb25uZWN0aW9uIHN0YXRhICovCiB9IHRCVEFfSlZfTk9USUZZX1BNX1NUQVRFX0NIQU5HRTsKIApAQCAtMzY0LDggKzM2NCw4IEBACiAgICAgdEJUQV9KVl9TVEFUVVMgICAgICAgICAgc3RhdHVzOyAgICAgICAgIC8qIEJUQV9KVl9FTkFCTEVfRVZUICovCiAgICAgdEJUQV9KVl9ESVNDT1ZFUllfQ09NUCAgZGlzY19jb21wOyAgICAgIC8qIEJUQV9KVl9ESVNDT1ZFUllfQ09NUF9FVlQgKi8KICAgICB0QlRBX0pWX1NFVF9ESVNDT1ZFUiAgICBzZXRfZGlzY292ZXI7ICAgLyogQlRBX0pWX1NFVF9ESVNDT1ZFUl9FVlQgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBzY247ICAgICAgICAgICAgLyogQlRBX0pWX0dFVF9TQ05fRVZUICovCi0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgcHNtOyAgICAgICAgICAgIC8qIEJUQV9KVl9HRVRfUFNNX0VWVCAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgc2NuOyAgICAgICAgICAgIC8qIEJUQV9KVl9HRVRfU0NOX0VWVCAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgcHNtOyAgICAgICAgICAgIC8qIEJUQV9KVl9HRVRfUFNNX0VWVCAqLwogICAgIHRCVEFfSlZfQ1JFQVRFX1JFQ09SRCAgIGNyZWF0ZV9yZWM7ICAgICAvKiBCVEFfSlZfQ1JFQVRFX1JFQ09SRF9FVlQgKi8KICAgICB0QlRBX0pWX0wyQ0FQX09QRU4gICAgICBsMmNfb3BlbjsgICAgICAgLyogQlRBX0pWX0wyQ0FQX09QRU5fRVZUICovCiAgICAgdEJUQV9KVl9MMkNBUF9DTE9TRSAgICAgbDJjX2Nsb3NlOyAgICAgIC8qIEJUQV9KVl9MMkNBUF9DTE9TRV9FVlQgKi8KQEAgLTQwMCw5ICs0MDAsOSBAQAogLyogSlYgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDE2ICBzZHBfcmF3X3NpemU7ICAgICAgICAgICAvKiBUaGUgc2l6ZSBvZiBwX3NkcF9yYXdfZGF0YSAqLwotICAgIFVJTlQxNiAgc2RwX2RiX3NpemU7ICAgICAgICAgICAgLyogVGhlIHNpemUgb2YgcF9zZHBfZGIgKi8KLSAgICBVSU5UOCAgICpwX3NkcF9yYXdfZGF0YTsgICAgICAgIC8qIFRoZSBkYXRhIGJ1ZmZlciB0byBrZWVwIHJhdyBkYXRhICovCisgICAgdWludDE2X3QgIHNkcF9yYXdfc2l6ZTsgICAgICAgICAgIC8qIFRoZSBzaXplIG9mIHBfc2RwX3Jhd19kYXRhICovCisgICAgdWludDE2X3QgIHNkcF9kYl9zaXplOyAgICAgICAgICAgIC8qIFRoZSBzaXplIG9mIHBfc2RwX2RiICovCisgICAgdWludDhfdCAgICpwX3NkcF9yYXdfZGF0YTsgICAgICAgIC8qIFRoZSBkYXRhIGJ1ZmZlciB0byBrZWVwIHJhdyBkYXRhICovCiAgICAgdFNEUF9ESVNDT1ZFUllfREIgICAqcF9zZHBfZGI7ICAvKiBUaGUgZGF0YSBidWZmZXIgdG8ga2VlcCBTRFAgZGF0YWJhc2UgKi8KIH0gdEJUQV9KVl9DRkc7CiAKQEAgLTQzOSwxMSArNDM5LDExIEBACiAqKgogKiogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgbGluayB0byBwZWVyIGRldmljZSBpcyBlbmNyeXB0ZWQKICoqCi0qKiBSZXR1cm5zICAgICAgICAgIFRSVUUgaWYgZW5jcnlwdGVkLgotKiogICAgICAgICAgICAgICAgICBGQUxTRSBpZiBub3QuCisqKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgZW5jcnlwdGVkLgorKiogICAgICAgICAgICAgICAgICBmYWxzZSBpZiBub3QuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gQlRBX0p2SXNFbmNyeXB0ZWQoQkRfQUREUiBiZF9hZGRyKTsKK2Jvb2wgQlRBX0p2SXNFbmNyeXB0ZWQoQkRfQUREUiBiZF9hZGRyKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC00NjcsNyArNDY3LDcgQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdEJUQV9KVl9TVEFUVVMgQlRBX0p2R2V0Q2hhbm5lbElkKGludCBjb25uX3R5cGUsIHZvaWQqIHVzZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBjaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWwpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTQ4MCw3ICs0ODAsNyBAQAogKiogICAgICAgICAgICAgICAgICBCVEFfSlZfRkFJTFVSRSwgb3RoZXJ3aXNlLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1NUQVRVUyBCVEFfSnZGcmVlQ2hhbm5lbChVSU5UMTYgY2hhbm5lbCwgaW50IGNvbm5fdHlwZSk7Cit0QlRBX0pWX1NUQVRVUyBCVEFfSnZGcmVlQ2hhbm5lbCh1aW50MTZfdCBjaGFubmVsLCBpbnQgY29ubl90eXBlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC00OTUsNyArNDk1LDcgQEAKICoqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2U3RhcnREaXNjb3ZlcnkoQkRfQUREUiBiZF9hZGRyLCBVSU5UMTYgbnVtX3V1aWQsCit0QlRBX0pWX1NUQVRVUyBCVEFfSnZTdGFydERpc2NvdmVyeShCRF9BRERSIGJkX2FkZHIsIHVpbnQxNl90IG51bV91dWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfVVVJRCAqcF91dWlkX2xpc3QsIHZvaWQqIHVzZXJfZGF0YSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC01MjEsNyArNTIxLDcgQEAKICoqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2RGVsZXRlUmVjb3JkKFVJTlQzMiBoYW5kbGUpOwordEJUQV9KVl9TVEFUVVMgQlRBX0p2RGVsZXRlUmVjb3JkKHVpbnQzMl90IGhhbmRsZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtNTM5LDggKzUzOSw4IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHRCVEFfSlZfU1RBVFVTIEJUQV9KdkwyY2FwQ29ubmVjdExFKHRCVEFfU0VDIHNlY19tYXNrLCB0QlRBX0pWX1JPTEUgcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRMMkNBUF9FUlRNX0lORk8gKmVydG1faW5mbywgVUlOVDE2IHJlbW90ZV9jaGFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IHJ4X210dSwgdEwyQ0FQX0NGR19JTkZPICpjZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0TDJDQVBfRVJUTV9JTkZPICplcnRtX2luZm8sIHVpbnQxNl90IHJlbW90ZV9jaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcnhfbXR1LCB0TDJDQVBfQ0ZHX0lORk8gKmNmZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEX0FERFIgcGVlcl9iZF9hZGRyLCB0QlRBX0pWX0wyQ0FQX0NCQUNLICpwX2NiYWNrLCB2b2lkICp1c2VyX2RhdGEpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNTU5LDggKzU1OSw4IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHRCVEFfSlZfU1RBVFVTIEJUQV9KdkwyY2FwQ29ubmVjdChpbnQgY29ubl90eXBlLCB0QlRBX1NFQyBzZWNfbWFzaywgdEJUQV9KVl9ST0xFIHJvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0TDJDQVBfRVJUTV9JTkZPICplcnRtX2luZm8sIFVJTlQxNiByZW1vdGVfcHNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IHJ4X210dSwgdEwyQ0FQX0NGR19JTkZPICpjZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0TDJDQVBfRVJUTV9JTkZPICplcnRtX2luZm8sIHVpbnQxNl90IHJlbW90ZV9wc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByeF9tdHUsIHRMMkNBUF9DRkdfSU5GTyAqY2ZnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRfQUREUiBwZWVyX2JkX2FkZHIsIHRCVEFfSlZfTDJDQVBfQ0JBQ0sgKnBfY2JhY2ssIHZvaWQgKnVzZXJfZGF0YSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC01NzMsNyArNTczLDcgQEAKICoqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2TDJjYXBDbG9zZShVSU5UMzIgaGFuZGxlKTsKK3RCVEFfSlZfU1RBVFVTIEJUQV9KdkwyY2FwQ2xvc2UodWludDMyX3QgaGFuZGxlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC01ODYsNyArNTg2LDcgQEAKICoqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2TDJjYXBDbG9zZUxFKFVJTlQzMiBoYW5kbGUpOwordEJUQV9KVl9TVEFUVVMgQlRBX0p2TDJjYXBDbG9zZUxFKHVpbnQzMl90IGhhbmRsZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtNjA0LDcgKzYwNCw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdEJUQV9KVl9TVEFUVVMgQlRBX0p2TDJjYXBTdGFydFNlcnZlcihpbnQgY29ubl90eXBlLCB0QlRBX1NFQyBzZWNfbWFzaywgdEJUQV9KVl9ST0xFIHJvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0TDJDQVBfRVJUTV9JTkZPICplcnRtX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgbG9jYWxfcHNtLCBVSU5UMTYgcnhfbXR1LCB0TDJDQVBfQ0ZHX0lORk8gKmNmZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxvY2FsX3BzbSwgdWludDE2X3QgcnhfbXR1LCB0TDJDQVBfQ0ZHX0lORk8gKmNmZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSlZfTDJDQVBfQ0JBQ0sgKnBfY2JhY2ssIHZvaWQgKnVzZXJfZGF0YSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC02MjQsNyArNjI0LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB0QlRBX0pWX1NUQVRVUyBCVEFfSnZMMmNhcFN0YXJ0U2VydmVyTEUodEJUQV9TRUMgc2VjX21hc2ssIHRCVEFfSlZfUk9MRSByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEwyQ0FQX0VSVE1fSU5GTyAqZXJ0bV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IGxvY2FsX2NoYW4sIFVJTlQxNiByeF9tdHUsIHRMMkNBUF9DRkdfSU5GTyAqY2ZnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbG9jYWxfY2hhbiwgdWludDE2X3QgcnhfbXR1LCB0TDJDQVBfQ0ZHX0lORk8gKmNmZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSlZfTDJDQVBfQ0JBQ0sgKnBfY2JhY2ssIHZvaWQgKnVzZXJfZGF0YSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC02MzgsNyArNjM4LDcgQEAKICoqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2TDJjYXBTdG9wU2VydmVyTEUoVUlOVDE2IGxvY2FsX2NoYW4sIHZvaWQgKnVzZXJfZGF0YSk7Cit0QlRBX0pWX1NUQVRVUyBCVEFfSnZMMmNhcFN0b3BTZXJ2ZXJMRSh1aW50MTZfdCBsb2NhbF9jaGFuLCB2b2lkICp1c2VyX2RhdGEpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTY1MSw3ICs2NTEsNyBAQAogKiogICAgICAgICAgICAgICAgICBCVEFfSlZfRkFJTFVSRSwgb3RoZXJ3aXNlLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1NUQVRVUyBCVEFfSnZMMmNhcFN0b3BTZXJ2ZXIoVUlOVDE2IGxvY2FsX3BzbSwgdm9pZCAqdXNlcl9kYXRhKTsKK3RCVEFfSlZfU1RBVFVTIEJUQV9KdkwyY2FwU3RvcFNlcnZlcih1aW50MTZfdCBsb2NhbF9wc20sIHZvaWQgKnVzZXJfZGF0YSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtNjY1LDggKzY2NSw4IEBACiAqKiAgICAgICAgICAgICAgICAgIEJUQV9KVl9GQUlMVVJFLCBvdGhlcndpc2UuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdkwyY2FwUmVhZChVSU5UMzIgaGFuZGxlLCBVSU5UMzIgcmVxX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4ICpwX2RhdGEsIFVJTlQxNiBsZW4pOwordEJUQV9KVl9TVEFUVVMgQlRBX0p2TDJjYXBSZWFkKHVpbnQzMl90IGhhbmRsZSwgdWludDMyX3QgcmVxX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfZGF0YSwgdWludDE2X3QgbGVuKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC02NzksNyArNjc5LDcgQEAKICoqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIGlmIGVycm9yLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1NUQVRVUyBCVEFfSnZMMmNhcFJlYWR5KFVJTlQzMiBoYW5kbGUsIFVJTlQzMiAqcF9kYXRhX3NpemUpOwordEJUQV9KVl9TVEFUVVMgQlRBX0p2TDJjYXBSZWFkeSh1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90ICpwX2RhdGFfc2l6ZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtNjk0LDggKzY5NCw4IEBACiAqKiAgICAgICAgICAgICAgICAgIEJUQV9KVl9GQUlMVVJFLCBvdGhlcndpc2UuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdkwyY2FwV3JpdGUoVUlOVDMyIGhhbmRsZSwgVUlOVDMyIHJlcV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfZGF0YSwgVUlOVDE2IGxlbiwgdm9pZCAqdXNlcl9kYXRhKTsKK3RCVEFfSlZfU1RBVFVTIEJUQV9KdkwyY2FwV3JpdGUodWludDMyX3QgaGFuZGxlLCB1aW50MzJfdCByZXFfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfZGF0YSwgdWludDE2X3QgbGVuLCB2b2lkICp1c2VyX2RhdGEpOwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC03MTEsOSArNzExLDkgQEAKICoqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2TDJjYXBXcml0ZUZpeGVkKFVJTlQxNiBjaGFubmVsLCBCRF9BRERSICphZGRyLCBVSU5UMzIgcmVxX2lkLAordEJUQV9KVl9TVEFUVVMgQlRBX0p2TDJjYXBXcml0ZUZpeGVkKHVpbnQxNl90IGNoYW5uZWwsIEJEX0FERFIgKmFkZHIsIHVpbnQzMl90IHJlcV9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9KVl9MMkNBUF9DQkFDSyAqcF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfZGF0YSwgVUlOVDE2IGxlbiwgdm9pZCAqdXNlcl9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcF9kYXRhLCB1aW50MTZfdCBsZW4sIHZvaWQgKnVzZXJfZGF0YSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtNzMxLDcgKzczMSw3IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHRCVEFfSlZfU1RBVFVTIEJUQV9KdlJmY29tbUNvbm5lY3QodEJUQV9TRUMgc2VjX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX1JPTEUgcm9sZSwgVUlOVDggcmVtb3RlX3NjbiwgQkRfQUREUiBwZWVyX2JkX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX1JPTEUgcm9sZSwgdWludDhfdCByZW1vdGVfc2NuLCBCRF9BRERSIHBlZXJfYmRfYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSlZfUkZDT01NX0NCQUNLICpwX2NiYWNrLCB2b2lkICp1c2VyX2RhdGEpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNzQ0LDcgKzc0NCw3IEBACiAqKiAgICAgICAgICAgICAgICAgIEJUQV9KVl9GQUlMVVJFLCBvdGhlcndpc2UuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdlJmY29tbUNsb3NlKFVJTlQzMiBoYW5kbGUsIHZvaWQqIHVzZXJfZGF0YSk7Cit0QlRBX0pWX1NUQVRVUyBCVEFfSnZSZmNvbW1DbG9zZSh1aW50MzJfdCBoYW5kbGUsIHZvaWQqIHVzZXJfZGF0YSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtNzYyLDcgKzc2Miw3IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHRCVEFfSlZfU1RBVFVTIEJUQV9KdlJmY29tbVN0YXJ0U2VydmVyKHRCVEFfU0VDIHNlY19tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSlZfUk9MRSByb2xlLCBVSU5UOCBsb2NhbF9zY24sIFVJTlQ4IG1heF9zZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSlZfUk9MRSByb2xlLCB1aW50OF90IGxvY2FsX3NjbiwgdWludDhfdCBtYXhfc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX1JGQ09NTV9DQkFDSyAqcF9jYmFjaywgdm9pZCAqdXNlcl9kYXRhKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTc3Niw3ICs3NzYsNyBAQAogKiogICAgICAgICAgICAgICAgICBCVEFfSlZfRkFJTFVSRSwgb3RoZXJ3aXNlLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1NUQVRVUyBCVEFfSnZSZmNvbW1TdG9wU2VydmVyKFVJTlQzMiBoYW5kbGUsIHZvaWQqIHVzZXJfZGF0YSk7Cit0QlRBX0pWX1NUQVRVUyBCVEFfSnZSZmNvbW1TdG9wU2VydmVyKHVpbnQzMl90IGhhbmRsZSwgdm9pZCogdXNlcl9kYXRhKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC03OTAsNyArNzkwLDcgQEAKICoqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2UmZjb21tV3JpdGUoVUlOVDMyIGhhbmRsZSwgVUlOVDMyIHJlcV9pZCk7Cit0QlRBX0pWX1NUQVRVUyBCVEFfSnZSZmNvbW1Xcml0ZSh1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IHJlcV9pZCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKioKQEAgLTgxMSw3ICs4MTEsNyBAQAogICoqICAgICAgICAgICAgICBCVEFfSlZfQ09OTl9DTE9TRSB0byByZW1vdmUgaW4gY2FzZSBvZiBjb25uZWN0aW9uIGNsb3NlIQogICoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdlNldFBtUHJvZmlsZShVSU5UMzIgaGFuZGxlLCB0QlRBX0pWX1BNX0lEIGFwcF9pZCwKK3RCVEFfSlZfU1RBVFVTIEJUQV9KdlNldFBtUHJvZmlsZSh1aW50MzJfdCBoYW5kbGUsIHRCVEFfSlZfUE1fSUQgYXBwX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX0NPTk5fU1RBVEUgaW5pdF9zdCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC04MjQsNyArODI0LDcgQEAKICoqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVUlOVDE2IEJUQV9KdlJmY29tbUdldFBvcnRIZGwoVUlOVDMyIGhhbmRsZSk7Cit1aW50MTZfdCBCVEFfSnZSZmNvbW1HZXRQb3J0SGRsKHVpbnQzMl90IGhhbmRsZSk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX2p2X2NvLmggYi9idGEvaW5jbHVkZS9idGFfanZfY28uaAppbmRleCAyMjZkNGY3Li5mOGM3Y2YzIDEwMDY0NAotLS0gYS9idGEvaW5jbHVkZS9idGFfanZfY28uaAorKysgYi9idGEvaW5jbHVkZS9idGFfanZfY28uaApAQCAtNDgsMTEgKzQ4LDExIEBACiAKIGV4dGVybiBpbnQgYnRhX2NvX3JmY19kYXRhX2luY29taW5nKHZvaWQgKnVzZXJfZGF0YSwgQlRfSERSICpwX2J1Zik7CiBleHRlcm4gaW50IGJ0YV9jb19yZmNfZGF0YV9vdXRnb2luZ19zaXplKHZvaWQgKnVzZXJfZGF0YSwgaW50ICpzaXplKTsKLWV4dGVybiBpbnQgYnRhX2NvX3JmY19kYXRhX291dGdvaW5nKHZvaWQgKnVzZXJfZGF0YSwgVUlOVDgqIGJ1ZiwgVUlOVDE2IHNpemUpOworZXh0ZXJuIGludCBidGFfY29fcmZjX2RhdGFfb3V0Z29pbmcodm9pZCAqdXNlcl9kYXRhLCB1aW50OF90KiBidWYsIHVpbnQxNl90IHNpemUpOwogCiBleHRlcm4gaW50IGJ0YV9jb19sMmNhcF9kYXRhX2luY29taW5nKHZvaWQgKnVzZXJfZGF0YSwgQlRfSERSICpwX2J1Zik7CiBleHRlcm4gaW50IGJ0YV9jb19sMmNhcF9kYXRhX291dGdvaW5nX3NpemUodm9pZCAqdXNlcl9kYXRhLCBpbnQgKnNpemUpOwotZXh0ZXJuIGludCBidGFfY29fbDJjYXBfZGF0YV9vdXRnb2luZyh2b2lkICp1c2VyX2RhdGEsIFVJTlQ4KiBidWYsIFVJTlQxNiBzaXplKTsKK2V4dGVybiBpbnQgYnRhX2NvX2wyY2FwX2RhdGFfb3V0Z29pbmcodm9pZCAqdXNlcl9kYXRhLCB1aW50OF90KiBidWYsIHVpbnQxNl90IHNpemUpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL2J0YS9pbmNsdWRlL2J0YV9tY2VfYXBpLmggYi9idGEvaW5jbHVkZS9idGFfbWNlX2FwaS5oCmluZGV4IGMzNTAzOTAuLmVlZGYxZDIgMTAwNjQ0Ci0tLSBhL2J0YS9pbmNsdWRlL2J0YV9tY2VfYXBpLmgKKysrIGIvYnRhL2luY2x1ZGUvYnRhX21jZV9hcGkuaApAQCAtNDIsNyArNDIsNyBAQAogI2RlZmluZSBCVEFfTUNFX0ZBSUxVUkUgICAgICAgICAgICAgMSAgICAgICAgICAgIC8qIEdlbmVyaWMgZmFpbHVyZS4gKi8KICNkZWZpbmUgQlRBX01DRV9CVVNZICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAvKiBUZW1wb3JhcmlseSBjYW4gbm90IGhhbmRsZSB0aGlzIHJlcXVlc3QuICovCiAKLXR5cGVkZWYgVUlOVDggdEJUQV9NQ0VfU1RBVFVTOwordHlwZWRlZiB1aW50OF90IHRCVEFfTUNFX1NUQVRVUzsKIAogLyogTUNFIEkvRiBjYWxsYmFjayBldmVudHMgKi8KIC8qIGV2ZW50cyByZWNlaXZlZCBieSB0QlRBX01DRV9ETV9DQkFDSyAqLwpAQCAtNTIsMTUgKzUyLDE1IEBACiAKICNkZWZpbmUgQlRBX01DRV9NQVhfTUFTX0lOU1RBTkNFUyAxMgogCi10eXBlZGVmIFVJTlQxNiB0QlRBX01DRV9FVlQ7Cit0eXBlZGVmIHVpbnQxNl90IHRCVEFfTUNFX0VWVDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UOCAgIHNjbjsKKyAgICB1aW50OF90ICAgc2NuOwogICAgIGNoYXIgICAgKnBfc3J2X25hbWU7Ci0gICAgVUlOVDE2ICBzcnZfbmFtZV9sZW47Ci0gICAgVUlOVDggICBpbnN0YW5jZV9pZDsKLSAgICBVSU5UOCAgIG1zZ190eXBlOworICAgIHVpbnQxNl90ICBzcnZfbmFtZV9sZW47CisgICAgdWludDhfdCAgIGluc3RhbmNlX2lkOworICAgIHVpbnQ4X3QgICBtc2dfdHlwZTsKIH0gdEJUQV9NQ0VfTUFTX0lORk87CiAKIC8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9NQ0VfTUFTX0RJU0NPVkVSWV9DT01QX0VWVCAqLwpAQCAtODUsNyArODUsNyBAQAogLyogTUNFIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQxNiAgc2RwX2RiX3NpemU7ICAgICAgICAgICAgLyogVGhlIHNpemUgb2YgcF9zZHBfZGIgKi8KKyAgICB1aW50MTZfdCAgc2RwX2RiX3NpemU7ICAgICAgICAgICAgLyogVGhlIHNpemUgb2YgcF9zZHBfZGIgKi8KICAgICB0U0RQX0RJU0NPVkVSWV9EQiAgICpwX3NkcF9kYjsgIC8qIFRoZSBkYXRhIGJ1ZmZlciB0byBrZWVwIFNEUCBkYXRhYmFzZSAqLwogfSB0QlRBX01DRV9DRkc7CiAKZGlmZiAtLWdpdCBhL2J0YS9pbmNsdWRlL2J0YV9vcF9hcGkuaCBiL2J0YS9pbmNsdWRlL2J0YV9vcF9hcGkuaAppbmRleCBjMjZlYTM1Li5mODM3MWJmIDEwMDY0NAotLS0gYS9idGEvaW5jbHVkZS9idGFfb3BfYXBpLmgKKysrIGIvYnRhL2luY2x1ZGUvYnRhX29wX2FwaS5oCkBAIC0zMywxMSArMzMsMTEgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRXh0cmEgRGVidWcgQ29kZSAqLwogI2lmbmRlZiBCVEFfT1BTX0RFQlVHCi0jZGVmaW5lIEJUQV9PUFNfREVCVUcgICAgICAgICAgIEZBTFNFCisjZGVmaW5lIEJUQV9PUFNfREVCVUcgICAgICAgICAgIGZhbHNlCiAjZW5kaWYKIAogI2lmbmRlZiBCVEFfT1BDX0RFQlVHCi0jZGVmaW5lIEJUQV9PUENfREVCVUcgICAgICAgICAgIEZBTFNFCisjZGVmaW5lIEJUQV9PUENfREVCVUcgICAgICAgICAgIGZhbHNlCiAjZW5kaWYKIAogCkBAIC01MCw3ICs1MCw3IEBACiAjZGVmaW5lIEJUQV9PUF9WTVNHX0ZNVCAgICAgICAgICAgICA2ICAgICAgIC8qIHZNZXNzYWdlICovCiAjZGVmaW5lIEJUQV9PUF9PVEhFUl9GTVQgICAgICAgICAgICAweEZGICAgIC8qIG90aGVyIGZvcm1hdCAqLwogCi10eXBlZGVmIFVJTlQ4IHRCVEFfT1BfRk1UOwordHlwZWRlZiB1aW50OF90IHRCVEFfT1BfRk1UOwogCiAvKiBPYmplY3QgZm9ybWF0IG1hc2sgKi8KICNkZWZpbmUgQlRBX09QX1ZDQVJEMjFfTUFTSyAgICAgICAgIDB4MDEgICAgLyogdkNhcmQgMi4xICovCkBAIC02MSw3ICs2MSw3IEBACiAjZGVmaW5lIEJUQV9PUF9WTVNHX01BU0sgICAgICAgICAgICAweDIwICAgIC8qIHZNZXNzYWdlICovCiAjZGVmaW5lIEJUQV9PUF9BTllfTUFTSyAgICAgICAgICAgICAweDQwICAgIC8qIEFueSB0eXBlIG9mIG9iamVjdC4gKi8KIAotdHlwZWRlZiBVSU5UOCB0QlRBX09QX0ZNVF9NQVNLOwordHlwZWRlZiB1aW50OF90IHRCVEFfT1BfRk1UX01BU0s7CiAKICNlbmRpZiAvKiBCVEFfT1BfQVBJX0ggKi8KIApkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX3Bhbl9hcGkuaCBiL2J0YS9pbmNsdWRlL2J0YV9wYW5fYXBpLmgKaW5kZXggYjU5NWY4Yy4uNzM5YzY0ZSAxMDA2NDQKLS0tIGEvYnRhL2luY2x1ZGUvYnRhX3Bhbl9hcGkuaAorKysgYi9idGEvaW5jbHVkZS9idGFfcGFuX2FwaS5oCkBAIC0zOSw3ICszOSw3IEBACiAjZGVmaW5lIEJUQV9QQU5fU1VDQ0VTUyAgICAgICAgICAwCiAjZGVmaW5lIEJUQV9QQU5fRkFJTCAgICAgICAgICAgICAxCiAKLXR5cGVkZWYgVUlOVDggdEJUQV9QQU5fU1RBVFVTOwordHlwZWRlZiB1aW50OF90IHRCVEFfUEFOX1NUQVRVUzsKIAogCiAvKiBQQU4gQ2FsbGJhY2sgZXZlbnRzICovCkBAIC00OSw3ICs0OSw3IEBACiAjZGVmaW5lIEJUQV9QQU5fT1BFTl9FVlQgICAgICAgICAzICAgICAgIC8qIENvbm5lY3Rpb24gaGFzIGJlZW4gb3BlbmVkLiAqLwogI2RlZmluZSBCVEFfUEFOX0NMT1NFX0VWVCAgICAgICAgNCAgICAgICAvKiBDb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZC4gKi8KIAotdHlwZWRlZiBVSU5UOCB0QlRBX1BBTl9FVlQ7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9QQU5fRVZUOwogCiAKIC8qIHBhbiByb2xlcyAqLwpAQCAtNTgsMTMgKzU4LDEzIEBACiAjZGVmaW5lIEJUQV9QQU5fUk9MRV9OQVAgICAgICAgICBQQU5fUk9MRV9OQVBfU0VSVkVSCiAKIAotdHlwZWRlZiBVSU5UOCAgIHRCVEFfUEFOX1JPTEU7Cit0eXBlZGVmIHVpbnQ4X3QgICB0QlRBX1BBTl9ST0xFOwogCiAvKiAgaW5mb3JtYXRpb24gcmVnYXJkaW5nIFBBTiByb2xlcyAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBjb25zdCBjaGFyICpwX3Nydl9uYW1lOyAgLyogc2VydmljZSBuYW1lIGZvciB0aGUgUEFOIHJvbGUgKi8KLSAgICBVSU5UOCBhcHBfaWQ7ICAgICAgLyogYXBwbGljYXRpb24gaWQgKi8KKyAgICB1aW50OF90IGFwcF9pZDsgICAgICAvKiBhcHBsaWNhdGlvbiBpZCAqLwogICAgIHRCVEFfU0VDIHNlY19tYXNrOyAvKiBzZWN1cml0eSBzZXR0aW5nIGZvciB0aGUgcm9sZSAqLwogCiB9IHRCVEFfUEFOX1JPTEVfSU5GTzsKQEAgLTgxLDcgKzgxLDcgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgQkRfQUREUiAgICAgICAgIGJkX2FkZHI7ICAgIC8qIEJEIGFkZHJlc3Mgb2YgcGVlciBkZXZpY2UuICovCi0gICAgVUlOVDE2ICAgICAgICAgIGhhbmRsZTsgICAgIC8qIEhhbmRsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25uZWN0aW9uLiAqLworICAgIHVpbnQxNl90ICAgICAgICAgIGhhbmRsZTsgICAgIC8qIEhhbmRsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25uZWN0aW9uLiAqLwogCiB9IHRCVEFfUEFOX09QRU5JTkc7CiAKQEAgLTkwLDcgKzkwLDcgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgQkRfQUREUiAgICAgICAgIGJkX2FkZHI7ICAgIC8qIEJEIGFkZHJlc3Mgb2YgcGVlciBkZXZpY2UuICovCi0gICAgVUlOVDE2ICAgICAgICAgIGhhbmRsZTsgICAgIC8qIEhhbmRsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25uZWN0aW9uLiAqLworICAgIHVpbnQxNl90ICAgICAgICAgIGhhbmRsZTsgICAgIC8qIEhhbmRsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25uZWN0aW9uLiAqLwogICAgIHRCVEFfUEFOX1NUQVRVUyBzdGF0dXM7ICAgICAvKiBzdGF0dXMgb2Ygb3BlbiBldmVudCAqLwogICAgIHRCVEFfUEFOX1JPTEUgICBsb2NhbF9yb2xlOyAvKiBMb2NhbCBkZXZpY2UgUEFOIHJvbGUgZm9yIHRoZSBjb25uZWN0aW9uICovCiAgICAgdEJUQV9QQU5fUk9MRSAgIHBlZXJfcm9sZTsgIC8qIFBlZXIgZGV2aWNlIFBBTiByb2xlIGZvciB0aGUgY29ubmVjdGlvbiAqLwpAQCAtMTAwLDcgKzEwMCw3IEBACiAvKiBFdmVudCBhc3NvY2lhdGVkIHdpdGggQlRBX1BBTl9DTE9TRV9FVlQgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDE2ICAgICAgICAgIGhhbmRsZTsgICAgIC8qIEhhbmRsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbm5lY3Rpb24uICovCisgICAgdWludDE2X3QgICAgICAgICAgaGFuZGxlOyAgICAgLyogSGFuZGxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29ubmVjdGlvbi4gKi8KIH0gdEJUQV9QQU5fQ0xPU0U7CiAKIC8qIFVuaW9uIG9mIGFsbCBQQU4gY2FsbGJhY2sgc3RydWN0dXJlcyAqLwpAQCAtMTkwLDcgKzE5MCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX1BhbkNsb3NlKFVJTlQxNiBoYW5kbGUpOworZXh0ZXJuIHZvaWQgQlRBX1BhbkNsb3NlKHVpbnQxNl90IGhhbmRsZSk7CiAKIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9idGEvaW5jbHVkZS9idGFfcGFuX2NpLmggYi9idGEvaW5jbHVkZS9idGFfcGFuX2NpLmgKaW5kZXggZGY2YmNiYi4uNjZiNzI0MSAxMDA2NDQKLS0tIGEvYnRhL2luY2x1ZGUvYnRhX3Bhbl9jaS5oCisrKyBiL2J0YS9pbmNsdWRlL2J0YV9wYW5fY2kuaApAQCAtNDcsNyArNDcsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9wYW5fY2lfdHhfcmVhZHkoVUlOVDE2IGhhbmRsZSk7CitleHRlcm4gdm9pZCBidGFfcGFuX2NpX3R4X3JlYWR5KHVpbnQxNl90IGhhbmRsZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtNjIsNyArNjIsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9wYW5fY2lfcnhfcmVhZHkoVUlOVDE2IGhhbmRsZSk7CitleHRlcm4gdm9pZCBidGFfcGFuX2NpX3J4X3JlYWR5KHVpbnQxNl90IGhhbmRsZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtNzksNyArNzksNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9wYW5fY2lfdHhfZmxvdyhVSU5UMTYgaGFuZGxlLCBCT09MRUFOIGVuYWJsZSk7CitleHRlcm4gdm9pZCBidGFfcGFuX2NpX3R4X2Zsb3codWludDE2X3QgaGFuZGxlLCBib29sIGVuYWJsZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtOTIsMTAgKzkyLDEwIEBACiAqKiAgICAgICAgICAgICAgICAgIHBob25lIG11c3Qgbm90IGZyZWUgdGhlIGJ1ZmZlci4KICoqCiAqKgotKiogUmV0dXJucyAgICAgICAgICBUUlVFIGlmIGZsb3cgZW5hYmxlZAorKiogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGZsb3cgZW5hYmxlZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfcGFuX2NpX3J4X3dyaXRlYnVmKFVJTlQxNiBoYW5kbGUsIEJEX0FERFIgc3JjLCBCRF9BRERSIGRzdCwgVUlOVDE2IHByb3RvY29sLCBCVF9IRFIgKnBfYnVmLCBCT09MRUFOIGV4dCk7CitleHRlcm4gdm9pZCBidGFfcGFuX2NpX3J4X3dyaXRlYnVmKHVpbnQxNl90IGhhbmRsZSwgQkRfQUREUiBzcmMsIEJEX0FERFIgZHN0LCB1aW50MTZfdCBwcm90b2NvbCwgQlRfSERSICpwX2J1ZiwgYm9vbCBleHQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTExMCw4ICsxMTAsOCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBCVF9IRFIgKiBidGFfcGFuX2NpX3JlYWRidWYoVUlOVDE2IGhhbmRsZSwgQkRfQUREUiBzcmMsIEJEX0FERFIgZHN0LCBVSU5UMTYgKnBfcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xFQU4qIHBfZXh0LCBCT09MRUFOKiBwX2ZvcndhcmQpOworZXh0ZXJuIEJUX0hEUiAqIGJ0YV9wYW5fY2lfcmVhZGJ1Zih1aW50MTZfdCBoYW5kbGUsIEJEX0FERFIgc3JjLCBCRF9BRERSIGRzdCwgdWludDE2X3QgKnBfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHBfZXh0LCBib29sKiBwX2ZvcndhcmQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTEyMyw3ICsxMjMsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9wYW5fY2lfc2V0X3BmaWx0ZXJzKFVJTlQxNiBoYW5kbGUsIFVJTlQxNiBudW1fZmlsdGVycywgVUlOVDE2ICpwX3N0YXJ0X2FycmF5LCBVSU5UMTYgKnBfZW5kX2FycmF5KTsKK2V4dGVybiB2b2lkIGJ0YV9wYW5fY2lfc2V0X3BmaWx0ZXJzKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbnVtX2ZpbHRlcnMsIHVpbnQxNl90ICpwX3N0YXJ0X2FycmF5LCB1aW50MTZfdCAqcF9lbmRfYXJyYXkpOwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMzYsOCArMTM2LDggQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfcGFuX2NpX3NldF9tZmlsdGVycyhVSU5UMTYgaGFuZGxlLCBVSU5UMTYgbnVtX21jYXN0X2ZpbHRlcnMsIFVJTlQ4ICpwX3N0YXJ0X2FycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfZW5kX2FycmF5KTsKK2V4dGVybiB2b2lkIGJ0YV9wYW5fY2lfc2V0X21maWx0ZXJzKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbnVtX21jYXN0X2ZpbHRlcnMsIHVpbnQ4X3QgKnBfc3RhcnRfYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwX2VuZF9hcnJheSk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX3Bhbl9jby5oIGIvYnRhL2luY2x1ZGUvYnRhX3Bhbl9jby5oCmluZGV4IGU5ZDdlNmMuLmNmMjhlZWYgMTAwNjQ0Ci0tLSBhL2J0YS9pbmNsdWRlL2J0YV9wYW5fY28uaAorKysgYi9idGEvaW5jbHVkZS9idGFfcGFuX2NvLmgKQEAgLTY4LDcgKzY4LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgRGF0YSBmbG93IG1hc2suCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBVSU5UOCBidGFfcGFuX2NvX2luaXQoVUlOVDggKnFfbGV2ZWwpOworZXh0ZXJuIHVpbnQ4X3QgYnRhX3Bhbl9jb19pbml0KHVpbnQ4X3QgKnFfbGV2ZWwpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTgyLDcgKzgyLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfcGFuX2NvX29wZW4oVUlOVDE2IGhhbmRsZSwgVUlOVDggYXBwX2lkLCB0QlRBX1BBTl9ST0xFIGxvY2FsX3JvbGUsIHRCVEFfUEFOX1JPTEUgcGVlcl9yb2xlLCBCRF9BRERSIHBlZXJfYWRkcik7CitleHRlcm4gdm9pZCBidGFfcGFuX2NvX29wZW4odWludDE2X3QgaGFuZGxlLCB1aW50OF90IGFwcF9pZCwgdEJUQV9QQU5fUk9MRSBsb2NhbF9yb2xlLCB0QlRBX1BBTl9ST0xFIHBlZXJfcm9sZSwgQkRfQUREUiBwZWVyX2FkZHIpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTk1LDcgKzk1LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfcGFuX2NvX2Nsb3NlKFVJTlQxNiBoYW5kbGUsIFVJTlQ4IGFwcF9pZCk7CitleHRlcm4gdm9pZCBidGFfcGFuX2NvX2Nsb3NlKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBhcHBfaWQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTExMCw3ICsxMTAsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9wYW5fY29fdHhfcGF0aChVSU5UMTYgaGFuZGxlLCBVSU5UOCBhcHBfaWQpOworZXh0ZXJuIHZvaWQgYnRhX3Bhbl9jb190eF9wYXRoKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBhcHBfaWQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTEyNSw3ICsxMjUsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9wYW5fY29fcnhfcGF0aChVSU5UMTYgaGFuZGxlLCBVSU5UOCBhcHBfaWQpOworZXh0ZXJuIHZvaWQgYnRhX3Bhbl9jb19yeF9wYXRoKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBhcHBfaWQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTE0MCw4ICsxNDAsOCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9wYW5fY29fdHhfd3JpdGUoVUlOVDE2IGhhbmRsZSwgVUlOVDggYXBwX2lkLCBCRF9BRERSIHNyYywgQkRfQUREUiBkc3QsIFVJTlQxNiBwcm90b2NvbCwgVUlOVDggKnBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IGxlbiwgQk9PTEVBTiBleHQsIEJPT0xFQU4gZm9yd2FyZCk7CitleHRlcm4gdm9pZCBidGFfcGFuX2NvX3R4X3dyaXRlKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBhcHBfaWQsIEJEX0FERFIgc3JjLCBCRF9BRERSIGRzdCwgdWludDE2X3QgcHJvdG9jb2wsIHVpbnQ4X3QgKnBfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuLCBib29sIGV4dCwgYm9vbCBmb3J3YXJkKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0xNTYsOCArMTU2LDggQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfcGFuX2NvX3R4X3dyaXRlYnVmKFVJTlQxNiBoYW5kbGUsIFVJTlQ4IGFwcF9pZCwgQkRfQUREUiBzcmMsIEJEX0FERFIgZHN0LCBVSU5UMTYgcHJvdG9jb2wsIEJUX0hEUiAqcF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xFQU4gZXh0LCBCT09MRUFOIGZvcndhcmQpOworZXh0ZXJuIHZvaWQgYnRhX3Bhbl9jb190eF93cml0ZWJ1Zih1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgYXBwX2lkLCBCRF9BRERSIHNyYywgQkRfQUREUiBkc3QsIHVpbnQxNl90IHByb3RvY29sLCBCVF9IRFIgKnBfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4dCwgYm9vbCBmb3J3YXJkKTsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTc0LDcgKzE3NCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX3Bhbl9jb19yeF9mbG93KFVJTlQxNiBoYW5kbGUsIFVJTlQ4IGFwcF9pZCwgQk9PTEVBTiBlbmFibGUpOworZXh0ZXJuIHZvaWQgYnRhX3Bhbl9jb19yeF9mbG93KHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBhcHBfaWQsIGJvb2wgZW5hYmxlKTsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTg2LDggKzE4Niw4IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX3Bhbl9jb19wZmlsdF9pbmQoVUlOVDE2IGhhbmRsZSwgQk9PTEVBTiBpbmRpY2F0aW9uLCB0QlRBX1BBTl9TVEFUVVMgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IGxlbiwgVUlOVDggKnBfZmlsdGVycyk7CitleHRlcm4gdm9pZCBidGFfcGFuX2NvX3BmaWx0X2luZCh1aW50MTZfdCBoYW5kbGUsIGJvb2wgaW5kaWNhdGlvbiwgdEJUQV9QQU5fU1RBVFVTIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbiwgdWludDhfdCAqcF9maWx0ZXJzKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0xOTgsOCArMTk4LDggQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfcGFuX2NvX21maWx0X2luZChVSU5UMTYgaGFuZGxlLCAgQk9PTEVBTiBpbmRpY2F0aW9uLCB0QlRBX1BBTl9TVEFUVVMgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IGxlbiwgVUlOVDggKnBfZmlsdGVycyk7CitleHRlcm4gdm9pZCBidGFfcGFuX2NvX21maWx0X2luZCh1aW50MTZfdCBoYW5kbGUsICBib29sIGluZGljYXRpb24sIHRCVEFfUEFOX1NUQVRVUyByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4sIHVpbnQ4X3QgKnBfZmlsdGVycyk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX3NkcF9hcGkuaCBiL2J0YS9pbmNsdWRlL2J0YV9zZHBfYXBpLmgKaW5kZXggNWJlYjhmNi4uMjM0NGJjMSAxMDA2NDQKLS0tIGEvYnRhL2luY2x1ZGUvYnRhX3NkcF9hcGkuaAorKysgYi9idGEvaW5jbHVkZS9idGFfc2RwX2FwaS5oCkBAIC0zOSw3ICszOSw3IEBACiAjZGVmaW5lIEJUQV9TRFBfRkFJTFVSRSAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAvKiBHZW5lcmljIGZhaWx1cmUuICovCiAjZGVmaW5lIEJUQV9TRFBfQlVTWSAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAvKiBUZW1wb3JhcmlseSBjYW4gbm90IGhhbmRsZSB0aGlzIHJlcXVlc3QuICovCiAKLXR5cGVkZWYgVUlOVDggdEJUQV9TRFBfU1RBVFVTOwordHlwZWRlZiB1aW50OF90IHRCVEFfU0RQX1NUQVRVUzsKIAogLyogU0RQIEkvRiBjYWxsYmFjayBldmVudHMgKi8KIC8qIGV2ZW50cyByZWNlaXZlZCBieSB0QlRBX1NEUF9ETV9DQkFDSyAqLwpAQCAtNTIsNyArNTIsNyBAQAogCiAjZGVmaW5lIEJUQV9TRFBfTUFYX1JFQ09SRFMgMTUKIAotdHlwZWRlZiBVSU5UMTYgdEJUQV9TRFBfRVZUOwordHlwZWRlZiB1aW50MTZfdCB0QlRBX1NEUF9FVlQ7CiAKIC8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9TRFBfRElTQ09WRVJZX0NPTVBfRVZUICovCiB0eXBlZGVmIHN0cnVjdApAQCAtNzYsNyArNzYsNyBAQAogLyogTUNFIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQxNiAgc2RwX2RiX3NpemU7ICAgICAgICAgICAgLyogVGhlIHNpemUgb2YgcF9zZHBfZGIgKi8KKyAgICB1aW50MTZfdCAgc2RwX2RiX3NpemU7ICAgICAgICAgICAgLyogVGhlIHNpemUgb2YgcF9zZHBfZGIgKi8KICAgICB0U0RQX0RJU0NPVkVSWV9EQiAgICpwX3NkcF9kYjsgIC8qIFRoZSBkYXRhIGJ1ZmZlciB0byBrZWVwIFNEUCBkYXRhYmFzZSAqLwogfSB0QlRBX1NEUF9DRkc7CiAKZGlmZiAtLWdpdCBhL2J0YS9pbmNsdWRlL3V0bC5oIGIvYnRhL2luY2x1ZGUvdXRsLmgKaW5kZXggMTZkNGE4MC4uMmI5ODhhYiAxMDA2NDQKLS0tIGEvYnRhL2luY2x1ZGUvdXRsLmgKKysrIGIvYnRhL2luY2x1ZGUvdXRsLmgKQEAgLTQ4LDkgKzQ4LDkgQEAKIC8qKiBmb3IgdXRsX3NldF9kZXZpY2VfY2xhc3MoKSAqKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDggICAgICAgbWlub3I7Ci0gICAgVUlOVDggICAgICAgbWFqb3I7Ci0gICAgVUlOVDE2ICAgICAgc2VydmljZTsKKyAgICB1aW50OF90ICAgICAgIG1pbm9yOworICAgIHVpbnQ4X3QgICAgICAgbWFqb3I7CisgICAgdWludDE2X3QgICAgICBzZXJ2aWNlOwogfSB0QlRBX1VUTF9DT0Q7CiAKIApAQCAtNzAsNyArNzAsNyBAQAogKiogUmV0dXJucyAgICAgICAgICBJbnRlZ2VyIHZhbHVlIG9yIC0xIG9uIGVycm9yLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gSU5UMTYgdXRsX3N0cjJpbnQoY29uc3QgY2hhciAqcF9zKTsKK2V4dGVybiBpbnQxNl90IHV0bF9zdHIyaW50KGNvbnN0IGNoYXIgKnBfcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtOTEsNyArOTEsNyBAQAogKioKICoqIEZ1bmN0aW9uICAgICAgICAgdXRsX2l0b2EKICoqCi0qKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBjb252ZXJ0cyBhIFVJTlQxNiB0byBhIHN0cmluZy4gIFRoZQorKiogRGVzY3JpcHRpb24gICAgICBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gY29udmVydHMgYSB1aW50MTZfdCB0byBhIHN0cmluZy4gIFRoZQogKiogICAgICAgICAgICAgICAgICBzdHJpbmcgaXMgTlVMTC10ZXJtaW5hdGVkLiAgVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGlzCiAqKiAgICAgICAgICAgICAgICAgIHJldHVybmVkLgogKioKQEAgLTk5LDcgKzk5LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgTGVuZ3RoIG9mIHN0cmluZy4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIFVJTlQ4IHV0bF9pdG9hKFVJTlQxNiBpLCBjaGFyICpwX3MpOworZXh0ZXJuIHVpbnQ4X3QgdXRsX2l0b2EodWludDE2X3QgaSwgY2hhciAqcF9zKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0xMTcsMTAgKzExNywxMCBAQAogKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX1VUTF9TRVRfQ09EX0FMTCAtIG92ZXJ3cml0ZSBtYWpvciwgbWlub3IsIHNldCB0aGUgYml0cyBpbiBzZXJ2aWNlIGNsYXNzCiAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfVVRMX0lOSVRfQ09EIC0gb3ZlcndyaXRlIG1ham9yLCBtaW5vciwgYW5kIHNlcnZpY2UgY2xhc3MKICoqCi0qKiBSZXR1cm5zICAgICAgICAgIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgT3RoZXJ3aXNlIEZBTFNFCisqKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgc3VjY2Vzc2Z1bCwgT3RoZXJ3aXNlIGZhbHNlCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBCT09MRUFOIHV0bF9zZXRfZGV2aWNlX2NsYXNzKHRCVEFfVVRMX0NPRCAqcF9jb2QsIFVJTlQ4IGNtZCk7CitleHRlcm4gYm9vbCB1dGxfc2V0X2RldmljZV9jbGFzcyh0QlRBX1VUTF9DT0QgKnBfY29kLCB1aW50OF90IGNtZCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMTMwLDEwICsxMzAsMTAgQEAKICoqICAgICAgICAgICAgICAgICAgaW50ZWdlciBzdHJpbmcgb3Igbm90CiAqKgogKioKLSoqIFJldHVybnMgICAgICAgICAgVFJVRSBpZiBzdWNjZXNzZnVsLCBPdGhlcndpc2UgRkFMU0UKKyoqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzdWNjZXNzZnVsLCBPdGhlcndpc2UgZmFsc2UKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIEJPT0xFQU4gdXRsX2lzaW50c3RyKGNvbnN0IGNoYXIgKnBfcyk7CitleHRlcm4gYm9vbCB1dGxfaXNpbnRzdHIoY29uc3QgY2hhciAqcF9zKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0xNDMsMTAgKzE0MywxMCBAQAogKiogICAgICAgICAgICAgICAgICBvbmx5IGRpYWwgZGlnaXRzIG9yIG5vdAogKioKICoqCi0qKiBSZXR1cm5zICAgICAgICAgIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgT3RoZXJ3aXNlIEZBTFNFCisqKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgc3VjY2Vzc2Z1bCwgT3RoZXJ3aXNlIGZhbHNlCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBCT09MRUFOIHV0bF9pc2RpYWxzdHIoY29uc3QgY2hhciAqcF9zKTsKK2V4dGVybiBib29sIHV0bF9pc2RpYWxzdHIoY29uc3QgY2hhciAqcF9zKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9idGEvanYvYnRhX2p2X2FjdC5jIGIvYnRhL2p2L2J0YV9qdl9hY3QuYwppbmRleCAzOTE4ZmRmLi41OTI3YzIxIDEwMDY0NAotLS0gYS9idGEvanYvYnRhX2p2X2FjdC5jCisrKyBiL2J0YS9qdi9idGFfanZfYWN0LmMKQEAgLTc5LDkgKzc5LDkgQEAKIHN0YXRpYyB1aW50MzJfdCBmY19uZXh0X2lkOwogCiAKLXN0YXRpYyB2b2lkIGZjY2hhbl9jb25uX2NobmdfY2JrKFVJTlQxNiBjaGFuLCBCRF9BRERSIGJkX2FkZHIsIEJPT0xFQU4gY29ubmVjdGVkLAotICAgICAgICBVSU5UMTYgcmVhc29uLCB0QlRfVFJBTlNQT1JUICk7Ci1zdGF0aWMgdm9pZCBmY2NoYW5fZGF0YV9jYmsoVUlOVDE2IGNoYW4sIEJEX0FERFIgYmRfYWRkciwgQlRfSERSICpwX2J1Zik7CitzdGF0aWMgdm9pZCBmY2NoYW5fY29ubl9jaG5nX2Niayh1aW50MTZfdCBjaGFuLCBCRF9BRERSIGJkX2FkZHIsIGJvb2wgY29ubmVjdGVkLAorICAgICAgICB1aW50MTZfdCByZWFzb24sIHRCVF9UUkFOU1BPUlQgKTsKK3N0YXRpYyB2b2lkIGZjY2hhbl9kYXRhX2Niayh1aW50MTZfdCBjaGFuLCBCRF9BRERSIGJkX2FkZHIsIEJUX0hEUiAqcF9idWYpOwogCiAKIGV4dGVybiB2b2lkIHV1aWRfdG9fc3RyaW5nX2xlZ2FjeShidF91dWlkX3QgKnBfdXVpZCwgY2hhciAqc3RyKTsKQEAgLTk0LDcgKzk0LDcgQEAKIAogCiBzdGF0aWMgdEJUQV9KVl9QQ0IgKiBidGFfanZfYWRkX3JmY19wb3J0KHRCVEFfSlZfUkZDX0NCICpwX2NiLCB0QlRBX0pWX1BDQiAqcF9wY2Jfb3Blbik7Ci1zdGF0aWMgdEJUQV9KVl9TVEFUVVMgYnRhX2p2X2ZyZWVfc2V0X3BtX3Byb2ZpbGVfY2IoVUlOVDMyIGp2X2hhbmRsZSk7CitzdGF0aWMgdEJUQV9KVl9TVEFUVVMgYnRhX2p2X2ZyZWVfc2V0X3BtX3Byb2ZpbGVfY2IodWludDMyX3QganZfaGFuZGxlKTsKIHN0YXRpYyB2b2lkIGJ0YV9qdl9wbV9jb25uX2J1c3kodEJUQV9KVl9QTV9DQiAqcF9jYik7CiBzdGF0aWMgdm9pZCBidGFfanZfcG1fY29ubl9pZGxlKHRCVEFfSlZfUE1fQ0IgKnBfY2IpOwogc3RhdGljIHZvaWQgYnRhX2p2X3BtX3N0YXRlX2NoYW5nZSh0QlRBX0pWX1BNX0NCICpwX2NiLCBjb25zdCB0QlRBX0pWX0NPTk5fU1RBVEUgc3RhdGUpOwpAQCAtMTEwLDkgKzExMCw5IEBACiAqKiBSZXR1cm5zCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVVJTlQ4IGJ0YV9qdl9hbGxvY19zZWNfaWQodm9pZCkKK3VpbnQ4X3QgYnRhX2p2X2FsbG9jX3NlY19pZCh2b2lkKQogewotICAgIFVJTlQ4IHJldCA9IDA7CisgICAgdWludDhfdCByZXQgPSAwOwogICAgIGludCBpOwogICAgIGZvcihpPTA7IGk8QlRBX0pWX05VTV9TRVJWSUNFX0lEOyBpKyspCiAgICAgewpAQCAtMTY0LDkgKzE2NCw5IEBACiAqKiBSZXR1cm5zCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9qdl9mcmVlX3NlY19pZChVSU5UOCAqcF9zZWNfaWQpCitzdGF0aWMgdm9pZCBidGFfanZfZnJlZV9zZWNfaWQodWludDhfdCAqcF9zZWNfaWQpCiB7Ci0gICAgVUlOVDggc2VjX2lkID0gKnBfc2VjX2lkOworICAgIHVpbnQ4X3Qgc2VjX2lkID0gKnBfc2VjX2lkOwogICAgICpwX3NlY19pZCA9IDA7CiAgICAgaWYoc2VjX2lkID49IEJUQV9KVl9GSVJTVF9TRVJWSUNFX0lEICYmIHNlY19pZCA8PSBCVEFfSlZfTEFTVF9TRVJWSUNFX0lEKQogICAgIHsKQEAgLTE4NCw3ICsxODQsNyBAQAogKiogUmV0dXJucwogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1JGQ19DQiAqIGJ0YV9qdl9hbGxvY19yZmNfY2IoVUlOVDE2IHBvcnRfaGFuZGxlLCB0QlRBX0pWX1BDQiAqKnBwX3BjYikKK3RCVEFfSlZfUkZDX0NCICogYnRhX2p2X2FsbG9jX3JmY19jYih1aW50MTZfdCBwb3J0X2hhbmRsZSwgdEJUQV9KVl9QQ0IgKipwcF9wY2IpCiB7CiAgICAgdEJUQV9KVl9SRkNfQ0IgKnBfY2IgPSBOVUxMOwogICAgIHRCVEFfSlZfUENCICpwX3BjYjsKQEAgLTIzMCw3ICsyMzAsNyBAQAogKiogUmV0dXJucwogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1BDQiAqIGJ0YV9qdl9yZmNfcG9ydF90b19wY2IoVUlOVDE2IHBvcnRfaGFuZGxlKQordEJUQV9KVl9QQ0IgKiBidGFfanZfcmZjX3BvcnRfdG9fcGNiKHVpbnQxNl90IHBvcnRfaGFuZGxlKQogewogICAgIHRCVEFfSlZfUENCICpwX3BjYiA9IE5VTEw7CiAKQEAgLTI1MiwxMCArMjUyLDEwIEBACiAqKiBSZXR1cm5zCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSlZfUkZDX0NCICogYnRhX2p2X3JmY19wb3J0X3RvX2NiKFVJTlQxNiBwb3J0X2hhbmRsZSkKK3RCVEFfSlZfUkZDX0NCICogYnRhX2p2X3JmY19wb3J0X3RvX2NiKHVpbnQxNl90IHBvcnRfaGFuZGxlKQogewogICAgIHRCVEFfSlZfUkZDX0NCICpwX2NiID0gTlVMTDsKLSAgICBVSU5UMzIgaGFuZGxlOworICAgIHVpbnQzMl90IGhhbmRsZTsKIAogICAgIGlmICgocG9ydF9oYW5kbGUgPiAwKSAmJiAocG9ydF9oYW5kbGUgPD0gTUFYX1JGQ19QT1JUUykKICAgICAgICAgICAgICYmIGJ0YV9qdl9jYi5wb3J0X2NiW3BvcnRfaGFuZGxlIC0gMV0uaGFuZGxlKQpAQCAtMjc3LDcgKzI3Nyw3IEBACiBzdGF0aWMgdEJUQV9KVl9TVEFUVVMgYnRhX2p2X2ZyZWVfcmZjX2NiKHRCVEFfSlZfUkZDX0NCICpwX2NiLCB0QlRBX0pWX1BDQiAqcF9wY2IpCiB7CiAgICAgdEJUQV9KVl9TVEFUVVMgc3RhdHVzID0gQlRBX0pWX1NVQ0NFU1M7Ci0gICAgQk9PTEVBTiByZW1vdmVfc2VydmVyID0gRkFMU0U7CisgICAgYm9vbCByZW1vdmVfc2VydmVyID0gZmFsc2U7CiAgICAgaW50IGNsb3NlX3BlbmRpbmcgPSAwOwogCiAgICAgaWYgKCFwX2NiIHx8ICFwX3BjYikKQEAgLTMwOSw3ICszMDksNyBAQAogICAgICAgICBicmVhazsKICAgICBjYXNlIEJUQV9KVl9TVF9TUl9MSVNURU46CiAgICAgICAgIHBfcGNiLT5zdGF0ZSA9IEJUQV9KVl9TVF9TUl9DTE9TSU5HOwotICAgICAgICByZW1vdmVfc2VydmVyID0gVFJVRTsKKyAgICAgICAgcmVtb3ZlX3NlcnZlciA9IHRydWU7CiAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9qdl9mcmVlX3NyX3JmY19jYjogc3RhdGU6IEJUQV9KVl9TVF9TUl9MSVNURU4sIHNjbjolZCwiCiAgICAgICAgICAgICAgICAgIiB1c2VyX2RhdGE6JXAiLCBwX2NiLT5zY24sIHBfcGNiLT51c2VyX2RhdGEpOwogICAgICAgICBicmVhazsKQEAgLTM1MCw3ICszNTAsNyBAQAogICAgICAgICBidGFfanZfZnJlZV9zZXRfcG1fcHJvZmlsZV9jYihwX3BjYi0+aGFuZGxlKTsKIAogICAgICAgICAvL0luaXRpYWxpemUgY29uZ2VzdGlvbiBmbGFncwotICAgICAgICBwX3BjYi0+Y29uZyA9IEZBTFNFOworICAgICAgICBwX3BjYi0+Y29uZyA9IGZhbHNlOwogICAgICAgICBwX3BjYi0+dXNlcl9kYXRhID0gMDsKICAgICAgICAgaW50IHNpID0gQlRBX0pWX1JGQ19IRExfVE9fU0lEWChwX3BjYi0+aGFuZGxlKTsKICAgICAgICAgaWYgKDAgPD0gc2kgJiYgc2kgPCBCVEFfSlZfTUFYX1JGQ19TUl9TRVNTSU9OKQpAQCAtMzg3LDEzICszODcsMTMgQEAKIAogICAgIGlmKEJUQV9KVl9TVF9OT05FICE9IHBfY2ItPnN0YXRlKQogICAgIHsKLSAgICAgICAgYnRhX2p2X2ZyZWVfc2V0X3BtX3Byb2ZpbGVfY2IoKFVJTlQzMilwX2NiLT5oYW5kbGUpOworICAgICAgICBidGFfanZfZnJlZV9zZXRfcG1fcHJvZmlsZV9jYigodWludDMyX3QpcF9jYi0+aGFuZGxlKTsKICAgICAgICAgaWYgKEdBUF9Db25uQ2xvc2UocF9jYi0+aGFuZGxlKSAhPSBCVF9QQVNTKQogICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJUQV9KVl9GQUlMVVJFOwogICAgIH0KICAgICBwX2NiLT5wc20gPSAwOwogICAgIHBfY2ItPnN0YXRlID0gQlRBX0pWX1NUX05PTkU7Ci0gICAgcF9jYi0+Y29uZyA9IEZBTFNFOworICAgIHBfY2ItPmNvbmcgPSBmYWxzZTsKICAgICBidGFfanZfZnJlZV9zZWNfaWQoJnBfY2ItPnNlY19pZCk7CiAgICAgcF9jYi0+cF9jYmFjayA9IE5VTEw7CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTQwNSwxMyArNDA1LDEzIEBACiAqKiBGdW5jdGlvbiAgICBidGFfanZfY2xlYXJfcG1fY2IKICoqCiAqKiBEZXNjcmlwdGlvbiBjbGVhcnMganYgcG0gY29udHJvbCBibG9jayBhbmQgb3B0aW9uYWxseSBjYWxscyBidGFfc3lzX2Nvbm5fY2xvc2UoKQotKiogICAgICAgICAgICAgSW4gZ2VuZXJhbCBjbG9zZV9jb25uIHNob3VsZCBiZSBzZXQgdG8gVFJVRSB0byByZW1vdmUgcmVnaXN0ZXJpbmcgd2l0aAorKiogICAgICAgICAgICAgSW4gZ2VuZXJhbCBjbG9zZV9jb25uIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSB0byByZW1vdmUgcmVnaXN0ZXJpbmcgd2l0aAogKiogICAgICAgICAgICAgZG0gcG0hCiAqKgogKiogV0FSTklORzogICAgTWFrZSBzdXJlIHRvIGNsZWFyIHBvaW50ZXIgZm9ybSBwb3J0IG9yIGwyYyB0byB0aGlzIGNvbnRyb2wgYmxvY2sgdG9vIQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfanZfY2xlYXJfcG1fY2IodEJUQV9KVl9QTV9DQiAqcF9wbV9jYiwgQk9PTEVBTiBjbG9zZV9jb25uKQorc3RhdGljIHZvaWQgYnRhX2p2X2NsZWFyX3BtX2NiKHRCVEFfSlZfUE1fQ0IgKnBfcG1fY2IsIGJvb2wgY2xvc2VfY29ubikKIHsKICAgICAvKiBuZWVkcyB0byBiZSBjYWxsZWQgaWYgcmVnaXN0ZXJlZCB3aXRoIGJ0YSBwbSwgb3RoZXJ3aXNlIHdlIG1heSBydW4gb3V0IG9mIGRtIHBtIHNsb3RzISAqLwogICAgIGlmIChjbG9zZV9jb25uKQpAQCAtNDMyLDcgKzQzMiw3IEBACiAgKiogICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUgaW4gY2FzZSBvZiBubyBwcm9maWxlIGhhcyBiZWVuIHJlZ2lzdGVyZWQgb3IgYWxyZWFkeSBmcmVlZAogICoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QlRBX0pWX1NUQVRVUyBidGFfanZfZnJlZV9zZXRfcG1fcHJvZmlsZV9jYihVSU5UMzIganZfaGFuZGxlKQorc3RhdGljIHRCVEFfSlZfU1RBVFVTIGJ0YV9qdl9mcmVlX3NldF9wbV9wcm9maWxlX2NiKHVpbnQzMl90IGp2X2hhbmRsZSkKIHsKICAgICB0QlRBX0pWX1NUQVRVUyBzdGF0dXMgPSBCVEFfSlZfRkFJTFVSRTsKICAgICB0QlRBX0pWX1BNX0NCICAqKnBfY2I7CkBAIC00NjMsMTcgKzQ2MywxNyBAQAogCiAgICAgICAgICAgICBpZiAoYmRfY291bnRlciA8PSAxIHx8IChhcHBpZF9jb3VudGVyIDw9IDEpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ0YV9qdl9jbGVhcl9wbV9jYigmYnRhX2p2X2NiLnBtX2NiW2ldLCBUUlVFKTsKKyAgICAgICAgICAgICAgICBidGFfanZfY2xlYXJfcG1fY2IoJmJ0YV9qdl9jYi5wbV9jYltpXSwgdHJ1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnRhX2p2X2NsZWFyX3BtX2NiKCZidGFfanZfY2IucG1fY2JbaV0sIEZBTFNFKTsKKyAgICAgICAgICAgICAgICBidGFfanZfY2xlYXJfcG1fY2IoJmJ0YV9qdl9jYi5wbV9jYltpXSwgZmFsc2UpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoQlRBX0pWX1JGQ09NTV9NQVNLICYganZfaGFuZGxlKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFVJTlQzMiBoaSA9ICgoanZfaGFuZGxlICYgQlRBX0pWX1JGQ19IRExfTUFTSykgJiB+QlRBX0pWX1JGQ09NTV9NQVNLKSAtIDE7Ci0gICAgICAgICAgICAgICAgVUlOVDMyIHNpID0gQlRBX0pWX1JGQ19IRExfVE9fU0lEWChqdl9oYW5kbGUpOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGhpID0gKChqdl9oYW5kbGUgJiBCVEFfSlZfUkZDX0hETF9NQVNLKSAmIH5CVEFfSlZfUkZDT01NX01BU0spIC0gMTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzaSA9IEJUQV9KVl9SRkNfSERMX1RPX1NJRFgoanZfaGFuZGxlKTsKICAgICAgICAgICAgICAgICBpZiAoaGkgPCBCVEFfSlZfTUFYX1JGQ19DT05OICYmIGJ0YV9qdl9jYi5yZmNfY2JbaGldLnBfY2JhY2sgJiYgc2kKICAgICAgICAgICAgICAgICAgICAgICAgIDwgQlRBX0pWX01BWF9SRkNfU1JfU0VTU0lPTiAmJiBidGFfanZfY2IucmZjX2NiW2hpXS5yZmNfaGRsW3NpXSkKICAgICAgICAgICAgICAgICB7CkBAIC01MTgsOSArNTE4LDkgQEAKICAqKiBSZXR1cm5zICAgICBwb2ludGVyIHRvIGFsbG9jYXRlZCBjYiBvciBOVUxMIGluIGNhc2Ugb2YgZmFpbHVyZQogICoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QlRBX0pWX1BNX0NCICpidGFfanZfYWxsb2Nfc2V0X3BtX3Byb2ZpbGVfY2IoVUlOVDMyIGp2X2hhbmRsZSwgdEJUQV9KVl9QTV9JRCBhcHBfaWQpCitzdGF0aWMgdEJUQV9KVl9QTV9DQiAqYnRhX2p2X2FsbG9jX3NldF9wbV9wcm9maWxlX2NiKHVpbnQzMl90IGp2X2hhbmRsZSwgdEJUQV9KVl9QTV9JRCBhcHBfaWQpCiB7Ci0gICAgQk9PTEVBTiBiUmZjSGFuZGxlID0gKGp2X2hhbmRsZSAmIEJUQV9KVl9SRkNPTU1fTUFTSykgIT0gMDsKKyAgICBib29sIGJSZmNIYW5kbGUgPSAoanZfaGFuZGxlICYgQlRBX0pWX1JGQ09NTV9NQVNLKSAhPSAwOwogICAgIEJEX0FERFIgcGVlcl9iZF9hZGRyOwogICAgIGludCBpLCBqOwogICAgIHRCVEFfSlZfUE1fQ0IgKipwcF9jYjsKQEAgLTU1Myw3ICs1NTMsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoanZfaGFuZGxlID09IGJ0YV9qdl9jYi5sMmNfY2Jbal0uaGFuZGxlKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwcF9jYiA9ICZidGFfanZfY2IubDJjX2NiW2pdLnBfcG1fY2I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCAqcF9iZF9hZGRyID0gR0FQX0Nvbm5HZXRSZW1vdGVBZGRyKChVSU5UMTYpanZfaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfYmRfYWRkciA9IEdBUF9Db25uR2V0UmVtb3RlQWRkcigodWludDE2X3QpanZfaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IHBfYmRfYWRkcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZGNweShwZWVyX2JkX2FkZHIsIHBfYmRfYWRkcik7CiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCkBAIC01ODksMTIgKzU4OSwxMiBAQAogKioKICoqIERlc2NyaXB0aW9uICBmb3Igbm93IHVzZSBvbmx5IHRoZSBsZWdhbCBQU00gcGVyIEpTUjgyIHNwZWMKICoqCi0qKiBSZXR1cm5zICAgICAgVFJVRSwgaWYgYWxsb3dlZAorKiogUmV0dXJucyAgICAgIHRydWUsIGlmIGFsbG93ZWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfanZfY2hlY2tfcHNtKFVJTlQxNiBwc20pCitib29sIGJ0YV9qdl9jaGVja19wc20odWludDE2X3QgcHNtKQogewotICAgIEJPT0xFQU4gcmV0ID0gRkFMU0U7CisgICAgYm9vbCByZXQgPSBmYWxzZTsKIAogICAgIGlmIChMMkNfSVNfVkFMSURfUFNNKHBzbSkpCiAgICAgewpAQCAtNjEwLDM5ICs2MTAsMzkgQEAKIAogICAgICAgICAgICAgY2FzZSBUQ1NfUFNNX0lOVEVSQ09NOiAgLyogNSAqLwogICAgICAgICAgICAgY2FzZSBUQ1NfUFNNX0NPUkRMRVNTOiAgLyogNyAqLwotICAgICAgICAgICAgICAgIGlmKCBGQUxTRSA9PSBidGFfc3lzX2lzX3JlZ2lzdGVyKEJUQV9JRF9DVCkgJiYKLSAgICAgICAgICAgICAgICAgICAgRkFMU0UgPT0gYnRhX3N5c19pc19yZWdpc3RlcihCVEFfSURfQ0cpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBpZiggZmFsc2UgPT0gYnRhX3N5c19pc19yZWdpc3RlcihCVEFfSURfQ1QpICYmCisgICAgICAgICAgICAgICAgICAgIGZhbHNlID09IGJ0YV9zeXNfaXNfcmVnaXN0ZXIoQlRBX0lEX0NHKSApCisgICAgICAgICAgICAgICAgICAgIHJldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgQlRfUFNNX0JORVA6ICAgICAgIC8qIEYgKi8KLSAgICAgICAgICAgICAgICBpZihGQUxTRSA9PSBidGFfc3lzX2lzX3JlZ2lzdGVyKEJUQV9JRF9QQU4pKQotICAgICAgICAgICAgICAgICAgICByZXQgPSBUUlVFOworICAgICAgICAgICAgICAgIGlmKGZhbHNlID09IGJ0YV9zeXNfaXNfcmVnaXN0ZXIoQlRBX0lEX1BBTikpCisgICAgICAgICAgICAgICAgICAgIHJldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgSElEX1BTTV9DT05UUk9MOiAgIC8qIDB4MTEgKi8KICAgICAgICAgICAgIGNhc2UgSElEX1BTTV9JTlRFUlJVUFQ6IC8qIDB4MTMgKi8KICAgICAgICAgICAgICAgICAvL0ZJWDogYWxsb3cgSElEIERldmljZSBhbmQgSElEIEhvc3QgdG8gY29leGlzdAotICAgICAgICAgICAgICAgIGlmKCBGQUxTRSA9PSBidGFfc3lzX2lzX3JlZ2lzdGVyKEJUQV9JRF9IRCkgfHwKLSAgICAgICAgICAgICAgICAgICAgRkFMU0UgPT0gYnRhX3N5c19pc19yZWdpc3RlcihCVEFfSURfSEgpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBpZiggZmFsc2UgPT0gYnRhX3N5c19pc19yZWdpc3RlcihCVEFfSURfSEQpIHx8CisgICAgICAgICAgICAgICAgICAgIGZhbHNlID09IGJ0YV9zeXNfaXNfcmVnaXN0ZXIoQlRBX0lEX0hIKSApCisgICAgICAgICAgICAgICAgICAgIHJldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgQVZDVF9QU006ICAgICAgICAgIC8qIDB4MTcgKi8KICAgICAgICAgICAgIGNhc2UgQVZEVF9QU006ICAgICAgICAgIC8qIDB4MTkgKi8KLSAgICAgICAgICAgICAgICBpZiAoKEZBTFNFID09IGJ0YV9zeXNfaXNfcmVnaXN0ZXIoQlRBX0lEX0FWKSkgJiYKLSAgICAgICAgICAgICAgICAgICAoRkFMU0UgPT0gYnRhX3N5c19pc19yZWdpc3RlcihCVEFfSURfQVZLKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgaWYgKChmYWxzZSA9PSBidGFfc3lzX2lzX3JlZ2lzdGVyKEJUQV9JRF9BVikpICYmCisgICAgICAgICAgICAgICAgICAgKGZhbHNlID09IGJ0YV9zeXNfaXNfcmVnaXN0ZXIoQlRBX0lEX0FWSykpKQorICAgICAgICAgICAgICAgICAgICByZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldCA9IFRSVUU7CisgICAgICAgICAgICByZXQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiByZXQ7CkBAIC02OTAsMTAgKzY5MCwxMCBAQAogICogbGlzdC4KICAqIElmIG5vIGZyZWUgUFNNcyBleGlzdCwgMCB3aWxsIGJlIHJldHVybmVkLgogICovCi1zdGF0aWMgVUlOVDE2IGJ0YV9qdl9nZXRfZnJlZV9wc20oKSB7CitzdGF0aWMgdWludDE2X3QgYnRhX2p2X2dldF9mcmVlX3BzbSgpIHsKICAgICBjb25zdCBpbnQgY250ID0gc2l6ZW9mKGJ0YV9qdl9jYi5mcmVlX3BzbV9saXN0KS9zaXplb2YoYnRhX2p2X2NiLmZyZWVfcHNtX2xpc3RbMF0pOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY250OyBpKyspIHsKLSAgICAgICAgVUlOVDE2IHBzbSA9IGJ0YV9qdl9jYi5mcmVlX3BzbV9saXN0W2ldOworICAgICAgICB1aW50MTZfdCBwc20gPSBidGFfanZfY2IuZnJlZV9wc21fbGlzdFtpXTsKICAgICAgICAgaWYgKHBzbSAhPSAwKSB7CiAgICAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcygpOiBSZXVzaW5nIFBTTTogMHglMDRkIiwgX19mdW5jX18sIHBzbSkKICAgICAgICAgICAgIGJ0YV9qdl9jYi5mcmVlX3BzbV9saXN0W2ldID0gMDsKQEAgLTcwMyw3ICs3MDMsNyBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBidGFfanZfc2V0X2ZyZWVfcHNtKFVJTlQxNiBwc20pIHsKK3N0YXRpYyB2b2lkIGJ0YV9qdl9zZXRfZnJlZV9wc20odWludDE2X3QgcHNtKSB7CiAgICAgaW50IGZyZWVfaW5kZXggPSAtMTsKICAgICBjb25zdCBpbnQgY250ID0gc2l6ZW9mKGJ0YV9qdl9jYi5mcmVlX3BzbV9saXN0KS9zaXplb2YoYnRhX2p2X2NiLmZyZWVfcHNtX2xpc3RbMF0pOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY250OyBpKyspIHsKQEAgLTczMywxNSArNzMzLDE1IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfanZfZ2V0X2NoYW5uZWxfaWQodEJUQV9KVl9NU0cgKnBfZGF0YSkKIHsKLSAgICBVSU5UMTYgICBwc20gPSAwOworICAgIHVpbnQxNl90ICAgcHNtID0gMDsKIAogICAgIHN3aXRjaCAocF9kYXRhLT5hbGxvY19jaGFubmVsLnR5cGUpIHsKICAgICAgICAgY2FzZSBCVEFfSlZfQ09OTl9UWVBFX1JGQ09NTTogewotICAgICAgICAgICAgSU5UMzIgICBjaGFubmVsID0gcF9kYXRhLT5hbGxvY19jaGFubmVsLmNoYW5uZWw7Ci0gICAgICAgICAgICBVSU5UOCBzY24gPSAwOworICAgICAgICAgICAgaW50MzJfdCAgIGNoYW5uZWwgPSBwX2RhdGEtPmFsbG9jX2NoYW5uZWwuY2hhbm5lbDsKKyAgICAgICAgICAgIHVpbnQ4X3Qgc2NuID0gMDsKICAgICAgICAgICAgIGlmIChjaGFubmVsID4gMCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoQlRNX1RyeUFsbG9jYXRlU0NOKGNoYW5uZWwpID09IEZBTFNFKQorICAgICAgICAgICAgICAgIGlmIChCVE1fVHJ5QWxsb2NhdGVTQ04oY2hhbm5lbCkgPT0gZmFsc2UpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKCJyZmMgY2hhbm5lbDolZCBhbHJlYWR5IGluIHVzZSBvciBpbnZhbGlkIiwgY2hhbm5lbCk7CiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgPSAwOwpAQCAtNzUxLDggKzc1MSw4IEBACiAgICAgICAgICAgICAgICAgY2hhbm5lbCA9IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoY2hhbm5lbCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYnRhX2p2X2NiLnNjbltjaGFubmVsLTFdID0gVFJVRTsKLSAgICAgICAgICAgICAgICBzY24gPSAoVUlOVDgpIGNoYW5uZWw7CisgICAgICAgICAgICAgICAgYnRhX2p2X2NiLnNjbltjaGFubmVsLTFdID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzY24gPSAodWludDhfdCkgY2hhbm5lbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChidGFfanZfY2IucF9kbV9jYmFjaykKICAgICAgICAgICAgICAgICBidGFfanZfY2IucF9kbV9jYmFjayhCVEFfSlZfR0VUX1NDTl9FVlQsICh0QlRBX0pWICopJnNjbiwKQEAgLTc4NywxNCArNzg3LDE0IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfanZfZnJlZV9zY24odEJUQV9KVl9NU0cgKnBfZGF0YSkKIHsKLSAgICBVSU5UMTYgICBzY24gPSBwX2RhdGEtPmZyZWVfY2hhbm5lbC5zY247CisgICAgdWludDE2X3QgICBzY24gPSBwX2RhdGEtPmZyZWVfY2hhbm5lbC5zY247CiAKICAgICBzd2l0Y2ggKHBfZGF0YS0+ZnJlZV9jaGFubmVsLnR5cGUpIHsKICAgICAgICAgY2FzZSBCVEFfSlZfQ09OTl9UWVBFX1JGQ09NTTogewogICAgICAgICAgICAgaWYgKHNjbiA+IDAgJiYgc2NuIDw9IEJUQV9KVl9NQVhfU0NOICYmIGJ0YV9qdl9jYi5zY25bc2NuLTFdKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8qIHRoaXMgc2NuIGlzIHVzZWQgYnkgSlYgKi8KLSAgICAgICAgICAgICAgICBidGFfanZfY2Iuc2NuW3Njbi0xXSA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJ0YV9qdl9jYi5zY25bc2NuLTFdID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgQlRNX0ZyZWVTQ04oc2NuKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtODU0LDcgKzg1NCw3IEBACiAqKiBSZXR1cm5zICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfanZfc3RhcnRfZGlzY292ZXJ5X2NiYWNrKFVJTlQxNiByZXN1bHQsIHZvaWQgKiB1c2VyX2RhdGEpCitzdGF0aWMgdm9pZCBidGFfanZfc3RhcnRfZGlzY292ZXJ5X2NiYWNrKHVpbnQxNl90IHJlc3VsdCwgdm9pZCAqIHVzZXJfZGF0YSkKIHsKICAgICB0QlRBX0pWX1NUQVRVUyBzdGF0dXM7CiAKQEAgLTg3Nyw3ICs4NzcsNyBAQAogICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygicF9zZHBfcmVjOiVwIiwgcF9zZHBfcmVjKTsKICAgICAgICAgICAgIGlmIChwX3NkcF9yZWMgJiYgU0RQX0ZpbmRQcm90b2NvbExpc3RFbGVtSW5SZWMocF9zZHBfcmVjLCBVVUlEX1BST1RPQ09MX1JGQ09NTSwgJnBlKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkY29tcC5zY24gPSAoVUlOVDgpIHBlLnBhcmFtc1swXTsKKyAgICAgICAgICAgICAgICBkY29tcC5zY24gPSAodWludDhfdCkgcGUucGFyYW1zWzBdOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJUQV9KVl9TVUNDRVNTOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC05ODUsNyArOTg1LDcgQEAKICoqIFJldHVybnMgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9qdl9sMmNhcF9jbGllbnRfY2JhY2soVUlOVDE2IGdhcF9oYW5kbGUsIFVJTlQxNiBldmVudCkKK3N0YXRpYyB2b2lkIGJ0YV9qdl9sMmNhcF9jbGllbnRfY2JhY2sodWludDE2X3QgZ2FwX2hhbmRsZSwgdWludDE2X3QgZXZlbnQpCiB7CiAgICAgdEJUQV9KVl9MMkNfQ0IgICpwX2NiID0gJmJ0YV9qdl9jYi5sMmNfY2JbZ2FwX2hhbmRsZV07CiAgICAgdEJUQV9KViAgICAgZXZ0X2RhdGE7CkBAIC0xMDA5LDcgKzEwMDksNyBAQAogICAgIGNhc2UgR0FQX0VWVF9DT05OX0NMT1NFRDoKICAgICAgICAgcF9jYi0+c3RhdGUgPSBCVEFfSlZfU1RfTk9ORTsKICAgICAgICAgYnRhX2p2X2ZyZWVfc2VjX2lkKCZwX2NiLT5zZWNfaWQpOwotICAgICAgICBldnRfZGF0YS5sMmNfY2xvc2UuYXN5bmMgPSBUUlVFOworICAgICAgICBldnRfZGF0YS5sMmNfY2xvc2UuYXN5bmMgPSB0cnVlOwogICAgICAgICBwX2NiLT5wX2NiYWNrKEJUQV9KVl9MMkNBUF9DTE9TRV9FVlQsICZldnRfZGF0YSwgcF9jYi0+dXNlcl9kYXRhKTsKICAgICAgICAgcF9jYi0+cF9jYmFjayA9IE5VTEw7CiAgICAgICAgIGJyZWFrOwpAQCAtMTAyOCw3ICsxMDI4LDcgQEAKIAogICAgIGNhc2UgR0FQX0VWVF9DT05OX0NPTkdFU1RFRDoKICAgICBjYXNlIEdBUF9FVlRfQ09OTl9VTkNPTkdFU1RFRDoKLSAgICAgICAgcF9jYi0+Y29uZyA9IChldmVudCA9PSBHQVBfRVZUX0NPTk5fQ09OR0VTVEVEKSA/IFRSVUUgOiBGQUxTRTsKKyAgICAgICAgcF9jYi0+Y29uZyA9IChldmVudCA9PSBHQVBfRVZUX0NPTk5fQ09OR0VTVEVEKSA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgZXZ0X2RhdGEubDJjX2NvbmcuY29uZyA9IHBfY2ItPmNvbmc7CiAgICAgICAgIHBfY2ItPnBfY2JhY2soQlRBX0pWX0wyQ0FQX0NPTkdfRVZULCAmZXZ0X2RhdGEsIHBfY2ItPnVzZXJfZGF0YSk7CiAgICAgICAgIGJyZWFrOwpAQCAtMTA1MSwxNiArMTA1MSwxNiBAQAogewogICAgIHRCVEFfSlZfTDJDX0NCICAgICAgKnBfY2I7CiAgICAgdEJUQV9KVl9MMkNBUF9DTF9JTklUICBldnRfZGF0YTsKLSAgICBVSU5UMTYgIGhhbmRsZT1HQVBfSU5WQUxJRF9IQU5ETEU7Ci0gICAgVUlOVDggICBzZWNfaWQ7CisgICAgdWludDE2X3QgIGhhbmRsZT1HQVBfSU5WQUxJRF9IQU5ETEU7CisgICAgdWludDhfdCAgIHNlY19pZDsKICAgICB0TDJDQVBfQ0ZHX0lORk8gY2ZnOwogICAgIHRCVEFfSlZfQVBJX0wyQ0FQX0NPTk5FQ1QgKmNjID0gJihwX2RhdGEtPmwyY2FwX2Nvbm5lY3QpOwotICAgIFVJTlQ4IGNoYW5fbW9kZV9tYXNrID0gR0FQX0ZDUl9DSEFOX09QVF9CQVNJQzsKKyAgICB1aW50OF90IGNoYW5fbW9kZV9tYXNrID0gR0FQX0ZDUl9DSEFOX09QVF9CQVNJQzsKICAgICB0TDJDQVBfRVJUTV9JTkZPICAgICplcnRtX2luZm8gPSBOVUxMOwogCiAgICAgbWVtc2V0KCZjZmcsIDAsIHNpemVvZih0TDJDQVBfQ0ZHX0lORk8pKTsKIAotICAgIGlmIChjYy0+aGFzX2NmZyA9PSBUUlVFKQorICAgIGlmIChjYy0+aGFzX2NmZyA9PSB0cnVlKQogICAgIHsKICAgICAgICAgY2ZnID0gY2MtPmNmZzsKICAgICAgICAgaWYgKGNmZy5mY3JfcHJlc2VudCAmJiBjZmcuZmNyLm1vZGUgPT0gTDJDQVBfRkNSX0VSVE1fTU9ERSkgewpAQCAtMTA2OCwxMyArMTA2OCwxMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGNjLT5oYXNfZXJ0bV9pbmZvID09IFRSVUUpCisgICAgaWYgKGNjLT5oYXNfZXJ0bV9pbmZvID09IHRydWUpCiAgICAgewogICAgICAgICBlcnRtX2luZm8gPSAmKGNjLT5lcnRtX2luZm8pOwogICAgIH0KIAogICAgIC8qIFdlIG5lZWQgdG8gdXNlIHRoaXMgdmFsdWUgZm9yIE1UVSB0byBiZSBhYmxlIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBjZmcgaXMgbm90IHNldCBpbiByZXEuICovCi0gICAgY2ZnLm10dV9wcmVzZW50ID0gVFJVRTsKKyAgICBjZmcubXR1X3ByZXNlbnQgPSB0cnVlOwogICAgIGNmZy5tdHUgPSBjYy0+cnhfbXR1OwogCiAgICAgLyogVE9ETzogRE0gcm9sZSBtYW5hZ2VyCkBAIC0xMTM3LDcgKzExMzcsNyBAQAogCiAgICAgZXZ0X2RhdGEuaGFuZGxlID0gY2MtPmhhbmRsZTsKICAgICBldnRfZGF0YS5zdGF0dXMgPSBidGFfanZfZnJlZV9sMmNfY2IoY2MtPnBfY2IpOwotICAgIGV2dF9kYXRhLmFzeW5jID0gRkFMU0U7CisgICAgZXZ0X2RhdGEuYXN5bmMgPSBmYWxzZTsKIAogICAgIGlmIChwX2NiYWNrKQogICAgICAgICBwX2NiYWNrKEJUQV9KVl9MMkNBUF9DTE9TRV9FVlQsICh0QlRBX0pWICopJmV2dF9kYXRhLCB1c2VyX2RhdGEpOwpAQCAtMTE1Miw3ICsxMTUyLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfanZfbDJjYXBfc2VydmVyX2NiYWNrKFVJTlQxNiBnYXBfaGFuZGxlLCBVSU5UMTYgZXZlbnQpCitzdGF0aWMgdm9pZCBidGFfanZfbDJjYXBfc2VydmVyX2NiYWNrKHVpbnQxNl90IGdhcF9oYW5kbGUsIHVpbnQxNl90IGV2ZW50KQogewogICAgIHRCVEFfSlZfTDJDX0NCICAqcF9jYiA9ICZidGFfanZfY2IubDJjX2NiW2dhcF9oYW5kbGVdOwogICAgIHRCVEFfSlYgZXZ0X2RhdGE7CkBAIC0xMTc2LDcgKzExNzYsNyBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgR0FQX0VWVF9DT05OX0NMT1NFRDoKLSAgICAgICAgZXZ0X2RhdGEubDJjX2Nsb3NlLmFzeW5jID0gVFJVRTsKKyAgICAgICAgZXZ0X2RhdGEubDJjX2Nsb3NlLmFzeW5jID0gdHJ1ZTsKICAgICAgICAgZXZ0X2RhdGEubDJjX2Nsb3NlLmhhbmRsZSA9IHBfY2ItPmhhbmRsZTsKICAgICAgICAgcF9jYmFjayA9IHBfY2ItPnBfY2JhY2s7CiAgICAgICAgIHVzZXJfZGF0YSA9IHBfY2ItPnVzZXJfZGF0YTsKQEAgLTExOTgsNyArMTE5OCw3IEBACiAKICAgICBjYXNlIEdBUF9FVlRfQ09OTl9DT05HRVNURUQ6CiAgICAgY2FzZSBHQVBfRVZUX0NPTk5fVU5DT05HRVNURUQ6Ci0gICAgICAgIHBfY2ItPmNvbmcgPSAoZXZlbnQgPT0gR0FQX0VWVF9DT05OX0NPTkdFU1RFRCkgPyBUUlVFIDogRkFMU0U7CisgICAgICAgIHBfY2ItPmNvbmcgPSAoZXZlbnQgPT0gR0FQX0VWVF9DT05OX0NPTkdFU1RFRCkgPyB0cnVlIDogZmFsc2U7CiAgICAgICAgIGV2dF9kYXRhLmwyY19jb25nLmNvbmcgPSBwX2NiLT5jb25nOwogICAgICAgICBwX2NiLT5wX2NiYWNrKEJUQV9KVl9MMkNBUF9DT05HX0VWVCwgJmV2dF9kYXRhLCBwX2NiLT51c2VyX2RhdGEpOwogICAgICAgICBicmVhazsKQEAgLTEyMjAsMzYgKzEyMjAsMzYgQEAKIHZvaWQgYnRhX2p2X2wyY2FwX3N0YXJ0X3NlcnZlcih0QlRBX0pWX01TRyAqcF9kYXRhKQogewogICAgIHRCVEFfSlZfTDJDX0NCICAgICAgKnBfY2I7Ci0gICAgVUlOVDggICBzZWNfaWQ7Ci0gICAgVUlOVDE2ICBoYW5kbGU7CisgICAgdWludDhfdCAgIHNlY19pZDsKKyAgICB1aW50MTZfdCAgaGFuZGxlOwogICAgIHRMMkNBUF9DRkdfSU5GTyBjZmc7CiAgICAgdEJUQV9KVl9MMkNBUF9TVEFSVCBldnRfZGF0YTsKICAgICB0QlRBX0pWX0FQSV9MMkNBUF9TRVJWRVIgKmxzID0gJihwX2RhdGEtPmwyY2FwX3NlcnZlcik7Ci0gICAgVUlOVDggY2hhbl9tb2RlX21hc2sgPSBHQVBfRkNSX0NIQU5fT1BUX0JBU0lDOworICAgIHVpbnQ4X3QgY2hhbl9tb2RlX21hc2sgPSBHQVBfRkNSX0NIQU5fT1BUX0JBU0lDOwogICAgIHRMMkNBUF9FUlRNX0lORk8gICAgKmVydG1faW5mbyA9IE5VTEw7CiAKICAgICBtZW1zZXQoJmNmZywgMCwgc2l6ZW9mKHRMMkNBUF9DRkdfSU5GTykpOwogCi0gICAgaWYgKGxzLT5oYXNfY2ZnID09IFRSVUUpIHsKKyAgICBpZiAobHMtPmhhc19jZmcgPT0gdHJ1ZSkgewogICAgICAgICBjZmcgPSBscy0+Y2ZnOwogICAgICAgICBpZiAoY2ZnLmZjcl9wcmVzZW50ICYmIGNmZy5mY3IubW9kZSA9PSBMMkNBUF9GQ1JfRVJUTV9NT0RFKSB7CiAgICAgICAgICAgICBjaGFuX21vZGVfbWFzayA9IEdBUF9GQ1JfQ0hBTl9PUFRfRVJUTTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChscy0+aGFzX2VydG1faW5mbyA9PSBUUlVFKSB7CisgICAgaWYgKGxzLT5oYXNfZXJ0bV9pbmZvID09IHRydWUpIHsKICAgICAgICAgZXJ0bV9pbmZvID0gJihscy0+ZXJ0bV9pbmZvKTsKICAgICB9CiAKICAgICAvL0ZJWDogTVRVPTAgbWVhbnMgbm90IHByZXNlbnQKICAgICBpZiAobHMtPnJ4X210dSA+MCkKICAgICB7Ci0gICAgICAgIGNmZy5tdHVfcHJlc2VudCA9IFRSVUU7CisgICAgICAgIGNmZy5tdHVfcHJlc2VudCA9IHRydWU7CiAgICAgICAgIGNmZy5tdHUgPSBscy0+cnhfbXR1OwogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgICBjZmcubXR1X3ByZXNlbnQgPSBGQUxTRTsKKyAgICAgICAgY2ZnLm10dV9wcmVzZW50ID0gZmFsc2U7CiAgICAgICAgIGNmZy5tdHUgPSAwOwogICAgIH0KIApAQCAtMTI1OSw3ICsxMjU5LDcgQEAKIAogICAgIHNlY19pZCA9IGJ0YV9qdl9hbGxvY19zZWNfaWQoKTsKICAgICAvKiBQU00gY2hlY2tpbmcgaXMgbm90IHJlcXVpcmVkIGZvciBMRSBDT0MgKi8KLSAgICBpZiAoMCA9PSBzZWNfaWQgfHwgKChscy0+dHlwZSA9PSBCVEFfSlZfQ09OTl9UWVBFX0wyQ0FQKSAmJiAoRkFMU0UgPT0gYnRhX2p2X2NoZWNrX3BzbShscy0+bG9jYWxfcHNtKSkpIHx8CisgICAgaWYgKDAgPT0gc2VjX2lkIHx8ICgobHMtPnR5cGUgPT0gQlRBX0pWX0NPTk5fVFlQRV9MMkNBUCkgJiYgKGZhbHNlID09IGJ0YV9qdl9jaGVja19wc20obHMtPmxvY2FsX3BzbSkpKSB8fAogICAgICAgICAoaGFuZGxlID0gR0FQX0Nvbm5PcGVuKCJKViBMMkNBUCIsIHNlY19pZCwgMSwgMCwgbHMtPmxvY2FsX3BzbSwgJmNmZywgZXJ0bV9pbmZvLAogICAgICAgICAgICAgbHMtPnNlY19tYXNrLCBjaGFuX21vZGVfbWFzaywgYnRhX2p2X2wyY2FwX3NlcnZlcl9jYmFjaywgbHMtPnR5cGUpKSA9PSBHQVBfSU5WQUxJRF9IQU5ETEUpCiAgICAgewpAQCAtMTMwOCw3ICsxMzA4LDcgQEAKICAgICAgICAgICAgIHVzZXJfZGF0YSA9IHBfY2ItPnVzZXJfZGF0YTsKICAgICAgICAgICAgIGV2dF9kYXRhLmhhbmRsZSA9IHBfY2ItPmhhbmRsZTsKICAgICAgICAgICAgIGV2dF9kYXRhLnN0YXR1cyA9IGJ0YV9qdl9mcmVlX2wyY19jYihwX2NiKTsKLSAgICAgICAgICAgIGV2dF9kYXRhLmFzeW5jID0gRkFMU0U7CisgICAgICAgICAgICBldnRfZGF0YS5hc3luYyA9IGZhbHNlOwogICAgICAgICAgICAgcF9jYmFjayhCVEFfSlZfTDJDQVBfQ0xPU0VfRVZULCAodEJUQV9KViAqKSZldnRfZGF0YSwgdXNlcl9kYXRhKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xNDM0LDcgKzE0MzQsNyBAQAogKiogUmV0dXJucyAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBidGFfanZfcG9ydF9kYXRhX2NvX2NiYWNrKFVJTlQxNiBwb3J0X2hhbmRsZSwgVUlOVDggKmJ1ZiwgVUlOVDE2IGxlbiwgaW50IHR5cGUpCitzdGF0aWMgaW50IGJ0YV9qdl9wb3J0X2RhdGFfY29fY2JhY2sodWludDE2X3QgcG9ydF9oYW5kbGUsIHVpbnQ4X3QgKmJ1ZiwgdWludDE2X3QgbGVuLCBpbnQgdHlwZSkKIHsKICAgICB0QlRBX0pWX1JGQ19DQiAgKnBfY2IgPSBidGFfanZfcmZjX3BvcnRfdG9fY2IocG9ydF9oYW5kbGUpOwogICAgIHRCVEFfSlZfUENCICAgICAqcF9wY2IgPSBidGFfanZfcmZjX3BvcnRfdG9fcGNiKHBvcnRfaGFuZGxlKTsKQEAgLTE0NjcsMTMgKzE0NjcsMTMgQEAKICoqIFJldHVybnMgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9qdl9wb3J0X21nbXRfY2xfY2JhY2soVUlOVDMyIGNvZGUsIFVJTlQxNiBwb3J0X2hhbmRsZSkKK3N0YXRpYyB2b2lkIGJ0YV9qdl9wb3J0X21nbXRfY2xfY2JhY2sodWludDMyX3QgY29kZSwgdWludDE2X3QgcG9ydF9oYW5kbGUpCiB7CiAgICAgdEJUQV9KVl9SRkNfQ0IgICpwX2NiID0gYnRhX2p2X3JmY19wb3J0X3RvX2NiKHBvcnRfaGFuZGxlKTsKICAgICB0QlRBX0pWX1BDQiAgICAgKnBfcGNiID0gYnRhX2p2X3JmY19wb3J0X3RvX3BjYihwb3J0X2hhbmRsZSk7CiAgICAgdEJUQV9KViBldnRfZGF0YTsKICAgICBCRF9BRERSIHJlbV9iZGE7Ci0gICAgVUlOVDE2IGxjaWQ7CisgICAgdWludDE2X3QgbGNpZDsKICAgICB0QlRBX0pWX1JGQ09NTV9DQkFDSyAqcF9jYmFjazsgIC8qIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLwogCiAgICAgQVBQTF9UUkFDRV9ERUJVRyggImJ0YV9qdl9wb3J0X21nbXRfY2xfY2JhY2s6Y29kZTolZCwgcG9ydF9oYW5kbGUlZCIsIGNvZGUsIHBvcnRfaGFuZGxlKTsKQEAgLTE0OTgsMTMgKzE0OTgsMTMgQEAKICAgICAgICAgZXZ0X2RhdGEucmZjX2Nsb3NlLmhhbmRsZSA9IHBfY2ItPmhhbmRsZTsKICAgICAgICAgZXZ0X2RhdGEucmZjX2Nsb3NlLnN0YXR1cyA9IEJUQV9KVl9GQUlMVVJFOwogICAgICAgICBldnRfZGF0YS5yZmNfY2xvc2UucG9ydF9zdGF0dXMgPSBjb2RlOwotICAgICAgICBldnRfZGF0YS5yZmNfY2xvc2UuYXN5bmMgPSBUUlVFOworICAgICAgICBldnRfZGF0YS5yZmNfY2xvc2UuYXN5bmMgPSB0cnVlOwogICAgICAgICBpZiAocF9wY2ItPnN0YXRlID09IEJUQV9KVl9TVF9DTF9DTE9TSU5HKQogICAgICAgICB7Ci0gICAgICAgICAgICBldnRfZGF0YS5yZmNfY2xvc2UuYXN5bmMgPSBGQUxTRTsKKyAgICAgICAgICAgIGV2dF9kYXRhLnJmY19jbG9zZS5hc3luYyA9IGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIC8vcF9wY2ItPnN0YXRlID0gQlRBX0pWX1NUX05PTkU7Ci0gICAgICAgIC8vcF9wY2ItPmNvbmcgPSBGQUxTRTsKKyAgICAgICAgLy9wX3BjYi0+Y29uZyA9IGZhbHNlOwogICAgICAgICBwX2NiYWNrID0gcF9jYi0+cF9jYmFjazsKICAgICAgICAgcF9jYmFjayhCVEFfSlZfUkZDT01NX0NMT1NFX0VWVCwgJmV2dF9kYXRhLCBwX3BjYi0+dXNlcl9kYXRhKTsKICAgICAgICAgLy9idGFfanZfZnJlZV9yZmNfY2IocF9jYiwgcF9wY2IpOwpAQCAtMTUyMSw3ICsxNTIxLDcgQEAKICoqIFJldHVybnMgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9qdl9wb3J0X2V2ZW50X2NsX2NiYWNrKFVJTlQzMiBjb2RlLCBVSU5UMTYgcG9ydF9oYW5kbGUpCitzdGF0aWMgdm9pZCBidGFfanZfcG9ydF9ldmVudF9jbF9jYmFjayh1aW50MzJfdCBjb2RlLCB1aW50MTZfdCBwb3J0X2hhbmRsZSkKIHsKICAgICB0QlRBX0pWX1JGQ19DQiAgKnBfY2IgPSBidGFfanZfcmZjX3BvcnRfdG9fY2IocG9ydF9oYW5kbGUpOwogICAgIHRCVEFfSlZfUENCICAgICAqcF9wY2IgPSBidGFfanZfcmZjX3BvcnRfdG9fcGNiKHBvcnRfaGFuZGxlKTsKQEAgLTE1NDEsNyArMTU0MSw3IEBACiAKICAgICBpZiAoY29kZSAmIFBPUlRfRVZfRkMpCiAgICAgewotICAgICAgICBwX3BjYi0+Y29uZyA9IChjb2RlICYgUE9SVF9FVl9GQ1MpID8gRkFMU0UgOiBUUlVFOworICAgICAgICBwX3BjYi0+Y29uZyA9IChjb2RlICYgUE9SVF9FVl9GQ1MpID8gZmFsc2UgOiB0cnVlOwogICAgICAgICBldnRfZGF0YS5yZmNfY29uZy5jb25nID0gcF9wY2ItPmNvbmc7CiAgICAgICAgIGV2dF9kYXRhLnJmY19jb25nLmhhbmRsZSA9IHBfY2ItPmhhbmRsZTsKICAgICAgICAgZXZ0X2RhdGEucmZjX2Nvbmcuc3RhdHVzID0gQlRBX0pWX1NVQ0NFU1M7CkBAIC0xNTY1LDEwICsxNTY1LDEwIEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfanZfcmZjb21tX2Nvbm5lY3QodEJUQV9KVl9NU0cgKnBfZGF0YSkKIHsKLSAgICBVSU5UMTYgaGFuZGxlID0gMDsKLSAgICBVSU5UMzIgZXZlbnRfbWFzayA9IEJUQV9KVl9SRkNfRVZfTUFTSzsKKyAgICB1aW50MTZfdCBoYW5kbGUgPSAwOworICAgIHVpbnQzMl90IGV2ZW50X21hc2sgPSBCVEFfSlZfUkZDX0VWX01BU0s7CiAgICAgdFBPUlRfU1RBVEUgcG9ydF9zdGF0ZTsKLSAgICBVSU5UOCAgIHNlY19pZCA9IDA7CisgICAgdWludDhfdCAgIHNlY19pZCA9IDA7CiAgICAgdEJUQV9KVl9SRkNfQ0IgICpwX2NiID0gTlVMTDsKICAgICB0QlRBX0pWX1BDQiAgICAgKnBfcGNiOwogICAgIHRCVEFfSlZfQVBJX1JGQ09NTV9DT05ORUNUICpjYyA9ICYocF9kYXRhLT5yZmNvbW1fY29ubmVjdCk7CkBAIC0xNTgzLDE1ICsxNTgzLDE1IEBACiAgICAgZXZ0X2RhdGEuc2VjX2lkID0gc2VjX2lkOwogICAgIGV2dF9kYXRhLnN0YXR1cyA9IEJUQV9KVl9TVUNDRVNTOwogICAgIGlmICgwID09IHNlY19pZCB8fAotICAgICAgICBCVE1fU2V0U2VjdXJpdHlMZXZlbChUUlVFLCAiIiwgc2VjX2lkLCAgY2MtPnNlY19tYXNrLCBCVF9QU01fUkZDT01NLAotICAgICAgICAgICAgICAgIEJUTV9TRUNfUFJPVE9fUkZDT01NLCBjYy0+cmVtb3RlX3NjbikgPT0gRkFMU0UpCisgICAgICAgIEJUTV9TZXRTZWN1cml0eUxldmVsKHRydWUsICIiLCBzZWNfaWQsICBjYy0+c2VjX21hc2ssIEJUX1BTTV9SRkNPTU0sCisgICAgICAgICAgICAgICAgQlRNX1NFQ19QUk9UT19SRkNPTU0sIGNjLT5yZW1vdGVfc2NuKSA9PSBmYWxzZSkKICAgICB7CiAgICAgICAgIGV2dF9kYXRhLnN0YXR1cyA9IEJUQV9KVl9GQUlMVVJFOwogICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKCJzZWNfaWQ6JWQgaXMgemVybyBvciBCVE1fU2V0U2VjdXJpdHlMZXZlbCBmYWlsZWQsIHJlbW90ZV9zY246JWQiLCBzZWNfaWQsIGNjLT5yZW1vdGVfc2NuKTsKICAgICB9CiAKICAgICBpZiAoZXZ0X2RhdGEuc3RhdHVzID09IEJUQV9KVl9TVUNDRVNTICYmCi0gICAgICAgIFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uKFVVSURfU0VSVkNMQVNTX1NFUklBTF9QT1JULCBjYy0+cmVtb3RlX3NjbiwgRkFMU0UsCisgICAgICAgIFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uKFVVSURfU0VSVkNMQVNTX1NFUklBTF9QT1JULCBjYy0+cmVtb3RlX3NjbiwgZmFsc2UsCiAgICAgICAgIEJUQV9KVl9ERUZfUkZDX01UVSwgY2MtPnBlZXJfYmRfYWRkciwgJmhhbmRsZSwgYnRhX2p2X3BvcnRfbWdtdF9jbF9jYmFjaykgIT0gUE9SVF9TVUNDRVNTKQogICAgIHsKICAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigiYnRhX2p2X3JmY29tbV9jb25uZWN0LCBSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbiBmYWlsZWQiKTsKQEAgLTE2MDcsNyArMTYwNyw3IEBACiAgICAgICAgICAgICBwX2NiLT5zY24gPSAwOwogICAgICAgICAgICAgcF9wY2ItPnN0YXRlID0gQlRBX0pWX1NUX0NMX09QRU5JTkc7CiAgICAgICAgICAgICBwX3BjYi0+dXNlcl9kYXRhID0gY2MtPnVzZXJfZGF0YTsKLSAgICAgICAgICAgIGV2dF9kYXRhLnVzZV9jbyA9IFRSVUU7CisgICAgICAgICAgICBldnRfZGF0YS51c2VfY28gPSB0cnVlOwogCiAgICAgICAgICAgICBQT1JUX1NldEV2ZW50Q2FsbGJhY2soaGFuZGxlLCBidGFfanZfcG9ydF9ldmVudF9jbF9jYmFjayk7CiAgICAgICAgICAgICBQT1JUX1NldEV2ZW50TWFzayhoYW5kbGUsIGV2ZW50X21hc2spOwpAQCAtMTYxOCw3ICsxNjE4LDcgQEAKICAgICAgICAgICAgIHBvcnRfc3RhdGUuZmNfdHlwZSA9IChQT1JUX0ZDX0NUU19PTl9JTlBVVCB8IFBPUlRfRkNfQ1RTX09OX09VVFBVVCk7CiAKICAgICAgICAgICAgIC8qIGNvdmVyaXR5W3VuaW5pdF91c2VfaW5fY2FsbF0KLSAgICAgICAgICAgICAgIEZBTFNFLVBPU0lUSVZFOiBwb3J0X3N0YXRlIGlzIGluaXRpYWxpemVkIGF0IFBPUlRfR2V0U3RhdGUoKSAqLworICAgICAgICAgICAgICAgZmFsc2UtUE9TSVRJVkU6IHBvcnRfc3RhdGUgaXMgaW5pdGlhbGl6ZWQgYXQgUE9SVF9HZXRTdGF0ZSgpICovCiAgICAgICAgICAgICBQT1JUX1NldFN0YXRlKGhhbmRsZSwgJnBvcnRfc3RhdGUpOwogCiAgICAgICAgICAgICBldnRfZGF0YS5oYW5kbGUgPSBwX2NiLT5oYW5kbGU7CkBAIC0xNjQ2LDcgKzE2NDYsNyBAQAogICAgIGludCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfUkZDX1BPUlRTOyBpKyspCiAgICAgewotICAgICAgICBVSU5UMzIgcmZjX2hhbmRsZSA9IGJ0YV9qdl9jYi5wb3J0X2NiW2ldLmhhbmRsZSAmIEJUQV9KVl9SRkNfSERMX01BU0s7CisgICAgICAgIHVpbnQzMl90IHJmY19oYW5kbGUgPSBidGFfanZfY2IucG9ydF9jYltpXS5oYW5kbGUgJiBCVEFfSlZfUkZDX0hETF9NQVNLOwogICAgICAgICByZmNfaGFuZGxlICY9IH5CVEFfSlZfUkZDT01NX01BU0s7CiAgICAgICAgIGlmIChyZmNfaGFuZGxlICYmIGJ0YV9qdl9jYi5wb3J0X2NiW2ldLnVzZXJfZGF0YSA9PSB1c2VyX2RhdGEpCiAgICAgICAgIHsKQEAgLTE3MDEsMTMgKzE3MDEsMTMgQEAKICoqIFJldHVybnMgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9qdl9wb3J0X21nbXRfc3JfY2JhY2soVUlOVDMyIGNvZGUsIFVJTlQxNiBwb3J0X2hhbmRsZSkKK3N0YXRpYyB2b2lkIGJ0YV9qdl9wb3J0X21nbXRfc3JfY2JhY2sodWludDMyX3QgY29kZSwgdWludDE2X3QgcG9ydF9oYW5kbGUpCiB7CiAgICAgdEJUQV9KVl9QQ0IgICAgICpwX3BjYiA9IGJ0YV9qdl9yZmNfcG9ydF90b19wY2IocG9ydF9oYW5kbGUpOwogICAgIHRCVEFfSlZfUkZDX0NCICAqcF9jYiA9IGJ0YV9qdl9yZmNfcG9ydF90b19jYihwb3J0X2hhbmRsZSk7CiAgICAgdEJUQV9KViBldnRfZGF0YTsKICAgICBCRF9BRERSIHJlbV9iZGE7Ci0gICAgVUlOVDE2IGxjaWQ7CisgICAgdWludDE2X3QgbGNpZDsKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfanZfcG9ydF9tZ210X3NyX2NiYWNrLCBjb2RlOiVkLCBwb3J0X2hhbmRsZTolZCIsIGNvZGUsIHBvcnRfaGFuZGxlKTsKICAgICBpZiAoTlVMTCA9PSBwX2NiIHx8IE5VTEwgPT0gcF9jYi0+cF9jYmFjaykKICAgICB7CkBAIC0xNzIwLDcgKzE3MjAsNyBAQAogICAgICAgICBjb2RlLCBwb3J0X2hhbmRsZSwgcF9jYi0+aGFuZGxlLCBwX3BjYiwgcF9wY2ItPnVzZXJfZGF0YSk7CiAKICAgICBQT1JUX0NoZWNrQ29ubmVjdGlvbihwb3J0X2hhbmRsZSwgcmVtX2JkYSwgJmxjaWQpOwotICAgIGludCBmYWlsZWQgPSBUUlVFOworICAgIGludCBmYWlsZWQgPSB0cnVlOwogICAgIGlmIChjb2RlID09IFBPUlRfU1VDQ0VTUykKICAgICB7CiAgICAgICAgIGV2dF9kYXRhLnJmY19zcnZfb3Blbi5oYW5kbGUgPSBwX3BjYi0+aGFuZGxlOwpAQCAtMTczMiw3ICsxNzMyLDcgQEAKICAgICAgICAgICAgIGV2dF9kYXRhLnJmY19zcnZfb3Blbi5uZXdfbGlzdGVuX2hhbmRsZSA9IHBfcGNiX25ld19saXN0ZW4tPmhhbmRsZTsKICAgICAgICAgICAgIHBfcGNiX25ld19saXN0ZW4tPnVzZXJfZGF0YSA9IHBfY2ItPnBfY2JhY2soQlRBX0pWX1JGQ09NTV9TUlZfT1BFTl9FVlQsICZldnRfZGF0YSwgdXNlcl9kYXRhKTsKICAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIlBPUlRfU1VDQ0VTUzogY3Vycl9zZXNzOiVkLCBtYXhfc2VzczolZCIsIHBfY2ItPmN1cnJfc2VzcywgcF9jYi0+bWF4X3Nlc3MpOwotICAgICAgICAgICAgZmFpbGVkID0gRkFMU0U7CisgICAgICAgICAgICBmYWlsZWQgPSBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKCJidGFfanZfYWRkX3JmY19wb3J0IGZhaWxlZCB0byBjcmVhdGUgbmV3IGxpc3RlbiBwb3J0Iik7CkBAIC0xNzQxLDE2ICsxNzQxLDE2IEBACiAgICAgewogICAgICAgICBldnRfZGF0YS5yZmNfY2xvc2UuaGFuZGxlID0gcF9jYi0+aGFuZGxlOwogICAgICAgICBldnRfZGF0YS5yZmNfY2xvc2Uuc3RhdHVzID0gQlRBX0pWX0ZBSUxVUkU7Ci0gICAgICAgIGV2dF9kYXRhLnJmY19jbG9zZS5hc3luYyA9IFRSVUU7CisgICAgICAgIGV2dF9kYXRhLnJmY19jbG9zZS5hc3luYyA9IHRydWU7CiAgICAgICAgIGV2dF9kYXRhLnJmY19jbG9zZS5wb3J0X3N0YXR1cyA9IGNvZGU7Ci0gICAgICAgIHBfcGNiLT5jb25nID0gRkFMU0U7CisgICAgICAgIHBfcGNiLT5jb25nID0gZmFsc2U7CiAKICAgICAgICAgdEJUQV9KVl9SRkNPTU1fQ0JBQ0sgICAgKnBfY2JhY2sgPSBwX2NiLT5wX2NiYWNrOwogICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJQT1JUX0NMT1NFRCBiZWZvcmUgQlRBX0pWX1JGQ09NTV9DTE9TRV9FVlQ6IGN1cnJfc2VzczolZCwgbWF4X3Nlc3M6JWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2ItPmN1cnJfc2VzcywgcF9jYi0+bWF4X3Nlc3MpOwogICAgICAgICBpZiAoQlRBX0pWX1NUX1NSX0NMT1NJTkcgPT0gcF9wY2ItPnN0YXRlKQogICAgICAgICB7Ci0gICAgICAgICAgICBldnRfZGF0YS5yZmNfY2xvc2UuYXN5bmMgPSBGQUxTRTsKKyAgICAgICAgICAgIGV2dF9kYXRhLnJmY19jbG9zZS5hc3luYyA9IGZhbHNlOwogICAgICAgICAgICAgZXZ0X2RhdGEucmZjX2Nsb3NlLnN0YXR1cyA9IEJUQV9KVl9TVUNDRVNTOwogICAgICAgICB9CiAgICAgICAgIC8vcF9wY2ItPnN0YXRlID0gQlRBX0pWX1NUX05PTkU7CkBAIC0xNzcxLDcgKzE3NzEsNyBAQAogKiogUmV0dXJucyAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2p2X3BvcnRfZXZlbnRfc3JfY2JhY2soVUlOVDMyIGNvZGUsIFVJTlQxNiBwb3J0X2hhbmRsZSkKK3N0YXRpYyB2b2lkIGJ0YV9qdl9wb3J0X2V2ZW50X3NyX2NiYWNrKHVpbnQzMl90IGNvZGUsIHVpbnQxNl90IHBvcnRfaGFuZGxlKQogewogICAgIHRCVEFfSlZfUENCICAgICAqcF9wY2IgPSBidGFfanZfcmZjX3BvcnRfdG9fcGNiKHBvcnRfaGFuZGxlKTsKICAgICB0QlRBX0pWX1JGQ19DQiAgKnBfY2IgPSBidGFfanZfcmZjX3BvcnRfdG9fY2IocG9ydF9oYW5kbGUpOwpAQCAtMTc5Miw3ICsxNzkyLDcgQEAKIAogICAgIGlmIChjb2RlICYgUE9SVF9FVl9GQykKICAgICB7Ci0gICAgICAgIHBfcGNiLT5jb25nID0gKGNvZGUgJiBQT1JUX0VWX0ZDUykgPyBGQUxTRSA6IFRSVUU7CisgICAgICAgIHBfcGNiLT5jb25nID0gKGNvZGUgJiBQT1JUX0VWX0ZDUykgPyBmYWxzZSA6IHRydWU7CiAgICAgICAgIGV2dF9kYXRhLnJmY19jb25nLmNvbmcgPSBwX3BjYi0+Y29uZzsKICAgICAgICAgZXZ0X2RhdGEucmZjX2NvbmcuaGFuZGxlID0gcF9jYi0+aGFuZGxlOwogICAgICAgICBldnRfZGF0YS5yZmNfY29uZy5zdGF0dXMgPSBCVEFfSlZfU1VDQ0VTUzsKQEAgLTE4MTYsMTAgKzE4MTYsMTAgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdEJUQV9KVl9QQ0IgKiBidGFfanZfYWRkX3JmY19wb3J0KHRCVEFfSlZfUkZDX0NCICpwX2NiLCB0QlRBX0pWX1BDQiAqcF9wY2Jfb3BlbikKIHsKLSAgICBVSU5UOCAgIHVzZWQgPSAwLCBpLCBsaXN0ZW49MDsKLSAgICBVSU5UMzIgIHNpID0gMDsKKyAgICB1aW50OF90ICAgdXNlZCA9IDAsIGksIGxpc3Rlbj0wOworICAgIHVpbnQzMl90ICBzaSA9IDA7CiAgICAgdFBPUlRfU1RBVEUgcG9ydF9zdGF0ZTsKLSAgICBVSU5UMzIgZXZlbnRfbWFzayA9IEJUQV9KVl9SRkNfRVZfTUFTSzsKKyAgICB1aW50MzJfdCBldmVudF9tYXNrID0gQlRBX0pWX1JGQ19FVl9NQVNLOwogICAgIHRCVEFfSlZfUENCICpwX3BjYiA9IE5VTEw7CiAgICAgaWYgKHBfY2ItPm1heF9zZXNzID4gMSkKICAgICB7CkBAIC0xODU5LDggKzE4NTksOCBAQAogICAgICAgICBpZiAodXNlZCA8IHBfY2ItPm1heF9zZXNzICYmIGxpc3RlbiA9PSAxICYmIHNpKQogICAgICAgICB7CiAgICAgICAgICAgICBzaS0tOwotICAgICAgICAgICAgaWYgKFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uKHBfY2ItPnNlY19pZCwgcF9jYi0+c2NuLCBUUlVFLAotICAgICAgICAgICAgICAgIEJUQV9KVl9ERUZfUkZDX01UVSwgKFVJTlQ4ICopIGJkX2FkZHJfYW55LCAmKHBfY2ItPnJmY19oZGxbc2ldKSwgYnRhX2p2X3BvcnRfbWdtdF9zcl9jYmFjaykgPT0gUE9SVF9TVUNDRVNTKQorICAgICAgICAgICAgaWYgKFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uKHBfY2ItPnNlY19pZCwgcF9jYi0+c2NuLCB0cnVlLAorICAgICAgICAgICAgICAgIEJUQV9KVl9ERUZfUkZDX01UVSwgKHVpbnQ4X3QgKikgYmRfYWRkcl9hbnksICYocF9jYi0+cmZjX2hkbFtzaV0pLCBidGFfanZfcG9ydF9tZ210X3NyX2NiYWNrKSA9PSBQT1JUX1NVQ0NFU1MpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcF9jYi0+Y3Vycl9zZXNzKys7CiAgICAgICAgICAgICAgICAgcF9wY2IgPSAmYnRhX2p2X2NiLnBvcnRfY2JbcF9jYi0+cmZjX2hkbFtzaV0gLSAxXTsKQEAgLTE5MDIsMTAgKzE5MDIsMTAgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9qdl9yZmNvbW1fc3RhcnRfc2VydmVyKHRCVEFfSlZfTVNHICpwX2RhdGEpCiB7Ci0gICAgVUlOVDE2IGhhbmRsZSA9IDA7Ci0gICAgVUlOVDMyIGV2ZW50X21hc2sgPSBCVEFfSlZfUkZDX0VWX01BU0s7CisgICAgdWludDE2X3QgaGFuZGxlID0gMDsKKyAgICB1aW50MzJfdCBldmVudF9tYXNrID0gQlRBX0pWX1JGQ19FVl9NQVNLOwogICAgIHRQT1JUX1NUQVRFIHBvcnRfc3RhdGU7Ci0gICAgVUlOVDggICBzZWNfaWQgPSAwOworICAgIHVpbnQ4X3QgICBzZWNfaWQgPSAwOwogICAgIHRCVEFfSlZfUkZDX0NCICAqcF9jYiA9IE5VTEw7CiAgICAgdEJUQV9KVl9QQ0IgICAgICpwX3BjYjsKICAgICB0QlRBX0pWX0FQSV9SRkNPTU1fU0VSVkVSICpycyA9ICYocF9kYXRhLT5yZmNvbW1fc2VydmVyKTsKQEAgLTE5MjQsMTUgKzE5MjQsMTUgQEAKICAgICAgICAgc2VjX2lkID0gYnRhX2p2X2FsbG9jX3NlY19pZCgpOwogCiAgICAgICAgIGlmICgwID09IHNlY19pZCB8fAotICAgICAgICAgICAgQlRNX1NldFNlY3VyaXR5TGV2ZWwoRkFMU0UsICJKViBQT1JUIiwgc2VjX2lkLCAgcnMtPnNlY19tYXNrLAotICAgICAgICAgICAgICAgIEJUX1BTTV9SRkNPTU0sIEJUTV9TRUNfUFJPVE9fUkZDT01NLCBycy0+bG9jYWxfc2NuKSA9PSBGQUxTRSkKKyAgICAgICAgICAgIEJUTV9TZXRTZWN1cml0eUxldmVsKGZhbHNlLCAiSlYgUE9SVCIsIHNlY19pZCwgIHJzLT5zZWNfbWFzaywKKyAgICAgICAgICAgICAgICBCVF9QU01fUkZDT01NLCBCVE1fU0VDX1BST1RPX1JGQ09NTSwgcnMtPmxvY2FsX3NjbikgPT0gZmFsc2UpCiAgICAgICAgIHsKICAgICAgICAgICAgIEFQUExfVFJBQ0VfRVJST1IoImJ0YV9qdl9yZmNvbW1fc3RhcnRfc2VydmVyLCBydW4gb3V0IG9mIHNlY19pZCIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoUkZDT01NX0NyZWF0ZUNvbm5lY3Rpb24oc2VjX2lkLCBycy0+bG9jYWxfc2NuLCBUUlVFLAotICAgICAgICAgICAgQlRBX0pWX0RFRl9SRkNfTVRVLCAoVUlOVDggKikgYmRfYWRkcl9hbnksICZoYW5kbGUsIGJ0YV9qdl9wb3J0X21nbXRfc3JfY2JhY2spICE9IFBPUlRfU1VDQ0VTUykKKyAgICAgICAgaWYgKFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uKHNlY19pZCwgcnMtPmxvY2FsX3NjbiwgdHJ1ZSwKKyAgICAgICAgICAgIEJUQV9KVl9ERUZfUkZDX01UVSwgKHVpbnQ4X3QgKikgYmRfYWRkcl9hbnksICZoYW5kbGUsIGJ0YV9qdl9wb3J0X21nbXRfc3JfY2JhY2spICE9IFBPUlRfU1VDQ0VTUykKICAgICAgICAgewogICAgICAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigiYnRhX2p2X3JmY29tbV9zdGFydF9zZXJ2ZXIsIFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uIGZhaWxlZCIpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xOTU1LDcgKzE5NTUsNyBAQAogICAgICAgICBldnRfZGF0YS5zdGF0dXMgPSBCVEFfSlZfU1VDQ0VTUzsKICAgICAgICAgZXZ0X2RhdGEuaGFuZGxlID0gcF9jYi0+aGFuZGxlOwogICAgICAgICBldnRfZGF0YS5zZWNfaWQgPSBzZWNfaWQ7Ci0gICAgICAgIGV2dF9kYXRhLnVzZV9jbyA9IFRSVUU7CisgICAgICAgIGV2dF9kYXRhLnVzZV9jbyA9IHRydWU7CiAKICAgICAgICAgUE9SVF9DbGVhcktlZXBIYW5kbGVGbGFnKGhhbmRsZSk7CiAgICAgICAgIFBPUlRfU2V0RXZlbnRDYWxsYmFjayhoYW5kbGUsIGJ0YV9qdl9wb3J0X2V2ZW50X3NyX2NiYWNrKTsKQEAgLTIzMTEsNyArMjMxMSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZmNfY2xpZW50ICpmY2NsaWVudF9hbGxvYyh1aW50MTZfdCBjaGFuLCBjaGFyIHNlcnZlciwgY29uc3QgdWludDhfdCAqc2VjX2lkX3RvX3VzZSkKIHsKLSAgICBzdHJ1Y3QgZmNfY2hhbm5lbCAqZmMgPSBmY2NoYW5fZ2V0KGNoYW4sIFRSVUUpOworICAgIHN0cnVjdCBmY19jaGFubmVsICpmYyA9IGZjY2hhbl9nZXQoY2hhbiwgdHJ1ZSk7CiAgICAgc3RydWN0IGZjX2NsaWVudCAqdDsKICAgICB1aW50OF90IHNlY19pZDsKIApAQCAtMjM0OSw3ICsyMzQ5LDcgQEAKIAogICAgIC8vIFVwZGF0ZSBjaGFubmVsIGlmIG5lZWRlZAogICAgIGlmIChzZXJ2ZXIpCi0gICAgICAgIGZjLT5oYXNfc2VydmVyID0gVFJVRTsKKyAgICAgICAgZmMtPmhhc19zZXJ2ZXIgPSB0cnVlOwogCiAgICAgcmV0dXJuIHQ7CiB9CkBAIC0yMzU3LDcgKzIzNTcsNyBAQAogc3RhdGljIHZvaWQgZmNjbGllbnRfZnJlZShzdHJ1Y3QgZmNfY2xpZW50ICpmYykKIHsKICAgICBzdHJ1Y3QgZmNfY2xpZW50ICp0ID0gZmNfY2xpZW50czsKLSAgICBzdHJ1Y3QgZmNfY2hhbm5lbCAqdGMgPSBmY2NoYW5fZ2V0KGZjLT5jaGFuLCBGQUxTRSk7CisgICAgc3RydWN0IGZjX2NoYW5uZWwgKnRjID0gZmNjaGFuX2dldChmYy0+Y2hhbiwgZmFsc2UpOwogCiAgICAgLy9yZW1vdmUgZnJvbSBnbG9iYWwgbGlzdAogICAgIHdoaWxlICh0ICYmIHQtPm5leHRfYWxsX2xpc3QgIT0gZmMpCkBAIC0yMzg1LDcgKzIzODUsNyBAQAogCiAgICAgICAgIC8vaWYgd2FzIHNlcnZlciB0aGVuIGNoYW5uZWwgbm8gbG9uZ2VyIGhhcyBhIHNlcnZlcgogICAgICAgICBpZiAoZmMtPnNlcnZlcikKLSAgICAgICAgICAgIHRjLT5oYXNfc2VydmVyID0gRkFMU0U7CisgICAgICAgICAgICB0Yy0+aGFzX3NlcnZlciA9IGZhbHNlOwogICAgIH0KIAogICAgIC8vZnJlZSBzZWN1cml0eSBpZApAQCAtMjM5NCwxOCArMjM5NCwxOCBAQAogICAgIG9zaV9mcmVlKGZjKTsKIH0KIAotc3RhdGljIHZvaWQgZmNjaGFuX2Nvbm5fY2huZ19jYmsoVUlOVDE2IGNoYW4sIEJEX0FERFIgYmRfYWRkciwgQk9PTEVBTiBjb25uZWN0ZWQsIFVJTlQxNiByZWFzb24sIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KQorc3RhdGljIHZvaWQgZmNjaGFuX2Nvbm5fY2huZ19jYmsodWludDE2X3QgY2hhbiwgQkRfQUREUiBiZF9hZGRyLCBib29sIGNvbm5lY3RlZCwgdWludDE2X3QgcmVhc29uLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkKIHsKICAgICB0QlRBX0pWIGluaXRfZXZ0OwogICAgIHRCVEFfSlYgb3Blbl9ldnQ7CiAgICAgc3RydWN0IGZjX2NoYW5uZWwgKnRjOwogICAgIHN0cnVjdCBmY19jbGllbnQgKnQgPSBOVUxMLCAqbmV3X2Nvbm47CiAgICAgdEJUQV9KVl9MMkNBUF9DQkFDSyAqcF9jYmFjayA9IE5VTEw7Ci0gICAgY2hhciBjYWxsX2luaXQgPSBGQUxTRTsKKyAgICBjaGFyIGNhbGxfaW5pdCA9IGZhbHNlOwogICAgIHZvaWQgKnVzZXJfZGF0YSA9IE5VTEw7CiAKIAotICAgIHRjID0gZmNjaGFuX2dldChjaGFuLCBGQUxTRSk7CisgICAgdGMgPSBmY2NoYW5fZ2V0KGNoYW4sIGZhbHNlKTsKICAgICBpZiAodGMpIHsKICAgICAgICAgdCA9IGZjY2xpZW50X2ZpbmRfYnlfYWRkcih0Yy0+Y2xpZW50cywgYmRfYWRkcik7IC8vIHRyeSB0byBmaW5kIGFuIG9wZW4gc29ja2VkIGZvciB0aGF0IGFkZHIKICAgICAgICAgaWYgKHQpIHsKQEAgLTI0MTUsMTIgKzI0MTUsMTIgQEAKICAgICAgICAgICAgIHQgPSBmY2NsaWVudF9maW5kX2J5X2FkZHIodGMtPmNsaWVudHMsIE5VTEwpOyAvLyB0cnkgdG8gZmluZCBhIGxpc3RlbmluZyBzb2NrZWQgZm9yIHRoYXQgY2hhbm5lbAogICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAvL2ZvdW5kOiBjcmVhdGUgYSBub3JtYWwgY29ubmVjdGlvbiBzb2NrZXQgYW5kIGFzc2lnbiB0aGUgY29ubmVjdGlvbiB0byBpdAotICAgICAgICAgICAgICAgIG5ld19jb25uID0gZmNjbGllbnRfYWxsb2MoY2hhbiwgRkFMU0UsICZ0LT5zZWNfaWQpOworICAgICAgICAgICAgICAgIG5ld19jb25uID0gZmNjbGllbnRfYWxsb2MoY2hhbiwgZmFsc2UsICZ0LT5zZWNfaWQpOwogICAgICAgICAgICAgICAgIGlmIChuZXdfY29ubil7CiAKICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZuZXdfY29ubi0+cmVtb3RlX2FkZHIsIGJkX2FkZHIsIHNpemVvZihuZXdfY29ubi0+cmVtb3RlX2FkZHIpKTsKICAgICAgICAgICAgICAgICAgICAgbmV3X2Nvbm4tPnBfY2JhY2sgPSBOVUxMOyAvL2ZvciBub3cKLSAgICAgICAgICAgICAgICAgICAgbmV3X2Nvbm4tPmluaXRfY2FsbGVkID0gVFJVRTsgLypub3AgbmVlZCB0byBkbyBpdCBhZ2FpbiAqLworICAgICAgICAgICAgICAgICAgICBuZXdfY29ubi0+aW5pdF9jYWxsZWQgPSB0cnVlOyAvKm5vcCBuZWVkIHRvIGRvIGl0IGFnYWluICovCiAKICAgICAgICAgICAgICAgICAgICAgcF9jYmFjayA9IHQtPnBfY2JhY2s7CiAgICAgICAgICAgICAgICAgICAgIHVzZXJfZGF0YSA9IHQtPnVzZXJfZGF0YTsKQEAgLTI0MzgsOCArMjQzOCw4IEBACiAKICAgICAgICAgaWYgKCF0LT5pbml0X2NhbGxlZCkgewogCi0gICAgICAgICAgICBjYWxsX2luaXQgPSBUUlVFOwotICAgICAgICAgICAgdC0+aW5pdF9jYWxsZWQgPSBUUlVFOworICAgICAgICAgICAgY2FsbF9pbml0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHQtPmluaXRfY2FsbGVkID0gdHJ1ZTsKIAogICAgICAgICAgICAgaW5pdF9ldnQubDJjX2NsX2luaXQuaGFuZGxlID0gdC0+aWQ7CiAgICAgICAgICAgICBpbml0X2V2dC5sMmNfY2xfaW5pdC5zdGF0dXMgPSBCVEFfSlZfU1VDQ0VTUzsKQEAgLTI0NzIsNyArMjQ3Miw3IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBmY2NoYW5fZGF0YV9jYmsoVUlOVDE2IGNoYW4sIEJEX0FERFIgYmRfYWRkciwgQlRfSERSICpwX2J1ZikKK3N0YXRpYyB2b2lkIGZjY2hhbl9kYXRhX2Niayh1aW50MTZfdCBjaGFuLCBCRF9BRERSIGJkX2FkZHIsIEJUX0hEUiAqcF9idWYpCiB7CiAgICAgdEJUQV9KViBldnRfZGF0YTsKICAgICBzdHJ1Y3QgZmNfY2hhbm5lbCAqdGM7CkBAIC0yNDgwLDcgKzI0ODAsNyBAQAogICAgIHRCVEFfSlZfTDJDQVBfQ0JBQ0sgKnNvY2tfY2JhY2sgPSBOVUxMOwogICAgIHZvaWQgKnNvY2tfdXNlcl9kYXRhOwogCi0gICAgdGMgPSBmY2NoYW5fZ2V0KGNoYW4sIEZBTFNFKTsKKyAgICB0YyA9IGZjY2hhbl9nZXQoY2hhbiwgZmFsc2UpOwogICAgIGlmICh0YykgewogICAgICAgICB0ID0gZmNjbGllbnRfZmluZF9ieV9hZGRyKHRjLT5jbGllbnRzLCBiZF9hZGRyKTsgLy8gdHJ5IHRvIGZpbmQgYW4gb3BlbiBzb2NrZWQgZm9yIHRoYXQgYWRkciBhbmQgY2hhbm5lbAogICAgICAgICBpZiAoIXQpIHsKQEAgLTI1MTMsMTMgKzI1MTMsMTMgQEAKICAgICB0QlRBX0pWX0FQSV9MMkNBUF9DT05ORUNUICpjYyA9ICYocF9kYXRhLT5sMmNhcF9jb25uZWN0KTsKICAgICB0QlRBX0pWIGV2dDsKICAgICB1aW50MzJfdCBpZDsKLSAgICBjaGFyIGNhbGxfaW5pdF9mID0gVFJVRTsKKyAgICBjaGFyIGNhbGxfaW5pdF9mID0gdHJ1ZTsKICAgICBzdHJ1Y3QgZmNfY2xpZW50ICp0OwogCiAgICAgZXZ0LmwyY19jbF9pbml0LmhhbmRsZSA9IEdBUF9JTlZBTElEX0hBTkRMRTsKICAgICBldnQubDJjX2NsX2luaXQuc3RhdHVzID0gQlRBX0pWX0ZBSUxVUkU7CiAKLSAgICB0ID0gZmNjbGllbnRfYWxsb2MoY2MtPnJlbW90ZV9jaGFuLCBGQUxTRSwgTlVMTCk7CisgICAgdCA9IGZjY2xpZW50X2FsbG9jKGNjLT5yZW1vdGVfY2hhbiwgZmFsc2UsIE5VTEwpOwogICAgIGlmICghdCkgewogICAgICAgICBjYy0+cF9jYmFjayhCVEFfSlZfTDJDQVBfQ0xfSU5JVF9FVlQsICZldnQsIGNjLT51c2VyX2RhdGEpOwogICAgICAgICByZXR1cm47CkBAIC0yNTI5LDcgKzI1MjksNyBAQAogICAgIHQtPnVzZXJfZGF0YSA9IGNjLT51c2VyX2RhdGE7CiAgICAgbWVtY3B5KCZ0LT5yZW1vdGVfYWRkciwgJmNjLT5wZWVyX2JkX2FkZHIsIHNpemVvZih0LT5yZW1vdGVfYWRkcikpOwogICAgIGlkID0gdC0+aWQ7Ci0gICAgdC0+aW5pdF9jYWxsZWQgPSBGQUxTRTsKKyAgICB0LT5pbml0X2NhbGxlZCA9IGZhbHNlOwogCiAgICAgaWYgKEwyQ0FfQ29ubmVjdEZpeGVkQ2hubCh0LT5jaGFuLCB0LT5yZW1vdGVfYWRkcikpIHsKIApAQCAtMjU0Nyw3ICsyNTQ3LDcgQEAKICAgICB9CiAgICAgaWYgKGNhbGxfaW5pdF9mKQogICAgICAgICBjYy0+cF9jYmFjayhCVEFfSlZfTDJDQVBfQ0xfSU5JVF9FVlQsICZldnQsIGNjLT51c2VyX2RhdGEpOwotICAgIHQtPmluaXRfY2FsbGVkID0gVFJVRTsKKyAgICB0LT5pbml0X2NhbGxlZCA9IHRydWU7CiB9CiAKIApAQCAtMjU3MCwxMCArMjU3MCwxMCBAQAogICAgIHZvaWQgKnVzZXJfZGF0YTsKIAogICAgIGV2dC5sMmNfY2xvc2Uuc3RhdHVzID0gQlRBX0pWX0ZBSUxVUkU7Ci0gICAgZXZ0LmwyY19jbG9zZS5hc3luYyA9IEZBTFNFOworICAgIGV2dC5sMmNfY2xvc2UuYXN5bmMgPSBmYWxzZTsKICAgICBldnQubDJjX2Nsb3NlLmhhbmRsZSA9IEdBUF9JTlZBTElEX0hBTkRMRTsKIAotICAgIGZjY2hhbiA9IGZjY2hhbl9nZXQobHMtPmxvY2FsX2NoYW4sIEZBTFNFKTsKKyAgICBmY2NoYW4gPSBmY2NoYW5fZ2V0KGxzLT5sb2NhbF9jaGFuLCBmYWxzZSk7CiAgICAgaWYgKGZjY2hhbikgewogICAgICAgICB3aGlsZSgoZmNjbGllbnQgPSBmY2NoYW4tPmNsaWVudHMpKSB7CiAgICAgICAgICAgICBwX2NiYWNrID0gZmNjbGllbnQtPnBfY2JhY2s7CkBAIC0yNTgxLDcgKzI1ODEsNyBAQAogCiAgICAgICAgICAgICBldnQubDJjX2Nsb3NlLmhhbmRsZSA9IGZjY2xpZW50LT5pZDsKICAgICAgICAgICAgIGV2dC5sMmNfY2xvc2Uuc3RhdHVzID0gQlRBX0pWX1NVQ0NFU1M7Ci0gICAgICAgICAgICBldnQubDJjX2Nsb3NlLmFzeW5jID0gRkFMU0U7CisgICAgICAgICAgICBldnQubDJjX2Nsb3NlLmFzeW5jID0gZmFsc2U7CiAKICAgICAgICAgICAgIGZjY2xpZW50X2ZyZWUoZmNjbGllbnQpOwogCkBAIC0yNjEwLDcgKzI2MTAsNyBAQAogICAgIGV2dF9kYXRhLnN0YXR1cyA9IEJUQV9KVl9GQUlMVVJFOwogCiAKLSAgICB0ID0gZmNjbGllbnRfYWxsb2Moc3MtPmxvY2FsX2NoYW4sIFRSVUUsIE5VTEwpOworICAgIHQgPSBmY2NsaWVudF9hbGxvYyhzcy0+bG9jYWxfY2hhbiwgdHJ1ZSwgTlVMTCk7CiAgICAgaWYgKCF0KQogICAgICAgICBnb3RvIG91dDsKIApkaWZmIC0tZ2l0IGEvYnRhL2p2L2J0YV9qdl9hcGkuYyBiL2J0YS9qdi9idGFfanZfYXBpLmMKaW5kZXggNjc0YTUxMC4uMzJmODU5NyAxMDA2NDQKLS0tIGEvYnRhL2p2L2J0YV9qdl9hcGkuYworKysgYi9idGEvanYvYnRhX2p2X2FwaS5jCkBAIC02Myw3ICs2Myw3IEBACiAgICAgaW50IGk7CiAKICAgICBBUFBMX1RSQUNFX0FQSSggIkJUQV9KdkVuYWJsZSIpOwotICAgIGlmKHBfY2JhY2sgJiYgRkFMU0UgPT0gYnRhX3N5c19pc19yZWdpc3RlcihCVEFfSURfSlYpKQorICAgIGlmKHBfY2JhY2sgJiYgZmFsc2UgPT0gYnRhX3N5c19pc19yZWdpc3RlcihCVEFfSURfSlYpKQogICAgIHsKICAgICAgICAgbWVtc2V0KCZidGFfanZfY2IsIDAsIHNpemVvZih0QlRBX0pWX0NCKSk7CiAgICAgICAgIC8qIHNldCBoYW5kbGUgdG8gaW52YWxpZCB2YWx1ZSBieSBkZWZhdWx0ICovCkBAIC0xMTgsMjEgKzExOCwyMSBAQAogKioKICoqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGxpbmsgdG8gcGVlciBkZXZpY2UgaXMgZW5jcnlwdGVkCiAqKgotKiogUmV0dXJucyAgICAgICAgICBUUlVFIGlmIGVuY3J5cHRlZC4KLSoqICAgICAgICAgICAgICAgICAgRkFMU0UgaWYgbm90LgorKiogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGVuY3J5cHRlZC4KKyoqICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgbm90LgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIEJUQV9KdklzRW5jcnlwdGVkKEJEX0FERFIgYmRfYWRkcikKK2Jvb2wgQlRBX0p2SXNFbmNyeXB0ZWQoQkRfQUREUiBiZF9hZGRyKQogewotICAgIEJPT0xFQU4gaXNfZW5jcnlwdGVkID0gRkFMU0U7Ci0gICAgVUlOVDggc2VjX2ZsYWdzLCBsZV9mbGFnczsKKyAgICBib29sIGlzX2VuY3J5cHRlZCA9IGZhbHNlOworICAgIHVpbnQ4X3Qgc2VjX2ZsYWdzLCBsZV9mbGFnczsKIAogICAgIGlmIChCVE1fR2V0U2VjdXJpdHlGbGFncyhiZF9hZGRyLCAmc2VjX2ZsYWdzKSAmJgogICAgICAgICBCVE1fR2V0U2VjdXJpdHlGbGFnc0J5VHJhbnNwb3J0KGJkX2FkZHIsICZsZV9mbGFncywgQlRfVFJBTlNQT1JUX0xFKSkKICAgICB7CiAgICAgICAgIGlmKHNlY19mbGFncyAmIEJUTV9TRUNfRkxBR19FTkNSWVBURUQgfHwKICAgICAgICAgICAgbGVfZmxhZ3MgJiBCVE1fU0VDX0ZMQUdfRU5DUllQVEVEKQotICAgICAgICAgICAgaXNfZW5jcnlwdGVkID0gVFJVRTsKKyAgICAgICAgICAgIGlzX2VuY3J5cHRlZCA9IHRydWU7CiAgICAgfQogICAgIHJldHVybiBpc19lbmNyeXB0ZWQ7CiB9CkBAIC0xNTgsNyArMTU4LDcgQEAKICoqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2R2V0Q2hhbm5lbElkKGludCBjb25uX3R5cGUsIHZvaWQqIHVzZXJfZGF0YSwgSU5UMzIgY2hhbm5lbCkKK3RCVEFfSlZfU1RBVFVTIEJUQV9KdkdldENoYW5uZWxJZChpbnQgY29ubl90eXBlLCB2b2lkKiB1c2VyX2RhdGEsIGludDMyX3QgY2hhbm5lbCkKIHsKICAgICB0QlRBX0pWX0FQSV9BTExPQ19DSEFOTkVMICpwX21zZyA9CiAgICAgICAgICh0QlRBX0pWX0FQSV9BTExPQ19DSEFOTkVMICopb3NpX21hbGxvYyhzaXplb2YodEJUQV9KVl9BUElfQUxMT0NfQ0hBTk5FTCkpOwpAQCAtMTkwLDcgKzE5MCw3IEBACiAqKiAgICAgICAgICAgICAgICAgIEJUQV9KVl9GQUlMVVJFLCBvdGhlcndpc2UuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdkZyZWVDaGFubmVsKFVJTlQxNiBjaGFubmVsLCBpbnQgY29ubl90eXBlKQordEJUQV9KVl9TVEFUVVMgQlRBX0p2RnJlZUNoYW5uZWwodWludDE2X3QgY2hhbm5lbCwgaW50IGNvbm5fdHlwZSkKIHsKICAgICB0QlRBX0pWX0FQSV9GUkVFX0NIQU5ORUwgKnBfbXNnID0KICAgICAgICAgKHRCVEFfSlZfQVBJX0ZSRUVfQ0hBTk5FTCAqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfSlZfQVBJX0ZSRUVfQ0hBTk5FTCkpOwpAQCAtMjE5LDcgKzIxOSw3IEBACiAqKiAgICAgICAgICAgICAgICAgIEJUQV9KVl9GQUlMVVJFLCBvdGhlcndpc2UuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdlN0YXJ0RGlzY292ZXJ5KEJEX0FERFIgYmRfYWRkciwgVUlOVDE2IG51bV91dWlkLAordEJUQV9KVl9TVEFUVVMgQlRBX0p2U3RhcnREaXNjb3ZlcnkoQkRfQUREUiBiZF9hZGRyLCB1aW50MTZfdCBudW1fdXVpZCwKICAgICAgICAgICAgIHRTRFBfVVVJRCAqcF91dWlkX2xpc3QsIHZvaWQgKiB1c2VyX2RhdGEpCiB7CiAgICAgdEJUQV9KVl9BUElfU1RBUlRfRElTQ09WRVJZICpwX21zZyA9CkBAIC0yNzYsNyArMjc2LDcgQEAKICoqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2RGVsZXRlUmVjb3JkKFVJTlQzMiBoYW5kbGUpCit0QlRBX0pWX1NUQVRVUyBCVEFfSnZEZWxldGVSZWNvcmQodWludDMyX3QgaGFuZGxlKQogewogICAgIHRCVEFfSlZfQVBJX0FERF9BVFRSSUJVVEUgKnBfbXNnID0KICAgICAgICAgKHRCVEFfSlZfQVBJX0FERF9BVFRSSUJVVEUgKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0pWX0FQSV9BRERfQVRUUklCVVRFKSk7CkBAIC0zMDcsOCArMzA3LDggQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdEJUQV9KVl9TVEFUVVMgQlRBX0p2TDJjYXBDb25uZWN0TEUodEJUQV9TRUMgc2VjX21hc2ssIHRCVEFfSlZfUk9MRSByb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEwyQ0FQX0VSVE1fSU5GTyAqZXJ0bV9pbmZvLCBVSU5UMTYgcmVtb3RlX2NoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgcnhfbXR1LCB0TDJDQVBfQ0ZHX0lORk8gKmNmZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRMMkNBUF9FUlRNX0lORk8gKmVydG1faW5mbywgdWludDE2X3QgcmVtb3RlX2NoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByeF9tdHUsIHRMMkNBUF9DRkdfSU5GTyAqY2ZnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRfQUREUiBwZWVyX2JkX2FkZHIsIHRCVEFfSlZfTDJDQVBfQ0JBQ0sgKnBfY2JhY2ssIHZvaWQgKnVzZXJfZGF0YSkKIHsKICAgICBBUFBMX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7CkBAIC0zMjQsMTYgKzMyNCwxNiBAQAogICAgIHBfbXNnLT5yZW1vdGVfY2hhbiAgPSByZW1vdGVfY2hhbjsKICAgICBwX21zZy0+cnhfbXR1ICAgICAgID0gcnhfbXR1OwogICAgIGlmIChjZmcgIT0gTlVMTCkgewotICAgICAgICBwX21zZy0+aGFzX2NmZyA9IFRSVUU7CisgICAgICAgIHBfbXNnLT5oYXNfY2ZnID0gdHJ1ZTsKICAgICAgICAgcF9tc2ctPmNmZyA9ICpjZmc7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcF9tc2ctPmhhc19jZmcgPSBGQUxTRTsKKyAgICAgICAgcF9tc2ctPmhhc19jZmcgPSBmYWxzZTsKICAgICB9CiAgICAgaWYgKGVydG1faW5mbyAhPSBOVUxMKSB7Ci0gICAgICAgIHBfbXNnLT5oYXNfZXJ0bV9pbmZvID0gVFJVRTsKKyAgICAgICAgcF9tc2ctPmhhc19lcnRtX2luZm8gPSB0cnVlOwogICAgICAgICBwX21zZy0+ZXJ0bV9pbmZvID0gKmVydG1faW5mbzsKICAgICB9IGVsc2UgewotICAgICAgICBwX21zZy0+aGFzX2VydG1faW5mbyA9IEZBTFNFOworICAgICAgICBwX21zZy0+aGFzX2VydG1faW5mbyA9IGZhbHNlOwogICAgIH0KICAgICBtZW1jcHkocF9tc2ctPnBlZXJfYmRfYWRkciwgcGVlcl9iZF9hZGRyLCBzaXplb2YoQkRfQUREUikpOwogICAgIHBfbXNnLT5wX2NiYWNrICAgICAgPSBwX2NiYWNrOwpAQCAtMzYwLDggKzM2MCw4IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHRCVEFfSlZfU1RBVFVTIEJUQV9KdkwyY2FwQ29ubmVjdChpbnQgY29ubl90eXBlLCB0QlRBX1NFQyBzZWNfbWFzaywgdEJUQV9KVl9ST0xFIHJvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0TDJDQVBfRVJUTV9JTkZPICplcnRtX2luZm8sIFVJTlQxNiByZW1vdGVfcHNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IHJ4X210dSwgdEwyQ0FQX0NGR19JTkZPICpjZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0TDJDQVBfRVJUTV9JTkZPICplcnRtX2luZm8sIHVpbnQxNl90IHJlbW90ZV9wc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByeF9tdHUsIHRMMkNBUF9DRkdfSU5GTyAqY2ZnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRfQUREUiBwZWVyX2JkX2FkZHIsIHRCVEFfSlZfTDJDQVBfQ0JBQ0sgKnBfY2JhY2ssIHZvaWQgKnVzZXJfZGF0YSkKIHsKICAgICBBUFBMX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7CkBAIC0zNzgsMTYgKzM3OCwxNiBAQAogICAgIHBfbXNnLT5yZW1vdGVfcHNtICAgPSByZW1vdGVfcHNtOwogICAgIHBfbXNnLT5yeF9tdHUgICAgICAgPSByeF9tdHU7CiAgICAgaWYgKGNmZyAhPSBOVUxMKSB7Ci0gICAgICAgIHBfbXNnLT5oYXNfY2ZnID0gVFJVRTsKKyAgICAgICAgcF9tc2ctPmhhc19jZmcgPSB0cnVlOwogICAgICAgICBwX21zZy0+Y2ZnID0gKmNmZzsKICAgICB9IGVsc2UgewotICAgICAgICBwX21zZy0+aGFzX2NmZyA9IEZBTFNFOworICAgICAgICBwX21zZy0+aGFzX2NmZyA9IGZhbHNlOwogICAgIH0KICAgICBpZiAoZXJ0bV9pbmZvICE9IE5VTEwpIHsKLSAgICAgICAgcF9tc2ctPmhhc19lcnRtX2luZm8gPSBUUlVFOworICAgICAgICBwX21zZy0+aGFzX2VydG1faW5mbyA9IHRydWU7CiAgICAgICAgIHBfbXNnLT5lcnRtX2luZm8gPSAqZXJ0bV9pbmZvOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHBfbXNnLT5oYXNfZXJ0bV9pbmZvID0gRkFMU0U7CisgICAgICAgIHBfbXNnLT5oYXNfZXJ0bV9pbmZvID0gZmFsc2U7CiAgICAgfQogICAgIG1lbWNweShwX21zZy0+cGVlcl9iZF9hZGRyLCBwZWVyX2JkX2FkZHIsIHNpemVvZihCRF9BRERSKSk7CiAgICAgcF9tc2ctPnBfY2JhY2sgICAgICA9IHBfY2JhY2s7CkBAIC00MDgsNyArNDA4LDcgQEAKICoqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2TDJjYXBDbG9zZShVSU5UMzIgaGFuZGxlKQordEJUQV9KVl9TVEFUVVMgQlRBX0p2TDJjYXBDbG9zZSh1aW50MzJfdCBoYW5kbGUpCiB7CiAgICAgdEJUQV9KVl9TVEFUVVMgc3RhdHVzID0gQlRBX0pWX0ZBSUxVUkU7CiAKQEAgLTQzOSw3ICs0MzksNyBAQAogKiogICAgICAgICAgICAgICAgICBCVEFfSlZfRkFJTFVSRSwgb3RoZXJ3aXNlLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1NUQVRVUyBCVEFfSnZMMmNhcENsb3NlTEUoVUlOVDMyIGhhbmRsZSkKK3RCVEFfSlZfU1RBVFVTIEJUQV9KdkwyY2FwQ2xvc2VMRSh1aW50MzJfdCBoYW5kbGUpCiB7CiAgICAgdEJUQV9KVl9BUElfTDJDQVBfQ0xPU0UgKnBfbXNnID0KICAgICAgICAgKHRCVEFfSlZfQVBJX0wyQ0FQX0NMT1NFICopb3NpX21hbGxvYyhzaXplb2YodEJUQV9KVl9BUElfTDJDQVBfQ0xPU0UpKTsKQEAgLTQ2OSw3ICs0NjksNyBAQAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB0QlRBX0pWX1NUQVRVUyBCVEFfSnZMMmNhcFN0YXJ0U2VydmVyKGludCBjb25uX3R5cGUsIHRCVEFfU0VDIHNlY19tYXNrLCB0QlRBX0pWX1JPTEUgcm9sZSwKLSAgICAgICAgY29uc3QgdEwyQ0FQX0VSVE1fSU5GTyAqZXJ0bV9pbmZvLFVJTlQxNiBsb2NhbF9wc20sIFVJTlQxNiByeF9tdHUsIHRMMkNBUF9DRkdfSU5GTyAqY2ZnLAorICAgICAgICBjb25zdCB0TDJDQVBfRVJUTV9JTkZPICplcnRtX2luZm8sdWludDE2X3QgbG9jYWxfcHNtLCB1aW50MTZfdCByeF9tdHUsIHRMMkNBUF9DRkdfSU5GTyAqY2ZnLAogICAgICAgICB0QlRBX0pWX0wyQ0FQX0NCQUNLICpwX2NiYWNrLCB2b2lkICp1c2VyX2RhdGEpCiB7CiAgICAgQVBQTF9UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwpAQCAtNDg2LDE2ICs0ODYsMTYgQEAKICAgICBwX21zZy0+bG9jYWxfcHNtID0gbG9jYWxfcHNtOwogICAgIHBfbXNnLT5yeF9tdHUgPSByeF9tdHU7CiAgICAgaWYgKGNmZyAhPSBOVUxMKSB7Ci0gICAgICAgIHBfbXNnLT5oYXNfY2ZnID0gVFJVRTsKKyAgICAgICAgcF9tc2ctPmhhc19jZmcgPSB0cnVlOwogICAgICAgICBwX21zZy0+Y2ZnID0gKmNmZzsKICAgICB9IGVsc2UgewotICAgICAgICBwX21zZy0+aGFzX2NmZyA9IEZBTFNFOworICAgICAgICBwX21zZy0+aGFzX2NmZyA9IGZhbHNlOwogICAgIH0KICAgICBpZiAoZXJ0bV9pbmZvICE9IE5VTEwpIHsKLSAgICAgICAgcF9tc2ctPmhhc19lcnRtX2luZm8gPSBUUlVFOworICAgICAgICBwX21zZy0+aGFzX2VydG1faW5mbyA9IHRydWU7CiAgICAgICAgIHBfbXNnLT5lcnRtX2luZm8gPSAqZXJ0bV9pbmZvOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHBfbXNnLT5oYXNfZXJ0bV9pbmZvID0gRkFMU0U7CisgICAgICAgIHBfbXNnLT5oYXNfZXJ0bV9pbmZvID0gZmFsc2U7CiAgICAgfQogICAgIHBfbXNnLT5wX2NiYWNrID0gcF9jYmFjazsKICAgICBwX21zZy0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOwpAQCAtNTIwLDcgKzUyMCw3IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHRCVEFfSlZfU1RBVFVTIEJUQV9KdkwyY2FwU3RhcnRTZXJ2ZXJMRSh0QlRBX1NFQyBzZWNfbWFzaywgdEJUQV9KVl9ST0xFIHJvbGUsCi0gICAgICAgIGNvbnN0IHRMMkNBUF9FUlRNX0lORk8gKmVydG1faW5mbyxVSU5UMTYgbG9jYWxfY2hhbiwgVUlOVDE2IHJ4X210dSwgdEwyQ0FQX0NGR19JTkZPICpjZmcsCisgICAgICAgIGNvbnN0IHRMMkNBUF9FUlRNX0lORk8gKmVydG1faW5mbyx1aW50MTZfdCBsb2NhbF9jaGFuLCB1aW50MTZfdCByeF9tdHUsIHRMMkNBUF9DRkdfSU5GTyAqY2ZnLAogICAgICAgICB0QlRBX0pWX0wyQ0FQX0NCQUNLICpwX2NiYWNrLCB2b2lkICp1c2VyX2RhdGEpCiB7CiAgICAgQVBQTF9UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwpAQCAtNTM2LDE2ICs1MzYsMTYgQEAKICAgICBwX21zZy0+bG9jYWxfY2hhbiA9IGxvY2FsX2NoYW47CiAgICAgcF9tc2ctPnJ4X210dSA9IHJ4X210dTsKICAgICBpZiAoY2ZnICE9IE5VTEwpIHsKLSAgICAgICAgcF9tc2ctPmhhc19jZmcgPSBUUlVFOworICAgICAgICBwX21zZy0+aGFzX2NmZyA9IHRydWU7CiAgICAgICAgIHBfbXNnLT5jZmcgPSAqY2ZnOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHBfbXNnLT5oYXNfY2ZnID0gRkFMU0U7CisgICAgICAgIHBfbXNnLT5oYXNfY2ZnID0gZmFsc2U7CiAgICAgfQogICAgIGlmIChlcnRtX2luZm8gIT0gTlVMTCkgewotICAgICAgICBwX21zZy0+aGFzX2VydG1faW5mbyA9IFRSVUU7CisgICAgICAgIHBfbXNnLT5oYXNfZXJ0bV9pbmZvID0gdHJ1ZTsKICAgICAgICAgcF9tc2ctPmVydG1faW5mbyA9ICplcnRtX2luZm87CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcF9tc2ctPmhhc19lcnRtX2luZm8gPSBGQUxTRTsKKyAgICAgICAgcF9tc2ctPmhhc19lcnRtX2luZm8gPSBmYWxzZTsKICAgICB9CiAgICAgcF9tc2ctPnBfY2JhY2sgPSBwX2NiYWNrOwogICAgIHBfbXNnLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CkBAIC01NjYsNyArNTY2LDcgQEAKICoqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2TDJjYXBTdG9wU2VydmVyKFVJTlQxNiBsb2NhbF9wc20sIHZvaWQgKnVzZXJfZGF0YSkKK3RCVEFfSlZfU1RBVFVTIEJUQV9KdkwyY2FwU3RvcFNlcnZlcih1aW50MTZfdCBsb2NhbF9wc20sIHZvaWQgKnVzZXJfZGF0YSkKIHsKICAgICBBUFBMX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7CiAKQEAgLTU5Miw3ICs1OTIsNyBAQAogKiogICAgICAgICAgICAgICAgICBCVEFfSlZfRkFJTFVSRSwgb3RoZXJ3aXNlLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1NUQVRVUyBCVEFfSnZMMmNhcFN0b3BTZXJ2ZXJMRShVSU5UMTYgbG9jYWxfY2hhbiwgdm9pZCAqdXNlcl9kYXRhKQordEJUQV9KVl9TVEFUVVMgQlRBX0p2TDJjYXBTdG9wU2VydmVyTEUodWludDE2X3QgbG9jYWxfY2hhbiwgdm9pZCAqdXNlcl9kYXRhKQogewogICAgIEFQUExfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKIApAQCAtNjIxLDcgKzYyMSw3IEBACiAqKiAgICAgICAgICAgICAgICAgIEJUQV9KVl9GQUlMVVJFLCBvdGhlcndpc2UuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdkwyY2FwUmVhZChVSU5UMzIgaGFuZGxlLCBVSU5UMzIgcmVxX2lkLCBVSU5UOCAqcF9kYXRhLCBVSU5UMTYgbGVuKQordEJUQV9KVl9TVEFUVVMgQlRBX0p2TDJjYXBSZWFkKHVpbnQzMl90IGhhbmRsZSwgdWludDMyX3QgcmVxX2lkLCB1aW50OF90ICpwX2RhdGEsIHVpbnQxNl90IGxlbikKIHsKICAgICB0QlRBX0pWX1NUQVRVUyBzdGF0dXMgPSBCVEFfSlZfRkFJTFVSRTsKICAgICB0QlRBX0pWX0wyQ0FQX1JFQUQgZXZ0X2RhdGE7CkBAIC02MzgsNyArNjM4LDcgQEAKICAgICAgICAgZXZ0X2RhdGEucF9kYXRhID0gcF9kYXRhOwogICAgICAgICBldnRfZGF0YS5sZW4gICAgPSAwOwogCi0gICAgICAgIGlmIChCVF9QQVNTID09IEdBUF9Db25uUmVhZERhdGEoKFVJTlQxNiloYW5kbGUsIHBfZGF0YSwgbGVuLCAmZXZ0X2RhdGEubGVuKSkKKyAgICAgICAgaWYgKEJUX1BBU1MgPT0gR0FQX0Nvbm5SZWFkRGF0YSgodWludDE2X3QpaGFuZGxlLCBwX2RhdGEsIGxlbiwgJmV2dF9kYXRhLmxlbikpCiAgICAgICAgIHsKICAgICAgICAgICAgIGV2dF9kYXRhLnN0YXR1cyA9IEJUQV9KVl9TVUNDRVNTOwogICAgICAgICB9CkBAIC02NjAsNyArNjYwLDcgQEAKICoqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIGlmIGVycm9yLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1NUQVRVUyBCVEFfSnZMMmNhcFJlYWR5KFVJTlQzMiBoYW5kbGUsIFVJTlQzMiAqcF9kYXRhX3NpemUpCit0QlRBX0pWX1NUQVRVUyBCVEFfSnZMMmNhcFJlYWR5KHVpbnQzMl90IGhhbmRsZSwgdWludDMyX3QgKnBfZGF0YV9zaXplKQogewogICAgIHRCVEFfSlZfU1RBVFVTIHN0YXR1cyA9IEJUQV9KVl9GQUlMVVJFOwogCkBAIC02NjgsNyArNjY4LDcgQEAKICAgICBpZiAocF9kYXRhX3NpemUgJiYgaGFuZGxlIDwgQlRBX0pWX01BWF9MMkNfQ09OTiAmJiBidGFfanZfY2IubDJjX2NiW2hhbmRsZV0ucF9jYmFjaykKICAgICB7CiAgICAgICAgICpwX2RhdGFfc2l6ZSA9IDA7Ci0gICAgICAgIGlmKEJUX1BBU1MgPT0gR0FQX0dldFJ4UXVldWVDbnQoKFVJTlQxNiloYW5kbGUsIHBfZGF0YV9zaXplKSApCisgICAgICAgIGlmKEJUX1BBU1MgPT0gR0FQX0dldFJ4UXVldWVDbnQoKHVpbnQxNl90KWhhbmRsZSwgcF9kYXRhX3NpemUpICkKICAgICAgICAgewogICAgICAgICAgICAgc3RhdHVzID0gQlRBX0pWX1NVQ0NFU1M7CiAgICAgICAgIH0KQEAgLTY5MSw4ICs2OTEsOCBAQAogKiogICAgICAgICAgICAgICAgICBCVEFfSlZfRkFJTFVSRSwgb3RoZXJ3aXNlLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1NUQVRVUyBCVEFfSnZMMmNhcFdyaXRlKFVJTlQzMiBoYW5kbGUsIFVJTlQzMiByZXFfaWQsIFVJTlQ4ICpwX2RhdGEsCi0gICAgICAgIFVJTlQxNiBsZW4sIHZvaWQgKnVzZXJfZGF0YSkKK3RCVEFfSlZfU1RBVFVTIEJUQV9KdkwyY2FwV3JpdGUodWludDMyX3QgaGFuZGxlLCB1aW50MzJfdCByZXFfaWQsIHVpbnQ4X3QgKnBfZGF0YSwKKyAgICAgICAgdWludDE2X3QgbGVuLCB2b2lkICp1c2VyX2RhdGEpCiB7CiAgICAgdEJUQV9KVl9TVEFUVVMgc3RhdHVzID0gQlRBX0pWX0ZBSUxVUkU7CiAKQEAgLTczMCw4ICs3MzAsOCBAQAogKiogICAgICAgICAgICAgICAgICBCVEFfSlZfRkFJTFVSRSwgb3RoZXJ3aXNlLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1NUQVRVUyBCVEFfSnZMMmNhcFdyaXRlRml4ZWQoVUlOVDE2IGNoYW5uZWwsIEJEX0FERFIgKmFkZHIsIFVJTlQzMiByZXFfaWQsCi0gICAgICAgIHRCVEFfSlZfTDJDQVBfQ0JBQ0sgKnBfY2JhY2ssIFVJTlQ4ICpwX2RhdGEsIFVJTlQxNiBsZW4sIHZvaWQgKnVzZXJfZGF0YSkKK3RCVEFfSlZfU1RBVFVTIEJUQV9KdkwyY2FwV3JpdGVGaXhlZCh1aW50MTZfdCBjaGFubmVsLCBCRF9BRERSICphZGRyLCB1aW50MzJfdCByZXFfaWQsCisgICAgICAgIHRCVEFfSlZfTDJDQVBfQ0JBQ0sgKnBfY2JhY2ssIHVpbnQ4X3QgKnBfZGF0YSwgdWludDE2X3QgbGVuLCB2b2lkICp1c2VyX2RhdGEpCiB7CiAgICAgdEJUQV9KVl9BUElfTDJDQVBfV1JJVEVfRklYRUQgKnBfbXNnID0KICAgICAgICAgKHRCVEFfSlZfQVBJX0wyQ0FQX1dSSVRFX0ZJWEVEICopb3NpX21hbGxvYyhzaXplb2YodEJUQV9KVl9BUElfTDJDQVBfV1JJVEVfRklYRUQpKTsKQEAgLTc2OCw3ICs3NjgsNyBAQAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB0QlRBX0pWX1NUQVRVUyBCVEFfSnZSZmNvbW1Db25uZWN0KHRCVEFfU0VDIHNlY19tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9KVl9ST0xFIHJvbGUsIFVJTlQ4IHJlbW90ZV9zY24sIEJEX0FERFIgcGVlcl9iZF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9KVl9ST0xFIHJvbGUsIHVpbnQ4X3QgcmVtb3RlX3NjbiwgQkRfQUREUiBwZWVyX2JkX2FkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX1JGQ09NTV9DQkFDSyAqcF9jYmFjaywgdm9pZCogdXNlcl9kYXRhKQogewogICAgIEFQUExfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKQEAgLTgwMSwxMSArODAxLDExIEBACiAqKiAgICAgICAgICAgICAgICAgIEJUQV9KVl9GQUlMVVJFLCBvdGhlcndpc2UuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdlJmY29tbUNsb3NlKFVJTlQzMiBoYW5kbGUsIHZvaWQgKnVzZXJfZGF0YSkKK3RCVEFfSlZfU1RBVFVTIEJUQV9KdlJmY29tbUNsb3NlKHVpbnQzMl90IGhhbmRsZSwgdm9pZCAqdXNlcl9kYXRhKQogewogICAgIHRCVEFfSlZfU1RBVFVTIHN0YXR1cyA9IEJUQV9KVl9GQUlMVVJFOwotICAgIFVJTlQzMiAgaGkgPSAoKGhhbmRsZSAmIEJUQV9KVl9SRkNfSERMX01BU0spJn5CVEFfSlZfUkZDT01NX01BU0spIC0gMTsKLSAgICBVSU5UMzIgIHNpID0gQlRBX0pWX1JGQ19IRExfVE9fU0lEWChoYW5kbGUpOworICAgIHVpbnQzMl90ICBoaSA9ICgoaGFuZGxlICYgQlRBX0pWX1JGQ19IRExfTUFTSykmfkJUQV9KVl9SRkNPTU1fTUFTSykgLSAxOworICAgIHVpbnQzMl90ICBzaSA9IEJUQV9KVl9SRkNfSERMX1RPX1NJRFgoaGFuZGxlKTsKIAogICAgIEFQUExfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKIApAQCAtODQzLDcgKzg0Myw3IEBACiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHRCVEFfSlZfU1RBVFVTIEJUQV9KdlJmY29tbVN0YXJ0U2VydmVyKHRCVEFfU0VDIHNlY19tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9KVl9ST0xFIHJvbGUsIFVJTlQ4IGxvY2FsX3NjbiwgVUlOVDggbWF4X3Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX1JPTEUgcm9sZSwgdWludDhfdCBsb2NhbF9zY24sIHVpbnQ4X3QgbWF4X3Nlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX1JGQ09NTV9DQkFDSyAqcF9jYmFjaywgdm9pZCogdXNlcl9kYXRhKQogewogICAgIEFQUExfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKQEAgLTg4Myw3ICs4ODMsNyBAQAogKiogICAgICAgICAgICAgICAgICBCVEFfSlZfRkFJTFVSRSwgb3RoZXJ3aXNlLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1NUQVRVUyBCVEFfSnZSZmNvbW1TdG9wU2VydmVyKFVJTlQzMiBoYW5kbGUsIHZvaWQgKiB1c2VyX2RhdGEpCit0QlRBX0pWX1NUQVRVUyBCVEFfSnZSZmNvbW1TdG9wU2VydmVyKHVpbnQzMl90IGhhbmRsZSwgdm9pZCAqIHVzZXJfZGF0YSkKIHsKICAgICB0QlRBX0pWX0FQSV9SRkNPTU1fU0VSVkVSICpwX21zZyA9CiAgICAgICAgICh0QlRBX0pWX0FQSV9SRkNPTU1fU0VSVkVSICopb3NpX21hbGxvYyhzaXplb2YodEJUQV9KVl9BUElfUkZDT01NX1NFUlZFUikpOwpAQCAtOTA5LDEwICs5MDksMTAgQEAKICoqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVUlOVDE2IEJUQV9KdlJmY29tbUdldFBvcnRIZGwoVUlOVDMyIGhhbmRsZSkKK3VpbnQxNl90IEJUQV9KdlJmY29tbUdldFBvcnRIZGwodWludDMyX3QgaGFuZGxlKQogewotICAgIFVJTlQzMiAgaGkgPSAoKGhhbmRsZSAmIEJUQV9KVl9SRkNfSERMX01BU0spICYgfkJUQV9KVl9SRkNPTU1fTUFTSykgLSAxOwotICAgIFVJTlQzMiAgc2kgPSBCVEFfSlZfUkZDX0hETF9UT19TSURYKGhhbmRsZSk7CisgICAgdWludDMyX3QgIGhpID0gKChoYW5kbGUgJiBCVEFfSlZfUkZDX0hETF9NQVNLKSAmIH5CVEFfSlZfUkZDT01NX01BU0spIC0gMTsKKyAgICB1aW50MzJfdCAgc2kgPSBCVEFfSlZfUkZDX0hETF9UT19TSURYKGhhbmRsZSk7CiAKICAgICBpZiAoaGkgPCBCVEFfSlZfTUFYX1JGQ19DT05OICYmCiAgICAgICAgIHNpIDwgQlRBX0pWX01BWF9SRkNfU1JfU0VTU0lPTiAmJiBidGFfanZfY2IucmZjX2NiW2hpXS5yZmNfaGRsW3NpXSkKQEAgLTkzMSwxMSArOTMxLDExIEBACiAqKiAgICAgICAgICAgICAgICAgIEJUQV9KVl9GQUlMVVJFLCBvdGhlcndpc2UuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdlJmY29tbVdyaXRlKFVJTlQzMiBoYW5kbGUsIFVJTlQzMiByZXFfaWQpCit0QlRBX0pWX1NUQVRVUyBCVEFfSnZSZmNvbW1Xcml0ZSh1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IHJlcV9pZCkKIHsKICAgICB0QlRBX0pWX1NUQVRVUyBzdGF0dXMgPSBCVEFfSlZfRkFJTFVSRTsKLSAgICBVSU5UMzIgIGhpID0gKChoYW5kbGUgJiBCVEFfSlZfUkZDX0hETF9NQVNLKSZ+QlRBX0pWX1JGQ09NTV9NQVNLKSAtIDE7Ci0gICAgVUlOVDMyICBzaSA9IEJUQV9KVl9SRkNfSERMX1RPX1NJRFgoaGFuZGxlKTsKKyAgICB1aW50MzJfdCAgaGkgPSAoKGhhbmRsZSAmIEJUQV9KVl9SRkNfSERMX01BU0spJn5CVEFfSlZfUkZDT01NX01BU0spIC0gMTsKKyAgICB1aW50MzJfdCAgc2kgPSBCVEFfSlZfUkZDX0hETF9UT19TSURYKGhhbmRsZSk7CiAKICAgICBBUFBMX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7CiAKQEAgLTk3OCw3ICs5NzgsNyBAQAogICoqICAgICAgICAgICAgICBCVEFfSlZfQ09OTl9DTE9TRSB0byByZW1vdmUgaW4gY2FzZSBvZiBjb25uZWN0aW9uIGNsb3NlIQogICoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdlNldFBtUHJvZmlsZShVSU5UMzIgaGFuZGxlLCB0QlRBX0pWX1BNX0lEIGFwcF9pZCwgdEJUQV9KVl9DT05OX1NUQVRFIGluaXRfc3QpCit0QlRBX0pWX1NUQVRVUyBCVEFfSnZTZXRQbVByb2ZpbGUodWludDMyX3QgaGFuZGxlLCB0QlRBX0pWX1BNX0lEIGFwcF9pZCwgdEJUQV9KVl9DT05OX1NUQVRFIGluaXRfc3QpCiB7CiAgICAgdEJUQV9KVl9BUElfU0VUX1BNX1BST0ZJTEUgKnBfbXNnID0KICAgICAgICAgKHRCVEFfSlZfQVBJX1NFVF9QTV9QUk9GSUxFICopb3NpX21hbGxvYyhzaXplb2YodEJUQV9KVl9BUElfU0VUX1BNX1BST0ZJTEUpKTsKZGlmZiAtLWdpdCBhL2J0YS9qdi9idGFfanZfY2ZnLmMgYi9idGEvanYvYnRhX2p2X2NmZy5jCmluZGV4IDNmMzI4ZjAuLjBhY2M4NDQgMTAwNjQ0Ci0tLSBhL2J0YS9qdi9idGFfanZfY2ZnLmMKKysrIGIvYnRhL2p2L2J0YV9qdl9jZmcuYwpAQCAtNDEsOCArNDEsOCBAQAogICogYmV0d2VlbiBCVEFfSnZFbmFibGUgYW5kIEJUQV9KdkRpc2FibGUKICAqIHBfYnRhX2p2X2NmZy0+cF9zZHBfcmF3X2RhdGEgY2FuIGJlIGFsbG9jYXRlZCBiZWZvcmUgY2FsbGluZyBCVEFfSnZTdGFydERpc2NvdmVyeQogICogaXQgY2FuIGJlIGRlLWFsbG9jYXRlZCBhZnRlciB0aGUgbGFzdCBjYWxsIHRvIGFjY2VzcyB0aGUgZGF0YWJhc2UgKi8KLXN0YXRpYyBVSU5UOCBidGFfanZfc2RwX3Jhd19kYXRhW0JUQV9KVl9TRFBfUkFXX0RBVEFfU0laRV07Ci1zdGF0aWMgVUlOVDggX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCkpKSBidGFfanZfc2RwX2RiX2RhdGFbQlRBX0pWX1NEUF9EQl9TSVpFXTsKK3N0YXRpYyB1aW50OF90IGJ0YV9qdl9zZHBfcmF3X2RhdGFbQlRBX0pWX1NEUF9SQVdfREFUQV9TSVpFXTsKK3N0YXRpYyB1aW50OF90IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDQpKSkgYnRhX2p2X3NkcF9kYl9kYXRhW0JUQV9KVl9TRFBfREJfU0laRV07CiAKIC8qIEpWIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlICovCiBjb25zdCB0QlRBX0pWX0NGRyBidGFfanZfY2ZnID0KZGlmZiAtLWdpdCBhL2J0YS9qdi9idGFfanZfaW50LmggYi9idGEvanYvYnRhX2p2X2ludC5oCmluZGV4IGUwOTg4OTQuLjRlOTFmYzUgMTAwNjQ0Ci0tLSBhL2J0YS9qdi9idGFfanZfaW50LmgKKysrIGIvYnRhL2p2L2J0YV9qdl9pbnQuaApAQCAtODEsMTAgKzgxLDEwIEBACiB7CiAgICAgQlRfSERSICAgICAgaGRyOwogICAgIEJEX0FERFIgYmRfYWRkcjsKLSAgICBVSU5UMTYgbnVtX3V1aWQ7CisgICAgdWludDE2X3QgbnVtX3V1aWQ7CiAgICAgdFNEUF9VVUlEIHV1aWRfbGlzdFtCVEFfSlZfTUFYX1VVSURTXTsKLSAgICBVSU5UMTYgbnVtX2F0dHI7Ci0gICAgVUlOVDE2IGF0dHJfbGlzdFtCVEFfSlZfTUFYX0FUVFJTXTsKKyAgICB1aW50MTZfdCBudW1fYXR0cjsKKyAgICB1aW50MTZfdCBhdHRyX2xpc3RbQlRBX0pWX01BWF9BVFRSU107CiAgICAgdm9pZCAgICAgICAgICAgICp1c2VyX2RhdGE7ICAgICAgLyogcGlnZ3liYWNrIGNhbGxlcidzIHByaXZhdGUgZGF0YSovCiB9IHRCVEFfSlZfQVBJX1NUQVJUX0RJU0NPVkVSWTsKIApAQCAtOTgsOCArOTgsOCBAQAogLyogQlRBIEpWIFBNIGNvbnRyb2wgYmxvY2sgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDMyICAgICAgICAgIGhhbmRsZTsgICAgIC8qIFRoZSBjb25uZWN0aW9uIGhhbmRsZSAqLwotICAgIFVJTlQ4ICAgICAgICAgICBzdGF0ZTsgICAgICAvKiBzdGF0ZTogc2VlIGFib3ZlIGVudW0gKi8KKyAgICB1aW50MzJfdCAgICAgICAgICBoYW5kbGU7ICAgICAvKiBUaGUgY29ubmVjdGlvbiBoYW5kbGUgKi8KKyAgICB1aW50OF90ICAgICAgICAgICBzdGF0ZTsgICAgICAvKiBzdGF0ZTogc2VlIGFib3ZlIGVudW0gKi8KICAgICB0QlRBX0pWX1BNX0lEICAgYXBwX2lkOyAgICAgLyogSlYgYXBwIHNwZWNpZmljIGlkIGluZGljYXRpbmcgcG93ZXIgdGFibGUgdG8gdXNlICovCiAgICAgQkRfQUREUiAgICAgICAgIHBlZXJfYmRfYWRkcjsgICAgLyogUGVlciBCRCBhZGRyZXNzICovCiB9IHRCVEFfSlZfUE1fQ0I7CkBAIC0xMTQsMTcgKzExNCwxNyBAQAogICAgIEJUQV9KVl9TVF9TUl9PUEVOLAogICAgIEJUQV9KVl9TVF9TUl9DTE9TSU5HCiB9IDsKLXR5cGVkZWYgVUlOVDggIHRCVEFfSlZfU1RBVEU7Cit0eXBlZGVmIHVpbnQ4X3QgIHRCVEFfSlZfU1RBVEU7CiAjZGVmaW5lIEJUQV9KVl9TVF9DTF9NQVggICAgQlRBX0pWX1NUX0NMX0NMT1NJTkcKIC8qIEpWIEwyQ0FQIGNvbnRyb2wgYmxvY2sgKi8KIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgdEJUQV9KVl9MMkNBUF9DQkFDSyAqcF9jYmFjazsgICAvKiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLSAgICBVSU5UMTYgICAgICAgICAgICAgIHBzbTsgICAgICAgIC8qIHRoZSBwc20gdXNlZCBmb3IgdGhpcyBzZXJ2ZXIgY29ubmVjdGlvbiAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBwc207ICAgICAgICAvKiB0aGUgcHNtIHVzZWQgZm9yIHRoaXMgc2VydmVyIGNvbm5lY3Rpb24gKi8KICAgICB0QlRBX0pWX1NUQVRFICAgICAgIHN0YXRlOyAgICAgIC8qIHRoZSBzdGF0ZSBvZiB0aGlzIGNvbnRyb2wgYmxvY2sgKi8KICAgICB0QlRBX1NFUlZJQ0VfSUQgICAgIHNlY19pZDsgICAgIC8qIHNlcnZpY2UgaWQgKi8KLSAgICBVSU5UMzIgICAgICAgICAgICAgIGhhbmRsZTsgICAgIC8qIHRoZSBoYW5kbGUgcmVwb3J0ZWQgdG8gamF2YSBhcHAgKHNhbWUgYXMgZ2FwIGhhbmRsZSkgKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgIGNvbmc7ICAgICAgIC8qIFRSVUUsIGlmIGNvbmdlc3RlZCAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBoYW5kbGU7ICAgICAvKiB0aGUgaGFuZGxlIHJlcG9ydGVkIHRvIGphdmEgYXBwIChzYW1lIGFzIGdhcCBoYW5kbGUpICovCisgICAgYm9vbCAgICAgICAgICAgICBjb25nOyAgICAgICAvKiB0cnVlLCBpZiBjb25nZXN0ZWQgKi8KICAgICB0QlRBX0pWX1BNX0NCICAgICAgKnBfcG1fY2I7ICAgIC8qIHB0ciB0byBwbSBjb250cm9sIGJsb2NrLCBOVUxMOiB1bnVzZWQgKi8KICAgICB2b2lkICAgICAgICAgICAgICAgICp1c2VyX2RhdGE7IC8qIHVzZXIgZGF0YSBmb3IgY2FsbGJhY2sgZnJvbSBoaWdoZXIgbGF5ZXJzICovCiB9IHRCVEFfSlZfTDJDX0NCOwpAQCAtMTM4LDEyICsxMzgsMTIgQEAKIC8qIHBvcnQgY29udHJvbCBibG9jayAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UMzIgICAgICAgICAgICAgIGhhbmRsZTsgICAgIC8qIHRoZSByZmNvbW0gc2Vzc2lvbiBoYW5kbGUgYXQganYgKi8KLSAgICBVSU5UMTYgICAgICAgICAgICAgIHBvcnRfaGFuZGxlOy8qIHBvcnQgaGFuZGxlICovCisgICAgdWludDMyX3QgICAgICAgICAgICAgIGhhbmRsZTsgICAgIC8qIHRoZSByZmNvbW0gc2Vzc2lvbiBoYW5kbGUgYXQganYgKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgcG9ydF9oYW5kbGU7LyogcG9ydCBoYW5kbGUgKi8KICAgICB0QlRBX0pWX1NUQVRFICAgICAgIHN0YXRlOyAgICAgIC8qIHRoZSBzdGF0ZSBvZiB0aGlzIGNvbnRyb2wgYmxvY2sgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIG1heF9zZXNzOyAgIC8qIG1heCBzZXNzaW9ucyAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBtYXhfc2VzczsgICAvKiBtYXggc2Vzc2lvbnMgKi8KICAgICB2b2lkICAgICAgICAgICAgICAgICp1c2VyX2RhdGE7IC8qIHBpZ2d5YmFjayBjYWxsZXIncyBwcml2YXRlIGRhdGEqLwotICAgIEJPT0xFQU4gICAgICAgICAgICAgY29uZzsgICAgICAgLyogVFJVRSwgaWYgY29uZ2VzdGVkICovCisgICAgYm9vbCAgICAgICAgICAgICBjb25nOyAgICAgICAvKiB0cnVlLCBpZiBjb25nZXN0ZWQgKi8KICAgICB0QlRBX0pWX1BNX0NCICAgICAgICpwX3BtX2NiOyAgIC8qIHB0ciB0byBwbSBjb250cm9sIGJsb2NrLCBOVUxMOiB1bnVzZWQgKi8KIH0gdEJUQV9KVl9QQ0I7CiAKQEAgLTE1MSwxMSArMTUxLDExIEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIHRCVEFfSlZfUkZDT01NX0NCQUNLICpwX2NiYWNrOyAgLyogdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0gICAgVUlOVDE2ICAgICAgICAgICAgICByZmNfaGRsW0JUQV9KVl9NQVhfUkZDX1NSX1NFU1NJT05dOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICByZmNfaGRsW0JUQV9KVl9NQVhfUkZDX1NSX1NFU1NJT05dOwogICAgIHRCVEFfU0VSVklDRV9JRCAgICAgc2VjX2lkOyAgICAgLyogc2VydmljZSBpZCAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgaGFuZGxlOyAgICAgLyogaW5kZXg6IHRoZSBoYW5kbGUgcmVwb3J0ZWQgdG8gamF2YSBhcHAgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgIHNjbjsgICAgICAgIC8qIHRoZSBzY24gb2YgdGhlIHNlcnZlciAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgbWF4X3Nlc3M7ICAgLyogbWF4IHNlc3Npb25zICovCisgICAgdWludDhfdCAgICAgICAgICAgICAgIGhhbmRsZTsgICAgIC8qIGluZGV4OiB0aGUgaGFuZGxlIHJlcG9ydGVkIHRvIGphdmEgYXBwICovCisgICAgdWludDhfdCAgICAgICAgICAgICAgIHNjbjsgICAgICAgIC8qIHRoZSBzY24gb2YgdGhlIHNlcnZlciAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBtYXhfc2VzczsgICAvKiBtYXggc2Vzc2lvbnMgKi8KICAgICBpbnQgICAgICAgICAgICAgICAgIGN1cnJfc2VzczsgICAvKiBjdXJyZW50IHNlc3Npb25zIGNvdW50Ki8KIH0gdEJUQV9KVl9SRkNfQ0I7CiAKQEAgLTE2MywxOCArMTYzLDE4IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJUX0hEUiAgICAgICAgICAgICAgaGRyOwotICAgIElOVDMyICAgICAgICAgICAgICAgdHlwZTsgICAgICAgLyogT25lIG9mIEJUQV9KVl9DT05OX1RZUEVfICovCisgICAgaW50MzJfdCAgICAgICAgICAgICAgIHR5cGU7ICAgICAgIC8qIE9uZSBvZiBCVEFfSlZfQ09OTl9UWVBFXyAqLwogICAgIHRCVEFfU0VDICAgICAgICAgICAgc2VjX21hc2s7CiAgICAgdEJUQV9KVl9ST0xFICAgICAgICByb2xlOwogICAgIHVuaW9uIHsKLSAgICAgICAgVUlOVDE2ICAgICAgICAgIHJlbW90ZV9wc207Ci0gICAgICAgIFVJTlQxNiAgICAgICAgICByZW1vdGVfY2hhbjsKKyAgICAgICAgdWludDE2X3QgICAgICAgICAgcmVtb3RlX3BzbTsKKyAgICAgICAgdWludDE2X3QgICAgICAgICAgcmVtb3RlX2NoYW47CiAgICAgfTsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIHJ4X210dTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgcnhfbXR1OwogICAgIEJEX0FERFIgICAgICAgICAgICAgcGVlcl9iZF9hZGRyOwotICAgIElOVDMyICAgICAgICAgICAgICAgaGFzX2NmZzsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgaGFzX2NmZzsKICAgICB0TDJDQVBfQ0ZHX0lORk8gICAgIGNmZzsKLSAgICBJTlQzMiAgICAgICAgICAgICAgIGhhc19lcnRtX2luZm87CisgICAgaW50MzJfdCAgICAgICAgICAgICAgIGhhc19lcnRtX2luZm87CiAgICAgdEwyQ0FQX0VSVE1fSU5GTyAgICBlcnRtX2luZm87CiAgICAgdEJUQV9KVl9MMkNBUF9DQkFDSyAqcF9jYmFjazsKICAgICB2b2lkICAgICAgICAgICAgICAgICp1c2VyX2RhdGE7CkBAIC0xODQsMTcgKzE4NCwxNyBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICAgICAgICAgIGhkcjsKLSAgICBJTlQzMiAgICAgICAgICAgICAgIHR5cGU7ICAgICAgIC8qIE9uZSBvZiBCVEFfSlZfQ09OTl9UWVBFXyAqLworICAgIGludDMyX3QgICAgICAgICAgICAgICB0eXBlOyAgICAgICAvKiBPbmUgb2YgQlRBX0pWX0NPTk5fVFlQRV8gKi8KICAgICB0QlRBX1NFQyAgICAgICAgICAgIHNlY19tYXNrOwogICAgIHRCVEFfSlZfUk9MRSAgICAgICAgcm9sZTsKICAgICB1bmlvbiB7Ci0gICAgICAgIFVJTlQxNiAgICAgICAgICBsb2NhbF9wc207Ci0gICAgICAgIFVJTlQxNiAgICAgICAgICBsb2NhbF9jaGFuOworICAgICAgICB1aW50MTZfdCAgICAgICAgICBsb2NhbF9wc207CisgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGxvY2FsX2NoYW47CiAgICAgfTsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIHJ4X210dTsKLSAgICBJTlQzMiAgICAgICAgICAgICAgIGhhc19jZmc7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIHJ4X210dTsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgaGFzX2NmZzsKICAgICB0TDJDQVBfQ0ZHX0lORk8gICAgIGNmZzsKLSAgICBJTlQzMiAgICAgICAgICAgICAgIGhhc19lcnRtX2luZm87CisgICAgaW50MzJfdCAgICAgICAgICAgICAgIGhhc19lcnRtX2luZm87CiAgICAgdEwyQ0FQX0VSVE1fSU5GTyAgICBlcnRtX2luZm87CiAgICAgdEJUQV9KVl9MMkNBUF9DQkFDSyAqcF9jYmFjazsKICAgICB2b2lkICAgICAgICAgICAgICAgICp1c2VyX2RhdGE7CkBAIC0yMDQsNyArMjA0LDcgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgQlRfSERSICAgICAgICAgIGhkcjsKLSAgICBVSU5UMzIgICAgICAgICAgaGFuZGxlOworICAgIHVpbnQzMl90ICAgICAgICAgIGhhbmRsZTsKICAgICB0QlRBX0pWX0wyQ19DQiAgKnBfY2I7CiB9IHRCVEFfSlZfQVBJX0wyQ0FQX0NMT1NFOwogCkBAIC0yMTIsMTEgKzIxMiwxMSBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICAgICAgICAgIGhkcjsKLSAgICBVSU5UMzIgICAgICAgICAgICAgIGhhbmRsZTsKLSAgICBVSU5UMzIgICAgICAgICAgICAgIHJlcV9pZDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgaGFuZGxlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICByZXFfaWQ7CiAgICAgdEJUQV9KVl9MMkNBUF9DQkFDSyAqcF9jYmFjazsKLSAgICBVSU5UOCogICAgICAgICAgICAgIHBfZGF0YTsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIGxlbjsKKyAgICB1aW50OF90KiAgICAgICAgICAgICAgcF9kYXRhOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICBsZW47CiAgICAgdm9pZCAgICAgICAgICAgICAgICAqdXNlcl9kYXRhOwogfSB0QlRBX0pWX0FQSV9MMkNBUF9SRUFEOwogCkBAIC0yMjQsMTEgKzIyNCwxMSBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICAgICAgICAgIGhkcjsKLSAgICBVSU5UMzIgICAgICAgICAgICAgIGhhbmRsZTsKLSAgICBVSU5UMzIgICAgICAgICAgICAgIHJlcV9pZDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgaGFuZGxlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICByZXFfaWQ7CiAgICAgdEJUQV9KVl9MMkNfQ0IgICAgICAqcF9jYjsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICpwX2RhdGE7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBsZW47CisgICAgdWludDhfdCAgICAgICAgICAgICAgICpwX2RhdGE7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIGxlbjsKICAgICB2b2lkICAgICAgICAgICAgICAgICp1c2VyX2RhdGE7CiB9IHRCVEFfSlZfQVBJX0wyQ0FQX1dSSVRFOwogCkBAIC0yMzYsMTIgKzIzNiwxMiBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICAgICAgICAgIGhkcjsKLSAgICBVSU5UMTYgICAgICAgICAgICAgIGNoYW5uZWw7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIGNoYW5uZWw7CiAgICAgQkRfQUREUiAgICAgICAgICAgICBhZGRyOwotICAgIFVJTlQzMiAgICAgICAgICAgICAgcmVxX2lkOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICByZXFfaWQ7CiAgICAgdEJUQV9KVl9MMkNBUF9DQkFDSyAqcF9jYmFjazsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICpwX2RhdGE7Ci0gICAgVUlOVDE2ICAgICAgICAgICAgICBsZW47CisgICAgdWludDhfdCAgICAgICAgICAgICAgICpwX2RhdGE7CisgICAgdWludDE2X3QgICAgICAgICAgICAgIGxlbjsKICAgICB2b2lkICAgICAgICAgICAgICAgICp1c2VyX2RhdGE7CiB9IHRCVEFfSlZfQVBJX0wyQ0FQX1dSSVRFX0ZJWEVEOwogCkBAIC0yNTEsNyArMjUxLDcgQEAKICAgICBCVF9IRFIgICAgICAgICAgaGRyOwogICAgIHRCVEFfU0VDICAgICAgICBzZWNfbWFzazsKICAgICB0QlRBX0pWX1JPTEUgICAgcm9sZTsKLSAgICBVSU5UOCAgICAgICAgICAgcmVtb3RlX3NjbjsKKyAgICB1aW50OF90ICAgICAgICAgICByZW1vdGVfc2NuOwogICAgIEJEX0FERFIgICAgICAgICBwZWVyX2JkX2FkZHI7CiAgICAgdEJUQV9KVl9SRkNPTU1fQ0JBQ0sgKnBfY2JhY2s7CiAgICAgdm9pZCAgICAgICAgICAgICp1c2VyX2RhdGE7CkBAIC0yNjMsOSArMjYzLDkgQEAKICAgICBCVF9IRFIgICAgICAgICAgaGRyOwogICAgIHRCVEFfU0VDICAgICAgICBzZWNfbWFzazsKICAgICB0QlRBX0pWX1JPTEUgICAgcm9sZTsKLSAgICBVSU5UOCAgICAgICAgICAgbG9jYWxfc2NuOwotICAgIFVJTlQ4ICAgICAgICAgICBtYXhfc2Vzc2lvbjsKLSAgICBVSU5UMzIgICAgICAgICAgaGFuZGxlOworICAgIHVpbnQ4X3QgICAgICAgICAgIGxvY2FsX3NjbjsKKyAgICB1aW50OF90ICAgICAgICAgICBtYXhfc2Vzc2lvbjsKKyAgICB1aW50MzJfdCAgICAgICAgICBoYW5kbGU7CiAgICAgdEJUQV9KVl9SRkNPTU1fQ0JBQ0sgKnBfY2JhY2s7CiAgICAgdm9pZCAgICAgICAgICAgICp1c2VyX2RhdGE7CiB9IHRCVEFfSlZfQVBJX1JGQ09NTV9TRVJWRVI7CkBAIC0yNzQsNyArMjc0LDcgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgQlRfSERSICAgICAgICAgICAgICBoZHI7Ci0gICAgVUlOVDMyICAgICAgICAgICAgICBoYW5kbGU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIGhhbmRsZTsKICAgICB0QlRBX0pWX1BNX0lEICAgICAgIGFwcF9pZDsKICAgICB0QlRBX0pWX0NPTk5fU1RBVEUgIGluaXRfc3Q7CiB9IHRCVEFfSlZfQVBJX1NFVF9QTV9QUk9GSUxFOwpAQCAtMjkxLDkgKzI5MSw5IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJUX0hEUiAgICAgICAgICBoZHI7Ci0gICAgVUlOVDMyICAgICAgICAgIGhhbmRsZTsKLSAgICBVSU5UMzIgICAgICAgICAgcmVxX2lkOwotICAgIFVJTlQ4ICAgICAgICAgICAqcF9kYXRhOworICAgIHVpbnQzMl90ICAgICAgICAgIGhhbmRsZTsKKyAgICB1aW50MzJfdCAgICAgICAgICByZXFfaWQ7CisgICAgdWludDhfdCAgICAgICAgICAgKnBfZGF0YTsKICAgICBpbnQgICAgICAgICAgICAgbGVuOwogICAgIHRCVEFfSlZfUkZDX0NCICAqcF9jYjsKICAgICB0QlRBX0pWX1BDQiAgICAgKnBfcGNiOwpAQCAtMzAzLDcgKzMwMyw3IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJUX0hEUiAgICAgICAgICBoZHI7Ci0gICAgVUlOVDMyICAgICAgICAgIGhhbmRsZTsKKyAgICB1aW50MzJfdCAgICAgICAgICBoYW5kbGU7CiAgICAgdEJUQV9KVl9SRkNfQ0IgICpwX2NiOwogICAgIHRCVEFfSlZfUENCICAgICAqcF9wY2I7CiAgICAgdm9pZCAgICAgICAgICAgICp1c2VyX2RhdGE7CkBAIC0zMjAsMjYgKzMyMCwyNiBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICBoZHI7Ci0gICAgVUlOVDMyICAgICAgaGFuZGxlOwotICAgIFVJTlQxNiAgICAgIGF0dHJfaWQ7Ci0gICAgVUlOVDggICAgICAgKnBfdmFsdWU7Ci0gICAgSU5UMzIgICAgICAgdmFsdWVfc2l6ZTsKKyAgICB1aW50MzJfdCAgICAgIGhhbmRsZTsKKyAgICB1aW50MTZfdCAgICAgIGF0dHJfaWQ7CisgICAgdWludDhfdCAgICAgICAqcF92YWx1ZTsKKyAgICBpbnQzMl90ICAgICAgIHZhbHVlX3NpemU7CiB9IHRCVEFfSlZfQVBJX0FERF9BVFRSSUJVVEU7CiAKIC8qIGRhdGEgdHlwZSBmb3IgQlRBX0pWX0FQSV9GUkVFX1NDTl9FVlQgKi8KIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgQlRfSERSICAgICAgaGRyOwotICAgIElOVDMyICAgICAgIHR5cGU7ICAgICAgIC8qIE9uZSBvZiBCVEFfSlZfQ09OTl9UWVBFXyAqLwotICAgIFVJTlQxNiAgICAgIHNjbjsKKyAgICBpbnQzMl90ICAgICAgIHR5cGU7ICAgICAgIC8qIE9uZSBvZiBCVEFfSlZfQ09OTl9UWVBFXyAqLworICAgIHVpbnQxNl90ICAgICAgc2NuOwogfSB0QlRBX0pWX0FQSV9GUkVFX0NIQU5ORUw7CiAKIC8qIGRhdGEgdHlwZSBmb3IgQlRBX0pWX0FQSV9BTExPQ19DSEFOTkVMX0VWVCAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCVF9IRFIgICAgICBoZHI7Ci0gICAgSU5UMzIgICAgICAgdHlwZTsgICAgICAgLyogT25lIG9mIEJUQV9KVl9DT05OX1RZUEVfICovCi0gICAgSU5UMzIgICAgICAgY2hhbm5lbDsgICAgLyogb3B0aW9uYWxseSByZXF1ZXN0IGEgc3BlY2lmaWMgY2hhbm5lbCAqLworICAgIGludDMyX3QgICAgICAgdHlwZTsgICAgICAgLyogT25lIG9mIEJUQV9KVl9DT05OX1RZUEVfICovCisgICAgaW50MzJfdCAgICAgICBjaGFubmVsOyAgICAvKiBvcHRpb25hbGx5IHJlcXVlc3QgYSBzcGVjaWZpYyBjaGFubmVsICovCiAgICAgdm9pZCAgICAgICAgKnVzZXJfZGF0YTsKIH0gdEJUQV9KVl9BUElfQUxMT0NfQ0hBTk5FTDsKIC8qIHVuaW9uIG9mIGFsbCBkYXRhIHR5cGVzICovCkBAIC0zNzMsMTggKzM3MywxOCBAQAogICAgIC8qIHRoZSBTRFAgaGFuZGxlIHJlcG9ydGVkIHRvIEpWIHVzZXIgaXMgdGhlIChpbmRleCArIDEpIHRvIHNkcF9oYW5kbGVbXS4KICAgICAgKiBpZiBzZHBfaGFuZGxlW2ldPT0wLCBpdCdzIG5vdCB1c2VkLgogICAgICAqIG90aGVyd2lzZSBzZHBfaGFuZGxlW2ldIGlzIHRoZSBzdGFjayBTRFAgaGFuZGxlLiAqLwotICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgIHNkcF9oYW5kbGVbQlRBX0pWX01BWF9TRFBfUkVDXTsgLyogU0RQIHJlY29yZHMgY3JlYXRlZCAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICpwX3NlbF9yYXdfZGF0YTsvKiB0aGUgcmF3IGRhdGEgb2YgbGFzdCBzZXJ2aWNlIHNlbGVjdCAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgc2RwX2hhbmRsZVtCVEFfSlZfTUFYX1NEUF9SRUNdOyAvKiBTRFAgcmVjb3JkcyBjcmVhdGVkICovCisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAqcF9zZWxfcmF3X2RhdGE7LyogdGhlIHJhdyBkYXRhIG9mIGxhc3Qgc2VydmljZSBzZWxlY3QgKi8KICAgICB0QlRBX0pWX0RNX0NCQUNLICAgICAgICAqcF9kbV9jYmFjazsKICAgICB0QlRBX0pWX0wyQ19DQiAgICAgICAgICBsMmNfY2JbQlRBX0pWX01BWF9MMkNfQ09OTl07ICAgIC8qIGluZGV4IGlzIEdBUCBoYW5kbGUgKGluZGV4KSAqLwogICAgIHRCVEFfSlZfUkZDX0NCICAgICAgICAgIHJmY19jYltCVEFfSlZfTUFYX1JGQ19DT05OXTsKICAgICB0QlRBX0pWX1BDQiAgICAgICAgICAgICBwb3J0X2NiW01BWF9SRkNfUE9SVFNdOyAgICAgICAgIC8qIGluZGV4IG9mIHRoaXMgYXJyYXkgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwb3J0X2hhbmRsZSwgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBzZWNfaWRbQlRBX0pWX05VTV9TRVJWSUNFX0lEXTsgIC8qIHNlcnZpY2UgSUQgKi8KLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICBzY25bQlRBX0pWX01BWF9TQ05dOyAgICAgICAgICAgIC8qIFNDTiBhbGxvY2F0ZWQgYnkgamF2YSAqLwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIGZyZWVfcHNtX2xpc3RbQlRBX0pWX01BWF9MMkNfQ09OTl07ICAvKiBQU01zIGZyZWVkIGJ5IGphdmEKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIHNlY19pZFtCVEFfSlZfTlVNX1NFUlZJQ0VfSURdOyAgLyogc2VydmljZSBJRCAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgIHNjbltCVEFfSlZfTUFYX1NDTl07ICAgICAgICAgICAgLyogU0NOIGFsbG9jYXRlZCBieSBqYXZhICovCisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICBmcmVlX3BzbV9saXN0W0JUQV9KVl9NQVhfTDJDX0NPTk5dOyAgLyogUFNNcyBmcmVlZCBieSBqYXZhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYW4gYmUgcmV1c2VkKSAqLwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIHNkcF9hY3RpdmU7ICAgICAgICAgICAgICAgICAgICAgLyogc2VlIEJUQV9KVl9TRFBfQUNUXyogKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIHNkcF9hY3RpdmU7ICAgICAgICAgICAgICAgICAgICAgLyogc2VlIEJUQV9KVl9TRFBfQUNUXyogKi8KICAgICB0U0RQX1VVSUQgICAgICAgICAgICAgICB1dWlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdXVpZCBvZiBzZHAgZGlzY292ZXJ5Ki8KICAgICB0QlRBX0pWX1BNX0NCICAgICAgICAgICBwbV9jYltCVEFfSlZfUE1fTUFYX05VTV07ICAgICAgIC8qIFBNIG9uIGEgcGVyIEpWIGhhbmRsZSBiYXNlcyAqLwogfSB0QlRBX0pWX0NCOwpAQCAtMzk3LDcgKzM5Nyw3IEBACiB9OwogCiAvKiBKViBjb250cm9sIGJsb2NrICovCi0jaWYgQlRBX0RZTkFNSUNfTUVNT1JZID09IEZBTFNFCisjaWYgKEJUQV9EWU5BTUlDX01FTU9SWSA9PSBGQUxTRSkKIGV4dGVybiB0QlRBX0pWX0NCIGJ0YV9qdl9jYjsKICNlbHNlCiBleHRlcm4gdEJUQV9KVl9DQiAqYnRhX2p2X2NiX3B0cjsKQEAgLTQwNyw3ICs0MDcsNyBAQAogLyogY29uZmlnIHN0cnVjdCAqLwogZXh0ZXJuIHRCVEFfSlZfQ0ZHICpwX2J0YV9qdl9jZmc7CiAKLWV4dGVybiBCT09MRUFOIGJ0YV9qdl9zbV9leGVjdXRlKEJUX0hEUiAqcF9tc2cpOworZXh0ZXJuIGJvb2wgYnRhX2p2X3NtX2V4ZWN1dGUoQlRfSERSICpwX21zZyk7CiAKIGV4dGVybiB2b2lkIGJ0YV9qdl9lbmFibGUgKHRCVEFfSlZfTVNHICpwX2RhdGEpOwogZXh0ZXJuIHZvaWQgYnRhX2p2X2Rpc2FibGUgKHRCVEFfSlZfTVNHICpwX2RhdGEpOwpkaWZmIC0tZ2l0IGEvYnRhL2p2L2J0YV9qdl9tYWluLmMgYi9idGEvanYvYnRhX2p2X21haW4uYwppbmRleCA4YjY5Nzc0Li5kNDc0YTUzIDEwMDY0NAotLS0gYS9idGEvanYvYnRhX2p2X21haW4uYworKysgYi9idGEvanYvYnRhX2p2X21haW4uYwpAQCAtMzEsNyArMzEsNyBAQAogKiogQ29uc3RhbnRzIGFuZCB0eXBlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZiBCVEFfRFlOQU1JQ19NRU1PUlkgPT0gRkFMU0UKKyNpZiAoQlRBX0RZTkFNSUNfTUVNT1JZID09IEZBTFNFKQogdEJUQV9KVl9DQiBidGFfanZfY2I7CiAjZW5kaWYKIApAQCAtODEsMTYgKzgxLDE2IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiBidGFfanZfc21fZXhlY3V0ZShCVF9IRFIgKnBfbXNnKQorYm9vbCBidGFfanZfc21fZXhlY3V0ZShCVF9IRFIgKnBfbXNnKQogewotICAgIEJPT0xFQU4gcmV0ID0gRkFMU0U7Ci0gICAgVUlOVDE2IGFjdGlvbiA9IChwX21zZy0+ZXZlbnQgJiAweDAwZmYpOworICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgdWludDE2X3QgYWN0aW9uID0gKHBfbXNnLT5ldmVudCAmIDB4MDBmZik7CiAgICAgLyogZXhlY3V0ZSBhY3Rpb24gZnVuY3Rpb25zICovCiAKICAgICBpZihhY3Rpb24gPCBCVEFfSlZfTlVNX0FDVElPTlMpCiAgICAgewogICAgICAgICAoKmJ0YV9qdl9hY3Rpb25bYWN0aW9uXSkoKHRCVEFfSlZfTVNHKilwX21zZyk7Ci0gICAgICAgIHJldCA9IFRSVUU7CisgICAgICAgIHJldCA9IHRydWU7CiAgICAgfQogCiAgICAgcmV0dXJuKHJldCk7CmRpZmYgLS1naXQgYS9idGEvbWNlL2J0YV9tY2VfYWN0LmMgYi9idGEvbWNlL2J0YV9tY2VfYWN0LmMKaW5kZXggOWQzZDVmZC4uODI3Y2E0YyAxMDA2NDQKLS0tIGEvYnRhL21jZS9idGFfbWNlX2FjdC5jCisrKyBiL2J0YS9tY2UvYnRhX21jZV9hY3QuYwpAQCAtNTcsNyArNTcsNyBAQAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIGJ0YV9tY2Vfc2VhcmNoX2NiYWNrKFVJTlQxNiByZXN1bHQsIHZvaWQgKiB1c2VyX2RhdGEpCitzdGF0aWMgdm9pZCBidGFfbWNlX3NlYXJjaF9jYmFjayh1aW50MTZfdCByZXN1bHQsIHZvaWQgKiB1c2VyX2RhdGEpCiB7CiAgICAgdFNEUF9ESVNDX1JFQyAqcF9yZWMgPSBOVUxMOwogICAgIHRCVEFfTUNFX01BU19ESVNDT1ZFUllfQ09NUCBldnRfZGF0YTsKQEAgLTE1Miw3ICsxNTIsNyBAQAogICAgIH0KICAgICB0QlRBX01DRV9TVEFUVVMgc3RhdHVzID0gQlRBX01DRV9GQUlMVVJFOwogCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgaW4sIHNkcF9hY3RpdmU6JWQiLCBfX0ZVTkNUSU9OX18sIGJ0YV9tY2VfY2Iuc2RwX2FjdGl2ZSk7CisgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgaW4sIHNkcF9hY3RpdmU6JWQiLCBfX2Z1bmNfXywgYnRhX21jZV9jYi5zZHBfYWN0aXZlKTsKIAogICAgIGlmIChidGFfbWNlX2NiLnNkcF9hY3RpdmUgIT0gQlRBX01DRV9TRFBfQUNUX05PTkUpCiAgICAgewpkaWZmIC0tZ2l0IGEvYnRhL21jZS9idGFfbWNlX2FwaS5jIGIvYnRhL21jZS9idGFfbWNlX2FwaS5jCmluZGV4IDg5Njc2MDUuLmIwYTU5MGQgMTAwNjQ0Ci0tLSBhL2J0YS9tY2UvYnRhX21jZV9hcGkuYworKysgYi9idGEvbWNlL2J0YV9tY2VfYXBpLmMKQEAgLTYzLDcgKzYzLDcgQEAKIAogICAgIEFQUExfVFJBQ0VfQVBJKCIlIiwgX19mdW5jX18pOwogCi0gICAgaWYgKHBfY2JhY2sgJiYgRkFMU0UgPT0gYnRhX3N5c19pc19yZWdpc3RlcihCVEFfSURfTUNFKSkgeworICAgIGlmIChwX2NiYWNrICYmIGZhbHNlID09IGJ0YV9zeXNfaXNfcmVnaXN0ZXIoQlRBX0lEX01DRSkpIHsKICAgICAgICAgbWVtc2V0KCZidGFfbWNlX2NiLCAwLCBzaXplb2YodEJUQV9NQ0VfQ0IpKTsKIAogICAgICAgICAvKiByZWdpc3RlciB3aXRoIEJUQSBzeXN0ZW0gbWFuYWdlciAqLwpkaWZmIC0tZ2l0IGEvYnRhL21jZS9idGFfbWNlX2NmZy5jIGIvYnRhL21jZS9idGFfbWNlX2NmZy5jCmluZGV4IDQ1ZGVlZWQuLjBmOTc2MWUgMTAwNjQ0Ci0tLSBhL2J0YS9tY2UvYnRhX21jZV9jZmcuYworKysgYi9idGEvbWNlL2J0YV9tY2VfY2ZnLmMKQEAgLTMyLDcgKzMyLDcgQEAKICNkZWZpbmUgQlRBX01DRV9TRFBfREJfU0laRSAgNDUwMAogI2VuZGlmCiAKLXN0YXRpYyBVSU5UOCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSkpIGJ0YV9tY2Vfc2RwX2RiX2RhdGFbQlRBX01DRV9TRFBfREJfU0laRV07CitzdGF0aWMgdWludDhfdCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSkpIGJ0YV9tY2Vfc2RwX2RiX2RhdGFbQlRBX01DRV9TRFBfREJfU0laRV07CiAKIC8qIE1DRSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAqLwogY29uc3QgdEJUQV9NQ0VfQ0ZHIGJ0YV9tY2VfY2ZnID0KZGlmZiAtLWdpdCBhL2J0YS9tY2UvYnRhX21jZV9pbnQuaCBiL2J0YS9tY2UvYnRhX21jZV9pbnQuaAppbmRleCA5MDMyZjZhLi45MjU5MDZlIDEwMDY0NAotLS0gYS9idGEvbWNlL2J0YV9tY2VfaW50LmgKKysrIGIvYnRhL21jZS9idGFfbWNlX2ludC5oCkBAIC02Nyw3ICs2Nyw3IEBACiAvKiBNQ0UgY29udHJvbCBibG9jayAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UOCAgICAgICAgICAgICAgc2RwX2FjdGl2ZTsgIC8qIHNlZSBCVEFfTUNFX1NEUF9BQ1RfKiAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgIHNkcF9hY3RpdmU7ICAvKiBzZWUgQlRBX01DRV9TRFBfQUNUXyogKi8KICAgICBCRF9BRERSICAgICAgICAgICAgcmVtb3RlX2FkZHI7CiAgICAgdEJUQV9NQ0VfRE1fQ0JBQ0sgICpwX2RtX2NiYWNrOwogfSB0QlRBX01DRV9DQjsKQEAgLTc5LDcgKzc5LDcgQEAKIH07CiAKIC8qIE1DRSBjb250cm9sIGJsb2NrICovCi0jaWYgQlRBX0RZTkFNSUNfTUVNT1JZID09IEZBTFNFCisjaWYgKEJUQV9EWU5BTUlDX01FTU9SWSA9PSBGQUxTRSkKIGV4dGVybiB0QlRBX01DRV9DQiBidGFfbWNlX2NiOwogI2Vsc2UKIGV4dGVybiB0QlRBX01DRV9DQiAqYnRhX21jZV9jYl9wdHI7CkBAIC04OSw3ICs4OSw3IEBACiAvKiBjb25maWcgc3RydWN0ICovCiBleHRlcm4gdEJUQV9NQ0VfQ0ZHICpwX2J0YV9tY2VfY2ZnOwogCi1leHRlcm4gQk9PTEVBTiBidGFfbWNlX3NtX2V4ZWN1dGUoQlRfSERSICpwX21zZyk7CitleHRlcm4gYm9vbCBidGFfbWNlX3NtX2V4ZWN1dGUoQlRfSERSICpwX21zZyk7CiAKIGV4dGVybiB2b2lkIGJ0YV9tY2VfZW5hYmxlICh0QlRBX01DRV9NU0cgKnBfZGF0YSk7CiBleHRlcm4gdm9pZCBidGFfbWNlX2dldF9yZW1vdGVfbWFzX2luc3RhbmNlcyAodEJUQV9NQ0VfTVNHICpwX2RhdGEpOwpkaWZmIC0tZ2l0IGEvYnRhL21jZS9idGFfbWNlX21haW4uYyBiL2J0YS9tY2UvYnRhX21jZV9tYWluLmMKaW5kZXggYTA1MzZmZi4uNjMyZWU2OCAxMDA2NDQKLS0tIGEvYnRhL21jZS9idGFfbWNlX21haW4uYworKysgYi9idGEvbWNlL2J0YV9tY2VfbWFpbi5jCkBAIC0zMyw3ICszMyw3IEBACiAqKiBDb25zdGFudHMgYW5kIHR5cGVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmIEJUQV9EWU5BTUlDX01FTU9SWSA9PSBGQUxTRQorI2lmIChCVEFfRFlOQU1JQ19NRU1PUlkgPT0gRkFMU0UpCiB0QlRBX01DRV9DQiBidGFfbWNlX2NiOwogI2VuZGlmCiAKQEAgLTYwLDE4ICs2MCwxOCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX21jZV9zbV9leGVjdXRlKEJUX0hEUiAqcF9tc2cpCitib29sIGJ0YV9tY2Vfc21fZXhlY3V0ZShCVF9IRFIgKnBfbXNnKQogewotICAgIGlmKHBfbXNnID09IE5VTEwpIHJldHVybiBGQUxTRTsKKyAgICBpZihwX21zZyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CiAKLSAgICBCT09MRUFOIHJldCA9IEZBTFNFOwotICAgIFVJTlQxNiBhY3Rpb24gPSAocF9tc2ctPmV2ZW50ICYgMHgwMGZmKTsKKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIHVpbnQxNl90IGFjdGlvbiA9IChwX21zZy0+ZXZlbnQgJiAweDAwZmYpOwogCiAgICAgLyogZXhlY3V0ZSBhY3Rpb24gZnVuY3Rpb25zICovCiAgICAgaWYoYWN0aW9uIDwgQlRBX01DRV9OVU1fQUNUSU9OUykKICAgICB7CiAgICAgICAgICgqYnRhX21jZV9hY3Rpb25bYWN0aW9uXSkoKHRCVEFfTUNFX01TRyopcF9tc2cpOwotICAgICAgICByZXQgPSBUUlVFOworICAgICAgICByZXQgPSB0cnVlOwogICAgIH0KIAogICAgIHJldHVybihyZXQpOwpkaWZmIC0tZ2l0IGEvYnRhL3Bhbi9idGFfcGFuX2FjdC5jIGIvYnRhL3Bhbi9idGFfcGFuX2FjdC5jCmluZGV4IDE5OTU0NzguLmM0ZDkyZmUgMTAwNjQ0Ci0tLSBhL2J0YS9wYW4vYnRhX3Bhbl9hY3QuYworKysgYi9idGEvcGFuL2J0YV9wYW5fYWN0LmMKQEAgLTI0LDcgKzI0LDcgQEAKIAogI2luY2x1ZGUgImJ0X3RhcmdldC5oIgogCi0jaWYgZGVmaW5lZChQQU5fSU5DTFVERUQpICYmIChQQU5fSU5DTFVERUQgPT0gVFJVRSkKKyNpZiAoUEFOX0lOQ0xVREVEID09IFRSVUUpCiAKICNpbmNsdWRlICJidGFfYXBpLmgiCiAjaW5jbHVkZSAiYnRhX3N5cy5oIgpAQCAtODUsOCArODUsOCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9wYW5fY29ubl9zdGF0ZV9jYmFjayhVSU5UMTYgaGFuZGxlLCBCRF9BRERSIGJkX2FkZHIsIHRQQU5fUkVTVUxUIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xFQU4gaXNfcm9sZV9jaGFuZ2UsIFVJTlQ4IHNyY19yb2xlLCBVSU5UOCBkc3Rfcm9sZSkKK3N0YXRpYyB2b2lkIGJ0YV9wYW5fY29ubl9zdGF0ZV9jYmFjayh1aW50MTZfdCBoYW5kbGUsIEJEX0FERFIgYmRfYWRkciwgdFBBTl9SRVNVTFQgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yb2xlX2NoYW5nZSwgdWludDhfdCBzcmNfcm9sZSwgdWludDhfdCBkc3Rfcm9sZSkKIHsKICAgICB0QlRBX1BBTl9TQ0IgKnBfc2NiOwogICAgIHRCVEFfUEFOX0NPTk4gKnBfYnVmID0gKHRCVEFfUEFOX0NPTk4gKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX1BBTl9DT05OKSk7CkBAIC0xMDYsNyArMTA2LDcgQEAKICAgICAgICAgcF9zY2ItPmhhbmRsZSA9IGhhbmRsZTsKICAgICAgICAgcF9zY2ItPmxvY2FsX3JvbGUgPSBzcmNfcm9sZTsKICAgICAgICAgcF9zY2ItPnBlZXJfcm9sZSA9IGRzdF9yb2xlOwotICAgICAgICBwX3NjYi0+cGFuX2Zsb3dfZW5hYmxlID0gVFJVRTsKKyAgICAgICAgcF9zY2ItPnBhbl9mbG93X2VuYWJsZSA9IHRydWU7CiAgICAgICAgIGJkY3B5KHBfc2NiLT5iZF9hZGRyLCBiZF9hZGRyKTsKICAgICAgICAgcF9zY2ItPmRhdGFfcXVldWUgPSBmaXhlZF9xdWV1ZV9uZXcoU0laRV9NQVgpOwogCkBAIC0xMzksNyArMTM5LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfcGFuX2RhdGFfZmxvd19jYihVSU5UMTYgaGFuZGxlLCB0UEFOX1JFU1VMVCByZXN1bHQpCitzdGF0aWMgdm9pZCBidGFfcGFuX2RhdGFfZmxvd19jYih1aW50MTZfdCBoYW5kbGUsIHRQQU5fUkVTVUxUIHJlc3VsdCkKIHsKICAgICB0QlRBX1BBTl9TQ0IgKnBfc2NiOwogCkBAIC0xNTEsMTAgKzE1MSwxMCBAQAogICAgICAgICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSBoYW5kbGU7CiAgICAgICAgIHBfYnVmLT5ldmVudCA9IEJUQV9QQU5fQk5FUF9GTE9XX0VOQUJMRV9FVlQ7CiAgICAgICAgIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci0gICAgICAgIGJ0YV9wYW5fY29fcnhfZmxvdyhoYW5kbGUsIHBfc2NiLT5hcHBfaWQsIFRSVUUpOworICAgICAgICBidGFfcGFuX2NvX3J4X2Zsb3coaGFuZGxlLCBwX3NjYi0+YXBwX2lkLCB0cnVlKTsKICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PSBQQU5fVFhfRkxPV19PRkYpIHsKLSAgICAgICAgcF9zY2ItPnBhbl9mbG93X2VuYWJsZSA9IEZBTFNFOwotICAgICAgICBidGFfcGFuX2NvX3J4X2Zsb3coaGFuZGxlLCBwX3NjYi0+YXBwX2lkLCBGQUxTRSk7CisgICAgICAgIHBfc2NiLT5wYW5fZmxvd19lbmFibGUgPSBmYWxzZTsKKyAgICAgICAgYnRhX3Bhbl9jb19yeF9mbG93KGhhbmRsZSwgcF9zY2ItPmFwcF9pZCwgZmFsc2UpOwogICAgIH0KIH0KIApAQCAtMTY4LDggKzE2OCw4IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX3Bhbl9kYXRhX2J1Zl9pbmRfY2JhY2soVUlOVDE2IGhhbmRsZSwgQkRfQUREUiBzcmMsIEJEX0FERFIgZHN0LCBVSU5UMTYgcHJvdG9jb2wsIEJUX0hEUiAqcF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xFQU4gZXh0LCBCT09MRUFOIGZvcndhcmQpCitzdGF0aWMgdm9pZCBidGFfcGFuX2RhdGFfYnVmX2luZF9jYmFjayh1aW50MTZfdCBoYW5kbGUsIEJEX0FERFIgc3JjLCBCRF9BRERSIGRzdCwgdWludDE2X3QgcHJvdG9jb2wsIEJUX0hEUiAqcF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXh0LCBib29sIGZvcndhcmQpCiB7CiAgICAgdEJUQV9QQU5fU0NCICpwX3NjYjsKICAgICBCVF9IRFIgKnBfbmV3X2J1ZjsKQEAgLTE3Nyw4ICsxNzcsOCBAQAogICAgIGlmIChzaXplb2YodEJUQV9QQU5fREFUQV9QQVJBTVMpID4gcF9idWYtPm9mZnNldCkgewogICAgICAgICAvKiBvZmZzZXQgc21hbGxlciB0aGFuIGRhdGEgc3RydWN0dXJlIGluIGZyb250IG9mIGFjdHVhbCBkYXRhICovCiAgICAgICAgIHBfbmV3X2J1ZiA9IChCVF9IRFIgKilvc2lfbWFsbG9jKFBBTl9CVUZfU0laRSk7Ci0gICAgICAgIG1lbWNweSgoVUlOVDggKikocF9uZXdfYnVmICsgMSkgKyBzaXplb2YodEJUQV9QQU5fREFUQV9QQVJBTVMpLAotICAgICAgICAgICAgICAgKFVJTlQ4ICopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0LCBwX2J1Zi0+bGVuKTsKKyAgICAgICAgbWVtY3B5KCh1aW50OF90ICopKHBfbmV3X2J1ZiArIDEpICsgc2l6ZW9mKHRCVEFfUEFOX0RBVEFfUEFSQU1TKSwKKyAgICAgICAgICAgICAgICh1aW50OF90ICopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0LCBwX2J1Zi0+bGVuKTsKICAgICAgICAgcF9uZXdfYnVmLT5sZW4gICAgPSBwX2J1Zi0+bGVuOwogICAgICAgICBwX25ld19idWYtPm9mZnNldCA9IHNpemVvZih0QlRBX1BBTl9EQVRBX1BBUkFNUyk7CiAgICAgICAgIG9zaV9mcmVlKHBfYnVmKTsKQEAgLTIxNCw4ICsyMTQsOCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9wYW5fcGZpbHRfaW5kX2NiYWNrKFVJTlQxNiBoYW5kbGUsIEJPT0xFQU4gaW5kaWNhdGlvbix0Qk5FUF9SRVNVTFQgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IG51bV9maWx0ZXJzLCBVSU5UOCAqcF9maWx0ZXJzKQorc3RhdGljIHZvaWQgYnRhX3Bhbl9wZmlsdF9pbmRfY2JhY2sodWludDE2X3QgaGFuZGxlLCBib29sIGluZGljYXRpb24sdEJORVBfUkVTVUxUIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG51bV9maWx0ZXJzLCB1aW50OF90ICpwX2ZpbHRlcnMpCiB7CiAKICAgICBidGFfcGFuX2NvX3BmaWx0X2luZChoYW5kbGUsIGluZGljYXRpb24sICh0QlRBX1BBTl9TVEFUVVMpKChyZXN1bHQgPT0gQk5FUF9TVUNDRVNTKSA/IEJUQV9QQU5fU1VDQ0VTUyA6IEJUQV9QQU5fRkFJTCksCkBAIC0yMzUsOCArMjM1LDggQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfcGFuX21maWx0X2luZF9jYmFjayhVSU5UMTYgaGFuZGxlLCBCT09MRUFOIGluZGljYXRpb24sdEJORVBfUkVTVUxUIHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBudW1fbWZpbHRlcnMsIFVJTlQ4ICpwX21maWx0ZXJzKQorc3RhdGljIHZvaWQgYnRhX3Bhbl9tZmlsdF9pbmRfY2JhY2sodWludDE2X3QgaGFuZGxlLCBib29sIGluZGljYXRpb24sdEJORVBfUkVTVUxUIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG51bV9tZmlsdGVycywgdWludDhfdCAqcF9tZmlsdGVycykKIHsKIAogICAgIGJ0YV9wYW5fY29fbWZpbHRfaW5kKGhhbmRsZSwgaW5kaWNhdGlvbiwgKHRCVEFfUEFOX1NUQVRVUykoKHJlc3VsdCA9PSBCTkVQX1NVQ0NFU1MpID8gQlRBX1BBTl9TVUNDRVNTIDogQlRBX1BBTl9GQUlMKSwKQEAgLTI1Myw0MyArMjUzLDQzIEBACiAqKiAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBkZXZpY2VzCiAqKgogKioKLSoqIFJldHVybnMgICAgICAgICAgQk9PTEVBTgorKiogUmV0dXJucyAgICAgICAgICBib29sCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBCT09MRUFOIGJ0YV9wYW5faGFzX211bHRpcGxlX2Nvbm5lY3Rpb25zKFVJTlQ4IGFwcF9pZCkKK3N0YXRpYyBib29sIGJ0YV9wYW5faGFzX211bHRpcGxlX2Nvbm5lY3Rpb25zKHVpbnQ4X3QgYXBwX2lkKQogewogICAgIHRCVEFfUEFOX1NDQiAqcF9zY2IgPSBOVUxMOwotICAgIEJPT0xFQU4gICAgIGZvdW5kID0gRkFMU0U7CisgICAgYm9vbCAgICAgZm91bmQgPSBmYWxzZTsKICAgICBCRF9BRERSICAgICBiZF9hZGRyOwogCi0gICAgZm9yIChVSU5UOCBpbmRleCA9IDA7IGluZGV4IDwgQlRBX1BBTl9OVU1fQ09OTjsgaW5kZXgrKykKKyAgICBmb3IgKHVpbnQ4X3QgaW5kZXggPSAwOyBpbmRleCA8IEJUQV9QQU5fTlVNX0NPTk47IGluZGV4KyspCiAgICAgewogICAgICAgICBwX3NjYiA9ICZidGFfcGFuX2NiLnNjYltpbmRleF07Ci0gICAgICAgIGlmIChwX3NjYi0+aW5fdXNlID09IFRSVUUgJiYgYXBwX2lkID09IHBfc2NiLT5hcHBfaWQpCisgICAgICAgIGlmIChwX3NjYi0+aW5fdXNlID09IHRydWUgJiYgYXBwX2lkID09IHBfc2NiLT5hcHBfaWQpCiAgICAgICAgIHsKICAgICAgICAgICAgIC8qIHNhdmUgdGVtcCBiZF9hZGRyICovCiAgICAgICAgICAgICBiZGNweShiZF9hZGRyLCBwX3NjYi0+YmRfYWRkcik7Ci0gICAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qIElmIGNhbm5vdCBmaW5kIGEgbWF0Y2ggdGhlbiB0aGVyZSBpcyBubyBjb25uZWN0aW9uIGF0IGFsbCAqLwotICAgIGlmIChmb3VuZCA9PSBGQUxTRSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmIChmb3VuZCA9PSBmYWxzZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgLyogRmluZCB3aGV0aGVyIHRoZXJlIGlzIGFub3RoZXIgY29ubmVjdGlvbiB3aXRoIGRpZmZlcmVudCBkZXZpY2Ugb3RoZXIgdGhhbiBQQU5VLgogICAgICAgICBDb3VsZCBiZSBzYW1lIHNlcnZpY2Ugb3IgZGlmZmVyZW50IHNlcnZpY2UgKi8KLSAgICBmb3IgKFVJTlQ4IGluZGV4ID0gMDsgaW5kZXggPCBCVEFfUEFOX05VTV9DT05OOyBpbmRleCsrKQorICAgIGZvciAodWludDhfdCBpbmRleCA9IDA7IGluZGV4IDwgQlRBX1BBTl9OVU1fQ09OTjsgaW5kZXgrKykKICAgICB7CiAgICAgICAgIHBfc2NiID0gJmJ0YV9wYW5fY2Iuc2NiW2luZGV4XTsKLSAgICAgICAgaWYgKHBfc2NiLT5pbl91c2UgPT0gVFJVRSAmJiBwX3NjYi0+YXBwX2lkICE9IGJ0YV9wYW5fY2IuYXBwX2lkWzBdICYmCisgICAgICAgIGlmIChwX3NjYi0+aW5fdXNlID09IHRydWUgJiYgcF9zY2ItPmFwcF9pZCAhPSBidGFfcGFuX2NiLmFwcF9pZFswXSAmJgogICAgICAgICAgICAgICAgIGJkY21wKGJkX2FkZHIsIHBfc2NiLT5iZF9hZGRyKSkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzA2LDEyICszMDYsMTIgQEAKIHZvaWQgYnRhX3Bhbl9lbmFibGUodEJUQV9QQU5fREFUQSAqcF9kYXRhKQogewogICAgIHRQQU5fUkVHSVNURVIgcmVnX2RhdGE7Ci0gICAgVUlOVDE2ICBpbml0aWFsX2Rpc2NvdmVyYWJpbGl0eTsKLSAgICBVSU5UMTYgIGluaXRpYWxfY29ubmVjdGFiaWxpdHk7Ci0gICAgVUlOVDE2ICBkX3dpbmRvdzsKLSAgICBVSU5UMTYgIGRfaW50ZXJ2YWw7Ci0gICAgVUlOVDE2ICBjX3dpbmRvdzsKLSAgICBVSU5UMTYgIGNfaW50ZXJ2YWw7CisgICAgdWludDE2X3QgIGluaXRpYWxfZGlzY292ZXJhYmlsaXR5OworICAgIHVpbnQxNl90ICBpbml0aWFsX2Nvbm5lY3RhYmlsaXR5OworICAgIHVpbnQxNl90ICBkX3dpbmRvdzsKKyAgICB1aW50MTZfdCAgZF9pbnRlcnZhbDsKKyAgICB1aW50MTZfdCAgY193aW5kb3c7CisgICAgdWludDE2X3QgIGNfaW50ZXJ2YWw7CiAKICAgICBidGFfcGFuX2NiLnBfY2JhY2sgPSBwX2RhdGEtPmFwaV9lbmFibGUucF9jYmFjazsKIApAQCAtMzU1LDcgKzM1NSw3IEBACiB7CiAgICAgdFBBTl9SRVNVTFQgc3RhdHVzOwogICAgIHRCVEFfUEFOX1NFVF9ST0xFIHNldF9yb2xlOwotICAgIFVJTlQ4ICBzZWNbM107CisgICAgdWludDhfdCAgc2VjWzNdOwogCiAKICAgICBidGFfcGFuX2NiLmFwcF9pZFswXSA9IHBfZGF0YS0+YXBpX3NldF9yb2xlLnVzZXJfYXBwX2lkOwpAQCAtNDIyLDcgKzQyMiw3IEBACiAKICAgICBCVF9IRFIgKnBfYnVmOwogICAgIHRCVEFfUEFOX1NDQiAqcF9zY2IgPSAmYnRhX3Bhbl9jYi5zY2JbMF07Ci0gICAgVUlOVDggaTsKKyAgICB1aW50OF90IGk7CiAKIAogICAgIC8qIGNsb3NlIGFsbCBjb25uZWN0aW9ucyAqLwpAQCAtNTUwLDggKzU1MCw4IEBACiAgICAgaWYocF9kYXRhLT5jb25uLnJlc3VsdCA9PSBQQU5fU1VDQ0VTUykKICAgICB7CiAgICAgICAgIGRhdGEuc3RhdHVzID0gQlRBX1BBTl9TVUNDRVNTOwotICAgICAgICBwX3NjYi0+cGFuX2Zsb3dfZW5hYmxlID0gVFJVRTsKLSAgICAgICAgcF9zY2ItPmFwcF9mbG93X2VuYWJsZSA9IFRSVUU7CisgICAgICAgIHBfc2NiLT5wYW5fZmxvd19lbmFibGUgPSB0cnVlOworICAgICAgICBwX3NjYi0+YXBwX2Zsb3dfZW5hYmxlID0gdHJ1ZTsKICAgICAgICAgYnRhX3N5c19jb25uX29wZW4oQlRBX0lEX1BBTiAscF9zY2ItPmFwcF9pZCwgcF9zY2ItPmJkX2FkZHIpOwogICAgIH0KICAgICBlbHNlCkBAIC01NjAsOCArNTYwLDggQEAKICAgICAgICAgZGF0YS5zdGF0dXMgPSBCVEFfUEFOX0ZBSUw7CiAgICAgfQogCi0gICAgcF9zY2ItPnBhbl9mbG93X2VuYWJsZSA9IFRSVUU7Ci0gICAgcF9zY2ItPmFwcF9mbG93X2VuYWJsZSA9IFRSVUU7CisgICAgcF9zY2ItPnBhbl9mbG93X2VuYWJsZSA9IHRydWU7CisgICAgcF9zY2ItPmFwcF9mbG93X2VuYWJsZSA9IHRydWU7CiAKICAgICAvKiBJZiBhcHBfaWQgaXMgTkFQL0dOLCBjaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBtdWx0aXBsZSBjb25uZWN0aW9ucy4KICAgICAgICBJZiB0aGVyZSBhcmUsIHByb3ZpZGUgYSBzcGVjaWFsIGFwcF9pZCB0byBkbSB0byBlbmZvcmNlIG1hc3RlciByb2xlIG9ubHkuICovCkBAIC02MzAsNyArNjMwLDcgQEAKICAgICBpZiAoKGJ0YV9wYW5fY2IuZmxvd19tYXNrICYgQlRBX1BBTl9SWF9NQVNLKSA9PSBCVEFfUEFOX1JYX1BVTEwpCiAgICAgewogICAgICAgICAvKiBpZiB3ZSBjYW4gYWNjZXB0IGRhdGEgKi8KLSAgICAgICAgaWYgKHBfc2NiLT5wYW5fZmxvd19lbmFibGUgPT0gVFJVRSkKKyAgICAgICAgaWYgKHBfc2NiLT5wYW5fZmxvd19lbmFibGUgPT0gdHJ1ZSkKICAgICAgICAgewogICAgICAgICAgICAgLyogY2FsbCBhcHBsaWNhdGlvbiBjYWxsb3V0IGZ1bmN0aW9uIGZvciByeCBwYXRoICovCiAgICAgICAgICAgICBidGFfcGFuX2NvX3J4X3BhdGgocF9zY2ItPmhhbmRsZSwgcF9zY2ItPmFwcF9pZCk7CkBAIC02NzMsNyArNjczLDcgQEAKICAgICBlbHNlIGlmICgoYnRhX3Bhbl9jYi5mbG93X21hc2sgJiBCVEFfUEFOX1RYX01BU0spID09IEJUQV9QQU5fVFhfUFVTSF9CVUYpCiAgICAgewogICAgICAgICAvKiBpZiBhcHAgY2FuIGFjY2VwdCBkYXRhICovCi0gICAgICAgIGlmIChwX3NjYi0+YXBwX2Zsb3dfZW5hYmxlID09IFRSVUUpCisgICAgICAgIGlmIChwX3NjYi0+YXBwX2Zsb3dfZW5hYmxlID09IHRydWUpCiAgICAgICAgIHsKICAgICAgICAgICAgIEJUX0hEUiAqcF9idWY7CiAKZGlmZiAtLWdpdCBhL2J0YS9wYW4vYnRhX3Bhbl9hcGkuYyBiL2J0YS9wYW4vYnRhX3Bhbl9hcGkuYwppbmRleCA4OTY4YzE1Li4zY2Y1NmE0IDEwMDY0NAotLS0gYS9idGEvcGFuL2J0YV9wYW5fYXBpLmMKKysrIGIvYnRhL3Bhbi9idGFfcGFuX2FwaS5jCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAiYnRfdXRpbHMuaCIKIAotI2lmIGRlZmluZWQoQlRBX1BBTl9JTkNMVURFRCkgJiYgKEJUQV9QQU5fSU5DTFVERUQgPT0gVFJVRSkKKyNpZiAoQlRBX1BBTl9JTkNMVURFRCA9PSBUUlVFKQogCiBzdGF0aWMgY29uc3QgdEJUQV9TWVNfUkVHIGJ0YV9wYW5fcmVnID0KIHsKQEAgLTE3Miw3ICsxNzIsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX1BhbkNsb3NlKFVJTlQxNiBoYW5kbGUpCit2b2lkIEJUQV9QYW5DbG9zZSh1aW50MTZfdCBoYW5kbGUpCiB7CiAgICAgQlRfSERSICpwX2J1ZiA9IChCVF9IRFIgKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFIpKTsKIApAQCAtMjA4LDcgKzIwOCw3IEBACiAgICAgVU5VU0VEKHBlZXJfcm9sZSk7CiB9CiAKLXZvaWQgQlRBX1BhbkNsb3NlKFVJTlQxNiBoYW5kbGUpCit2b2lkIEJUQV9QYW5DbG9zZSh1aW50MTZfdCBoYW5kbGUpCiB7CiAgICAgVU5VU0VEKGhhbmRsZSk7CiB9CmRpZmYgLS1naXQgYS9idGEvcGFuL2J0YV9wYW5fY2kuYyBiL2J0YS9wYW4vYnRhX3Bhbl9jaS5jCmluZGV4IGVjNzdlNjAuLmJkM2YzNDggMTAwNjQ0Ci0tLSBhL2J0YS9wYW4vYnRhX3Bhbl9jaS5jCisrKyBiL2J0YS9wYW4vYnRhX3Bhbl9jaS5jCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSAiYnRhX3Bhbl9pbnQuaCIKICNpbmNsdWRlICJidF91dGlscy5oIgogCi0jaWYgZGVmaW5lZChCVEFfUEFOX0lOQ0xVREVEKSAmJiAoQlRBX1BBTl9JTkNMVURFRCA9PSBUUlVFKQorI2lmIChCVEFfUEFOX0lOQ0xVREVEID09IFRSVUUpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtNDksNyArNDksNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3Bhbl9jaV90eF9yZWFkeShVSU5UMTYgaGFuZGxlKQordm9pZCBidGFfcGFuX2NpX3R4X3JlYWR5KHVpbnQxNl90IGhhbmRsZSkKIHsKICAgICBCVF9IRFIgKnBfYnVmID0gKEJUX0hEUiAqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUikpOwogCkBAIC03Miw3ICs3Miw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfcGFuX2NpX3J4X3JlYWR5KFVJTlQxNiBoYW5kbGUpCit2b2lkIGJ0YV9wYW5fY2lfcnhfcmVhZHkodWludDE2X3QgaGFuZGxlKQogewogICAgIEJUX0hEUiAqcF9idWYgPSAoQlRfSERSICopb3NpX21hbGxvYyhzaXplb2YoQlRfSERSKSk7CiAKQEAgLTk3LDcgKzk3LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9wYW5fY2lfdHhfZmxvdyhVSU5UMTYgaGFuZGxlLCBCT09MRUFOIGVuYWJsZSkKK3ZvaWQgYnRhX3Bhbl9jaV90eF9mbG93KHVpbnQxNl90IGhhbmRsZSwgYm9vbCBlbmFibGUpCiB7CiAgICAgdEJUQV9QQU5fQ0lfVFhfRkxPVyAgKnBfYnVmID0KICAgICAgICAgKHRCVEFfUEFOX0NJX1RYX0ZMT1cgKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX1BBTl9DSV9UWF9GTE9XKSk7CkBAIC0xMjEsOCArMTIxLDggQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9wYW5fY2lfcnhfd3JpdGUoVUlOVDE2IGhhbmRsZSwgQkRfQUREUiBkc3QsIEJEX0FERFIgc3JjLCBVSU5UMTYgcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfZGF0YSwgVUlOVDE2IGxlbiwgQk9PTEVBTiBleHQpCit2b2lkIGJ0YV9wYW5fY2lfcnhfd3JpdGUodWludDE2X3QgaGFuZGxlLCBCRF9BRERSIGRzdCwgQkRfQUREUiBzcmMsIHVpbnQxNl90IHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfZGF0YSwgdWludDE2X3QgbGVuLCBib29sIGV4dCkKIHsKICAgICBCVF9IRFIgKnBfYnVmID0gKEJUX0hEUiAqKW9zaV9tYWxsb2MoUEFOX0JVRl9TSVpFKTsKIApAQCAtMTM2LDcgKzEzNiw3IEBACiAgICAgcF9idWYtPmxlbj1sZW47CiAKICAgICAvKiBjb3B5IGRhdGEgKi8KLSAgICBtZW1jcHkoKFVJTlQ4ICopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0LCBwX2RhdGEsIGxlbik7CisgICAgbWVtY3B5KCh1aW50OF90ICopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0LCBwX2RhdGEsIGxlbik7CiAKICAgICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSBoYW5kbGU7CiAgICAgcF9idWYtPmV2ZW50ID0gQlRBX1BBTl9DSV9SWF9XUklURUJVRl9FVlQ7CkBAIC0xNTgsOCArMTU4LDggQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9wYW5fY2lfcnhfd3JpdGVidWYoVUlOVDE2IGhhbmRsZSwgQkRfQUREUiBkc3QsIEJEX0FERFIgc3JjLCBVSU5UMTYgcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSICpwX2J1ZiwgQk9PTEVBTiBleHQpCit2b2lkIGJ0YV9wYW5fY2lfcnhfd3JpdGVidWYodWludDE2X3QgaGFuZGxlLCBCRF9BRERSIGRzdCwgQkRfQUREUiBzcmMsIHVpbnQxNl90IHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiAqcF9idWYsIGJvb2wgZXh0KQogewogCiAgICAgLyogY29weSBhbGwgb3RoZXIgcGFyYW1zIGJlZm9yZSB0aGUgZGF0YSAqLwpAQCAtMTg2LDggKzE4Niw4IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQlRfSERSICogYnRhX3Bhbl9jaV9yZWFkYnVmKFVJTlQxNiBoYW5kbGUsIEJEX0FERFIgc3JjLCBCRF9BRERSIGRzdCwgVUlOVDE2KiBwX3Byb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTEVBTiogcF9leHQsIEJPT0xFQU4qIHBfZm9yd2FyZCkKK0JUX0hEUiAqIGJ0YV9wYW5fY2lfcmVhZGJ1Zih1aW50MTZfdCBoYW5kbGUsIEJEX0FERFIgc3JjLCBCRF9BRERSIGRzdCwgdWludDE2X3QqIHBfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBwX2V4dCwgYm9vbCogcF9mb3J3YXJkKQogewogICAgIHRCVEFfUEFOX1NDQiAqIHBfc2NiOwogICAgIEJUX0hEUiAqIHBfYnVmOwpAQCAtMjE4LDggKzIxOCw4IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfcGFuX2NpX3NldF9tZmlsdGVycyhVSU5UMTYgaGFuZGxlLCBVSU5UMTYgbnVtX21jYXN0X2ZpbHRlcnMsIFVJTlQ4ICpwX3N0YXJ0X2FycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4ICpwX2VuZF9hcnJheSkKK3ZvaWQgYnRhX3Bhbl9jaV9zZXRfbWZpbHRlcnModWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBudW1fbWNhc3RfZmlsdGVycywgdWludDhfdCAqcF9zdGFydF9hcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwX2VuZF9hcnJheSkKIHsKIAogICAgIFBBTl9TZXRNdWx0aWNhc3RGaWx0ZXJzKGhhbmRsZSwgbnVtX21jYXN0X2ZpbHRlcnMsIHBfc3RhcnRfYXJyYXksIHBfZW5kX2FycmF5KTsKQEAgLTIzNyw3ICsyMzcsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3Bhbl9jaV9zZXRfcGZpbHRlcnMoVUlOVDE2IGhhbmRsZSwgVUlOVDE2IG51bV9maWx0ZXJzLCBVSU5UMTYgKnBfc3RhcnRfYXJyYXksIFVJTlQxNiAqcF9lbmRfYXJyYXkpCit2b2lkIGJ0YV9wYW5fY2lfc2V0X3BmaWx0ZXJzKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbnVtX2ZpbHRlcnMsIHVpbnQxNl90ICpwX3N0YXJ0X2FycmF5LCB1aW50MTZfdCAqcF9lbmRfYXJyYXkpCiB7CiAKICAgICBQQU5fU2V0UHJvdG9jb2xGaWx0ZXJzKGhhbmRsZSwgbnVtX2ZpbHRlcnMsIHBfc3RhcnRfYXJyYXksIHBfZW5kX2FycmF5ICk7CkBAIC0yNDUsMjMgKzI0NSwyMyBAQAogfQogI2Vsc2UKIAotdm9pZCBidGFfcGFuX2NpX3R4X3JlYWR5KFVJTlQxNiBoYW5kbGUpCit2b2lkIGJ0YV9wYW5fY2lfdHhfcmVhZHkodWludDE2X3QgaGFuZGxlKQogewogICAgIFVOVVNFRChoYW5kbGUpOwogfQogCi12b2lkIGJ0YV9wYW5fY2lfcnhfcmVhZHkoVUlOVDE2IGhhbmRsZSkKK3ZvaWQgYnRhX3Bhbl9jaV9yeF9yZWFkeSh1aW50MTZfdCBoYW5kbGUpCiB7CiAgICAgVU5VU0VEKGhhbmRsZSk7CiB9CiAKLXZvaWQgYnRhX3Bhbl9jaV90eF9mbG93KFVJTlQxNiBoYW5kbGUsIEJPT0xFQU4gZW5hYmxlKQordm9pZCBidGFfcGFuX2NpX3R4X2Zsb3codWludDE2X3QgaGFuZGxlLCBib29sIGVuYWJsZSkKIHsKICAgICBVTlVTRUQoaGFuZGxlKTsKICAgICBVTlVTRUQoZW5hYmxlKTsKIH0KIAotdm9pZCBidGFfcGFuX2NpX3J4X3dyaXRlYnVmKFVJTlQxNiBoYW5kbGUsIEJEX0FERFIgc3JjLCBCRF9BRERSIGRzdCwgVUlOVDE2IHByb3RvY29sLCBCVF9IRFIgKnBfYnVmLCBCT09MRUFOIGV4dCkKK3ZvaWQgYnRhX3Bhbl9jaV9yeF93cml0ZWJ1Zih1aW50MTZfdCBoYW5kbGUsIEJEX0FERFIgc3JjLCBCRF9BRERSIGRzdCwgdWludDE2X3QgcHJvdG9jb2wsIEJUX0hEUiAqcF9idWYsIGJvb2wgZXh0KQogewogICAgIFVOVVNFRChoYW5kbGUpOwogICAgIFVOVVNFRChzcmMpOwpAQCAtMjcxLDggKzI3MSw4IEBACiAgICAgVU5VU0VEKGV4dCk7CiB9CiAKLUJUX0hEUiAqIGJ0YV9wYW5fY2lfcmVhZGJ1ZihVSU5UMTYgaGFuZGxlLCBCRF9BRERSIHNyYywgQkRfQUREUiBkc3QsIFVJTlQxNiAqcF9wcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MRUFOKiBwX2V4dCwgQk9PTEVBTiogcF9mb3J3YXJkKQorQlRfSERSICogYnRhX3Bhbl9jaV9yZWFkYnVmKHVpbnQxNl90IGhhbmRsZSwgQkRfQUREUiBzcmMsIEJEX0FERFIgZHN0LCB1aW50MTZfdCAqcF9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBwX2V4dCwgYm9vbCogcF9mb3J3YXJkKQogewogICAgIFVOVVNFRChoYW5kbGUpOwogICAgIFVOVVNFRChzcmMpOwpAQCAtMjgzLDcgKzI4Myw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgYnRhX3Bhbl9jaV9zZXRfcGZpbHRlcnMoVUlOVDE2IGhhbmRsZSwgVUlOVDE2IG51bV9maWx0ZXJzLCBVSU5UMTYgKnBfc3RhcnRfYXJyYXksIFVJTlQxNiAqcF9lbmRfYXJyYXkpCit2b2lkIGJ0YV9wYW5fY2lfc2V0X3BmaWx0ZXJzKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbnVtX2ZpbHRlcnMsIHVpbnQxNl90ICpwX3N0YXJ0X2FycmF5LCB1aW50MTZfdCAqcF9lbmRfYXJyYXkpCiB7CiAgICAgVU5VU0VEKGhhbmRsZSk7CiAgICAgVU5VU0VEKG51bV9maWx0ZXJzKTsKQEAgLTI5MSw4ICsyOTEsOCBAQAogICAgIFVOVVNFRChwX2VuZF9hcnJheSk7CiB9CiAKLXZvaWQgYnRhX3Bhbl9jaV9zZXRfbWZpbHRlcnMoVUlOVDE2IGhhbmRsZSwgVUlOVDE2IG51bV9tY2FzdF9maWx0ZXJzLCBVSU5UOCAqcF9zdGFydF9hcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDggKnBfZW5kX2FycmF5KQordm9pZCBidGFfcGFuX2NpX3NldF9tZmlsdGVycyh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IG51bV9tY2FzdF9maWx0ZXJzLCB1aW50OF90ICpwX3N0YXJ0X2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwX2VuZF9hcnJheSkKIHsKICAgICBVTlVTRUQoaGFuZGxlKTsKICAgICBVTlVTRUQobnVtX21jYXN0X2ZpbHRlcnMpOwpkaWZmIC0tZ2l0IGEvYnRhL3Bhbi9idGFfcGFuX2ludC5oIGIvYnRhL3Bhbi9idGFfcGFuX2ludC5oCmluZGV4IGNkMzZlZjIuLmNjNjE5YmMgMTAwNjQ0Ci0tLSBhL2J0YS9wYW4vYnRhX3Bhbl9pbnQuaAorKysgYi9idGEvcGFuL2J0YV9wYW5faW50LmgKQEAgLTg3LDkgKzg3LDkgQEAKICAgICBjaGFyICAgICAgICAgICAgICAgIGduX25hbWVbQlRBX1NFUlZJQ0VfTkFNRV9MRU4rMV07ICAgICAvKiBTZXJ2aWNlIG5hbWUgKi8KICAgICBjaGFyICAgICAgICAgICAgICAgIG5hcF9uYW1lW0JUQV9TRVJWSUNFX05BTUVfTEVOKzFdOyAgICAvKiBTZXJ2aWNlIG5hbWUgKi8KICAgICB0QlRBX1BBTl9ST0xFICAgICAgIHJvbGU7Ci0gICAgVUlOVDggICAgICAgICAgICAgICB1c2VyX2FwcF9pZDsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIGduX2FwcF9pZDsKLSAgICBVSU5UOCAgICAgICAgICAgICAgIG5hcF9hcHBfaWQ7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIHVzZXJfYXBwX2lkOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBnbl9hcHBfaWQ7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIG5hcF9hcHBfaWQ7CiAgICAgdEJUQV9TRUMgICAgICAgICAgICB1c2VyX3NlY19tYXNrOyAgICAgICAgICAgICAgICAgICAvKiBTZWN1cml0eSBtYXNrICovCiAgICAgdEJUQV9TRUMgICAgICAgICAgICBnbl9zZWNfbWFzazsgICAgICAgICAgICAgICAgICAgICAvKiBTZWN1cml0eSBtYXNrICovCiAgICAgdEJUQV9TRUMgICAgICAgICAgICBuYXBfc2VjX21hc2s7ICAgICAgICAgICAgICAgICAgICAvKiBTZWN1cml0eSBtYXNrICovCkBAIC0xMTAsNyArMTEwLDcgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgQlRfSERSICAgICAgICAgIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qIEV2ZW50IGhlYWRlciAqLwotICAgIEJPT0xFQU4gICAgICAgICBlbmFibGU7ICAgICAgICAgICAgICAgICAvKiBGbG93IGNvbnRyb2wgc2V0dGluZyAqLworICAgIGJvb2wgICAgICAgICBlbmFibGU7ICAgICAgICAgICAgICAgICAvKiBGbG93IGNvbnRyb2wgc2V0dGluZyAqLwogfSB0QlRBX1BBTl9DSV9UWF9GTE9XOwogCiAvKiBkYXRhIHR5cGUgZm9yIEJUQV9QQU5fQ09OTl9PUEVOX0VWVCAqLwpAQCAtMTQwLDE1ICsxNDAsMTUgQEAKIHsKICAgICBCRF9BRERSICAgICAgICAgICAgICAgICBiZF9hZGRyOyAgICAgICAgLyogcGVlciBiZGFkZHIgKi8KICAgICBmaXhlZF9xdWV1ZV90ICAgICAgICAgICAqZGF0YV9xdWV1ZTsgICAgLyogUXVldWUgb2YgYnVmZmVycyB3YWl0aW5nIHRvIGJlIHBhc3NlZCB0byBhcHBsaWNhdGlvbiAqLwotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIGhhbmRsZTsgICAgICAgICAvKiBCVEEgUEFOL0JORVAgaGFuZGxlICovCi0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgaW5fdXNlOyAgICAgICAgIC8qIHNjYiBpbiB1c2UgKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIGhhbmRsZTsgICAgICAgICAvKiBCVEEgUEFOL0JORVAgaGFuZGxlICovCisgICAgYm9vbCAgICAgICAgICAgICAgICAgaW5fdXNlOyAgICAgICAgIC8qIHNjYiBpbiB1c2UgKi8KICAgICB0QlRBX1NFQyAgICAgICAgICAgICAgICBzZWNfbWFzazsgICAgICAgLyogU2VjdXJpdHkgbWFzayAqLwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgIHBhbl9mbG93X2VuYWJsZTsvKiBCTkVQIGZsb3cgY29udHJvbCBzdGF0ZSAqLwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgIGFwcF9mbG93X2VuYWJsZTsvKiBBcHBsaWNhdGlvbiBmbG93IGNvbnRyb2wgc3RhdGUgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBzdGF0ZTsgICAgICAgICAgLyogU3RhdGUgbWFjaGluZSBzdGF0ZSAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgIHBhbl9mbG93X2VuYWJsZTsvKiBCTkVQIGZsb3cgY29udHJvbCBzdGF0ZSAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgIGFwcF9mbG93X2VuYWJsZTsvKiBBcHBsaWNhdGlvbiBmbG93IGNvbnRyb2wgc3RhdGUgKi8KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIHN0YXRlOyAgICAgICAgICAvKiBTdGF0ZSBtYWNoaW5lIHN0YXRlICovCiAgICAgdEJUQV9QQU5fUk9MRSAgICAgICAgICAgIGxvY2FsX3JvbGU7ICAgICAvKiBsb2NhbCByb2xlICovCiAgICAgdEJUQV9QQU5fUk9MRSAgICAgICAgICAgIHBlZXJfcm9sZTsgICAgICAvKiBwZWVyIHJvbGUgKi8KLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgYXBwX2lkOyAgICAgICAgIC8qIGFwcGxpY2F0aW9uIGlkIGZvciB0aGUgY29ubmVjdGlvbiAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgIGFwcF9pZDsgICAgICAgICAvKiBhcHBsaWNhdGlvbiBpZCBmb3IgdGhlIGNvbm5lY3Rpb24gKi8KIAogfSB0QlRBX1BBTl9TQ0I7CiAKQEAgLTE1OSw5ICsxNTksOSBAQAogewogICAgIHRCVEFfUEFOX1NDQiAgICBzY2JbQlRBX1BBTl9OVU1fQ09OTl07ICAgICAgICAgIC8qIHN0YXRlIG1hY2hpbmUgY29udHJvbCBibG9ja3MgKi8KICAgICB0QlRBX1BBTl9DQkFDSyAqcF9jYmFjazsgICAgICAgICAgICAgICAgICAgICAgICAvKiBQQU4gY2FsbGJhY2sgZnVuY3Rpb24gKi8KLSAgICBVSU5UOCAgICAgICAgICAgIGFwcF9pZFszXTsgICAgICAgICAgICAgICAgICAgICAgLyogYXBwbGljYXRpb24gaWQgZm9yIFBBTiByb2xlcyAqLwotICAgIFVJTlQ4ICAgICAgICAgICBmbG93X21hc2s7ICAgICAgICAgICAgICAgICAgICAgIC8qIERhdGEgZmxvdyBtYXNrICovCi0gICAgVUlOVDggICAgICAgICAgIHFfbGV2ZWw7ICAgICAgICAgICAgICAgICAgICAgICAgLyogcXVldWUgbGV2ZWwgc2V0IGJ5IGFwcGxpY2F0aW9uIGZvciBUWCBkYXRhICovCisgICAgdWludDhfdCAgICAgICAgICAgIGFwcF9pZFszXTsgICAgICAgICAgICAgICAgICAgICAgLyogYXBwbGljYXRpb24gaWQgZm9yIFBBTiByb2xlcyAqLworICAgIHVpbnQ4X3QgICAgICAgICAgIGZsb3dfbWFzazsgICAgICAgICAgICAgICAgICAgICAgLyogRGF0YSBmbG93IG1hc2sgKi8KKyAgICB1aW50OF90ICAgICAgICAgICBxX2xldmVsOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHF1ZXVlIGxldmVsIHNldCBieSBhcHBsaWNhdGlvbiBmb3IgVFggZGF0YSAqLwogCiB9IHRCVEFfUEFOX0NCOwogCkBAIC0xNzIsOSArMTcyLDkgQEAKICAgICBCVF9IRFIgIGhkcjsKICAgICBCRF9BRERSIHNyYzsKICAgICBCRF9BRERSIGRzdDsKLSAgICBVSU5UMTYgIHByb3RvY29sOwotICAgIEJPT0xFQU4gZXh0OwotICAgIEJPT0xFQU4gZm9yd2FyZDsKKyAgICB1aW50MTZfdCAgcHJvdG9jb2w7CisgICAgYm9vbCBleHQ7CisgICAgYm9vbCBmb3J3YXJkOwogCiB9IHRCVEFfUEFOX0RBVEFfUEFSQU1TOwogCkBAIC0xODUsNyArMTg1LDcgQEAKIAogLyogUEFOIGNvbnRyb2wgYmxvY2sgKi8KIAotI2lmIEJUQV9EWU5BTUlDX01FTU9SWSA9PSBGQUxTRQorI2lmIChCVEFfRFlOQU1JQ19NRU1PUlkgPT0gRkFMU0UpCiBleHRlcm4gdEJUQV9QQU5fQ0IgIGJ0YV9wYW5fY2I7CiAjZWxzZQogZXh0ZXJuIHRCVEFfUEFOX0NCICpidGFfcGFuX2NiX3B0cjsKQEAgLTE5Nyw5ICsxOTcsOSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBleHRlcm4gdEJUQV9QQU5fU0NCICpidGFfcGFuX3NjYl9hbGxvYyh2b2lkKTsKIGV4dGVybiB2b2lkIGJ0YV9wYW5fc2NiX2RlYWxsb2ModEJUQV9QQU5fU0NCICpwX3NjYik7Ci1leHRlcm4gVUlOVDggYnRhX3Bhbl9zY2JfdG9faWR4KHRCVEFfUEFOX1NDQiAqcF9zY2IpOwotZXh0ZXJuIHRCVEFfUEFOX1NDQiAqYnRhX3Bhbl9zY2JfYnlfaGFuZGxlKFVJTlQxNiBoYW5kbGUpOwotZXh0ZXJuIEJPT0xFQU4gYnRhX3Bhbl9oZGxfZXZlbnQoQlRfSERSICpwX21zZyk7CitleHRlcm4gdWludDhfdCBidGFfcGFuX3NjYl90b19pZHgodEJUQV9QQU5fU0NCICpwX3NjYik7CitleHRlcm4gdEJUQV9QQU5fU0NCICpidGFfcGFuX3NjYl9ieV9oYW5kbGUodWludDE2X3QgaGFuZGxlKTsKK2V4dGVybiBib29sIGJ0YV9wYW5faGRsX2V2ZW50KEJUX0hEUiAqcF9tc2cpOwogCiAvKiBhY3Rpb24gZnVuY3Rpb25zICovCiBleHRlcm4gdm9pZCBidGFfcGFuX2VuYWJsZSh0QlRBX1BBTl9EQVRBICpwX2RhdGEpOwpkaWZmIC0tZ2l0IGEvYnRhL3Bhbi9idGFfcGFuX21haW4uYyBiL2J0YS9wYW4vYnRhX3Bhbl9tYWluLmMKaW5kZXggYTc2NmYyZS4uMmQzNWM0MiAxMDA2NDQKLS0tIGEvYnRhL3Bhbi9idGFfcGFuX21haW4uYworKysgYi9idGEvcGFuL2J0YV9wYW5fbWFpbi5jCkBAIC0yNCw3ICsyNCw3IEBACiAKICNpbmNsdWRlICJidF90YXJnZXQuaCIKIAotI2lmIGRlZmluZWQoQlRBX1BBTl9JTkNMVURFRCkgJiYgKEJUQV9QQU5fSU5DTFVERUQgPT0gVFJVRSkKKyNpZiAoQlRBX1BBTl9JTkNMVURFRCA9PSBUUlVFKQogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAiYnRhX2FwaS5oIgpAQCAtODUsNyArODUsNyBAQAogCiAKIC8qIHN0YXRlIHRhYmxlIGZvciBsaXN0ZW4gc3RhdGUgKi8KLWNvbnN0IFVJTlQ4IGJ0YV9wYW5fc3RfaWRsZVtdW0JUQV9QQU5fTlVNX0NPTFNdID0KK2NvbnN0IHVpbnQ4X3QgYnRhX3Bhbl9zdF9pZGxlW11bQlRBX1BBTl9OVU1fQ09MU10gPQogewogICAgLyogQVBJX0NMT1NFICovICAgICAgICAgIHtCVEFfUEFOX0FQSV9DTE9TRSwgICAgICAgICAgICAgIEJUQV9QQU5fSURMRV9TVH0sCiAgICAvKiBDSV9UWF9SRUFEWSAqLyAgICAgICAge0JUQV9QQU5fSUdOT1JFLCAgICAgICAgICAgICAgICAgQlRBX1BBTl9JRExFX1NUfSwKQEAgLTEwMyw3ICsxMDMsNyBAQAogCiAKIC8qIHN0YXRlIHRhYmxlIGZvciBvcGVuIHN0YXRlICovCi1jb25zdCBVSU5UOCBidGFfcGFuX3N0X29wZW5bXVtCVEFfUEFOX05VTV9DT0xTXSA9Citjb25zdCB1aW50OF90IGJ0YV9wYW5fc3Rfb3BlbltdW0JUQV9QQU5fTlVNX0NPTFNdID0KIHsKICAgIC8qIEFQSV9DTE9TRSAqLyAgICAgICAgICB7QlRBX1BBTl9BUElfQ0xPU0UsICAgICAgICAgICAgICAgQlRBX1BBTl9PUEVOX1NUfSwKICAgIC8qIENJX1RYX1JFQURZICovICAgICAgICB7QlRBX1BBTl9UWF9QQVRILCAgICAgICAgICAgICAgICAgQlRBX1BBTl9PUEVOX1NUfSwKQEAgLTExOCw3ICsxMTgsNyBAQAogfTsKIAogLyogc3RhdGUgdGFibGUgZm9yIGNsb3Npbmcgc3RhdGUgKi8KLWNvbnN0IFVJTlQ4IGJ0YV9wYW5fc3RfY2xvc2luZ1tdW0JUQV9QQU5fTlVNX0NPTFNdID0KK2NvbnN0IHVpbnQ4X3QgYnRhX3Bhbl9zdF9jbG9zaW5nW11bQlRBX1BBTl9OVU1fQ09MU10gPQogewogICAgLyogQVBJX0NMT1NFICovICAgICAgICAgIHtCVEFfUEFOX0lHTk9SRSwgICAgICAgICAgICAgICAgICAgQlRBX1BBTl9DTE9TSU5HX1NUfSwKICAgIC8qIENJX1RYX1JFQURZICovICAgICAgICB7QlRBX1BBTl9UWF9QQVRILCAgICAgICAgICAgICAgICAgIEJUQV9QQU5fQ0xPU0lOR19TVH0sCkBAIC0xMzMsNyArMTMzLDcgQEAKIH07CiAKIC8qIHR5cGUgZm9yIHN0YXRlIHRhYmxlICovCi10eXBlZGVmIGNvbnN0IFVJTlQ4ICgqdEJUQV9QQU5fU1RfVEJMKVtCVEFfUEFOX05VTV9DT0xTXTsKK3R5cGVkZWYgY29uc3QgdWludDhfdCAoKnRCVEFfUEFOX1NUX1RCTClbQlRBX1BBTl9OVU1fQ09MU107CiAKIC8qIHN0YXRlIHRhYmxlICovCiBjb25zdCB0QlRBX1BBTl9TVF9UQkwgYnRhX3Bhbl9zdF90YmxbXSA9IHsKQEAgLTE0Nyw3ICsxNDcsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIFBBTiBjb250cm9sIGJsb2NrICovCi0jaWYgQlRBX0RZTkFNSUNfTUVNT1JZID09IEZBTFNFCisjaWYgKEJUQV9EWU5BTUlDX01FTU9SWSA9PSBGQUxTRSkKIHRCVEFfUEFOX0NCICBidGFfcGFuX2NiOwogI2VuZGlmCiAKQEAgLTE3MCw3ICsxNzAsNyBAQAogICAgIHsKICAgICAgICAgaWYgKCFwX3NjYi0+aW5fdXNlKQogICAgICAgICB7Ci0gICAgICAgICAgICBwX3NjYi0+aW5fdXNlID0gVFJVRTsKKyAgICAgICAgICAgIHBfc2NiLT5pbl91c2UgPSB0cnVlOwogICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX3Bhbl9zY2JfYWxsb2MgJWQiLCBpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xOTUsMTAgKzE5NSwxMCBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9wYW5fc21fZXhlY3V0ZSh0QlRBX1BBTl9TQ0IgKnBfc2NiLCBVSU5UMTYgZXZlbnQsIHRCVEFfUEFOX0RBVEEgKnBfZGF0YSkKK3N0YXRpYyB2b2lkIGJ0YV9wYW5fc21fZXhlY3V0ZSh0QlRBX1BBTl9TQ0IgKnBfc2NiLCB1aW50MTZfdCBldmVudCwgdEJUQV9QQU5fREFUQSAqcF9kYXRhKQogewogICAgIHRCVEFfUEFOX1NUX1RCTCAgICAgIHN0YXRlX3RhYmxlOwotICAgIFVJTlQ4ICAgICAgICAgICAgICAgYWN0aW9uOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBhY3Rpb247CiAgICAgaW50ICAgICAgICAgICAgICAgICBpOwogCiAgICAgQVBQTF9UUkFDRV9FVkVOVCgiUEFOIHNjYj0lZCBldmVudD0weCV4IHN0YXRlPSVkIiwgYnRhX3Bhbl9zY2JfdG9faWR4KHBfc2NiKSwgZXZlbnQsIHBfc2NiLT5zdGF0ZSk7CkBAIC0zMTgsMTAgKzMxOCwxMCBAQAogKiogUmV0dXJucyAgICAgICAgICBJbmRleCBvZiBzY2IuCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVVJTlQ4IGJ0YV9wYW5fc2NiX3RvX2lkeCh0QlRBX1BBTl9TQ0IgKnBfc2NiKQordWludDhfdCBidGFfcGFuX3NjYl90b19pZHgodEJUQV9QQU5fU0NCICpwX3NjYikKIHsKIAotICAgIHJldHVybiAoKFVJTlQ4KSAocF9zY2IgLSBidGFfcGFuX2NiLnNjYikpICsgMTsKKyAgICByZXR1cm4gKCh1aW50OF90KSAocF9zY2IgLSBidGFfcGFuX2NiLnNjYikpICsgMTsKIH0KIAogCkBAIC0zMzYsMTAgKzMzNiwxMCBAQAogKiogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHNjYiBvciBOVUxMIGlmIG5vdCBmb3VuZC4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9QQU5fU0NCICpidGFfcGFuX3NjYl9ieV9oYW5kbGUoVUlOVDE2IGhhbmRsZSkKK3RCVEFfUEFOX1NDQiAqYnRhX3Bhbl9zY2JfYnlfaGFuZGxlKHVpbnQxNl90IGhhbmRsZSkKIHsKICAgICB0QlRBX1BBTl9TQ0IgICAgICpwX3NjYiA9ICZidGFfcGFuX2NiLnNjYlswXTsKLSAgICBVSU5UOCBpOworICAgIHVpbnQ4X3QgaTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBCVEFfUEFOX05VTV9DT05OOyBpKyssIHBfc2NiKyspCiAgICAgewpAQCAtMzY1LDEwICszNjUsMTAgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9wYW5faGRsX2V2ZW50KEJUX0hEUiAqcF9tc2cpCitib29sIGJ0YV9wYW5faGRsX2V2ZW50KEJUX0hEUiAqcF9tc2cpCiB7CiAgICAgdEJUQV9QQU5fU0NCICpwX3NjYjsKLSAgICBCT09MRUFOICAgICBmcmVlYnVmID0gVFJVRTsKKyAgICBib29sICAgICBmcmVlYnVmID0gdHJ1ZTsKIAogICAgIHN3aXRjaCAocF9tc2ctPmV2ZW50KQogICAgIHsKQEAgLTM5NSw3ICszOTUsNyBAQAogCiAgICAgICAgIC8qIGV2ZW50cyB0aGF0IHJlcXVpcmUgYnVmZmVyIG5vdCBiZSByZWxlYXNlZCAqLwogICAgICAgICBjYXNlIEJUQV9QQU5fQ0lfUlhfV1JJVEVCVUZfRVZUOgotICAgICAgICAgICAgZnJlZWJ1ZiA9IEZBTFNFOworICAgICAgICAgICAgZnJlZWJ1ZiA9IGZhbHNlOwogICAgICAgICAgICAgaWYgKChwX3NjYiA9IGJ0YV9wYW5fc2NiX2J5X2hhbmRsZShwX21zZy0+bGF5ZXJfc3BlY2lmaWMpKSAhPSBOVUxMKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGJ0YV9wYW5fc21fZXhlY3V0ZShwX3NjYiwgcF9tc2ctPmV2ZW50LCAodEJUQV9QQU5fREFUQSAqKSBwX21zZyk7CmRpZmYgLS1naXQgYS9idGEvcGIvYnRhX3Bic19pbnQuaCBiL2J0YS9wYi9idGFfcGJzX2ludC5oCmluZGV4IGZiNzg4NDIuLjM0ODg5ODYgMTAwNjQ0Ci0tLSBhL2J0YS9wYi9idGFfcGJzX2ludC5oCisrKyBiL2J0YS9wYi9idGFfcGJzX2ludC5oCkBAIC00OSwxMCArNDksMTAgQEAKIC8qIENvbmZpZ3VyYXRpb24gc3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQ4ICAgICAgIHJlYWxtX2NoYXJzZXQ7ICAgICAgICAgIC8qIFNlcnZlciBvbmx5ICovCi0gICAgQk9PTEVBTiAgICAgdXNlcmlkX3JlcTsgICAgICAgICAgICAgLyogVFJVRSBpZiB1c2VyIGlkIGlzIHJlcXVpcmVkIGR1cmluZyBvYmV4IGF1dGhlbnRpY2F0aW9uIChTZXJ2ZXIgb25seSkgKi8KLSAgICBVSU5UOCAgICAgICBzdXBwb3J0ZWRfZmVhdHVyZXM7ICAgICAvKiBTZXJ2ZXIgc3VwcG9ydGVkIGZlYXR1cmVzICovCi0gICAgVUlOVDggICAgICAgc3VwcG9ydGVkX3JlcG9zaXRvcmllczsgLyogU2VydmVyIHN1cHBvcnRlZCByZXBvc2l0b3JpZXMgKi8KKyAgICB1aW50OF90ICAgICAgIHJlYWxtX2NoYXJzZXQ7ICAgICAgICAgIC8qIFNlcnZlciBvbmx5ICovCisgICAgYm9vbCAgICAgdXNlcmlkX3JlcTsgICAgICAgICAgICAgLyogdHJ1ZSBpZiB1c2VyIGlkIGlzIHJlcXVpcmVkIGR1cmluZyBvYmV4IGF1dGhlbnRpY2F0aW9uIChTZXJ2ZXIgb25seSkgKi8KKyAgICB1aW50OF90ICAgICAgIHN1cHBvcnRlZF9mZWF0dXJlczsgICAgIC8qIFNlcnZlciBzdXBwb3J0ZWQgZmVhdHVyZXMgKi8KKyAgICB1aW50OF90ICAgICAgIHN1cHBvcnRlZF9yZXBvc2l0b3JpZXM7IC8qIFNlcnZlciBzdXBwb3J0ZWQgcmVwb3NpdG9yaWVzICovCiAKIH0gdEJUQV9QQlNfQ0ZHOwogCmRpZmYgLS1naXQgYS9idGEvc2RwL2J0YV9zZHAuYyBiL2J0YS9zZHAvYnRhX3NkcC5jCmluZGV4IDg4YTY4YTUuLjYxMzE1OWEgMTAwNjQ0Ci0tLSBhL2J0YS9zZHAvYnRhX3NkcC5jCisrKyBiL2J0YS9zZHAvYnRhX3NkcC5jCkBAIC0zMyw3ICszMyw3IEBACiAqKiBDb25zdGFudHMgYW5kIHR5cGVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmIEJUQV9EWU5BTUlDX01FTU9SWSA9PSBGQUxTRQorI2lmIChCVEFfRFlOQU1JQ19NRU1PUlkgPT0gRkFMU0UpCiB0QlRBX1NEUF9DQiBidGFfc2RwX2NiOwogI2VuZGlmCiAKQEAgLTU5LDE4ICs1OSwxOCBAQAogKioKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX3NkcF9zbV9leGVjdXRlKEJUX0hEUiAqcF9tc2cpCitib29sIGJ0YV9zZHBfc21fZXhlY3V0ZShCVF9IRFIgKnBfbXNnKQogewotICAgIGlmKHBfbXNnID09IE5VTEwpIHJldHVybiBGQUxTRTsKKyAgICBpZihwX21zZyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CiAKLSAgICBCT09MRUFOIHJldCA9IEZBTFNFOwotICAgIFVJTlQxNiBhY3Rpb24gPSAocF9tc2ctPmV2ZW50ICYgMHgwMGZmKTsKKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIHVpbnQxNl90IGFjdGlvbiA9IChwX21zZy0+ZXZlbnQgJiAweDAwZmYpOwogCiAgICAgLyogZXhlY3V0ZSBhY3Rpb24gZnVuY3Rpb25zICovCiAgICAgaWYoYWN0aW9uIDwgQlRBX1NEUF9OVU1fQUNUSU9OUykKICAgICB7CiAgICAgICAgICgqYnRhX3NkcF9hY3Rpb25bYWN0aW9uXSkoKHRCVEFfU0RQX01TRyopcF9tc2cpOwotICAgICAgICByZXQgPSBUUlVFOworICAgICAgICByZXQgPSB0cnVlOwogICAgIH0KIAogICAgIHJldHVybihyZXQpOwpkaWZmIC0tZ2l0IGEvYnRhL3NkcC9idGFfc2RwX2FjdC5jIGIvYnRhL3NkcC9idGFfc2RwX2FjdC5jCmluZGV4IDAxNjhiOWMuLjEwYjUwYzcgMTAwNjQ0Ci0tLSBhL2J0YS9zZHAvYnRhX3NkcF9hY3QuYworKysgYi9idGEvc2RwL2J0YV9zZHBfYWN0LmMKQEAgLTk0LDcgKzk0LDcgQEAKIHsKICAgICB0U0RQX0RJU0NfQVRUUiAqcF9hdHRyOwogICAgIHRTRFBfUFJPVE9DT0xfRUxFTSBwZTsKLSAgICBVSU5UMTYgcHZlcnNpb24gPSAwOworICAgIHVpbnQxNl90IHB2ZXJzaW9uID0gMDsKICAgICByZWNvcmQtPm1ucy5oZHIudHlwZSA9IFNEUF9UWVBFX01BUF9NTlM7CiAgICAgcmVjb3JkLT5tbnMuaGRyLnNlcnZpY2VfbmFtZV9sZW5ndGggPSAwOwogICAgIHJlY29yZC0+bW5zLmhkci5zZXJ2aWNlX25hbWUgPSBOVUxMOwpAQCAtMTM0LDcgKzEzNCw3IEBACiB7CiAgICAgdFNEUF9ESVNDX0FUVFIgKnBfYXR0cjsKICAgICB0U0RQX1BST1RPQ09MX0VMRU0gcGU7Ci0gICAgVUlOVDE2IHB2ZXJzaW9uID0gLTE7CisgICAgdWludDE2X3QgcHZlcnNpb24gPSAtMTsKIAogICAgIHJlY29yZC0+bWFzLmhkci50eXBlID0gU0RQX1RZUEVfTUFQX01BUzsKICAgICByZWNvcmQtPm1hcy5oZHIuc2VydmljZV9uYW1lX2xlbmd0aCA9IDA7CkBAIC0xODYsNyArMTg2LDcgQEAKIHN0YXRpYyB2b2lkIGJ0YV9jcmVhdGVfcHNlX3NkcF9yZWNvcmQoYmx1ZXRvb3RoX3NkcF9yZWNvcmQgKnJlY29yZCwgdFNEUF9ESVNDX1JFQyAqcF9yZWMpCiB7CiAgICAgdFNEUF9ESVNDX0FUVFIgKnBfYXR0cjsKLSAgICBVSU5UMTYgcHZlcnNpb247CisgICAgdWludDE2X3QgcHZlcnNpb247CiAgICAgdFNEUF9QUk9UT0NPTF9FTEVNIHBlOwogCiAgICAgcmVjb3JkLT5wc2UuaGRyLnR5cGUgPSBTRFBfVFlQRV9QQkFQX1BTRTsKQEAgLTIzMyw3ICsyMzMsNyBAQAogewogICAgIHRTRFBfRElTQ19BVFRSICpwX2F0dHIsICpwX3NhdHRyOwogICAgIHRTRFBfUFJPVE9DT0xfRUxFTSBwZTsKLSAgICBVSU5UMTYgcHZlcnNpb24gPSAtMTsKKyAgICB1aW50MTZfdCBwdmVyc2lvbiA9IC0xOwogCiAgICAgcmVjb3JkLT5vcHMuaGRyLnR5cGUgPSBTRFBfVFlQRV9PUFBfU0VSVkVSOwogICAgIHJlY29yZC0+b3BzLmhkci5zZXJ2aWNlX25hbWVfbGVuZ3RoID0gMDsKQEAgLTMxNCw3ICszMTQsNyBAQAogewogICAgIHRTRFBfRElTQ19BVFRSICpwX2F0dHI7CiAgICAgdFNEUF9QUk9UT0NPTF9FTEVNIHBlOwotICAgIFVJTlQxNiBwdmVyc2lvbiA9IC0xOworICAgIHVpbnQxNl90IHB2ZXJzaW9uID0gLTE7CiAKICAgICByZWNvcmQtPnNhcC5oZHIudHlwZSA9IFNEUF9UWVBFX01BUF9NQVM7CiAgICAgcmVjb3JkLT5zYXAuaGRyLnNlcnZpY2VfbmFtZV9sZW5ndGggPSAwOwpAQCAtMzc4LDcgKzM3OCw3IEBACiAqKiBSZXR1cm5zICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfc2RwX3NlYXJjaF9jYmFjayhVSU5UMTYgcmVzdWx0LCB2b2lkICogdXNlcl9kYXRhKQorc3RhdGljIHZvaWQgYnRhX3NkcF9zZWFyY2hfY2JhY2sodWludDE2X3QgcmVzdWx0LCB2b2lkICogdXNlcl9kYXRhKQogewogICAgIHRTRFBfRElTQ19SRUMgKnBfcmVjID0gTlVMTDsKICAgICB0QlRBX1NEUF9TRUFSQ0hfQ09NUCBldnRfZGF0YTsKZGlmZiAtLWdpdCBhL2J0YS9zZHAvYnRhX3NkcF9hcGkuYyBiL2J0YS9zZHAvYnRhX3NkcF9hcGkuYwppbmRleCA1MGQ3NGQ0Li5lMTBjMzFlIDEwMDY0NAotLS0gYS9idGEvc2RwL2J0YV9zZHBfYXBpLmMKKysrIGIvYnRhL3NkcC9idGFfc2RwX2FwaS5jCkBAIC01OSw4ICs1OSw4IEBACiB7CiAgICAgdEJUQV9TRFBfU1RBVFVTIHN0YXR1cyA9IEJUQV9TRFBfRkFJTFVSRTsKIAotICAgIEFQUExfVFJBQ0VfQVBJKF9fRlVOQ1RJT05fXyk7Ci0gICAgaWYocF9jYmFjayAmJiBGQUxTRSA9PSBidGFfc3lzX2lzX3JlZ2lzdGVyKEJUQV9JRF9TRFApKQorICAgIEFQUExfVFJBQ0VfQVBJKF9fZnVuY19fKTsKKyAgICBpZihwX2NiYWNrICYmIGZhbHNlID09IGJ0YV9zeXNfaXNfcmVnaXN0ZXIoQlRBX0lEX1NEUCkpCiAgICAgewogICAgICAgICBtZW1zZXQoJmJ0YV9zZHBfY2IsIDAsIHNpemVvZih0QlRBX1NEUF9DQikpOwogCmRpZmYgLS1naXQgYS9idGEvc2RwL2J0YV9zZHBfY2ZnLmMgYi9idGEvc2RwL2J0YV9zZHBfY2ZnLmMKaW5kZXggNDc3MzE4Yy4uOWJjMGFhMyAxMDA2NDQKLS0tIGEvYnRhL3NkcC9idGFfc2RwX2NmZy5jCisrKyBiL2J0YS9zZHAvYnRhX3NkcF9jZmcuYwpAQCAtMjgsNyArMjgsNyBAQAogI2RlZmluZSBCVEFfU0RQX0RCX1NJWkUgIDQ1MDAKICNlbmRpZgogCi1zdGF0aWMgVUlOVDggX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCkpKSBidGFfc2RwX2RiX2RhdGFbQlRBX1NEUF9EQl9TSVpFXTsKK3N0YXRpYyB1aW50OF90IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDQpKSkgYnRhX3NkcF9kYl9kYXRhW0JUQV9TRFBfREJfU0laRV07CiAKIC8qIFNEUCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAqLwogY29uc3QgdEJUQV9TRFBfQ0ZHIGJ0YV9zZHBfY2ZnID0KZGlmZiAtLWdpdCBhL2J0YS9zZHAvYnRhX3NkcF9pbnQuaCBiL2J0YS9zZHAvYnRhX3NkcF9pbnQuaAppbmRleCA0ZjNmNmE1Li41MzZlOGU2IDEwMDY0NAotLS0gYS9idGEvc2RwL2J0YV9zZHBfaW50LmgKKysrIGIvYnRhL3NkcC9idGFfc2RwX2ludC5oCkBAIC04OCwxNCArODgsMTQgQEAKIC8qIFNEUCBjb250cm9sIGJsb2NrICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQ4ICAgICAgICAgICAgICBzZHBfYWN0aXZlOyAgLyogc2VlIEJUQV9TRFBfU0RQX0FDVF8qICovCisgICAgdWludDhfdCAgICAgICAgICAgICAgc2RwX2FjdGl2ZTsgIC8qIHNlZSBCVEFfU0RQX1NEUF9BQ1RfKiAqLwogICAgIEJEX0FERFIgICAgICAgICAgICByZW1vdGVfYWRkcjsKICAgICB0QlRBX1NEUF9ETV9DQkFDSyAgKnBfZG1fY2JhY2s7CiB9IHRCVEFfU0RQX0NCOwogCiAKIC8qIFNEUCBjb250cm9sIGJsb2NrICovCi0jaWYgQlRBX0RZTkFNSUNfTUVNT1JZID09IEZBTFNFCisjaWYgKEJUQV9EWU5BTUlDX01FTU9SWSA9PSBGQUxTRSkKIGV4dGVybiB0QlRBX1NEUF9DQiBidGFfc2RwX2NiOwogI2Vsc2UKIGV4dGVybiB0QlRBX1NEUF9DQiAqYnRhX3NkcF9jYl9wdHI7CkBAIC0xMDUsNyArMTA1LDcgQEAKIC8qIGNvbmZpZyBzdHJ1Y3QgKi8KIGV4dGVybiB0QlRBX1NEUF9DRkcgKnBfYnRhX3NkcF9jZmc7CiAKLWV4dGVybiBCT09MRUFOIGJ0YV9zZHBfc21fZXhlY3V0ZShCVF9IRFIgKnBfbXNnKTsKK2V4dGVybiBib29sIGJ0YV9zZHBfc21fZXhlY3V0ZShCVF9IRFIgKnBfbXNnKTsKIAogZXh0ZXJuIHZvaWQgYnRhX3NkcF9lbmFibGUgKHRCVEFfU0RQX01TRyAqcF9kYXRhKTsKIGV4dGVybiB2b2lkIGJ0YV9zZHBfc2VhcmNoICh0QlRBX1NEUF9NU0cgKnBfZGF0YSk7CmRpZmYgLS1naXQgYS9idGEvc3lzL2J0YV9zeXMuaCBiL2J0YS9zeXMvYnRhX3N5cy5oCmluZGV4IGI4OTg5OGUuLjMwZmFhNzcgMTAwNjQ0Ci0tLSBhL2J0YS9zeXMvYnRhX3N5cy5oCisrKyBiL2J0YS9zeXMvYnRhX3N5cy5oCkBAIC0zNywxMCArMzcsMTAgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiB2ZW5kb3Igc3BlY2lmaWMgZXZlbnQgaGFuZGxlciBmdW5jdGlvbiB0eXBlICovCi10eXBlZGVmIEJPT0xFQU4gKHRCVEFfU1lTX1ZTX0VWVF9IRExSKShVSU5UMTYgZXZ0LCB2b2lkICpwKTsKK3R5cGVkZWYgYm9vbCAodEJUQV9TWVNfVlNfRVZUX0hETFIpKHVpbnQxNl90IGV2dCwgdm9pZCAqcCk7CiAKIC8qIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24gdHlwZSAqLwotdHlwZWRlZiBCT09MRUFOICh0QlRBX1NZU19FVlRfSERMUikoQlRfSERSICpwX21zZyk7Cit0eXBlZGVmIGJvb2wgKHRCVEFfU1lTX0VWVF9IRExSKShCVF9IRFIgKnBfbXNnKTsKIAogLyogZGlzYWJsZSBmdW5jdGlvbiB0eXBlICovCiB0eXBlZGVmIHZvaWQgKHRCVEFfU1lTX0RJU0FCTEUpKHZvaWQpOwpAQCAtNTUsNyArNTUsNyBAQAogICAgIEJUQV9TWVNfTUFYX0hXX01PRFVMRVMKIH07CiAKLXR5cGVkZWYgVUlOVDE2IHRCVEFfU1lTX0hXX01PRFVMRTsKK3R5cGVkZWYgdWludDE2X3QgdEJUQV9TWVNfSFdfTU9EVUxFOwogCiAjaWZuZGVmIEJUQV9ETV9OVU1fSlZfSUQKICNkZWZpbmUgQlRBX0RNX05VTV9KVl9JRCAgICAyCkBAIC0xMTMsNyArMTEzLDcgQEAKIAogI2RlZmluZSBCVEFfSURfTUFYICAgICAgICAgICg0NCArIEJUQV9ETV9OVU1fSlZfSUQpCiAKLXR5cGVkZWYgVUlOVDggdEJUQV9TWVNfSUQ7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9TWVNfSUQ7CiAKIAogI2RlZmluZSBCVEFfU1lTX0NPTk5fT1BFTiAgICAgICAgICAgMHgwMApAQCAtMTMyLDI0ICsxMzIsMjQgQEAKICNkZWZpbmUgQlRBX1NZU19QTENZX0RFRl9DTFIgICAgICAgIDB4MTMgLyogY2xlYXIgdGhlIGRlZmF1bHQgbGluayBwb2xpY3kgKi8KICNkZWZpbmUgQlRBX1NZU19ST0xFX0NIQU5HRSAgICAgICAgIDB4MTQgLyogcm9sZSBjaGFuZ2UgKi8KIAotdHlwZWRlZiBVSU5UOCB0QlRBX1NZU19DT05OX1NUQVRVUzsKK3R5cGVkZWYgdWludDhfdCB0QlRBX1NZU19DT05OX1NUQVRVUzsKIAogLyogQml0bWFzayBvZiBzeXMgZmVhdHVyZXMgKi8KICNkZWZpbmUgQlRBX1NZU19GRUFUX1BDTTIgICAgICAgICAgIDB4MDAwMQogI2RlZmluZSBCVEFfU1lTX0ZFQVRfUENNMl9NQVNURVIgICAgMHgwMDAyCiAKIC8qIHRCVEFfUFJFRl9ST0xFUyAqLwotdHlwZWRlZiBVSU5UOCB0QlRBX1NZU19QUkVGX1JPTEVTOwordHlwZWRlZiB1aW50OF90IHRCVEFfU1lTX1BSRUZfUk9MRVM7CiAKIC8qIGNvbm4gY2FsbGJhY2sgZm9yIHJvbGUgLyBsb3cgcG93ZXIgbWFuYWdlciovCi10eXBlZGVmIHZvaWQgKHRCVEFfU1lTX0NPTk5fQ0JBQ0spKHRCVEFfU1lTX0NPTk5fU1RBVFVTIHN0YXR1cyxVSU5UOCBpZCwgVUlOVDggYXBwX2lkLCBCRF9BRERSIHBlZXJfYWRkcik7Cit0eXBlZGVmIHZvaWQgKHRCVEFfU1lTX0NPTk5fQ0JBQ0spKHRCVEFfU1lTX0NPTk5fU1RBVFVTIHN0YXR1cyx1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpOwogCiAvKiBjb25uIGNhbGxiYWNrIGZvciByb2xlIC8gbG93IHBvd2VyIG1hbmFnZXIqLwotdHlwZWRlZiB2b2lkICh0QlRBX1NZU19TU1JfQ0ZHX0NCQUNLKShVSU5UOCBpZCwgVUlOVDggYXBwX2lkLCBVSU5UMTYgbGF0ZW5jeSwgVUlOVDE2IHRvdXQpOwordHlwZWRlZiB2b2lkICh0QlRBX1NZU19TU1JfQ0ZHX0NCQUNLKSh1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwgdWludDE2X3QgbGF0ZW5jeSwgdWludDE2X3QgdG91dCk7CiAKICNpZiAoQlRBX0VJUl9DQU5ORURfVVVJRF9MSVNUICE9IFRSVUUpCiAvKiBlaXIgY2FsbGJhY2sgZm9yIGFkZGluZy9yZW1vdmVpbmcgVVVJRCAqLwotdHlwZWRlZiB2b2lkICh0QlRBX1NZU19FSVJfQ0JBQ0spKFVJTlQxNiB1dWlkMTYsIEJPT0xFQU4gYWRkaW5nKTsKK3R5cGVkZWYgdm9pZCAodEJUQV9TWVNfRUlSX0NCQUNLKSh1aW50MTZfdCB1dWlkMTYsIGJvb2wgYWRkaW5nKTsKICNlbmRpZgogCiAvKiByZWdpc3RyYXRpb24gc3RydWN0dXJlICovCkBAIC0xNzEsNyArMTcxLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiB0cmFjZSBsZXZlbCAqLwotZXh0ZXJuIFVJTlQ4IGFwcGxfdHJhY2VfbGV2ZWw7CitleHRlcm4gdWludDhfdCBhcHBsX3RyYWNlX2xldmVsOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqICBNYWNyb3MKQEAgLTIxMCw3ICsyMTAsNyBAQAogICAgIEJUQV9TWVNfSFdfRVJST1JfRVZUCiAKIH07Ci10eXBlZGVmIFVJTlQ4IHRCVEFfU1lTX0hXX0VWVDsKK3R5cGVkZWYgdWludDhfdCB0QlRBX1NZU19IV19FVlQ7CiAKIC8qIEhXIGVuYWJsZSBjYWxsYmFjayB0eXBlICovCiB0eXBlZGVmIHZvaWQgKHRCVEFfU1lTX0hXX0NCQUNLKSh0QlRBX1NZU19IV19FVlQgc3RhdHVzKTsKQEAgLTIyMiwxMSArMjIyLDExIEBACiBleHRlcm4gdm9pZCBidGFfc3lzX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBidGFfc3lzX2ZyZWUodm9pZCk7CiBleHRlcm4gdm9pZCBidGFfc3lzX2V2ZW50KEJUX0hEUiAqcF9tc2cpOwotZXh0ZXJuIHZvaWQgYnRhX3N5c19zZXRfdHJhY2VfbGV2ZWwoVUlOVDggbGV2ZWwpOwotZXh0ZXJuIHZvaWQgYnRhX3N5c19yZWdpc3RlcihVSU5UOCBpZCwgY29uc3QgdEJUQV9TWVNfUkVHICpwX3JlZyk7Ci1leHRlcm4gdm9pZCBidGFfc3lzX2RlcmVnaXN0ZXIoVUlOVDggaWQpOwotZXh0ZXJuIEJPT0xFQU4gYnRhX3N5c19pc19yZWdpc3RlcihVSU5UOCBpZCk7Ci1leHRlcm4gVUlOVDE2IGJ0YV9zeXNfZ2V0X3N5c19mZWF0dXJlcyh2b2lkKTsKK2V4dGVybiB2b2lkIGJ0YV9zeXNfc2V0X3RyYWNlX2xldmVsKHVpbnQ4X3QgbGV2ZWwpOworZXh0ZXJuIHZvaWQgYnRhX3N5c19yZWdpc3Rlcih1aW50OF90IGlkLCBjb25zdCB0QlRBX1NZU19SRUcgKnBfcmVnKTsKK2V4dGVybiB2b2lkIGJ0YV9zeXNfZGVyZWdpc3Rlcih1aW50OF90IGlkKTsKK2V4dGVybiBib29sIGJ0YV9zeXNfaXNfcmVnaXN0ZXIodWludDhfdCBpZCk7CitleHRlcm4gdWludDE2X3QgYnRhX3N5c19nZXRfc3lzX2ZlYXR1cmVzKHZvaWQpOwogZXh0ZXJuIHZvaWQgYnRhX3N5c19zZW5kbXNnKHZvaWQgKnBfbXNnKTsKIGV4dGVybiB2b2lkIGJ0YV9zeXNfc3RhcnRfdGltZXIoYWxhcm1fdCAqYWxhcm0sIHBlcmlvZF9tc190IGludGVydmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBldmVudCwgdWludDE2X3QgbGF5ZXJfc3BlY2lmaWMpOwpAQCAtMjQzLDQxICsyNDMsNDEgQEAKIGV4dGVybiB2b2lkIGJ0YV9zeXNfc2NvX3JlZ2lzdGVyKHRCVEFfU1lTX0NPTk5fQ0JBQ0sgKiBwX2NiYWNrKTsKIAogCi1leHRlcm4gdm9pZCBidGFfc3lzX2Nvbm5fb3BlbihVSU5UOCBpZCwgVUlOVDggYXBwX2lkLCBCRF9BRERSIHBlZXJfYWRkcik7Ci1leHRlcm4gdm9pZCBidGFfc3lzX2Nvbm5fY2xvc2UoVUlOVDggaWQsIFVJTlQ4IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpOwotZXh0ZXJuIHZvaWQgYnRhX3N5c19hcHBfb3BlbihVSU5UOCBpZCwgVUlOVDggYXBwX2lkLCBCRF9BRERSIHBlZXJfYWRkcik7Ci1leHRlcm4gdm9pZCBidGFfc3lzX2FwcF9jbG9zZShVSU5UOCBpZCwgVUlOVDggYXBwX2lkLCBCRF9BRERSIHBlZXJfYWRkcik7Ci1leHRlcm4gdm9pZCBidGFfc3lzX3Njb19vcGVuKFVJTlQ4IGlkLCBVSU5UOCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKTsKLWV4dGVybiB2b2lkIGJ0YV9zeXNfc2NvX2Nsb3NlKFVJTlQ4IGlkLCBVSU5UOCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKTsKLWV4dGVybiB2b2lkIGJ0YV9zeXNfc2NvX3VzZShVSU5UOCBpZCwgVUlOVDggYXBwX2lkLCBCRF9BRERSIHBlZXJfYWRkcik7Ci1leHRlcm4gdm9pZCBidGFfc3lzX3Njb191bnVzZShVSU5UOCBpZCwgVUlOVDggYXBwX2lkLCBCRF9BRERSIHBlZXJfYWRkcik7Ci1leHRlcm4gdm9pZCBidGFfc3lzX2lkbGUoVUlOVDggaWQsIFVJTlQ4IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpOwotZXh0ZXJuIHZvaWQgYnRhX3N5c19idXN5KFVJTlQ4IGlkLCBVSU5UOCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKTsKK2V4dGVybiB2b2lkIGJ0YV9zeXNfY29ubl9vcGVuKHVpbnQ4X3QgaWQsIHVpbnQ4X3QgYXBwX2lkLCBCRF9BRERSIHBlZXJfYWRkcik7CitleHRlcm4gdm9pZCBidGFfc3lzX2Nvbm5fY2xvc2UodWludDhfdCBpZCwgdWludDhfdCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKTsKK2V4dGVybiB2b2lkIGJ0YV9zeXNfYXBwX29wZW4odWludDhfdCBpZCwgdWludDhfdCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKTsKK2V4dGVybiB2b2lkIGJ0YV9zeXNfYXBwX2Nsb3NlKHVpbnQ4X3QgaWQsIHVpbnQ4X3QgYXBwX2lkLCBCRF9BRERSIHBlZXJfYWRkcik7CitleHRlcm4gdm9pZCBidGFfc3lzX3Njb19vcGVuKHVpbnQ4X3QgaWQsIHVpbnQ4X3QgYXBwX2lkLCBCRF9BRERSIHBlZXJfYWRkcik7CitleHRlcm4gdm9pZCBidGFfc3lzX3Njb19jbG9zZSh1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpOworZXh0ZXJuIHZvaWQgYnRhX3N5c19zY29fdXNlKHVpbnQ4X3QgaWQsIHVpbnQ4X3QgYXBwX2lkLCBCRF9BRERSIHBlZXJfYWRkcik7CitleHRlcm4gdm9pZCBidGFfc3lzX3Njb191bnVzZSh1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpOworZXh0ZXJuIHZvaWQgYnRhX3N5c19pZGxlKHVpbnQ4X3QgaWQsIHVpbnQ4X3QgYXBwX2lkLCBCRF9BRERSIHBlZXJfYWRkcik7CitleHRlcm4gdm9pZCBidGFfc3lzX2J1c3kodWludDhfdCBpZCwgdWludDhfdCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKTsKIAogI2lmIChCVE1fU1NSX0lOQ0xVREVEID09IFRSVUUpCiBleHRlcm4gdm9pZCBidGFfc3lzX3Nzcl9jZmdfcmVnaXN0ZXIodEJUQV9TWVNfU1NSX0NGR19DQkFDSyAqIHBfY2JhY2spOwotZXh0ZXJuIHZvaWQgYnRhX3N5c19jaGdfc3NyX2NvbmZpZyAoVUlOVDggaWQsIFVJTlQ4IGFwcF9pZCwgVUlOVDE2IG1heF9sYXRlbmN5LCBVSU5UMTYgbWluX3RvdXQpOworZXh0ZXJuIHZvaWQgYnRhX3N5c19jaGdfc3NyX2NvbmZpZyAodWludDhfdCBpZCwgdWludDhfdCBhcHBfaWQsIHVpbnQxNl90IG1heF9sYXRlbmN5LCB1aW50MTZfdCBtaW5fdG91dCk7CiAjZW5kaWYKIAogZXh0ZXJuIHZvaWQgYnRhX3N5c19yb2xlX2NoZ19yZWdpc3Rlcih0QlRBX1NZU19DT05OX0NCQUNLICogcF9jYmFjayk7Ci1leHRlcm4gdm9pZCBidGFfc3lzX25vdGlmeV9yb2xlX2NoZyhCRF9BRERSX1BUUiBwX2JkYSwgVUlOVDggbmV3X3JvbGUsIFVJTlQ4IGhjaV9zdGF0dXMpOwotZXh0ZXJuIHZvaWQgYnRhX3N5c19jb2xsaXNpb25fcmVnaXN0ZXIoVUlOVDggYnRhX2lkLCB0QlRBX1NZU19DT05OX0NCQUNLICpwX2NiYWNrKTsKK2V4dGVybiB2b2lkIGJ0YV9zeXNfbm90aWZ5X3JvbGVfY2hnKEJEX0FERFJfUFRSIHBfYmRhLCB1aW50OF90IG5ld19yb2xlLCB1aW50OF90IGhjaV9zdGF0dXMpOworZXh0ZXJuIHZvaWQgYnRhX3N5c19jb2xsaXNpb25fcmVnaXN0ZXIodWludDhfdCBidGFfaWQsIHRCVEFfU1lTX0NPTk5fQ0JBQ0sgKnBfY2JhY2spOwogZXh0ZXJuIHZvaWQgYnRhX3N5c19ub3RpZnlfY29sbGlzaW9uIChCRF9BRERSX1BUUiBwX2JkYSk7CiAKICNpZiAoQlRBX0VJUl9DQU5ORURfVVVJRF9MSVNUICE9IFRSVUUpCiBleHRlcm4gdm9pZCBidGFfc3lzX2Vpcl9yZWdpc3Rlcih0QlRBX1NZU19FSVJfQ0JBQ0sgKiBwX2NiYWNrKTsKLWV4dGVybiB2b2lkIGJ0YV9zeXNfYWRkX3V1aWQoVUlOVDE2IHV1aWQxNik7Ci1leHRlcm4gdm9pZCBidGFfc3lzX3JlbW92ZV91dWlkKFVJTlQxNiB1dWlkMTYpOworZXh0ZXJuIHZvaWQgYnRhX3N5c19hZGRfdXVpZCh1aW50MTZfdCB1dWlkMTYpOworZXh0ZXJuIHZvaWQgYnRhX3N5c19yZW1vdmVfdXVpZCh1aW50MTZfdCB1dWlkMTYpOwogI2Vsc2UKICNkZWZpbmUgYnRhX3N5c19laXJfcmVnaXN0ZXIodXQpCiAjZGVmaW5lIGJ0YV9zeXNfYWRkX3V1aWQodXQpCiAjZGVmaW5lIGJ0YV9zeXNfcmVtb3ZlX3V1aWQodXQpCiAjZW5kaWYKIAotZXh0ZXJuIHZvaWQgYnRhX3N5c19zZXRfcG9saWN5IChVSU5UOCBpZCwgVUlOVDggcG9saWN5LCBCRF9BRERSIHBlZXJfYWRkcik7Ci1leHRlcm4gdm9pZCBidGFfc3lzX2NsZWFyX3BvbGljeSAoVUlOVDggaWQsIFVJTlQ4IHBvbGljeSwgQkRfQUREUiBwZWVyX2FkZHIpOwotZXh0ZXJuIHZvaWQgYnRhX3N5c19zZXRfZGVmYXVsdF9wb2xpY3kgKFVJTlQ4IGlkLCBVSU5UOCBwb2xpY3kpOwotZXh0ZXJuIHZvaWQgYnRhX3N5c19jbGVhcl9kZWZhdWx0X3BvbGljeSAoVUlOVDggaWQsIFVJTlQ4IHBvbGljeSk7CitleHRlcm4gdm9pZCBidGFfc3lzX3NldF9wb2xpY3kgKHVpbnQ4X3QgaWQsIHVpbnQ4X3QgcG9saWN5LCBCRF9BRERSIHBlZXJfYWRkcik7CitleHRlcm4gdm9pZCBidGFfc3lzX2NsZWFyX3BvbGljeSAodWludDhfdCBpZCwgdWludDhfdCBwb2xpY3ksIEJEX0FERFIgcGVlcl9hZGRyKTsKK2V4dGVybiB2b2lkIGJ0YV9zeXNfc2V0X2RlZmF1bHRfcG9saWN5ICh1aW50OF90IGlkLCB1aW50OF90IHBvbGljeSk7CitleHRlcm4gdm9pZCBidGFfc3lzX2NsZWFyX2RlZmF1bHRfcG9saWN5ICh1aW50OF90IGlkLCB1aW50OF90IHBvbGljeSk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvYnRhL3N5cy9idGFfc3lzX2Nvbm4uYyBiL2J0YS9zeXMvYnRhX3N5c19jb25uLmMKaW5kZXggZWMyYjE3Ny4uMWZhZTllNyAxMDA2NDQKLS0tIGEvYnRhL3N5cy9idGFfc3lzX2Nvbm4uYworKysgYi9idGEvc3lzL2J0YV9zeXNfY29ubi5jCkBAIC0xMDAsNyArMTAwLDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9zeXNfbm90aWZ5X3JvbGVfY2hnKEJEX0FERFJfUFRSIHBfYmRhLCBVSU5UOCBuZXdfcm9sZSwgVUlOVDggaGNpX3N0YXR1cykKK3ZvaWQgYnRhX3N5c19ub3RpZnlfcm9sZV9jaGcoQkRfQUREUl9QVFIgcF9iZGEsIHVpbnQ4X3QgbmV3X3JvbGUsIHVpbnQ4X3QgaGNpX3N0YXR1cykKIHsKICAgICBpZiAoYnRhX3N5c19jYi5wX3JvbGVfY2IpCiAgICAgewpAQCAtMTE4LDkgKzExOCw5IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfc3lzX2NvbGxpc2lvbl9yZWdpc3RlcihVSU5UOCBidGFfaWQsIHRCVEFfU1lTX0NPTk5fQ0JBQ0sgKnBfY2JhY2spCit2b2lkIGJ0YV9zeXNfY29sbGlzaW9uX3JlZ2lzdGVyKHVpbnQ4X3QgYnRhX2lkLCB0QlRBX1NZU19DT05OX0NCQUNLICpwX2NiYWNrKQogewotICAgIFVJTlQ4IGluZGV4OworICAgIHVpbnQ4X3QgaW5kZXg7CiAKICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNQVhfQ09MTElTSU9OX1JFRzsgaW5kZXgrKykKICAgICB7CkBAIC0xNDYsNyArMTQ2LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9zeXNfbm90aWZ5X2NvbGxpc2lvbiAoQkRfQUREUl9QVFIgcF9iZGEpCiB7Ci0gICAgVUlOVDggaW5kZXg7CisgICAgdWludDhfdCBpbmRleDsKIAogICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9DT0xMSVNJT05fUkVHOyBpbmRleCsrKQogICAgIHsKQEAgLTE5OSw3ICsxOTksNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3N5c19jb25uX29wZW4oVUlOVDggaWQsIFVJTlQ4IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpCit2b2lkIGJ0YV9zeXNfY29ubl9vcGVuKHVpbnQ4X3QgaWQsIHVpbnQ4X3QgYXBwX2lkLCBCRF9BRERSIHBlZXJfYWRkcikKIHsKICAgICBpZihidGFfc3lzX2NiLnBybV9jYikKICAgICB7CkBAIC0yMjksNyArMjI5LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9zeXNfY29ubl9jbG9zZShVSU5UOCBpZCwgVUlOVDggYXBwX2lkLCBCRF9BRERSIHBlZXJfYWRkcikKK3ZvaWQgYnRhX3N5c19jb25uX2Nsb3NlKHVpbnQ4X3QgaWQsIHVpbnQ4X3QgYXBwX2lkLCBCRF9BRERSIHBlZXJfYWRkcikKIHsKICAgICBpZihidGFfc3lzX2NiLnBybV9jYikKICAgICB7CkBAIC0yNTgsNyArMjU4LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9zeXNfYXBwX29wZW4oVUlOVDggaWQsIFVJTlQ4IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpCit2b2lkIGJ0YV9zeXNfYXBwX29wZW4odWludDhfdCBpZCwgdWludDhfdCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKQogewogICAgIGlmKGJ0YV9zeXNfY2IucHBtX2NiKQogICAgIHsKQEAgLTI3OCw3ICsyNzgsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3N5c19hcHBfY2xvc2UoVUlOVDggaWQsIFVJTlQ4IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpCit2b2lkIGJ0YV9zeXNfYXBwX2Nsb3NlKHVpbnQ4X3QgaWQsIHVpbnQ4X3QgYXBwX2lkLCBCRF9BRERSIHBlZXJfYWRkcikKIHsKICAgICBpZihidGFfc3lzX2NiLnBwbV9jYikKICAgICB7CkBAIC0yOTcsNyArMjk3LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9zeXNfc2NvX29wZW4oVUlOVDggaWQsIFVJTlQ4IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpCit2b2lkIGJ0YV9zeXNfc2NvX29wZW4odWludDhfdCBpZCwgdWludDhfdCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKQogewogICAgIC8qIEFHIHRyaWdnZXJzIHBfc2NvX2NiIGJ5IGJ0YV9zeXNfc2NvX3VzZS4gKi8KICAgICBpZigoaWQgIT0gQlRBX0lEX0FHKSAmJiAoYnRhX3N5c19jYi5wX3Njb19jYikpCkBAIC0zMjIsOSArMzIyLDkgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9zeXNfc2NvX2Nsb3NlKFVJTlQ4IGlkLCBVSU5UOCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKQordm9pZCBidGFfc3lzX3Njb19jbG9zZSh1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpCiB7Ci0gICAgVUlOVDggbnVtX3Njb19saW5rczsKKyAgICB1aW50OF90IG51bV9zY29fbGlua3M7CiAKICAgICBpZigoaWQgIT0gQlRBX0lEX0FHKSAmJiAoYnRhX3N5c19jYi5wX3Njb19jYikpCiAgICAgewpAQCAtMzQ4LDcgKzM0OCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfc3lzX3Njb191c2UoVUlOVDggaWQsIFVJTlQ4IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpCit2b2lkIGJ0YV9zeXNfc2NvX3VzZSh1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpCiB7CiAgICAgVU5VU0VEKGlkKTsKIApAQCAtMzcwLDkgKzM3MCw5IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfc3lzX3Njb191bnVzZShVSU5UOCBpZCwgVUlOVDggYXBwX2lkLCBCRF9BRERSIHBlZXJfYWRkcikKK3ZvaWQgYnRhX3N5c19zY29fdW51c2UodWludDhfdCBpZCwgdWludDhfdCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKQogewotICAgIFVJTlQ4IG51bV9zY29fbGlua3M7CisgICAgdWludDhfdCBudW1fc2NvX2xpbmtzOwogICAgIFVOVVNFRChpZCk7CiAKICAgICBpZigoYnRhX3N5c19jYi5wX3Njb19jYikpCkBAIC0zOTIsNyArMzkyLDcgQEAKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmIChCVE1fU1NSX0lOQ0xVREVEID09IFRSVUUpCi12b2lkIGJ0YV9zeXNfY2hnX3Nzcl9jb25maWcgKFVJTlQ4IGlkLCBVSU5UOCBhcHBfaWQsIFVJTlQxNiBtYXhfbGF0ZW5jeSwgVUlOVDE2IG1pbl90b3V0KQordm9pZCBidGFfc3lzX2NoZ19zc3JfY29uZmlnICh1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwgdWludDE2X3QgbWF4X2xhdGVuY3ksIHVpbnQxNl90IG1pbl90b3V0KQogewogICAgIGlmKGJ0YV9zeXNfY2IucF9zc3JfY2IpCiAgICAgewpAQCAtNDEwLDcgKzQxMCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfc3lzX3NldF9wb2xpY3kgKFVJTlQ4IGlkLCBVSU5UOCBwb2xpY3ksIEJEX0FERFIgcGVlcl9hZGRyKQordm9pZCBidGFfc3lzX3NldF9wb2xpY3kgKHVpbnQ4X3QgaWQsIHVpbnQ4X3QgcG9saWN5LCBCRF9BRERSIHBlZXJfYWRkcikKIHsKICAgICBpZihidGFfc3lzX2NiLnBfcG9saWN5X2NiKQogICAgIHsKQEAgLTQyOCw3ICs0MjgsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3N5c19jbGVhcl9wb2xpY3kgKFVJTlQ4IGlkLCBVSU5UOCBwb2xpY3ksIEJEX0FERFIgcGVlcl9hZGRyKQordm9pZCBidGFfc3lzX2NsZWFyX3BvbGljeSAodWludDhfdCBpZCwgdWludDhfdCBwb2xpY3ksIEJEX0FERFIgcGVlcl9hZGRyKQogewogICAgIGlmKGJ0YV9zeXNfY2IucF9wb2xpY3lfY2IpCiAgICAgewpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfc3lzX3NldF9kZWZhdWx0X3BvbGljeSAoVUlOVDggaWQsIFVJTlQ4IHBvbGljeSkKK3ZvaWQgYnRhX3N5c19zZXRfZGVmYXVsdF9wb2xpY3kgKHVpbnQ4X3QgaWQsIHVpbnQ4X3QgcG9saWN5KQogewogICAgIGlmKGJ0YV9zeXNfY2IucF9wb2xpY3lfY2IpCiAgICAgewpAQCAtNDY0LDcgKzQ2NCw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfc3lzX2NsZWFyX2RlZmF1bHRfcG9saWN5IChVSU5UOCBpZCwgVUlOVDggcG9saWN5KQordm9pZCBidGFfc3lzX2NsZWFyX2RlZmF1bHRfcG9saWN5ICh1aW50OF90IGlkLCB1aW50OF90IHBvbGljeSkKIHsKICAgICBpZihidGFfc3lzX2NiLnBfcG9saWN5X2NiKQogICAgIHsKQEAgLTQ4Miw3ICs0ODIsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3N5c19pZGxlKFVJTlQ4IGlkLCBVSU5UOCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKQordm9pZCBidGFfc3lzX2lkbGUodWludDhfdCBpZCwgdWludDhfdCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKQogewogCiAgICAgaWYoYnRhX3N5c19jYi5wcm1fY2IpCkBAIC01MDksNyArNTA5LDcgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9zeXNfYnVzeShVSU5UOCBpZCwgVUlOVDggYXBwX2lkLCBCRF9BRERSIHBlZXJfYWRkcikKK3ZvaWQgYnRhX3N5c19idXN5KHVpbnQ4X3QgaWQsIHVpbnQ4X3QgYXBwX2lkLCBCRF9BRERSIHBlZXJfYWRkcikKIHsKICAgICBpZihidGFfc3lzX2NiLnBybV9jYikKICAgICB7CkBAIC01NTIsMTEgKzU1MiwxMSBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3N5c19hZGRfdXVpZChVSU5UMTYgdXVpZDE2KQordm9pZCBidGFfc3lzX2FkZF91dWlkKHVpbnQxNl90IHV1aWQxNikKIHsKICAgICBpZihidGFfc3lzX2NiLmVpcl9jYikKICAgICB7Ci0gICAgICAgIGJ0YV9zeXNfY2IuZWlyX2NiKHV1aWQxNiwgVFJVRSApOworICAgICAgICBidGFfc3lzX2NiLmVpcl9jYih1dWlkMTYsIHRydWUgKTsKICAgICB9CiB9CiAKQEAgLTU3MCwxMSArNTcwLDExIEBACiAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfc3lzX3JlbW92ZV91dWlkKFVJTlQxNiB1dWlkMTYpCit2b2lkIGJ0YV9zeXNfcmVtb3ZlX3V1aWQodWludDE2X3QgdXVpZDE2KQogewogICAgIGlmKGJ0YV9zeXNfY2IuZWlyX2NiKQogICAgIHsKLSAgICAgICAgYnRhX3N5c19jYi5laXJfY2IodXVpZDE2LCBGQUxTRSk7CisgICAgICAgIGJ0YV9zeXNfY2IuZWlyX2NiKHV1aWQxNiwgZmFsc2UpOwogICAgIH0KIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYnRhL3N5cy9idGFfc3lzX2ludC5oIGIvYnRhL3N5cy9idGFfc3lzX2ludC5oCmluZGV4IGU5YzE5MjkuLmI4MTg4NmUgMTAwNjQ0Ci0tLSBhL2J0YS9zeXMvYnRhX3N5c19pbnQuaAorKysgYi9idGEvc3lzL2J0YV9zeXNfaW50LmgKQEAgLTQwLDE0ICs0MCwxNCBAQAogICAgIEJUQV9TWVNfSFdfT04sCiAgICAgQlRBX1NZU19IV19TVE9QUElORwogfTsKLXR5cGVkZWYgVUlOVDggdEJUQV9TWVNfSFdfU1RBVEU7Cit0eXBlZGVmIHVpbnQ4X3QgdEJUQV9TWVNfSFdfU1RBVEU7CiAKIC8qIENvbGxpc2lvbiBjYWxsYmFjayAqLwogI2RlZmluZSBNQVhfQ09MTElTSU9OX1JFRyAgIDUKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBpZFtNQVhfQ09MTElTSU9OX1JFR107CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBpZFtNQVhfQ09MTElTSU9OX1JFR107CiAgICAgdEJUQV9TWVNfQ09OTl9DQkFDSyAgICAgKnBfY29sbF9jYmFja1tNQVhfQ09MTElTSU9OX1JFR107CiB9IHRCVEFfU1lTX0NPTExJU0lPTjsKIApAQCAtNTUsMTEgKzU1LDExIEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIHRCVEFfU1lTX1JFRyAgICAgICAgICAgICpyZWdbQlRBX0lEX01BWF07ICAgICAgIC8qIHJlZ2lzdHJhdGlvbiBzdHJ1Y3R1cmVzICovCi0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgaXNfcmVnW0JUQV9JRF9NQVhdOyAgICAgLyogcmVnaXN0cmF0aW9uIHN0cnVjdHVyZXMgKi8KKyAgICBib29sICAgICAgICAgICAgICAgICBpc19yZWdbQlRBX0lEX01BWF07ICAgICAvKiByZWdpc3RyYXRpb24gc3RydWN0dXJlcyAqLwogICAgIHRCVEFfU1lTX0hXX1NUQVRFIHN0YXRlOwogICAgIHRCVEFfU1lTX0hXX0NCQUNLICpzeXNfaHdfY2JhY2tbQlRBX1NZU19NQVhfSFdfTU9EVUxFU107ICAgIC8qIGVuYWJsZSBjYWxsYmFjayBmb3IgZWFjaCBIVyBtb2R1bGVzICovCi0gICAgVUlOVDMyICAgICAgICAgICAgICAgICAgc3lzX2h3X21vZHVsZV9hY3RpdmU7ICAgLyogYml0bWFzayBvZiBhbGwgYWN0aXZlIG1vZHVsZXMgKi8KLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBzeXNfZmVhdHVyZXM7ICAgICAgICAgICAvKiBCaXRtYXNrIG9mIHN5cyBmZWF0dXJlcyAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgc3lzX2h3X21vZHVsZV9hY3RpdmU7ICAgLyogYml0bWFzayBvZiBhbGwgYWN0aXZlIG1vZHVsZXMgKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIHN5c19mZWF0dXJlczsgICAgICAgICAgIC8qIEJpdG1hc2sgb2Ygc3lzIGZlYXR1cmVzICovCiAKICAgICB0QlRBX1NZU19DT05OX0NCQUNLICAgICAqcHJtX2NiOyAgICAgICAgICAgICAgICAgLyogcm9sZSBtYW5hZ2VtZW50IGNhbGxiYWNrIHJlZ2lzdGVyZWQgYnkgRE0gKi8KICAgICB0QlRBX1NZU19DT05OX0NCQUNLICAgICAqcHBtX2NiOyAgICAgICAgICAgICAgICAgLyogbG93IHBvd2VyIG1hbmFnZW1lbnQgY2FsbGJhY2sgcmVnaXN0ZXJlZCBieSBETSAqLwpAQCAtODMsNyArODMsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIHN5c3RlbSBtYW5hZ2VyIGNvbnRyb2wgYmxvY2sgKi8KLSNpZiBCVEFfRFlOQU1JQ19NRU1PUlkgPT0gRkFMU0UKKyNpZiAoQlRBX0RZTkFNSUNfTUVNT1JZID09IEZBTFNFKQogZXh0ZXJuIHRCVEFfU1lTX0NCIGJ0YV9zeXNfY2I7CiAjZWxzZQogZXh0ZXJuIHRCVEFfU1lTX0NCICpidGFfc3lzX2NiX3B0cjsKQEAgLTk5LDYgKzk5LDYgQEAKIHZvaWQgYnRhX3N5c19od19ldnRfZGlzYWJsZWQodEJUQV9TWVNfSFdfTVNHICpwX3N5c19od19tc2cpOwogdm9pZCBidGFfc3lzX2h3X2V2dF9zdGFja19lbmFibGVkKHRCVEFfU1lTX0hXX01TRyAqcF9zeXNfaHdfbXNnKTsKIAotQk9PTEVBTiBidGFfc3lzX3NtX2V4ZWN1dGUoQlRfSERSICpwX21zZyk7Citib29sIGJ0YV9zeXNfc21fZXhlY3V0ZShCVF9IRFIgKnBfbXNnKTsKIAogI2VuZGlmIC8qIEJUQV9TWVNfSU5UX0ggKi8KZGlmZiAtLWdpdCBhL2J0YS9zeXMvYnRhX3N5c19tYWluLmMgYi9idGEvc3lzL2J0YV9zeXNfbWFpbi5jCmluZGV4IDMyMDcwM2UuLjE5Mzg1MTkgMTAwNjQ0Ci0tLSBhL2J0YS9zeXMvYnRhX3N5c19tYWluLmMKKysrIGIvYnRhL3N5cy9idGFfc3lzX21haW4uYwpAQCAtNDAsMTIgKzQwLDEyIEBACiAjaW5jbHVkZSAib3NpL2luY2x1ZGUvdGhyZWFkLmgiCiAjaW5jbHVkZSAidXRsLmgiCiAKLSNpZiggZGVmaW5lZCBCVEFfQVJfSU5DTFVERUQgKSAmJiAoQlRBX0FSX0lOQ0xVREVEID09IFRSVUUpCisjaWYoIGRlZmluZWQgQlRBX0FSX0lOQ0xVREVEICkgJiYgKEJUQV9BUl9JTkNMVURFRCA9PSB0cnVlKQogI2luY2x1ZGUgImJ0YV9hcl9hcGkuaCIKICNlbmRpZgogCiAvKiBzeXN0ZW0gbWFuYWdlciBjb250cm9sIGJsb2NrIGRlZmluaXRpb24gKi8KLSNpZiBCVEFfRFlOQU1JQ19NRU1PUlkgPT0gRkFMU0UKKyNpZiAoQlRBX0RZTkFNSUNfTUVNT1JZID09IEZBTFNFKQogdEJUQV9TWVNfQ0IgYnRhX3N5c19jYjsKICNlbmRpZgogCkBAIC01NCw4ICs1NCw4IEBACiAKIC8qIHRyYWNlIGxldmVsICovCiAvKiBUT0RPIEhhcmQtY29kZWQgdHJhY2UgbGV2ZWxzIC0gIE5lZWRzIHRvIGJlIGNvbmZpZ3VyYWJsZSAqLwotVUlOVDggYXBwbF90cmFjZV9sZXZlbCA9IEJUX1RSQUNFX0xFVkVMX1dBUk5JTkc7IC8vQVBQTF9JTklUSUFMX1RSQUNFX0xFVkVMOwotVUlOVDggYnRpZl90cmFjZV9sZXZlbCA9IEJUX1RSQUNFX0xFVkVMX1dBUk5JTkc7Cit1aW50OF90IGFwcGxfdHJhY2VfbGV2ZWwgPSBCVF9UUkFDRV9MRVZFTF9XQVJOSU5HOyAvL0FQUExfSU5JVElBTF9UUkFDRV9MRVZFTDsKK3VpbnQ4X3QgYnRpZl90cmFjZV9sZXZlbCA9IEJUX1RSQUNFX0xFVkVMX1dBUk5JTkc7CiAKIC8vIENvbW11bmljYXRpb24gcXVldWUgYmV0d2VlbiBidHVfdGFzayBhbmQgYnRhLgogZXh0ZXJuIGZpeGVkX3F1ZXVlX3QgKmJ0dV9idGFfbXNnX3F1ZXVlOwpAQCAtMTA0LDcgKzEwNCw3IEBACiAKIAogLyogc3RhdGUgdGFibGUgZm9yIE9GRiBzdGF0ZSAqLwotY29uc3QgVUlOVDggYnRhX3N5c19od19vZmZbXVtCVEFfU1lTX05VTV9DT0xTXSA9Citjb25zdCB1aW50OF90IGJ0YV9zeXNfaHdfb2ZmW11bQlRBX1NZU19OVU1fQ09MU10gPQogewogLyogRXZlbnQgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAxICAgICAgICAgICAgICAgQWN0aW9uIDIgICAgICAgICAgICAgTmV4dCBTdGF0ZSAqLwogLyogQVBJX0VOQUJMRSAgICAqLyAge0JUQV9TWVNfSFdfQVBJX0VOQUJMRSwgICAgQlRBX1NZU19JR05PUkUsICAgICBCVEFfU1lTX0hXX1NUQVJUSU5HfSwKQEAgLTExNSw3ICsxMTUsNyBAQAogLyogRVZUX0VSUk9SICAgICAqLyAge0JUQV9TWVNfSUdOT1JFLCAgICAgICAgICAgQlRBX1NZU19JR05PUkUsICAgICBCVEFfU1lTX0hXX09GRn0KIH07CiAKLWNvbnN0IFVJTlQ4IGJ0YV9zeXNfaHdfc3RhcnRpbmdbXVtCVEFfU1lTX05VTV9DT0xTXSA9Citjb25zdCB1aW50OF90IGJ0YV9zeXNfaHdfc3RhcnRpbmdbXVtCVEFfU1lTX05VTV9DT0xTXSA9CiB7CiAvKiBFdmVudCAgICAgICAgICAgICAgICAgICAgQWN0aW9uIDEgICAgICAgICAgICAgICAgICAgQWN0aW9uIDIgICAgICAgICAgICAgICBOZXh0IFN0YXRlICovCiAvKiBBUElfRU5BQkxFICAgICovICB7QlRBX1NZU19JR05PUkUsICAgICAgICAgICAgICAgQlRBX1NZU19JR05PUkUsICAgICAgICAgQlRBX1NZU19IV19TVEFSVElOR30sIC8qIHdhaXQgZm9yIGNvbXBsZXRpb24gZXZlbnQgKi8KQEAgLTEyNiw3ICsxMjYsNyBAQAogLyogRVZUX0VSUk9SICovICAgICAge0JUQV9TWVNfSFdfRVJST1IsICAgICAgICAgICAgIEJUQV9TWVNfSUdOT1JFLCAgICAgICAgIEJUQV9TWVNfSFdfT059CiB9OwogCi1jb25zdCBVSU5UOCBidGFfc3lzX2h3X29uW11bQlRBX1NZU19OVU1fQ09MU10gPQorY29uc3QgdWludDhfdCBidGFfc3lzX2h3X29uW11bQlRBX1NZU19OVU1fQ09MU10gPQogewogLyogRXZlbnQgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAxICAgICAgICAgICAgICAgICAgIEFjdGlvbiAyICAgICAgICAgICAgICAgTmV4dCBTdGF0ZSAqLwogLyogQVBJX0VOQUJMRSAgICAqLyAge0JUQV9TWVNfSFdfQVBJX0VOQUJMRSwgICAgICAgIEJUQV9TWVNfSUdOT1JFLCAgICAgICAgIEJUQV9TWVNfSFdfT059LApAQCAtMTM3LDcgKzEzNyw3IEBACiAvKiBFVlRfRVJST1IgKi8gICAgICB7QlRBX1NZU19IV19FUlJPUiwgICAgICAgICAgICAgQlRBX1NZU19JR05PUkUsICAgICAgICAgQlRBX1NZU19IV19PTn0KIH07CiAKLWNvbnN0IFVJTlQ4IGJ0YV9zeXNfaHdfc3RvcHBpbmdbXVtCVEFfU1lTX05VTV9DT0xTXSA9Citjb25zdCB1aW50OF90IGJ0YV9zeXNfaHdfc3RvcHBpbmdbXVtCVEFfU1lTX05VTV9DT0xTXSA9CiB7CiAvKiBFdmVudCAgICAgICAgICAgICAgICAgICAgQWN0aW9uIDEgICAgICAgICAgICAgICAgICAgQWN0aW9uIDIgICAgICAgICAgICAgICBOZXh0IFN0YXRlICovCiAvKiBBUElfRU5BQkxFICAgICovICB7QlRBX1NZU19JR05PUkUsICAgICAgICAgICAgICAgQlRBX1NZU19JR05PUkUsICAgICAgICAgQlRBX1NZU19IV19TVEFSVElOR30sIC8qIGNoYW5nZSBzdGF0ZSwgYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24gZXZlbnQgdG8gZW5hYmxlICovCkBAIC0xNDgsNyArMTQ4LDcgQEAKIC8qIEVWVF9FUlJPUiAgICAgKi8gIHtCVEFfU1lTX0hXX0FQSV9ESVNBQkxFLCAgICAgICBCVEFfU1lTX0lHTk9SRSwgICAgICAgICBCVEFfU1lTX0hXX1NUT1BQSU5HfQogfTsKIAotdHlwZWRlZiBjb25zdCBVSU5UOCAoKnRCVEFfU1lTX1NUX1RCTClbQlRBX1NZU19OVU1fQ09MU107Cit0eXBlZGVmIGNvbnN0IHVpbnQ4X3QgKCp0QlRBX1NZU19TVF9UQkwpW0JUQV9TWVNfTlVNX0NPTFNdOwogCiAvKiBzdGF0ZSB0YWJsZSAqLwogY29uc3QgdEJUQV9TWVNfU1RfVEJMIGJ0YV9zeXNfc3RfdGJsW10gPSB7CkBAIC0xODQsNyArMTg0LDcgQEAKICAgICAvKiByZWdpc3RlciBmb3IgQlRNIG5vdGlmaWNhdGlvbnMgKi8KICAgICBCVE1fUmVnaXN0ZXJGb3JEZXZpY2VTdGF0dXNOb3RpZiAoKHRCVE1fREVWX1NUQVRVU19DQiopJmJ0YV9zeXNfaHdfYnRtX2NiYWNrICk7CiAKLSNpZiggZGVmaW5lZCBCVEFfQVJfSU5DTFVERUQgKSAmJiAoQlRBX0FSX0lOQ0xVREVEID09IFRSVUUpCisjaWYoIGRlZmluZWQgQlRBX0FSX0lOQ0xVREVEICkgJiYgKEJUQV9BUl9JTkNMVURFRCA9PSB0cnVlKQogICAgIGJ0YV9hcl9pbml0KCk7CiAjZW5kaWYKIApAQCAtMjA2LDExICsyMDYsMTEgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIGJ0YV9zeXNfc21fZXhlY3V0ZShCVF9IRFIgKnBfbXNnKQorYm9vbCBidGFfc3lzX3NtX2V4ZWN1dGUoQlRfSERSICpwX21zZykKIHsKLSAgICBCT09MRUFOIGZyZWVidWYgPSBUUlVFOworICAgIGJvb2wgZnJlZWJ1ZiA9IHRydWU7CiAgICAgdEJUQV9TWVNfU1RfVEJMICAgICAgc3RhdGVfdGFibGU7Ci0gICAgVUlOVDggICAgICAgICAgICAgICBhY3Rpb247CisgICAgdWludDhfdCAgICAgICAgICAgICAgIGFjdGlvbjsKICAgICBpbnQgICAgICAgICAgICAgICAgIGk7CiAKICAgICBBUFBMX1RSQUNFX0VWRU5UKCJidGFfc3lzX3NtX2V4ZWN1dGUgc3RhdGU6JWQsIGV2ZW50OjB4JXgiLCAgYnRhX3N5c19jYi5zdGF0ZSwgcF9tc2ctPmV2ZW50KTsKQEAgLTI5MiwxNCArMjkyLDE0IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfc3lzX2h3X2Vycm9yKHRCVEFfU1lTX0hXX01TRyAqcF9zeXNfaHdfbXNnKQogewotICAgIFVJTlQ4IG1vZHVsZV9pbmRleDsKKyAgICB1aW50OF90IG1vZHVsZV9pbmRleDsKICAgICBVTlVTRUQocF9zeXNfaHdfbXNnKTsKIAotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKIAogICAgIGZvciAobW9kdWxlX2luZGV4ID0gMDsgbW9kdWxlX2luZGV4IDwgQlRBX1NZU19NQVhfSFdfTU9EVUxFUzsgbW9kdWxlX2luZGV4KyspCiAgICAgewotICAgICAgICBpZiggYnRhX3N5c19jYi5zeXNfaHdfbW9kdWxlX2FjdGl2ZSAmICAoKFVJTlQzMikxIDw8IG1vZHVsZV9pbmRleCApKSB7CisgICAgICAgIGlmKCBidGFfc3lzX2NiLnN5c19od19tb2R1bGVfYWN0aXZlICYgICgodWludDMyX3QpMSA8PCBtb2R1bGVfaW5kZXggKSkgewogICAgICAgICAgICAgc3dpdGNoKCBtb2R1bGVfaW5kZXgpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGNhc2UgQlRBX1NZU19IV19CTFVFVE9PVEg6CkBAIC0zMzMsNyArMzMzLDcgQEAKICAgICBpZiAoKCFidGFfc3lzX2NiLnN5c19od19tb2R1bGVfYWN0aXZlKSAmJiAoYnRhX3N5c19jYi5zdGF0ZSAhPSBCVEFfU1lTX0hXX09OKSkKICAgICB7CiAgICAgICAgIC8qIHJlZ2lzdGVyIHdoaWNoIEhXIG1vZHVsZSB3YXMgdHVybmVkIG9uICovCi0gICAgICAgIGJ0YV9zeXNfY2Iuc3lzX2h3X21vZHVsZV9hY3RpdmUgfD0gICgoVUlOVDMyKTEgPDwgcF9zeXNfaHdfbXNnLT5od19tb2R1bGUgKTsKKyAgICAgICAgYnRhX3N5c19jYi5zeXNfaHdfbW9kdWxlX2FjdGl2ZSB8PSAgKCh1aW50MzJfdCkxIDw8IHBfc3lzX2h3X21zZy0+aHdfbW9kdWxlICk7CiAKICAgICAgICAgdEJUQV9TWVNfSFdfTVNHICpwX21zZyA9CiAgICAgICAgICAgICAodEJUQV9TWVNfSFdfTVNHICopb3NpX21hbGxvYyhzaXplb2YodEJUQV9TWVNfSFdfTVNHKSk7CkBAIC0zNDUsNyArMzQ1LDcgQEAKICAgICBlbHNlCiAgICAgewogICAgICAgICAvKiByZWdpc3RlciB3aGljaCBIVyBtb2R1bGUgd2FzIHR1cm5lZCBvbiAqLwotICAgICAgICBidGFfc3lzX2NiLnN5c19od19tb2R1bGVfYWN0aXZlIHw9ICAoKFVJTlQzMikxIDw8IHBfc3lzX2h3X21zZy0+aHdfbW9kdWxlICk7CisgICAgICAgIGJ0YV9zeXNfY2Iuc3lzX2h3X21vZHVsZV9hY3RpdmUgfD0gICgodWludDMyX3QpMSA8PCBwX3N5c19od19tc2ctPmh3X21vZHVsZSApOwogCiAgICAgICAgIC8qIEhXIGFscmVhZHkgaW4gdXNlLCBzbyBkaXJlY3RseSBub3RpZnkgdGhlIGNhbGxlciAqLwogICAgICAgICBpZiAoYnRhX3N5c19jYi5zeXNfaHdfY2JhY2tbcF9zeXNfaHdfbXNnLT5od19tb2R1bGUgXSE9IE5VTEwgKQpAQCAtMzc3LDcgKzM3Nyw3IEBACiAKIAogICAgIC8qIHJlZ2lzdGVyIHdoaWNoIG1vZHVsZSB3ZSB0dXJuIG9mZiAqLwotICAgIGJ0YV9zeXNfY2Iuc3lzX2h3X21vZHVsZV9hY3RpdmUgJj0gIH4oKFVJTlQzMikxIDw8IHBfc3lzX2h3X21zZy0+aHdfbW9kdWxlICk7CisgICAgYnRhX3N5c19jYi5zeXNfaHdfbW9kdWxlX2FjdGl2ZSAmPSAgfigodWludDMyX3QpMSA8PCBwX3N5c19od19tc2ctPmh3X21vZHVsZSApOwogCiAKICAgICAvKiBpZiB0aGVyZSBhcmUgc3RpbGwgc29tZSBTVyBtb2R1bGVzIHVzaW5nIHRoZSBIVywganVzdCBwcm92aWRlIGFuIGFuc3dlciB0byB0aGUgY2FsbGluZyAqLwpAQCAtNDMwLDcgKzQzMCw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBidGFfc3lzX2h3X2V2dF9kaXNhYmxlZCh0QlRBX1NZU19IV19NU0cgKnBfc3lzX2h3X21zZykKIHsKLSAgICBVSU5UOCBod19tb2R1bGVfaW5kZXg7CisgICAgdWludDhfdCBod19tb2R1bGVfaW5kZXg7CiAKICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfc3lzX2h3X2V2dF9kaXNhYmxlZCAtIG1vZHVsZSAweCVYIiwgcF9zeXNfaHdfbXNnLT5od19tb2R1bGUpOwogCkBAIC00NTMsNyArNDUzLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGJ0YV9zeXNfaHdfZXZ0X3N0YWNrX2VuYWJsZWQodEJUQV9TWVNfSFdfTVNHICpwX3N5c19od19tc2cpCiB7Ci0gICAgVUlOVDggaHdfbW9kdWxlX2luZGV4OworICAgIHVpbnQ4X3QgaHdfbW9kdWxlX2luZGV4OwogICAgIFVOVVNFRChwX3N5c19od19tc2cpOwogCiAgICAgQVBQTF9UUkFDRV9ERUJVRygiIGJ0YV9zeXNfaHdfZXZ0X3N0YWNrX2VuYWJsZWQhbm90aWZ5IHRoZSBjYWxsZXJzIik7CkBAIC00ODAsMTMgKzQ4MCwxMyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYnRhX3N5c19ldmVudChCVF9IRFIgKnBfbXNnKQogewotICAgIFVJTlQ4ICAgICAgIGlkOwotICAgIEJPT0xFQU4gICAgIGZyZWVidWYgPSBUUlVFOworICAgIHVpbnQ4X3QgICAgICAgaWQ7CisgICAgYm9vbCAgICAgZnJlZWJ1ZiA9IHRydWU7CiAKICAgICBBUFBMX1RSQUNFX0VWRU5UKCJCVEEgZ290IGV2ZW50IDB4JXgiLCBwX21zZy0+ZXZlbnQpOwogCiAgICAgLyogZ2V0IHN1YnN5c3RlbSBpZCBmcm9tIGV2ZW50ICovCi0gICAgaWQgPSAoVUlOVDgpIChwX21zZy0+ZXZlbnQgPj4gOCk7CisgICAgaWQgPSAodWludDhfdCkgKHBfbXNnLT5ldmVudCA+PiA4KTsKIAogICAgIC8qIHZlcmlmeSBpZCBhbmQgY2FsbCBzdWJzeXN0ZW0gZXZlbnQgaGFuZGxlciAqLwogICAgIGlmICgoaWQgPCBCVEFfSURfTUFYKSAmJiAoYnRhX3N5c19jYi5yZWdbaWRdICE9IE5VTEwpKQpAQCAtNTE2LDEwICs1MTYsMTAgQEAKICoqIFJldHVybnMgICAgICAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9zeXNfcmVnaXN0ZXIoVUlOVDggaWQsIGNvbnN0IHRCVEFfU1lTX1JFRyAqcF9yZWcpCit2b2lkIGJ0YV9zeXNfcmVnaXN0ZXIodWludDhfdCBpZCwgY29uc3QgdEJUQV9TWVNfUkVHICpwX3JlZykKIHsKICAgICBidGFfc3lzX2NiLnJlZ1tpZF0gPSAodEJUQV9TWVNfUkVHICopIHBfcmVnOwotICAgIGJ0YV9zeXNfY2IuaXNfcmVnW2lkXSA9IFRSVUU7CisgICAgYnRhX3N5c19jYi5pc19yZWdbaWRdID0gdHJ1ZTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTUzMyw5ICs1MzMsOSBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3N5c19kZXJlZ2lzdGVyKFVJTlQ4IGlkKQordm9pZCBidGFfc3lzX2RlcmVnaXN0ZXIodWludDhfdCBpZCkKIHsKLSAgICBidGFfc3lzX2NiLmlzX3JlZ1tpZF0gPSBGQUxTRTsKKyAgICBidGFfc3lzX2NiLmlzX3JlZ1tpZF0gPSBmYWxzZTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU0OSw3ICs1NDksNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJPT0xFQU4gYnRhX3N5c19pc19yZWdpc3RlcihVSU5UOCBpZCkKK2Jvb2wgYnRhX3N5c19pc19yZWdpc3Rlcih1aW50OF90IGlkKQogewogICAgIHJldHVybiBidGFfc3lzX2NiLmlzX3JlZ1tpZF07CiB9CkBAIC02MjgsNyArNjI4LDcgQEAKICAgICB7CiAgICAgICAgIGlmIChidGFfc3lzX2NiLnJlZ1tidGFfaWRdICE9IE5VTEwpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChidGFfc3lzX2NiLmlzX3JlZ1tidGFfaWRdID09IFRSVUUgICYmICBidGFfc3lzX2NiLnJlZ1tidGFfaWRdLT5kaXNhYmxlICE9IE5VTEwpCisgICAgICAgICAgICBpZiAoYnRhX3N5c19jYi5pc19yZWdbYnRhX2lkXSA9PSB0cnVlICAmJiAgYnRhX3N5c19jYi5yZWdbYnRhX2lkXS0+ZGlzYWJsZSAhPSBOVUxMKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICgqYnRhX3N5c19jYi5yZWdbYnRhX2lkXS0+ZGlzYWJsZSkoKTsKICAgICAgICAgICAgIH0KQEAgLTY0NSw3ICs2NDUsNyBAQAogKiogUmV0dXJucyAgICAgICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3N5c19zZXRfdHJhY2VfbGV2ZWwoVUlOVDggbGV2ZWwpCit2b2lkIGJ0YV9zeXNfc2V0X3RyYWNlX2xldmVsKHVpbnQ4X3QgbGV2ZWwpCiB7CiAgICAgYXBwbF90cmFjZV9sZXZlbCA9IGxldmVsOwogfQpAQCAtNjU5LDcgKzY1OSw3IEBACiAqKiBSZXR1cm5zICAgICAgICAgIHN5c19mZWF0dXJlcwogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1VSU5UMTYgYnRhX3N5c19nZXRfc3lzX2ZlYXR1cmVzICh2b2lkKQordWludDE2X3QgYnRhX3N5c19nZXRfc3lzX2ZlYXR1cmVzICh2b2lkKQogewogICAgIHJldHVybiBidGFfc3lzX2NiLnN5c19mZWF0dXJlczsKIH0KZGlmZiAtLWdpdCBhL2J0YS9zeXMvdXRsLmMgYi9idGEvc3lzL3V0bC5jCmluZGV4IGZjM2Q3ZWIuLjYxYjhkNDMgMTAwNjQ0Ci0tLSBhL2J0YS9zeXMvdXRsLmMKKysrIGIvYnRhL3N5cy91dGwuYwpAQCAtMzksOSArMzksOSBAQAogKiogUmV0dXJucyAgICAgICAgICBJbnRlZ2VyIHZhbHVlIG9yIC0xIG9uIGVycm9yLgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1JTlQxNiB1dGxfc3RyMmludChjb25zdCBjaGFyICpwX3MpCitpbnQxNl90IHV0bF9zdHIyaW50KGNvbnN0IGNoYXIgKnBfcykKIHsKLSAgICBJTlQzMiAgIHZhbCA9IDA7CisgICAgaW50MzJfdCAgIHZhbCA9IDA7CiAKICAgICBmb3IgKDsqcF9zID09ICcgJyAmJiAqcF9zICE9IDA7IHBfcysrKTsKIApAQCAtNTEsMTMgKzUxLDEzIEBACiAgICAgewogICAgICAgICBpZiAoKCpwX3MgPCAnMCcpIHx8ICgqcF9zID4gJzknKSkgcmV0dXJuIC0xOwogCi0gICAgICAgIHZhbCArPSAoSU5UMzIpICgqcF9zKysgLSAnMCcpOworICAgICAgICB2YWwgKz0gKGludDMyX3QpICgqcF9zKysgLSAnMCcpOwogCiAgICAgICAgIGlmICh2YWwgPiAzMjc2NykgcmV0dXJuIC0xOwogCiAgICAgICAgIGlmICgqcF9zID09IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoSU5UMTYpIHZhbDsKKyAgICAgICAgICAgIHJldHVybiAoaW50MTZfdCkgdmFsOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewpAQCAtMTExLDcgKzExMSw3IEBACiAqKgogKiogRnVuY3Rpb24gICAgICAgICB1dGxfaXRvYQogKioKLSoqIERlc2NyaXB0aW9uICAgICAgVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIGNvbnZlcnRzIGEgVUlOVDE2IHRvIGEgc3RyaW5nLiAgVGhlCisqKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBjb252ZXJ0cyBhIHVpbnQxNl90IHRvIGEgc3RyaW5nLiAgVGhlCiAqKiAgICAgICAgICAgICAgICAgIHN0cmluZyBpcyBOVUxMLXRlcm1pbmF0ZWQuICBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaXMKICoqICAgICAgICAgICAgICAgICAgcmV0dXJuZWQ7CiAqKgpAQCAtMTE5LDExICsxMTksMTEgQEAKICoqIFJldHVybnMgICAgICAgICAgTGVuZ3RoIG9mIHN0cmluZy4KICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVUlOVDggdXRsX2l0b2EoVUlOVDE2IGksIGNoYXIgKnBfcykKK3VpbnQ4X3QgdXRsX2l0b2EodWludDE2X3QgaSwgY2hhciAqcF9zKQogewotICAgIFVJTlQxNiAgaiwgazsKKyAgICB1aW50MTZfdCAgaiwgazsKICAgICBjaGFyICAgICpwID0gcF9zOwotICAgIEJPT0xFQU4gZmlsbCA9IEZBTFNFOworICAgIGJvb2wgZmlsbCA9IGZhbHNlOwogCiAgICAgaWYgKGkgPT0gMCkKICAgICB7CkBAIC0xMzksMTIgKzEzOSwxMiBAQAogICAgICAgICAgICAgaWYgKGsgPiAwIHx8IGZpbGwpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICpwKysgPSBrICsgJzAnOwotICAgICAgICAgICAgICBmaWxsID0gVFJVRTsKKyAgICAgICAgICAgICAgZmlsbCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgKnAgPSAwOwotICAgIHJldHVybiAoVUlOVDgpIChwIC0gcF9zKTsKKyAgICByZXR1cm4gKHVpbnQ4X3QpIChwIC0gcF9zKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE2MywxNCArMTYzLDE0IEBACiAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfVVRMX1NFVF9DT0RfQUxMIC0gb3ZlcndyaXRlIG1ham9yLCBtaW5vciwgc2V0IHRoZSBiaXRzIGluIHNlcnZpY2UgY2xhc3MKICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9VVExfSU5JVF9DT0QgLSBvdmVyd3JpdGUgbWFqb3IsIG1pbm9yLCBhbmQgc2VydmljZSBjbGFzcwogKioKLSoqIFJldHVybnMgICAgICAgICAgVFJVRSBpZiBzdWNjZXNzZnVsLCBPdGhlcndpc2UgRkFMU0UKKyoqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzdWNjZXNzZnVsLCBPdGhlcndpc2UgZmFsc2UKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQk9PTEVBTiB1dGxfc2V0X2RldmljZV9jbGFzcyh0QlRBX1VUTF9DT0QgKnBfY29kLCBVSU5UOCBjbWQpCitib29sIHV0bF9zZXRfZGV2aWNlX2NsYXNzKHRCVEFfVVRMX0NPRCAqcF9jb2QsIHVpbnQ4X3QgY21kKQogewotICAgIFVJTlQ4ICpkZXY7Ci0gICAgVUlOVDE2IHNlcnZpY2U7Ci0gICAgVUlOVDggIG1pbm9yLCBtYWpvcjsKKyAgICB1aW50OF90ICpkZXY7CisgICAgdWludDE2X3Qgc2VydmljZTsKKyAgICB1aW50OF90ICBtaW5vciwgbWFqb3I7CiAgICAgREVWX0NMQVNTIGRldl9jbGFzczsKIAogICAgIGRldiA9IEJUTV9SZWFkRGV2aWNlQ2xhc3MoKTsKQEAgLTIxMCwxNiArMjEwLDE2IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyogY29udmVydCB0aGUgZmllbGRzIGludG8gdGhlIGRldmljZSBjbGFzcyB0eXBlICovCiAgICAgRklFTERTX1RPX0NPRChkZXZfY2xhc3MsIG1pbm9yLCBtYWpvciwgc2VydmljZSk7CiAKICAgICBpZiAoQlRNX1NldERldmljZUNsYXNzKGRldl9jbGFzcykgPT0gQlRNX1NVQ0NFU1MpCi0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMzAsMjAgKzIzMCwyMCBAQAogKiogICAgICAgICAgICAgICAgICBpbnRlZ2VyIHN0cmluZyBvciBub3QKICoqCiAqKgotKiogUmV0dXJucyAgICAgICAgICBUUlVFIGlmIHN1Y2Nlc3NmdWwsIE90aGVyd2lzZSBGQUxTRQorKiogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHN1Y2Nlc3NmdWwsIE90aGVyd2lzZSBmYWxzZQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIHV0bF9pc2ludHN0cihjb25zdCBjaGFyICpwX3MpCitib29sIHV0bF9pc2ludHN0cihjb25zdCBjaGFyICpwX3MpCiB7Ci0gICAgVUlOVDE2IGkgPSAwOworICAgIHVpbnQxNl90IGkgPSAwOwogCiAgICAgZm9yKGk9MDsgcF9zW2ldICE9IDA7IGkrKykKICAgICB7CiAgICAgICAgIGlmKCgocF9zW2ldIDwgJzAnKSB8fCAocF9zW2ldID4gJzknKSkgJiYgKHBfc1tpXSAhPSAnOycpKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjU0LDEyICsyNTQsMTIgQEAKICoqICAgICAgICAgICAgICAgICAgb25seSBkaWFsIGRpZ2l0cyBvciBub3QKICoqCiAqKgotKiogUmV0dXJucyAgICAgICAgICBUUlVFIGlmIHN1Y2Nlc3NmdWwsIE90aGVyd2lzZSBGQUxTRQorKiogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHN1Y2Nlc3NmdWwsIE90aGVyd2lzZSBmYWxzZQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CT09MRUFOIHV0bF9pc2RpYWxzdHIoY29uc3QgY2hhciAqcF9zKQorYm9vbCB1dGxfaXNkaWFsc3RyKGNvbnN0IGNoYXIgKnBfcykKIHsKLSAgICBVSU5UMTYgaSA9IDA7CisgICAgdWludDE2X3QgaSA9IDA7CiAKICAgICBmb3IoaT0wOyBwX3NbaV0gIT0gMDsgaSsrKQogICAgIHsKQEAgLTI2OCwxMCArMjY4LDEwIEBACiAgICAgICAgICAgICB8fCAoKHBfc1tpXSA+PSAnQScpICYmIChwX3NbaV0gPD0gJ0MnKSkKICAgICAgICAgICAgIHx8ICgocF9zW2ldID09ICdwJykgfHwgKHBfc1tpXSA9PSAnUCcpCiAgICAgICAgICAgICB8fCAocF9zW2ldID09ICd3JykgfHwgKHBfc1tpXSA9PSAnVycpKSkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIAo=