ZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lL2Y4L2Y4MWUyMGRlZDU1N2UxMGEyZjgxNTk2MDI4Y2FlNzcwYjNkYTY1ZjEuc3ZuLWJhc2UgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS9mOC9mODFlMjBkZWQ1NTdlMTBhMmY4MTU5NjAyOGNhZTc3MGIzZGE2NWYxLnN2bi1iYXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2OTU5NzMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS9mOC9mODFlMjBkZWQ1NTdlMTBhMmY4MTU5NjAyOGNhZTc3MGIzZGE2NWYxLnN2bi1iYXNlCkBAIC0wLDAgKzEsMTQ5NyBAQAorLyogJElkJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwam5hdGgvc3R1bl9zZXNzaW9uLmg+CisjaW5jbHVkZSA8cGpuYXRoL2Vycm5vLmg+CisjaW5jbHVkZSA8cGpsaWIuaD4KKworc3RydWN0IHBqX3N0dW5fc2Vzc2lvbgoreworICAgIHBqX3N0dW5fY29uZmlnCSpjZmc7CisgICAgcGpfcG9vbF90CQkqcG9vbDsKKyAgICBwal9ncnBfbG9ja190CSpncnBfbG9jazsKKyAgICBwal9zdHVuX3Nlc3Npb25fY2IJIGNiOworICAgIHZvaWQJCSp1c2VyX2RhdGE7CisgICAgcGpfYm9vbF90CQkgaXNfZGVzdHJveWluZzsKKworICAgIHBqX2Jvb2xfdAkJIHVzZV9maW5nZXJwcmludDsKKworICAgIHBqX3Bvb2xfdAkJKnJ4X3Bvb2w7CisKKyNpZiBQSl9MT0dfTUFYX0xFVkVMID49IDUKKyAgICBjaGFyCQkgZHVtcF9idWZbMTAwMF07CisjZW5kaWYKKyAgICB1bnNpZ25lZAkJIGxvZ19mbGFnOworCisgICAgcGpfc3R1bl9hdXRoX3R5cGUJIGF1dGhfdHlwZTsKKyAgICBwal9zdHVuX2F1dGhfY3JlZAkgY3JlZDsKKyAgICBpbnQJCQkgYXV0aF9yZXRyeTsKKyAgICBwal9zdHJfdAkJIG5leHRfbm9uY2U7CisgICAgcGpfc3RyX3QJCSBzZXJ2ZXJfcmVhbG07CisKKyAgICBwal9zdHJfdAkJIHNydl9uYW1lOworCisgICAgcGpfc3R1bl90eF9kYXRhCSBwZW5kaW5nX3JlcXVlc3RfbGlzdDsKKyAgICBwal9zdHVuX3R4X2RhdGEJIGNhY2hlZF9yZXNwb25zZV9saXN0OworfTsKKworI2RlZmluZSBTTkFNRShzXykJCSAgICAoKHNfKS0+cG9vbC0+b2JqX25hbWUpCisjZGVmaW5lIFRISVNfRklMRQkJICAgICJzdHVuX3Nlc3Npb24uYyIKKworI2lmIDEKKyMgICBkZWZpbmUgVFJBQ0VfKGV4cHIpCQkgICAgUEpfTE9HKDUsZXhwcikKKyNlbHNlCisjICAgZGVmaW5lIFRSQUNFXyhleHByKQorI2VuZGlmCisKKyNkZWZpbmUgTE9HX0VSUl8oc2Vzcyx0aXRsZSxyYykgUEpfUEVSUk9SKDMsKHNlc3MtPnBvb2wtPm9ial9uYW1lLHJjLHRpdGxlKSkKKworI2RlZmluZSBUREFUQV9QT09MX1NJWkUJCSAgICBQSk5BVEhfUE9PTF9MRU5fU1RVTl9UREFUQQorI2RlZmluZSBUREFUQV9QT09MX0lOQwkJICAgIFBKTkFUSF9QT09MX0lOQ19TVFVOX1REQVRBCisKKworc3RhdGljIHZvaWQgc3R1bl90c3hfb25fY29tcGxldGUocGpfc3R1bl9jbGllbnRfdHN4ICp0c3gsCisJCQkJIHBqX3N0YXR1c190IHN0YXR1cywgCisJCQkJIGNvbnN0IHBqX3N0dW5fbXNnICpyZXNwb25zZSwKKwkJCQkgY29uc3QgcGpfc29ja2FkZHJfdCAqc3JjX2FkZHIsCisJCQkJIHVuc2lnbmVkIHNyY19hZGRyX2xlbik7CitzdGF0aWMgcGpfc3RhdHVzX3Qgc3R1bl90c3hfb25fc2VuZF9tc2cocGpfc3R1bl9jbGllbnRfdHN4ICp0c3gsCisJCQkJCWNvbnN0IHZvaWQgKnN0dW5fcGt0LAorCQkJCQlwal9zaXplX3QgcGt0X3NpemUpOworc3RhdGljIHZvaWQgc3R1bl90c3hfb25fZGVzdHJveShwal9zdHVuX2NsaWVudF90c3ggKnRzeCk7CitzdGF0aWMgdm9pZCBzdHVuX3Nlc3Nfb25fZGVzdHJveSh2b2lkICpjb21wKTsKKworc3RhdGljIHBqX3N0dW5fdHN4X2NiIHRzeF9jYiA9IAoreworICAgICZzdHVuX3RzeF9vbl9jb21wbGV0ZSwKKyAgICAmc3R1bl90c3hfb25fc2VuZF9tc2csCisgICAgJnN0dW5fdHN4X29uX2Rlc3Ryb3kKK307CisKKworc3RhdGljIHBqX3N0YXR1c190IHRzeF9hZGQocGpfc3R1bl9zZXNzaW9uICpzZXNzLAorCQkJICAgcGpfc3R1bl90eF9kYXRhICp0ZGF0YSkKK3sKKyAgICBwal9saXN0X3B1c2hfZnJvbnQoJnNlc3MtPnBlbmRpbmdfcmVxdWVzdF9saXN0LCB0ZGF0YSk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCB0c3hfZXJhc2UocGpfc3R1bl9zZXNzaW9uICpzZXNzLAorCQkJICAgICBwal9zdHVuX3R4X2RhdGEgKnRkYXRhKQoreworICAgIFBKX1VOVVNFRF9BUkcoc2Vzcyk7CisgICAgcGpfbGlzdF9lcmFzZSh0ZGF0YSk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBwal9zdHVuX3R4X2RhdGEqIHRzeF9sb29rdXAocGpfc3R1bl9zZXNzaW9uICpzZXNzLAorCQkJCSAgIGNvbnN0IHBqX3N0dW5fbXNnICptc2cpCit7CisgICAgcGpfc3R1bl90eF9kYXRhICp0ZGF0YTsKKworICAgIHRkYXRhID0gc2Vzcy0+cGVuZGluZ19yZXF1ZXN0X2xpc3QubmV4dDsKKyAgICB3aGlsZSAodGRhdGEgIT0gJnNlc3MtPnBlbmRpbmdfcmVxdWVzdF9saXN0KSB7CisJcGpfYXNzZXJ0KHNpemVvZih0ZGF0YS0+bXNnX2tleSk9PXNpemVvZihtc2ctPmhkci50c3hfaWQpKTsKKwlpZiAodGRhdGEtPm1zZ19tYWdpYyA9PSBtc2ctPmhkci5tYWdpYyAmJgorCSAgICBwal9tZW1jbXAodGRhdGEtPm1zZ19rZXksIG1zZy0+aGRyLnRzeF9pZCwgCisJCSAgICAgIHNpemVvZihtc2ctPmhkci50c3hfaWQpKT09MCkKKwl7CisJICAgIHJldHVybiB0ZGF0YTsKKwl9CisJdGRhdGEgPSB0ZGF0YS0+bmV4dDsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHBqX3N0YXR1c190IGNyZWF0ZV90ZGF0YShwal9zdHVuX3Nlc3Npb24gKnNlc3MsCisJCQkgICAgICAgIHBqX3N0dW5fdHhfZGF0YSAqKnBfdGRhdGEpCit7CisgICAgcGpfcG9vbF90ICpwb29sOworICAgIHBqX3N0dW5fdHhfZGF0YSAqdGRhdGE7CisKKyAgICAvKiBDcmVhdGUgcG9vbCBhbmQgaW5pdGlhbGl6ZSBiYXNpYyB0ZGF0YSBhdHRyaWJ1dGVzICovCisgICAgcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKHNlc3MtPmNmZy0+cGYsICJ0ZGF0YSVwIiwgCisJCQkgIFREQVRBX1BPT0xfU0laRSwgVERBVEFfUE9PTF9JTkMsIE5VTEwpOworICAgIFBKX0FTU0VSVF9SRVRVUk4ocG9vbCwgUEpfRU5PTUVNKTsKKworICAgIHRkYXRhID0gUEpfUE9PTF9aQUxMT0NfVChwb29sLCBwal9zdHVuX3R4X2RhdGEpOworICAgIHRkYXRhLT5wb29sID0gcG9vbDsKKyAgICB0ZGF0YS0+c2VzcyA9IHNlc3M7CisKKyAgICBwal9saXN0X2luaXQodGRhdGEpOworCisgICAgKnBfdGRhdGEgPSB0ZGF0YTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBzdHVuX3RzeF9vbl9kZXN0cm95KHBqX3N0dW5fY2xpZW50X3RzeCAqdHN4KQoreworICAgIHBqX3N0dW5fdHhfZGF0YSAqdGRhdGE7CisKKyAgICB0ZGF0YSA9IChwal9zdHVuX3R4X2RhdGEqKSBwal9zdHVuX2NsaWVudF90c3hfZ2V0X2RhdGEodHN4KTsKKyAgICBwal9zdHVuX2NsaWVudF90c3hfc3RvcCh0c3gpOworICAgIGlmICh0ZGF0YSkgeworCXRzeF9lcmFzZSh0ZGF0YS0+c2VzcywgdGRhdGEpOworCXBqX3Bvb2xfcmVsZWFzZSh0ZGF0YS0+cG9vbCk7CisgICAgfQorCisgICAgVFJBQ0VfKChUSElTX0ZJTEUsICJTVFVOIHRyYW5zYWN0aW9uICVwIGRlc3Ryb3llZCIsIHRzeCkpOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X3RkYXRhKHBqX3N0dW5fdHhfZGF0YSAqdGRhdGEsIHBqX2Jvb2xfdCBmb3JjZSkKK3sKKyAgICBUUkFDRV8oKFRISVNfRklMRSwgInRkYXRhICVwIGRlc3Ryb3kgcmVxdWVzdCwgZm9yY2U9JWQsIHRzeD0lcCIsIHRkYXRhLAorCSAgICBmb3JjZSwgdGRhdGEtPmNsaWVudF90c3gpKTsKKworICAgIGlmICh0ZGF0YS0+cmVzX3RpbWVyLmlkICE9IFBKX0ZBTFNFKSB7CisJcGpfdGltZXJfaGVhcF9jYW5jZWxfaWZfYWN0aXZlKHRkYXRhLT5zZXNzLT5jZmctPnRpbWVyX2hlYXAsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZGF0YS0+cmVzX3RpbWVyLCBQSl9GQUxTRSk7CisJcGpfbGlzdF9lcmFzZSh0ZGF0YSk7CisgICAgfQorCisgICAgaWYgKGZvcmNlKSB7CisJcGpfbGlzdF9lcmFzZSh0ZGF0YSk7CisJaWYgKHRkYXRhLT5jbGllbnRfdHN4KSB7CisJICAgIHBqX3N0dW5fY2xpZW50X3RzeF9zdG9wKHRkYXRhLT5jbGllbnRfdHN4KTsKKwkgICAgcGpfc3R1bl9jbGllbnRfdHN4X3NldF9kYXRhKHRkYXRhLT5jbGllbnRfdHN4LCBOVUxMKTsKKwl9CisJcGpfcG9vbF9yZWxlYXNlKHRkYXRhLT5wb29sKTsKKworICAgIH0gZWxzZSB7CisJaWYgKHRkYXRhLT5jbGllbnRfdHN4KSB7CisJICAgIC8qICJQcm9iYWJseSIgdGhpcyBpcyB0byBhYnNvcmIgcmV0cmFuc21pc3Npb24gKi8KKwkgICAgcGpfdGltZV92YWwgZGVsYXkgPSB7MCwgMzAwfTsKKwkgICAgcGpfc3R1bl9jbGllbnRfdHN4X3NjaGVkdWxlX2Rlc3Ryb3kodGRhdGEtPmNsaWVudF90c3gsICZkZWxheSk7CisKKwl9IGVsc2UgeworCSAgICBwal9wb29sX3JlbGVhc2UodGRhdGEtPnBvb2wpOworCX0KKyAgICB9Cit9CisKKy8qCisgKiBEZXN0cm95IHRoZSB0cmFuc21pdCBkYXRhLgorICovCitQSl9ERUYodm9pZCkgcGpfc3R1bl9tc2dfZGVzdHJveV90ZGF0YSggcGpfc3R1bl9zZXNzaW9uICpzZXNzLAorCQkJCQlwal9zdHVuX3R4X2RhdGEgKnRkYXRhKQoreworICAgIFBKX1VOVVNFRF9BUkcoc2Vzcyk7CisgICAgZGVzdHJveV90ZGF0YSh0ZGF0YSwgUEpfRkFMU0UpOworfQorCisKKy8qIFRpbWVyIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGl0J3MgdGltZSB0byBkZXN0cm95IHJlc3BvbnNlIGNhY2hlICovCitzdGF0aWMgdm9pZCBvbl9jYWNoZV90aW1lb3V0KHBqX3RpbWVyX2hlYXBfdCAqdGltZXJfaGVhcCwKKwkJCSAgICAgc3RydWN0IHBqX3RpbWVyX2VudHJ5ICplbnRyeSkKK3sKKyAgICBwal9zdHVuX3R4X2RhdGEgKnRkYXRhOworCisgICAgUEpfVU5VU0VEX0FSRyh0aW1lcl9oZWFwKTsKKworICAgIGVudHJ5LT5pZCA9IFBKX0ZBTFNFOworICAgIHRkYXRhID0gKHBqX3N0dW5fdHhfZGF0YSopIGVudHJ5LT51c2VyX2RhdGE7CisKKyAgICBQSl9MT0coNSwoU05BTUUodGRhdGEtPnNlc3MpLCAiUmVzcG9uc2UgY2FjaGUgZGVsZXRlZCIpKTsKKworICAgIHBqX2xpc3RfZXJhc2UodGRhdGEpOworICAgIGRlc3Ryb3lfdGRhdGEodGRhdGEsIFBKX0ZBTFNFKTsKK30KKworc3RhdGljIHBqX3N0YXR1c190IGFwcGx5X21zZ19vcHRpb25zKHBqX3N0dW5fc2Vzc2lvbiAqc2VzcywKKwkJCQkgICAgIHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkgICAgIGNvbnN0IHBqX3N0dW5fcmVxX2NyZWRfaW5mbyAqYXV0aF9pbmZvLAorCQkJCSAgICAgcGpfc3R1bl9tc2cgKm1zZykKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXMgPSAwOworICAgIHBqX3N0cl90IHJlYWxtLCB1c2VybmFtZSwgbm9uY2UsIGF1dGhfa2V5OworCisgICAgLyogSWYgdGhlIGFnZW50IGlzIHNlbmRpbmcgYSByZXF1ZXN0LCBpdCBTSE9VTEQgYWRkIGEgU09GVFdBUkUgYXR0cmlidXRlCisgICAgICogdG8gdGhlIHJlcXVlc3QuIFRoZSBzZXJ2ZXIgU0hPVUxEIGluY2x1ZGUgYSBTT0ZUV0FSRSBhdHRyaWJ1dGUgaW4gYWxsIAorICAgICAqIHJlc3BvbnNlcy4KKyAgICAgKgorICAgICAqIElmIG1hZ2ljIHZhbHVlIGlzIG5vdCBQSl9TVFVOX01BR0lDLCBvbmx5IGFwcGx5IHRoZSBhdHRyaWJ1dGUgZm9yCisgICAgICogcmVzcG9uc2VzLgorICAgICAqLworICAgIGlmIChzZXNzLT5zcnZfbmFtZS5zbGVuICYmIAorCXBqX3N0dW5fbXNnX2ZpbmRfYXR0cihtc2csIFBKX1NUVU5fQVRUUl9TT0ZUV0FSRSwgMCk9PU5VTEwgJiYKKwkoUEpfU1RVTl9JU19SRVNQT05TRShtc2ctPmhkci50eXBlKSB8fAorCSAoUEpfU1RVTl9JU19SRVFVRVNUKG1zZy0+aGRyLnR5cGUpICYmIG1zZy0+aGRyLm1hZ2ljPT1QSl9TVFVOX01BR0lDKSkpIAorICAgIHsKKwlwal9zdHVuX21zZ19hZGRfc3RyaW5nX2F0dHIocG9vbCwgbXNnLCBQSl9TVFVOX0FUVFJfU09GVFdBUkUsCisJCQkJICAgICZzZXNzLT5zcnZfbmFtZSk7CisgICAgfQorCisgICAgaWYgKHBqX3N0dW5fYXV0aF92YWxpZF9mb3JfbXNnKG1zZykgJiYgYXV0aF9pbmZvKSB7CisJcmVhbG0gPSBhdXRoX2luZm8tPnJlYWxtOworCXVzZXJuYW1lID0gYXV0aF9pbmZvLT51c2VybmFtZTsKKwlub25jZSA9IGF1dGhfaW5mby0+bm9uY2U7CisJYXV0aF9rZXkgPSBhdXRoX2luZm8tPmF1dGhfa2V5OworICAgIH0gZWxzZSB7CisJcmVhbG0uc2xlbiA9IHVzZXJuYW1lLnNsZW4gPSBub25jZS5zbGVuID0gYXV0aF9rZXkuc2xlbiA9IDA7CisgICAgfQorCisgICAgLyogQ3JlYXRlIGFuZCBhZGQgVVNFUk5BTUUgYXR0cmlidXRlIGlmIG5lZWRlZCAqLworICAgIGlmICh1c2VybmFtZS5zbGVuICYmIFBKX1NUVU5fSVNfUkVRVUVTVChtc2ctPmhkci50eXBlKSkgeworCXN0YXR1cyA9IHBqX3N0dW5fbXNnX2FkZF9zdHJpbmdfYXR0cihwb29sLCBtc2csCisJCQkJCSAgICAgUEpfU1RVTl9BVFRSX1VTRVJOQU1FLAorCQkJCQkgICAgICZ1c2VybmFtZSk7CisJUEpfQVNTRVJUX1JFVFVSTihzdGF0dXM9PVBKX1NVQ0NFU1MsIHN0YXR1cyk7CisgICAgfQorCisgICAgLyogQWRkIFJFQUxNIG9ubHkgd2hlbiBsb25nIHRlcm0gY3JlZGVudGlhbCBpcyB1c2VkICovCisgICAgaWYgKHJlYWxtLnNsZW4gJiYgIFBKX1NUVU5fSVNfUkVRVUVTVChtc2ctPmhkci50eXBlKSkgeworCXN0YXR1cyA9IHBqX3N0dW5fbXNnX2FkZF9zdHJpbmdfYXR0cihwb29sLCBtc2csCisJCQkJCSAgICBQSl9TVFVOX0FUVFJfUkVBTE0sCisJCQkJCSAgICAmcmVhbG0pOworCVBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzPT1QSl9TVUNDRVNTLCBzdGF0dXMpOworICAgIH0KKworICAgIC8qIEFkZCBOT05DRSB3aGVuIGRlc2lyZWQgKi8KKyAgICBpZiAobm9uY2Uuc2xlbiAmJiAKKwkoUEpfU1RVTl9JU19SRVFVRVNUKG1zZy0+aGRyLnR5cGUpIHx8CisJIFBKX1NUVU5fSVNfRVJST1JfUkVTUE9OU0UobXNnLT5oZHIudHlwZSkpKSAKKyAgICB7CisJc3RhdHVzID0gcGpfc3R1bl9tc2dfYWRkX3N0cmluZ19hdHRyKHBvb2wsIG1zZywKKwkJCQkJICAgIFBKX1NUVU5fQVRUUl9OT05DRSwKKwkJCQkJICAgICZub25jZSk7CisgICAgfQorCisgICAgLyogQWRkIE1FU1NBR0UtSU5URUdSSVRZIGF0dHJpYnV0ZSAqLworICAgIGlmICh1c2VybmFtZS5zbGVuICYmIGF1dGhfa2V5LnNsZW4pIHsKKwlzdGF0dXMgPSBwal9zdHVuX21zZ19hZGRfbXNnaW50X2F0dHIocG9vbCwgbXNnKTsKKwlQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cz09UEpfU1VDQ0VTUywgc3RhdHVzKTsKKyAgICB9CisKKworICAgIC8qIEFkZCBGSU5HRVJQUklOVCBhdHRyaWJ1dGUgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKHNlc3MtPnVzZV9maW5nZXJwcmludCkgeworCXN0YXR1cyA9IHBqX3N0dW5fbXNnX2FkZF91aW50X2F0dHIocG9vbCwgbXNnLCAKKwkJCQkJICBQSl9TVFVOX0FUVFJfRklOR0VSUFJJTlQsIDApOworCVBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzPT1QSl9TVUNDRVNTLCBzdGF0dXMpOworICAgIH0KKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgaGFuZGxlX2F1dGhfY2hhbGxlbmdlKHBqX3N0dW5fc2Vzc2lvbiAqc2VzcywKKwkJCQkJIGNvbnN0IHBqX3N0dW5fdHhfZGF0YSAqcmVxdWVzdCwKKwkJCQkJIGNvbnN0IHBqX3N0dW5fbXNnICpyZXNwb25zZSwKKwkJCQkJIGNvbnN0IHBqX3NvY2thZGRyX3QgKnNyY19hZGRyLAorCQkJCQkgdW5zaWduZWQgc3JjX2FkZHJfbGVuLAorCQkJCQkgcGpfYm9vbF90ICpub3RpZnlfdXNlcikKK3sKKyAgICBjb25zdCBwal9zdHVuX2VycmNvZGVfYXR0ciAqZWE7CisKKyAgICAqbm90aWZ5X3VzZXIgPSBQSl9UUlVFOworCisgICAgaWYgKHJlc3BvbnNlPT1OVUxMKQorCXJldHVybiBQSl9TVUNDRVNTOworCisgICAgaWYgKHNlc3MtPmF1dGhfdHlwZSAhPSBQSl9TVFVOX0FVVEhfTE9OR19URVJNKQorCXJldHVybiBQSl9TVUNDRVNTOworICAgIAorICAgIGlmICghUEpfU1RVTl9JU19FUlJPUl9SRVNQT05TRShyZXNwb25zZS0+aGRyLnR5cGUpKSB7CisJc2Vzcy0+YXV0aF9yZXRyeSA9IDA7CisJcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgfQorCisgICAgZWEgPSAoY29uc3QgcGpfc3R1bl9lcnJjb2RlX2F0dHIqKQorCSBwal9zdHVuX21zZ19maW5kX2F0dHIocmVzcG9uc2UsIFBKX1NUVU5fQVRUUl9FUlJPUl9DT0RFLCAwKTsKKyAgICBpZiAoIWVhKSB7CisJUEpfTE9HKDQsKFNOQU1FKHNlc3MpLCAiSW52YWxpZCBlcnJvciByZXNwb25zZTogbm8gRVJST1ItQ09ERSIKKwkJICAiIGF0dHJpYnV0ZSIpKTsKKwkqbm90aWZ5X3VzZXIgPSBQSl9GQUxTRTsKKwlyZXR1cm4gUEpOQVRIX0VJTlNUVU5NU0c7CisgICAgfQorCisgICAgaWYgKGVhLT5lcnJfY29kZSA9PSBQSl9TVFVOX1NDX1VOQVVUSE9SSVpFRCB8fCAKKwllYS0+ZXJyX2NvZGUgPT0gUEpfU1RVTl9TQ19TVEFMRV9OT05DRSkKKyAgICB7CisJY29uc3QgcGpfc3R1bl9ub25jZV9hdHRyICphbm9uY2U7CisJY29uc3QgcGpfc3R1bl9yZWFsbV9hdHRyICphcmVhbG07CisJcGpfc3R1bl90eF9kYXRhICp0ZGF0YTsKKwl1bnNpZ25lZCBpOworCXBqX3N0YXR1c190IHN0YXR1czsKKworCWFub25jZSA9IChjb25zdCBwal9zdHVuX25vbmNlX2F0dHIqKQorCQkgcGpfc3R1bl9tc2dfZmluZF9hdHRyKHJlc3BvbnNlLCBQSl9TVFVOX0FUVFJfTk9OQ0UsIDApOworCWlmICghYW5vbmNlKSB7CisJICAgIFBKX0xPRyg0LChTTkFNRShzZXNzKSwgIkludmFsaWQgcmVzcG9uc2U6IG1pc3NpbmcgTk9OQ0UiKSk7CisJICAgICpub3RpZnlfdXNlciA9IFBKX0ZBTFNFOworCSAgICByZXR1cm4gUEpOQVRIX0VJTlNUVU5NU0c7CisJfQorCisJLyogQmFpbCBvdXQgaWYgd2UndmUgc3VwcGxpZWQgdGhlIGNvcnJlY3Qgbm9uY2UgKi8KKwlpZiAocGpfc3RyY21wKCZhbm9uY2UtPnZhbHVlLCAmc2Vzcy0+bmV4dF9ub25jZSk9PTApIHsKKwkgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisJfQorCisJLyogQmFpbCBvdXQgaWYgd2UndmUgdHJpZWQgdG9vIG1hbnkgKi8KKwlpZiAoKytzZXNzLT5hdXRoX3JldHJ5ID4gMykgeworCSAgICBQSl9MT0coNCwoU05BTUUoc2VzcyksICJFcnJvcjogYXV0aGVudGljYXRpb24gZmFpbGVkICh0b28gIgorCQkgICAgICAibWFueSByZXRyaWVzKSIpKTsKKwkgICAgcmV0dXJuIFBKX1NUQVRVU19GUk9NX1NUVU5fQ09ERSg0MDEpOworCX0KKworCS8qIFNhdmUgbmV4dF9ub25jZSAqLworCXBqX3N0cmR1cChzZXNzLT5wb29sLCAmc2Vzcy0+bmV4dF9ub25jZSwgJmFub25jZS0+dmFsdWUpOworCisJLyogQ29weSB0aGUgcmVhbG0gZnJvbSB0aGUgcmVzcG9uc2UgKi8KKwlhcmVhbG0gPSAocGpfc3R1bl9yZWFsbV9hdHRyKikKKwkJIHBqX3N0dW5fbXNnX2ZpbmRfYXR0cihyZXNwb25zZSwgUEpfU1RVTl9BVFRSX1JFQUxNLCAwKTsKKwlpZiAoYXJlYWxtKSB7CisJICAgIHBqX3N0cmR1cChzZXNzLT5wb29sLCAmc2Vzcy0+c2VydmVyX3JlYWxtLCAmYXJlYWxtLT52YWx1ZSk7CisJICAgIHdoaWxlIChzZXNzLT5zZXJ2ZXJfcmVhbG0uc2xlbiAmJgorCQkgICAgIXNlc3MtPnNlcnZlcl9yZWFsbS5wdHJbc2Vzcy0+c2VydmVyX3JlYWxtLnNsZW4tMV0pCisJICAgIHsKKwkJLS1zZXNzLT5zZXJ2ZXJfcmVhbG0uc2xlbjsKKwkgICAgfQorCX0KKworCS8qIENyZWF0ZSBuZXcgcmVxdWVzdCAqLworCXN0YXR1cyA9IHBqX3N0dW5fc2Vzc2lvbl9jcmVhdGVfcmVxKHNlc3MsIHJlcXVlc3QtPm1zZy0+aGRyLnR5cGUsCisJCQkJCSAgICByZXF1ZXN0LT5tc2ctPmhkci5tYWdpYywKKwkJCQkJICAgIE5VTEwsICZ0ZGF0YSk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICByZXR1cm4gc3RhdHVzOworCisJLyogRHVwbGljYXRlIGFsbCB0aGUgYXR0cmlidXRlcyBpbiB0aGUgb2xkIHJlcXVlc3QsIGV4Y2VwdAorCSAqIFVTRVJOQU1FLCBSRUFMTSwgTS1JLCBhbmQgTk9OQ0UsIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluCisJICogbGF0ZXIuCisJICovCisJZm9yIChpPTA7IGk8cmVxdWVzdC0+bXNnLT5hdHRyX2NvdW50OyArK2kpIHsKKwkgICAgY29uc3QgcGpfc3R1bl9hdHRyX2hkciAqYXNyYyA9IHJlcXVlc3QtPm1zZy0+YXR0cltpXTsKKworCSAgICBpZiAoYXNyYy0+dHlwZSA9PSBQSl9TVFVOX0FUVFJfVVNFUk5BTUUgfHwKKwkJYXNyYy0+dHlwZSA9PSBQSl9TVFVOX0FUVFJfUkVBTE0gfHwKKwkJYXNyYy0+dHlwZSA9PSBQSl9TVFVOX0FUVFJfTUVTU0FHRV9JTlRFR1JJVFkgfHwKKwkJYXNyYy0+dHlwZSA9PSBQSl9TVFVOX0FUVFJfTk9OQ0UpCisJICAgIHsKKwkJY29udGludWU7CisJICAgIH0KKworCSAgICB0ZGF0YS0+bXNnLT5hdHRyW3RkYXRhLT5tc2ctPmF0dHJfY291bnQrK10gPSAKKwkJcGpfc3R1bl9hdHRyX2Nsb25lKHRkYXRhLT5wb29sLCBhc3JjKTsKKwl9CisKKwkvKiBXaWxsIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggYXV0aGVudGljYXRpb24sIG5vIG5lZWQgdG8KKwkgKiBub3RpZnkgdXNlci4KKwkgKi8KKwkqbm90aWZ5X3VzZXIgPSBQSl9GQUxTRTsKKworCVBKX0xPRyg0LChTTkFNRShzZXNzKSwgIlJldHJ5aW5nIHJlcXVlc3Qgd2l0aCBuZXcgYXV0aGVudGljYXRpb24iKSk7CisKKwkvKiBSZXRyeSB0aGUgcmVxdWVzdCAqLworCXN0YXR1cyA9IHBqX3N0dW5fc2Vzc2lvbl9zZW5kX21zZyhzZXNzLCByZXF1ZXN0LT50b2tlbiwgUEpfVFJVRSwgCisJCQkJCSAgcmVxdWVzdC0+cmV0cmFuc21pdCwgc3JjX2FkZHIsIAorCQkJCQkgIHNyY19hZGRyX2xlbiwgdGRhdGEpOworCisgICAgfSBlbHNlIHsKKwlzZXNzLT5hdXRoX3JldHJ5ID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgc3R1bl90c3hfb25fY29tcGxldGUocGpfc3R1bl9jbGllbnRfdHN4ICp0c3gsCisJCQkJIHBqX3N0YXR1c190IHN0YXR1cywgCisJCQkJIGNvbnN0IHBqX3N0dW5fbXNnICpyZXNwb25zZSwKKwkJCQkgY29uc3QgcGpfc29ja2FkZHJfdCAqc3JjX2FkZHIsCisJCQkJIHVuc2lnbmVkIHNyY19hZGRyX2xlbikKK3sKKyAgICBwal9zdHVuX3Nlc3Npb24gKnNlc3M7CisgICAgcGpfYm9vbF90IG5vdGlmeV91c2VyID0gUEpfVFJVRTsKKyAgICBwal9zdHVuX3R4X2RhdGEgKnRkYXRhOworCisgICAgdGRhdGEgPSAocGpfc3R1bl90eF9kYXRhKikgcGpfc3R1bl9jbGllbnRfdHN4X2dldF9kYXRhKHRzeCk7CisgICAgc2VzcyA9IHRkYXRhLT5zZXNzOworCisgICAgLyogTG9jayB0aGUgc2Vzc2lvbiBhbmQgcHJldmVudCB1c2VyIGZyb20gZGVzdHJveWluZyB1cyBpbiB0aGUgY2FsbGJhY2sgKi8KKyAgICBwal9ncnBfbG9ja19hY3F1aXJlKHNlc3MtPmdycF9sb2NrKTsKKyAgICBpZiAoc2Vzcy0+aXNfZGVzdHJveWluZykgeworCXBqX3N0dW5fbXNnX2Rlc3Ryb3lfdGRhdGEoc2VzcywgdGRhdGEpOworCXBqX2dycF9sb2NrX3JlbGVhc2Uoc2Vzcy0+Z3JwX2xvY2spOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBIYW5kbGUgYXV0aGVudGljYXRpb24gY2hhbGxlbmdlICovCisgICAgaGFuZGxlX2F1dGhfY2hhbGxlbmdlKHNlc3MsIHRkYXRhLCByZXNwb25zZSwgc3JjX2FkZHIsCisJCSAgICAgICAgICBzcmNfYWRkcl9sZW4sICZub3RpZnlfdXNlcik7CisKKyAgICBpZiAobm90aWZ5X3VzZXIgJiYgc2Vzcy0+Y2Iub25fcmVxdWVzdF9jb21wbGV0ZSkgeworCSgqc2Vzcy0+Y2Iub25fcmVxdWVzdF9jb21wbGV0ZSkoc2Vzcywgc3RhdHVzLCB0ZGF0YS0+dG9rZW4sIHRkYXRhLCAKKwkJCQkJcmVzcG9uc2UsIHNyY19hZGRyLCBzcmNfYWRkcl9sZW4pOworICAgIH0KKworICAgIC8qIERlc3Ryb3kgdGhlIHRyYW5zbWl0IGRhdGEuIFRoaXMgd2lsbCByZW1vdmUgdGhlIHRyYW5zYWN0aW9uCisgICAgICogZnJvbSB0aGUgcGVuZGluZyBsaXN0IHRvby4gCisgICAgICovCisgICAgaWYgKHN0YXR1cyA9PSBQSk5BVEhfRVNUVU5USU1FRE9VVCkKKwlkZXN0cm95X3RkYXRhKHRkYXRhLCBQSl9UUlVFKTsKKyAgICBlbHNlCisJZGVzdHJveV90ZGF0YSh0ZGF0YSwgUEpfRkFMU0UpOworICAgIHRkYXRhID0gTlVMTDsKKworICAgIHBqX2dycF9sb2NrX3JlbGVhc2Uoc2Vzcy0+Z3JwX2xvY2spOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3Qgc3R1bl90c3hfb25fc2VuZF9tc2cocGpfc3R1bl9jbGllbnRfdHN4ICp0c3gsCisJCQkJCWNvbnN0IHZvaWQgKnN0dW5fcGt0LAorCQkJCQlwal9zaXplX3QgcGt0X3NpemUpCit7CisgICAgcGpfc3R1bl90eF9kYXRhICp0ZGF0YTsKKyAgICBwal9zdHVuX3Nlc3Npb24gKnNlc3M7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgdGRhdGEgPSAocGpfc3R1bl90eF9kYXRhKikgcGpfc3R1bl9jbGllbnRfdHN4X2dldF9kYXRhKHRzeCk7CisgICAgc2VzcyA9IHRkYXRhLT5zZXNzOworCisgICAgLyogTG9jayB0aGUgc2Vzc2lvbiBhbmQgcHJldmVudCB1c2VyIGZyb20gZGVzdHJveWluZyB1cyBpbiB0aGUgY2FsbGJhY2sgKi8KKyAgICBwal9ncnBfbG9ja19hY3F1aXJlKHNlc3MtPmdycF9sb2NrKTsKKyAgICAKKyAgICBpZiAoc2Vzcy0+aXNfZGVzdHJveWluZykgeworCS8qIFN0cmF5IHRpbWVyICovCisJcGpfZ3JwX2xvY2tfcmVsZWFzZShzZXNzLT5ncnBfbG9jayk7CisJcmV0dXJuIFBKX0VJTlZBTElET1A7CisgICAgfQorCisgICAgc3RhdHVzID0gc2Vzcy0+Y2Iub25fc2VuZF9tc2codGRhdGEtPnNlc3MsIHRkYXRhLT50b2tlbiwgc3R1bl9wa3QsIAorCQkJCSAgcGt0X3NpemUsIHRkYXRhLT5kc3RfYWRkciwgCisJCQkJICB0ZGF0YS0+YWRkcl9sZW4pOworICAgIGlmIChwal9ncnBfbG9ja19yZWxlYXNlKHNlc3MtPmdycF9sb2NrKSkKKwlyZXR1cm4gUEpfRUdPTkU7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9zdHVuX3Nlc3Npb25fY3JlYXRlKCBwal9zdHVuX2NvbmZpZyAqY2ZnLAorCQkJCQkgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJICAgIGNvbnN0IHBqX3N0dW5fc2Vzc2lvbl9jYiAqY2IsCisJCQkJCSAgICBwal9ib29sX3QgZmluZ2VycHJpbnQsCisJCQkJCSAgICBwal9ncnBfbG9ja190ICpncnBfbG9jaywKKwkJCQkJICAgIHBqX3N0dW5fc2Vzc2lvbiAqKnBfc2VzcykKK3sKKyAgICBwal9wb29sX3QJKnBvb2w7CisgICAgcGpfc3R1bl9zZXNzaW9uICpzZXNzOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4oY2ZnICYmIGNiICYmIHBfc2VzcywgUEpfRUlOVkFMKTsKKworICAgIGlmIChuYW1lPT1OVUxMKQorCW5hbWUgPSAic3R1c2UlcCI7CisKKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUoY2ZnLT5wZiwgbmFtZSwgUEpOQVRIX1BPT0xfTEVOX1NUVU5fU0VTUywgCisJCQkgIFBKTkFUSF9QT09MX0lOQ19TVFVOX1NFU1MsIE5VTEwpOworICAgIFBKX0FTU0VSVF9SRVRVUk4ocG9vbCwgUEpfRU5PTUVNKTsKKworICAgIHNlc3MgPSBQSl9QT09MX1pBTExPQ19UKHBvb2wsIHBqX3N0dW5fc2Vzc2lvbik7CisgICAgc2Vzcy0+Y2ZnID0gY2ZnOworICAgIHNlc3MtPnBvb2wgPSBwb29sOworICAgIHBqX21lbWNweSgmc2Vzcy0+Y2IsIGNiLCBzaXplb2YoKmNiKSk7CisgICAgc2Vzcy0+dXNlX2ZpbmdlcnByaW50ID0gZmluZ2VycHJpbnQ7CisgICAgc2Vzcy0+bG9nX2ZsYWcgPSAweEZGRkY7CisKKyAgICBpZiAoZ3JwX2xvY2spIHsKKwlzZXNzLT5ncnBfbG9jayA9IGdycF9sb2NrOworICAgIH0gZWxzZSB7CisJc3RhdHVzID0gcGpfZ3JwX2xvY2tfY3JlYXRlKHBvb2wsIE5VTEwsICZzZXNzLT5ncnBfbG9jayk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKwkgICAgcmV0dXJuIHN0YXR1czsKKwl9CisgICAgfQorCisgICAgcGpfZ3JwX2xvY2tfYWRkX3JlZihzZXNzLT5ncnBfbG9jayk7CisgICAgcGpfZ3JwX2xvY2tfYWRkX2hhbmRsZXIoc2Vzcy0+Z3JwX2xvY2ssIHBvb2wsIHNlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0dW5fc2Vzc19vbl9kZXN0cm95KTsKKworICAgIHBqX3N0dW5fc2Vzc2lvbl9zZXRfc29mdHdhcmVfbmFtZShzZXNzLCAmY2ZnLT5zb2Z0d2FyZV9uYW1lKTsKKworICAgIHNlc3MtPnJ4X3Bvb2wgPSBwal9wb29sX2NyZWF0ZShzZXNzLT5jZmctPnBmLCBuYW1lLAorCQkJCSAgIFBKTkFUSF9QT09MX0xFTl9TVFVOX1REQVRBLAorCQkJCSAgIFBKTkFUSF9QT09MX0lOQ19TVFVOX1REQVRBLCBOVUxMKTsKKworICAgIHBqX2xpc3RfaW5pdCgmc2Vzcy0+cGVuZGluZ19yZXF1ZXN0X2xpc3QpOworICAgIHBqX2xpc3RfaW5pdCgmc2Vzcy0+Y2FjaGVkX3Jlc3BvbnNlX2xpc3QpOworCisgICAgKnBfc2VzcyA9IHNlc3M7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgc3R1bl9zZXNzX29uX2Rlc3Ryb3kodm9pZCAqY29tcCkKK3sKKyAgICBwal9zdHVuX3Nlc3Npb24gKnNlc3MgPSAocGpfc3R1bl9zZXNzaW9uKiljb21wOworCisgICAgd2hpbGUgKCFwal9saXN0X2VtcHR5KCZzZXNzLT5wZW5kaW5nX3JlcXVlc3RfbGlzdCkpIHsKKwlwal9zdHVuX3R4X2RhdGEgKnRkYXRhID0gc2Vzcy0+cGVuZGluZ19yZXF1ZXN0X2xpc3QubmV4dDsKKwlkZXN0cm95X3RkYXRhKHRkYXRhLCBQSl9UUlVFKTsKKyAgICB9CisKKyAgICB3aGlsZSAoIXBqX2xpc3RfZW1wdHkoJnNlc3MtPmNhY2hlZF9yZXNwb25zZV9saXN0KSkgeworCXBqX3N0dW5fdHhfZGF0YSAqdGRhdGEgPSBzZXNzLT5jYWNoZWRfcmVzcG9uc2VfbGlzdC5uZXh0OworCWRlc3Ryb3lfdGRhdGEodGRhdGEsIFBKX1RSVUUpOworICAgIH0KKworICAgIGlmIChzZXNzLT5yeF9wb29sKSB7CisJcGpfcG9vbF9yZWxlYXNlKHNlc3MtPnJ4X3Bvb2wpOworCXNlc3MtPnJ4X3Bvb2wgPSBOVUxMOworICAgIH0KKworICAgIHBqX3Bvb2xfcmVsZWFzZShzZXNzLT5wb29sKTsKKworICAgIFRSQUNFXygoVEhJU19GSUxFLCAiU1RVTiBzZXNzaW9uICVwIGRlc3Ryb3llZCIsIHNlc3MpKTsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9zdHVuX3Nlc3Npb25fZGVzdHJveShwal9zdHVuX3Nlc3Npb24gKnNlc3MpCit7CisgICAgcGpfc3R1bl90eF9kYXRhICp0ZGF0YTsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4oc2VzcywgUEpfRUlOVkFMKTsKKworICAgIFRSQUNFXygoU05BTUUoc2VzcyksICJTVFVOIHNlc3Npb24gJXAgZGVzdHJveSByZXF1ZXN0LCByZWZfY250PSVkIiwKKwkgICAgIHNlc3MsIHBqX2dycF9sb2NrX2dldF9yZWYoc2Vzcy0+Z3JwX2xvY2spKSk7CisKKyAgICBwal9ncnBfbG9ja19hY3F1aXJlKHNlc3MtPmdycF9sb2NrKTsKKworICAgIGlmIChzZXNzLT5pc19kZXN0cm95aW5nKSB7CisJLyogUHJldmVudCBmcm9tIGRlY3JlbWVudGluZyB0aGUgcmVmIGNvdW50ZXIgbW9yZSB0aGFuIG9uY2UgKi8KKwlwal9ncnBfbG9ja19yZWxlYXNlKHNlc3MtPmdycF9sb2NrKTsKKwlyZXR1cm4gUEpfRUlOVkFMSURPUDsKKyAgICB9CisKKyAgICBzZXNzLT5pc19kZXN0cm95aW5nID0gUEpfVFJVRTsKKworICAgIC8qIFdlIG5lZWQgdG8gc3RvcCB0cmFuc2FjdGlvbnMgYW5kIGNhY2hlZCByZXNwb25zZSBiZWNhdXNlIHRoZXkgYXJlCisgICAgICogaG9sZGluZyB0aGUgZ3JvdXAgbG9jaydzIHJlZmVyZW5jZSBjb3VudGVyIHdoaWxlIHJldHJhbnNtaXR0aW5nLgorICAgICAqLworICAgIHRkYXRhID0gc2Vzcy0+cGVuZGluZ19yZXF1ZXN0X2xpc3QubmV4dDsKKyAgICB3aGlsZSAodGRhdGEgIT0gJnNlc3MtPnBlbmRpbmdfcmVxdWVzdF9saXN0KSB7CisJaWYgKHRkYXRhLT5jbGllbnRfdHN4KQorCSAgICBwal9zdHVuX2NsaWVudF90c3hfc3RvcCh0ZGF0YS0+Y2xpZW50X3RzeCk7CisJdGRhdGEgPSB0ZGF0YS0+bmV4dDsKKyAgICB9CisKKyAgICB0ZGF0YSA9IHNlc3MtPmNhY2hlZF9yZXNwb25zZV9saXN0Lm5leHQ7CisgICAgd2hpbGUgKHRkYXRhICE9ICZzZXNzLT5jYWNoZWRfcmVzcG9uc2VfbGlzdCkgeworCXBqX3RpbWVyX2hlYXBfY2FuY2VsX2lmX2FjdGl2ZSh0ZGF0YS0+c2Vzcy0+Y2ZnLT50aW1lcl9oZWFwLAorCQkJCSAgICAgICAmdGRhdGEtPnJlc190aW1lciwgUEpfRkFMU0UpOworCXRkYXRhID0gdGRhdGEtPm5leHQ7CisgICAgfQorCisgICAgcGpfZ3JwX2xvY2tfZGVjX3JlZihzZXNzLT5ncnBfbG9jayk7CisgICAgcGpfZ3JwX2xvY2tfcmVsZWFzZShzZXNzLT5ncnBfbG9jayk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworUEpfREVGKHBqX3N0YXR1c190KSBwal9zdHVuX3Nlc3Npb25fc2V0X3VzZXJfZGF0YSggcGpfc3R1bl9zZXNzaW9uICpzZXNzLAorCQkJCQkJICAgdm9pZCAqdXNlcl9kYXRhKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4oc2VzcywgUEpfRUlOVkFMKTsKKyAgICBwal9ncnBfbG9ja19hY3F1aXJlKHNlc3MtPmdycF9sb2NrKTsKKyAgICBzZXNzLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgICAgcGpfZ3JwX2xvY2tfcmVsZWFzZShzZXNzLT5ncnBfbG9jayk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRih2b2lkKikgcGpfc3R1bl9zZXNzaW9uX2dldF91c2VyX2RhdGEocGpfc3R1bl9zZXNzaW9uICpzZXNzKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4oc2VzcywgTlVMTCk7CisgICAgcmV0dXJuIHNlc3MtPnVzZXJfZGF0YTsKK30KKworUEpfREVGKHBqX2dycF9sb2NrX3QgKikgcGpfc3R1bl9zZXNzaW9uX2dldF9ncnBfbG9jayhwal9zdHVuX3Nlc3Npb24gKnNlc3MpCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzZXNzLCBOVUxMKTsKKyAgICByZXR1cm4gc2Vzcy0+Z3JwX2xvY2s7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc3R1bl9zZXNzaW9uX3NldF9zb2Z0d2FyZV9uYW1lKHBqX3N0dW5fc2Vzc2lvbiAqc2VzcywKKwkJCQkJCSAgICAgIGNvbnN0IHBqX3N0cl90ICpzdykKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNlc3MsIFBKX0VJTlZBTCk7CisgICAgcGpfZ3JwX2xvY2tfYWNxdWlyZShzZXNzLT5ncnBfbG9jayk7CisgICAgaWYgKHN3ICYmIHN3LT5zbGVuKQorCXBqX3N0cmR1cChzZXNzLT5wb29sLCAmc2Vzcy0+c3J2X25hbWUsIHN3KTsKKyAgICBlbHNlCisJc2Vzcy0+c3J2X25hbWUuc2xlbiA9IDA7CisgICAgcGpfZ3JwX2xvY2tfcmVsZWFzZShzZXNzLT5ncnBfbG9jayk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc3R1bl9zZXNzaW9uX3NldF9jcmVkZW50aWFsKHBqX3N0dW5fc2Vzc2lvbiAqc2VzcywKKwkJCQkJCSBwal9zdHVuX2F1dGhfdHlwZSBhdXRoX3R5cGUsCisJCQkJCQkgY29uc3QgcGpfc3R1bl9hdXRoX2NyZWQgKmNyZWQpCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzZXNzLCBQSl9FSU5WQUwpOworCisgICAgcGpfZ3JwX2xvY2tfYWNxdWlyZShzZXNzLT5ncnBfbG9jayk7CisgICAgc2Vzcy0+YXV0aF90eXBlID0gYXV0aF90eXBlOworICAgIGlmIChjcmVkKSB7CisJcGpfc3R1bl9hdXRoX2NyZWRfZHVwKHNlc3MtPnBvb2wsICZzZXNzLT5jcmVkLCBjcmVkKTsKKyAgICB9IGVsc2UgeworCXNlc3MtPmF1dGhfdHlwZSA9IFBKX1NUVU5fQVVUSF9OT05FOworCXBqX2J6ZXJvKCZzZXNzLT5jcmVkLCBzaXplb2Yoc2Vzcy0+Y3JlZCkpOworICAgIH0KKyAgICBwal9ncnBfbG9ja19yZWxlYXNlKHNlc3MtPmdycF9sb2NrKTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitQSl9ERUYodm9pZCkgcGpfc3R1bl9zZXNzaW9uX3NldF9sb2coIHBqX3N0dW5fc2Vzc2lvbiAqc2VzcywKKwkJCQkgICAgICB1bnNpZ25lZCBmbGFncykKK3sKKyAgICBQSl9BU1NFUlRfT05fRkFJTChzZXNzLCByZXR1cm4pOworICAgIHNlc3MtPmxvZ19mbGFnID0gZmxhZ3M7Cit9CisKK1BKX0RFRihwal9ib29sX3QpIHBqX3N0dW5fc2Vzc2lvbl91c2VfZmluZ2VycHJpbnQocGpfc3R1bl9zZXNzaW9uICpzZXNzLAorCQkJCQkJICBwal9ib29sX3QgdXNlKQoreworICAgIHBqX2Jvb2xfdCBvbGRfdXNlOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihzZXNzLCBQSl9GQUxTRSk7CisKKyAgICBvbGRfdXNlID0gc2Vzcy0+dXNlX2ZpbmdlcnByaW50OworICAgIHNlc3MtPnVzZV9maW5nZXJwcmludCA9IHVzZTsKKyAgICByZXR1cm4gb2xkX3VzZTsKK30KKworc3RhdGljIHBqX3N0YXR1c190IGdldF9hdXRoKHBqX3N0dW5fc2Vzc2lvbiAqc2VzcywKKwkJCSAgICBwal9zdHVuX3R4X2RhdGEgKnRkYXRhKQoreworICAgIGlmIChzZXNzLT5jcmVkLnR5cGUgPT0gUEpfU1RVTl9BVVRIX0NSRURfU1RBVElDKSB7CisJLy90ZGF0YS0+YXV0aF9pbmZvLnJlYWxtID0gc2Vzcy0+Y3JlZC5kYXRhLnN0YXRpY19jcmVkLnJlYWxtOworCXRkYXRhLT5hdXRoX2luZm8ucmVhbG0gPSBzZXNzLT5zZXJ2ZXJfcmVhbG07CisJdGRhdGEtPmF1dGhfaW5mby51c2VybmFtZSA9IHNlc3MtPmNyZWQuZGF0YS5zdGF0aWNfY3JlZC51c2VybmFtZTsKKwl0ZGF0YS0+YXV0aF9pbmZvLm5vbmNlID0gc2Vzcy0+Y3JlZC5kYXRhLnN0YXRpY19jcmVkLm5vbmNlOworCisJcGpfc3R1bl9jcmVhdGVfa2V5KHRkYXRhLT5wb29sLCAmdGRhdGEtPmF1dGhfaW5mby5hdXRoX2tleSwgCisJCQkgICAmdGRhdGEtPmF1dGhfaW5mby5yZWFsbSwKKwkJCSAgICZ0ZGF0YS0+YXV0aF9pbmZvLnVzZXJuYW1lLAorCQkJICAgc2Vzcy0+Y3JlZC5kYXRhLnN0YXRpY19jcmVkLmRhdGFfdHlwZSwKKwkJCSAgICZzZXNzLT5jcmVkLmRhdGEuc3RhdGljX2NyZWQuZGF0YSk7CisKKyAgICB9IGVsc2UgaWYgKHNlc3MtPmNyZWQudHlwZSA9PSBQSl9TVFVOX0FVVEhfQ1JFRF9EWU5BTUlDKSB7CisJcGpfc3RyX3QgcGFzc3dvcmQ7CisJdm9pZCAqdXNlcl9kYXRhID0gc2Vzcy0+Y3JlZC5kYXRhLmR5bl9jcmVkLnVzZXJfZGF0YTsKKwlwal9zdHVuX3Bhc3N3ZF90eXBlIGRhdGFfdHlwZSA9IFBKX1NUVU5fUEFTU1dEX1BMQUlOOworCXBqX3N0YXR1c190IHJjOworCisJcmMgPSAoKnNlc3MtPmNyZWQuZGF0YS5keW5fY3JlZC5nZXRfY3JlZCkodGRhdGEtPm1zZywgdXNlcl9kYXRhLCAKKwkJCQkJCSAgdGRhdGEtPnBvb2wsCisJCQkJCQkgICZ0ZGF0YS0+YXV0aF9pbmZvLnJlYWxtLCAKKwkJCQkJCSAgJnRkYXRhLT5hdXRoX2luZm8udXNlcm5hbWUsCisJCQkJCQkgICZ0ZGF0YS0+YXV0aF9pbmZvLm5vbmNlLCAKKwkJCQkJCSAgJmRhdGFfdHlwZSwgJnBhc3N3b3JkKTsKKwlpZiAocmMgIT0gUEpfU1VDQ0VTUykKKwkgICAgcmV0dXJuIHJjOworCisJcGpfc3R1bl9jcmVhdGVfa2V5KHRkYXRhLT5wb29sLCAmdGRhdGEtPmF1dGhfaW5mby5hdXRoX2tleSwgCisJCQkgICAmdGRhdGEtPmF1dGhfaW5mby5yZWFsbSwgJnRkYXRhLT5hdXRoX2luZm8udXNlcm5hbWUsCisJCQkgICBkYXRhX3R5cGUsICZwYXNzd29yZCk7CisKKyAgICB9IGVsc2UgeworCXBqX2Fzc2VydCghIlVua25vd24gY3JlZGVudGlhbCB0eXBlIik7CisJcmV0dXJuIFBKX0VCVUc7CisgICAgfQorCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc3R1bl9zZXNzaW9uX2NyZWF0ZV9yZXEocGpfc3R1bl9zZXNzaW9uICpzZXNzLAorCQkJCQkgICAgICAgaW50IG1ldGhvZCwKKwkJCQkJICAgICAgIHBqX3VpbnQzMl90IG1hZ2ljLAorCQkJCQkgICAgICAgY29uc3QgcGpfdWludDhfdCB0c3hfaWRbMTJdLAorCQkJCQkgICAgICAgcGpfc3R1bl90eF9kYXRhICoqcF90ZGF0YSkKK3sKKyAgICBwal9zdHVuX3R4X2RhdGEgKnRkYXRhID0gTlVMTDsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNlc3MgJiYgcF90ZGF0YSwgUEpfRUlOVkFMKTsKKworICAgIHBqX2dycF9sb2NrX2FjcXVpcmUoc2Vzcy0+Z3JwX2xvY2spOworICAgIGlmIChzZXNzLT5pc19kZXN0cm95aW5nKSB7CisJcGpfZ3JwX2xvY2tfcmVsZWFzZShzZXNzLT5ncnBfbG9jayk7CisJcmV0dXJuIFBKX0VJTlZBTElET1A7CisgICAgfQorCisgICAgc3RhdHVzID0gY3JlYXRlX3RkYXRhKHNlc3MsICZ0ZGF0YSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWdvdG8gb25fZXJyb3I7CisKKyAgICAvKiBDcmVhdGUgU1RVTiBtZXNzYWdlICovCisgICAgc3RhdHVzID0gcGpfc3R1bl9tc2dfY3JlYXRlKHRkYXRhLT5wb29sLCBtZXRob2QsICBtYWdpYywgCisJCQkJdHN4X2lkLCAmdGRhdGEtPm1zZyk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWdvdG8gb25fZXJyb3I7CisKKyAgICAvKiBjb3B5IHRoZSByZXF1ZXN0J3MgdHJhbnNhY3Rpb24gSUQgYXMgdGhlIHRyYW5zYWN0aW9uIGtleS4gKi8KKyAgICBwal9hc3NlcnQoc2l6ZW9mKHRkYXRhLT5tc2dfa2V5KT09c2l6ZW9mKHRkYXRhLT5tc2ctPmhkci50c3hfaWQpKTsKKyAgICB0ZGF0YS0+bXNnX21hZ2ljID0gdGRhdGEtPm1zZy0+aGRyLm1hZ2ljOworICAgIHBqX21lbWNweSh0ZGF0YS0+bXNnX2tleSwgdGRhdGEtPm1zZy0+aGRyLnRzeF9pZCwKKwkgICAgICBzaXplb2YodGRhdGEtPm1zZy0+aGRyLnRzeF9pZCkpOworCisgICAgCisgICAgLyogR2V0IGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgcmVxdWVzdCAqLworICAgIGlmIChzZXNzLT5hdXRoX3R5cGUgPT0gUEpfU1RVTl9BVVRIX05PTkUpIHsKKwkvKiBObyBhdXRoZW50aWNhdGlvbiAqLworCisgICAgfSBlbHNlIGlmIChzZXNzLT5hdXRoX3R5cGUgPT0gUEpfU1RVTl9BVVRIX1NIT1JUX1RFUk0pIHsKKwkvKiBNVVNUIHB1dCBhdXRoZW50aWNhdGlvbiBpbiByZXF1ZXN0ICovCisJc3RhdHVzID0gZ2V0X2F1dGgoc2VzcywgdGRhdGEpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkgICAgZ290byBvbl9lcnJvcjsKKworICAgIH0gZWxzZSBpZiAoc2Vzcy0+YXV0aF90eXBlID09IFBKX1NUVU5fQVVUSF9MT05HX1RFUk0pIHsKKwkvKiBPbmx5IHB1dCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBpZiB3ZSd2ZSByZWNlaXZlZAorCSAqIHJlc3BvbnNlIGZyb20gc2VydmVyLgorCSAqLworCWlmIChzZXNzLT5uZXh0X25vbmNlLnNsZW4gIT0gMCkgeworCSAgICBzdGF0dXMgPSBnZXRfYXV0aChzZXNzLCB0ZGF0YSk7CisJICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkJZ290byBvbl9lcnJvcjsKKwkgICAgdGRhdGEtPmF1dGhfaW5mby5ub25jZSA9IHNlc3MtPm5leHRfbm9uY2U7CisJICAgIHRkYXRhLT5hdXRoX2luZm8ucmVhbG0gPSBzZXNzLT5zZXJ2ZXJfcmVhbG07CisJfQorCisgICAgfSBlbHNlIHsKKwlwal9hc3NlcnQoISJJbnZhbGlkIGF1dGhlbnRpY2F0aW9uIHR5cGUiKTsKKwlzdGF0dXMgPSBQSl9FQlVHOworCWdvdG8gb25fZXJyb3I7CisgICAgfQorCisgICAgKnBfdGRhdGEgPSB0ZGF0YTsKKyAgICBwal9ncnBfbG9ja19yZWxlYXNlKHNlc3MtPmdycF9sb2NrKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKworb25fZXJyb3I6CisgICAgaWYgKHRkYXRhKQorCXBqX3Bvb2xfcmVsZWFzZSh0ZGF0YS0+cG9vbCk7CisgICAgcGpfZ3JwX2xvY2tfcmVsZWFzZShzZXNzLT5ncnBfbG9jayk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9zdHVuX3Nlc3Npb25fY3JlYXRlX2luZChwal9zdHVuX3Nlc3Npb24gKnNlc3MsCisJCQkJCSAgICAgICBpbnQgbXNnX3R5cGUsCisJCQkJCSAgICAgICBwal9zdHVuX3R4X2RhdGEgKipwX3RkYXRhKQoreworICAgIHBqX3N0dW5fdHhfZGF0YSAqdGRhdGEgPSBOVUxMOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4oc2VzcyAmJiBwX3RkYXRhLCBQSl9FSU5WQUwpOworCisgICAgcGpfZ3JwX2xvY2tfYWNxdWlyZShzZXNzLT5ncnBfbG9jayk7CisgICAgaWYgKHNlc3MtPmlzX2Rlc3Ryb3lpbmcpIHsKKwlwal9ncnBfbG9ja19yZWxlYXNlKHNlc3MtPmdycF9sb2NrKTsKKwlyZXR1cm4gUEpfRUlOVkFMSURPUDsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBjcmVhdGVfdGRhdGEoc2VzcywgJnRkYXRhKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlwal9ncnBfbG9ja19yZWxlYXNlKHNlc3MtPmdycF9sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8qIENyZWF0ZSBTVFVOIG1lc3NhZ2UgKi8KKyAgICBtc2dfdHlwZSB8PSBQSl9TVFVOX0lORElDQVRJT05fQklUOworICAgIHN0YXR1cyA9IHBqX3N0dW5fbXNnX2NyZWF0ZSh0ZGF0YS0+cG9vbCwgbXNnX3R5cGUsICBQSl9TVFVOX01BR0lDLCAKKwkJCQlOVUxMLCAmdGRhdGEtPm1zZyk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcGpfcG9vbF9yZWxlYXNlKHRkYXRhLT5wb29sKTsKKwlwal9ncnBfbG9ja19yZWxlYXNlKHNlc3MtPmdycF9sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgICpwX3RkYXRhID0gdGRhdGE7CisKKyAgICBwal9ncnBfbG9ja19yZWxlYXNlKHNlc3MtPmdycF9sb2NrKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoKKyAqIENyZWF0ZSBhIFNUVU4gcmVzcG9uc2UgbWVzc2FnZS4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zdHVuX3Nlc3Npb25fY3JlYXRlX3JlcyggcGpfc3R1bl9zZXNzaW9uICpzZXNzLAorCQkJCQkJY29uc3QgcGpfc3R1bl9yeF9kYXRhICpyZGF0YSwKKwkJCQkJCXVuc2lnbmVkIGVycl9jb2RlLAorCQkJCQkJY29uc3QgcGpfc3RyX3QgKmVycl9tc2csCisJCQkJCQlwal9zdHVuX3R4X2RhdGEgKipwX3RkYXRhKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICBwal9zdHVuX3R4X2RhdGEgKnRkYXRhID0gTlVMTDsKKworICAgIHBqX2dycF9sb2NrX2FjcXVpcmUoc2Vzcy0+Z3JwX2xvY2spOworICAgIGlmIChzZXNzLT5pc19kZXN0cm95aW5nKSB7CisJcGpfZ3JwX2xvY2tfcmVsZWFzZShzZXNzLT5ncnBfbG9jayk7CisJcmV0dXJuIFBKX0VJTlZBTElET1A7CisgICAgfQorCisgICAgc3RhdHVzID0gY3JlYXRlX3RkYXRhKHNlc3MsICZ0ZGF0YSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcGpfZ3JwX2xvY2tfcmVsZWFzZShzZXNzLT5ncnBfbG9jayk7CisJcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgU1RVTiByZXNwb25zZSBtZXNzYWdlICovCisgICAgc3RhdHVzID0gcGpfc3R1bl9tc2dfY3JlYXRlX3Jlc3BvbnNlKHRkYXRhLT5wb29sLCByZGF0YS0+bXNnLCAKKwkJCQkJIGVycl9jb2RlLCBlcnJfbXNnLCAmdGRhdGEtPm1zZyk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcGpfcG9vbF9yZWxlYXNlKHRkYXRhLT5wb29sKTsKKwlwal9ncnBfbG9ja19yZWxlYXNlKHNlc3MtPmdycF9sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8qIGNvcHkgdGhlIHJlcXVlc3QncyB0cmFuc2FjdGlvbiBJRCBhcyB0aGUgdHJhbnNhY3Rpb24ga2V5LiAqLworICAgIHBqX2Fzc2VydChzaXplb2YodGRhdGEtPm1zZ19rZXkpPT1zaXplb2YocmRhdGEtPm1zZy0+aGRyLnRzeF9pZCkpOworICAgIHRkYXRhLT5tc2dfbWFnaWMgPSByZGF0YS0+bXNnLT5oZHIubWFnaWM7CisgICAgcGpfbWVtY3B5KHRkYXRhLT5tc2dfa2V5LCByZGF0YS0+bXNnLT5oZHIudHN4X2lkLCAKKwkgICAgICBzaXplb2YocmRhdGEtPm1zZy0+aGRyLnRzeF9pZCkpOworCisgICAgLyogY29weSB0aGUgY3JlZGVudGlhbCBmb3VuZCBpbiB0aGUgcmVxdWVzdCAqLworICAgIHBqX3N0dW5fcmVxX2NyZWRfaW5mb19kdXAodGRhdGEtPnBvb2wsICZ0ZGF0YS0+YXV0aF9pbmZvLCAmcmRhdGEtPmluZm8pOworCisgICAgKnBfdGRhdGEgPSB0ZGF0YTsKKworICAgIHBqX2dycF9sb2NrX3JlbGVhc2Uoc2Vzcy0+Z3JwX2xvY2spOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyogUHJpbnQgb3V0Z29pbmcgbWVzc2FnZSB0byBsb2cgKi8KK3N0YXRpYyB2b2lkIGR1bXBfdHhfbXNnKHBqX3N0dW5fc2Vzc2lvbiAqc2VzcywgY29uc3QgcGpfc3R1bl9tc2cgKm1zZywKKwkJCXVuc2lnbmVkIHBrdF9zaXplLCBjb25zdCBwal9zb2NrYWRkcl90ICphZGRyKQoreworICAgIGNoYXIgZHN0X25hbWVbUEpfSU5FVDZfQUREUlNUUkxFTisxMF07CisgICAgCisgICAgaWYgKChQSl9TVFVOX0lTX1JFUVVFU1QobXNnLT5oZHIudHlwZSkgJiYgCisJIChzZXNzLT5sb2dfZmxhZyAmIFBKX1NUVU5fU0VTU19MT0dfVFhfUkVRKT09MCkgfHwKKwkoUEpfU1RVTl9JU19SRVNQT05TRShtc2ctPmhkci50eXBlKSAmJgorCSAoc2Vzcy0+bG9nX2ZsYWcgJiBQSl9TVFVOX1NFU1NfTE9HX1RYX1JFUyk9PTApIHx8CisJKFBKX1NUVU5fSVNfSU5ESUNBVElPTihtc2ctPmhkci50eXBlKSAmJgorCSAoc2Vzcy0+bG9nX2ZsYWcgJiBQSl9TVFVOX1NFU1NfTE9HX1RYX0lORCk9PTApKQorICAgIHsKKwlyZXR1cm47CisgICAgfQorCisgICAgcGpfc29ja2FkZHJfcHJpbnQoYWRkciwgZHN0X25hbWUsIHNpemVvZihkc3RfbmFtZSksIDMpOworCisgICAgUEpfTE9HKDUsKFNOQU1FKHNlc3MpLCAKKwkgICAgICAiVFggJWQgYnl0ZXMgU1RVTiBtZXNzYWdlIHRvICVzOlxuIgorCSAgICAgICItLS0gYmVnaW4gU1RVTiBtZXNzYWdlIC0tLVxuIgorCSAgICAgICIlcyIKKwkgICAgICAiLS0tIGVuZCBvZiBTVFVOIG1lc3NhZ2UgLS0tXG4iLAorCSAgICAgIHBrdF9zaXplLCBkc3RfbmFtZSwgCisJICAgICAgcGpfc3R1bl9tc2dfZHVtcChtc2csIHNlc3MtPmR1bXBfYnVmLCBzaXplb2Yoc2Vzcy0+ZHVtcF9idWYpLCAKKwkJCSAgICAgICBOVUxMKSkpOworCit9CisKKworUEpfREVGKHBqX3N0YXR1c190KSBwal9zdHVuX3Nlc3Npb25fc2VuZF9tc2coIHBqX3N0dW5fc2Vzc2lvbiAqc2VzcywKKwkJCQkJICAgICAgdm9pZCAqdG9rZW4sCisJCQkJCSAgICAgIHBqX2Jvb2xfdCBjYWNoZV9yZXMsCisJCQkJCSAgICAgIHBqX2Jvb2xfdCByZXRyYW5zbWl0LAorCQkJCQkgICAgICBjb25zdCBwal9zb2NrYWRkcl90ICpzZXJ2ZXIsCisJCQkJCSAgICAgIHVuc2lnbmVkIGFkZHJfbGVuLAorCQkJCQkgICAgICBwal9zdHVuX3R4X2RhdGEgKnRkYXRhKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4oc2VzcyAmJiBhZGRyX2xlbiAmJiBzZXJ2ZXIgJiYgdGRhdGEsIFBKX0VJTlZBTCk7CisKKyAgICAvKiBMb2NrIHRoZSBzZXNzaW9uIGFuZCBwcmV2ZW50IHVzZXIgZnJvbSBkZXN0cm95aW5nIHVzIGluIHRoZSBjYWxsYmFjayAqLworICAgIHBqX2dycF9sb2NrX2FjcXVpcmUoc2Vzcy0+Z3JwX2xvY2spOworICAgIGlmIChzZXNzLT5pc19kZXN0cm95aW5nKSB7CisJcGpfZ3JwX2xvY2tfcmVsZWFzZShzZXNzLT5ncnBfbG9jayk7CisJcmV0dXJuIFBKX0VJTlZBTElET1A7CisgICAgfQorCisgICAgcGpfbG9nX3B1c2hfaW5kZW50KCk7CisKKyAgICAvKiBBbGxvY2F0ZSBwYWNrZXQgKi8KKyAgICB0ZGF0YS0+bWF4X2xlbiA9IFBKX1NUVU5fTUFYX1BLVF9MRU47CisgICAgdGRhdGEtPnBrdCA9IHBqX3Bvb2xfYWxsb2ModGRhdGEtPnBvb2wsIHRkYXRhLT5tYXhfbGVuKTsKKworICAgIHRkYXRhLT50b2tlbiA9IHRva2VuOworICAgIHRkYXRhLT5yZXRyYW5zbWl0ID0gcmV0cmFuc21pdDsKKworICAgIC8qIEFwcGx5IG9wdGlvbnMgKi8KKyAgICBzdGF0dXMgPSBhcHBseV9tc2dfb3B0aW9ucyhzZXNzLCB0ZGF0YS0+cG9vbCwgJnRkYXRhLT5hdXRoX2luZm8sIAorCQkJICAgICAgIHRkYXRhLT5tc2cpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXBqX3N0dW5fbXNnX2Rlc3Ryb3lfdGRhdGEoc2VzcywgdGRhdGEpOworCUxPR19FUlJfKHNlc3MsICJFcnJvciBhcHBseWluZyBvcHRpb25zIiwgc3RhdHVzKTsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICAvKiBFbmNvZGUgbWVzc2FnZSAqLworICAgIHN0YXR1cyA9IHBqX3N0dW5fbXNnX2VuY29kZSh0ZGF0YS0+bXNnLCAocGpfdWludDhfdCopdGRhdGEtPnBrdCwgCisgICAgCQkJCXRkYXRhLT5tYXhfbGVuLCAwLCAKKyAgICAJCQkJJnRkYXRhLT5hdXRoX2luZm8uYXV0aF9rZXksCisJCQkJJnRkYXRhLT5wa3Rfc2l6ZSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcGpfc3R1bl9tc2dfZGVzdHJveV90ZGF0YShzZXNzLCB0ZGF0YSk7CisJTE9HX0VSUl8oc2VzcywgIlNUVU4gZW5jb2RlKCkgZXJyb3IiLCBzdGF0dXMpOworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIC8qIER1bXAgcGFja2V0ICovCisgICAgZHVtcF90eF9tc2coc2VzcywgdGRhdGEtPm1zZywgKHVuc2lnbmVkKXRkYXRhLT5wa3Rfc2l6ZSwgc2VydmVyKTsKKworICAgIC8qIElmIHRoaXMgaXMgYSBTVFVOIHJlcXVlc3QgbWVzc2FnZSwgdGhlbiBzZW5kIHRoZSByZXF1ZXN0IHdpdGgKKyAgICAgKiBhIG5ldyBTVFVOIGNsaWVudCB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICBpZiAoUEpfU1RVTl9JU19SRVFVRVNUKHRkYXRhLT5tc2ctPmhkci50eXBlKSkgeworCisJLyogQ3JlYXRlIFNUVU4gY2xpZW50IHRyYW5zYWN0aW9uICovCisJc3RhdHVzID0gcGpfc3R1bl9jbGllbnRfdHN4X2NyZWF0ZShzZXNzLT5jZmcsIHRkYXRhLT5wb29sLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzcy0+Z3JwX2xvY2ssCisJCQkJCSAgICZ0c3hfY2IsICZ0ZGF0YS0+Y2xpZW50X3RzeCk7CisJUEpfQVNTRVJUX1JFVFVSTihzdGF0dXM9PVBKX1NVQ0NFU1MsIHN0YXR1cyk7CisJcGpfc3R1bl9jbGllbnRfdHN4X3NldF9kYXRhKHRkYXRhLT5jbGllbnRfdHN4LCAodm9pZCopdGRhdGEpOworCisJLyogU2F2ZSB0aGUgcmVtb3RlIGFkZHJlc3MgKi8KKwl0ZGF0YS0+YWRkcl9sZW4gPSBhZGRyX2xlbjsKKwl0ZGF0YS0+ZHN0X2FkZHIgPSBzZXJ2ZXI7CisKKwkvKiBTZW5kIHRoZSByZXF1ZXN0ISAqLworCXN0YXR1cyA9IHBqX3N0dW5fY2xpZW50X3RzeF9zZW5kX21zZyh0ZGF0YS0+Y2xpZW50X3RzeCwgcmV0cmFuc21pdCwKKwkJCQkJICAgICB0ZGF0YS0+cGt0LCAKKwkJCQkJICAgICAodW5zaWduZWQpdGRhdGEtPnBrdF9zaXplKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MgJiYgc3RhdHVzICE9IFBKX0VQRU5ESU5HKSB7CisJICAgIHBqX3N0dW5fbXNnX2Rlc3Ryb3lfdGRhdGEoc2VzcywgdGRhdGEpOworCSAgICBMT0dfRVJSXyhzZXNzLCAiRXJyb3Igc2VuZGluZyBTVFVOIHJlcXVlc3QiLCBzdGF0dXMpOworCSAgICBnb3RvIG9uX3JldHVybjsKKwl9CisKKwkvKiBBZGQgdG8gcGVuZGluZyByZXF1ZXN0IGxpc3QgKi8KKwl0c3hfYWRkKHNlc3MsIHRkYXRhKTsKKworICAgIH0gZWxzZSB7CisJaWYgKGNhY2hlX3JlcyAmJiAKKwkgICAgKFBKX1NUVU5fSVNfU1VDQ0VTU19SRVNQT05TRSh0ZGF0YS0+bXNnLT5oZHIudHlwZSkgfHwKKwkgICAgIFBKX1NUVU5fSVNfRVJST1JfUkVTUE9OU0UodGRhdGEtPm1zZy0+aGRyLnR5cGUpKSkgCisJeworCSAgICAvKiBSZXF1ZXN0ZWQgdG8ga2VlcCB0aGUgcmVzcG9uc2UgaW4gdGhlIGNhY2hlICovCisJICAgIHBqX3RpbWVfdmFsIHRpbWVvdXQ7CisJICAgIAorCSAgICBwal9tZW1zZXQoJnRkYXRhLT5yZXNfdGltZXIsIDAsIHNpemVvZih0ZGF0YS0+cmVzX3RpbWVyKSk7CisJICAgIHBqX3RpbWVyX2VudHJ5X2luaXQoJnRkYXRhLT5yZXNfdGltZXIsIFBKX0ZBTFNFLCB0ZGF0YSwKKwkJCQkmb25fY2FjaGVfdGltZW91dCk7CisKKwkgICAgdGltZW91dC5zZWMgPSBzZXNzLT5jZmctPnJlc19jYWNoZV9tc2VjIC8gMTAwMDsKKwkgICAgdGltZW91dC5tc2VjID0gc2Vzcy0+Y2ZnLT5yZXNfY2FjaGVfbXNlYyAlIDEwMDA7CisKKwkgICAgc3RhdHVzID0gcGpfdGltZXJfaGVhcF9zY2hlZHVsZV93X2dycF9sb2NrKHNlc3MtPmNmZy0+dGltZXJfaGVhcCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZGF0YS0+cmVzX3RpbWVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWVvdXQsIFBKX1RSVUUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzLT5ncnBfbG9jayk7CisJICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCQlwal9zdHVuX21zZ19kZXN0cm95X3RkYXRhKHNlc3MsIHRkYXRhKTsKKwkJTE9HX0VSUl8oc2VzcywgIkVycm9yIHNjaGVkdWxpbmcgcmVzcG9uc2UgdGltZXIiLCBzdGF0dXMpOworCQlnb3RvIG9uX3JldHVybjsKKwkgICAgfQorCisJICAgIHBqX2xpc3RfcHVzaF9iYWNrKCZzZXNzLT5jYWNoZWRfcmVzcG9uc2VfbGlzdCwgdGRhdGEpOworCX0KKyAgICAKKwkvKiBPdGhlcndpc2UgZm9yIG5vbi1yZXF1ZXN0IG1lc3NhZ2UsIHNlbmQgZGlyZWN0bHkgdG8gdHJhbnNwb3J0LiAqLworCXN0YXR1cyA9IHNlc3MtPmNiLm9uX3NlbmRfbXNnKHNlc3MsIHRva2VuLCB0ZGF0YS0+cGt0LCAKKwkJCQkgICAgICB0ZGF0YS0+cGt0X3NpemUsIHNlcnZlciwgYWRkcl9sZW4pOworCisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTICYmIHN0YXR1cyAhPSBQSl9FUEVORElORykgeworCSAgICBwal9zdHVuX21zZ19kZXN0cm95X3RkYXRhKHNlc3MsIHRkYXRhKTsKKwkgICAgTE9HX0VSUl8oc2VzcywgIkVycm9yIHNlbmRpbmcgU1RVTiByZXF1ZXN0Iiwgc3RhdHVzKTsKKwkgICAgZ290byBvbl9yZXR1cm47CisJfQorCisJLyogRGVzdHJveSBvbmx5IHdoZW4gcmVzcG9uc2UgaXMgbm90IGNhY2hlZCovCisJaWYgKHRkYXRhLT5yZXNfdGltZXIuaWQgPT0gMCkgeworCSAgICBwal9zdHVuX21zZ19kZXN0cm95X3RkYXRhKHNlc3MsIHRkYXRhKTsKKwl9CisgICAgfQorCitvbl9yZXR1cm46CisgICAgcGpfbG9nX3BvcF9pbmRlbnQoKTsKKworICAgIGlmIChwal9ncnBfbG9ja19yZWxlYXNlKHNlc3MtPmdycF9sb2NrKSkKKwlyZXR1cm4gUEpfRUdPTkU7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qCisgKiBDcmVhdGUgYW5kIHNlbmQgU1RVTiByZXNwb25zZSBtZXNzYWdlLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3N0dW5fc2Vzc2lvbl9yZXNwb25kKCBwal9zdHVuX3Nlc3Npb24gKnNlc3MsIAorCQkJCQkgICAgIGNvbnN0IHBqX3N0dW5fcnhfZGF0YSAqcmRhdGEsCisJCQkJCSAgICAgdW5zaWduZWQgY29kZSwgCisJCQkJCSAgICAgY29uc3QgY2hhciAqZXJybXNnLAorCQkJCQkgICAgIHZvaWQgKnRva2VuLAorCQkJCQkgICAgIHBqX2Jvb2xfdCBjYWNoZSwgCisJCQkJCSAgICAgY29uc3QgcGpfc29ja2FkZHJfdCAqZHN0X2FkZHIsIAorCQkJCQkgICAgIHVuc2lnbmVkIGFkZHJfbGVuKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICBwal9zdHJfdCByZWFzb247CisgICAgcGpfc3R1bl90eF9kYXRhICp0ZGF0YTsKKworICAgIHBqX2dycF9sb2NrX2FjcXVpcmUoc2Vzcy0+Z3JwX2xvY2spOworICAgIGlmIChzZXNzLT5pc19kZXN0cm95aW5nKSB7CisJcGpfZ3JwX2xvY2tfcmVsZWFzZShzZXNzLT5ncnBfbG9jayk7CisJcmV0dXJuIFBKX0VJTlZBTElET1A7CisgICAgfQorCisgICAgc3RhdHVzID0gcGpfc3R1bl9zZXNzaW9uX2NyZWF0ZV9yZXMoc2VzcywgcmRhdGEsIGNvZGUsIAorCQkJCQkoZXJybXNnP3BqX2NzdHIoJnJlYXNvbixlcnJtc2cpOk5VTEwpLCAKKwkJCQkJJnRkYXRhKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlwal9ncnBfbG9ja19yZWxlYXNlKHNlc3MtPmdycF9sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqX3N0dW5fc2Vzc2lvbl9zZW5kX21zZyhzZXNzLCB0b2tlbiwgY2FjaGUsIFBKX0ZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYWRkciwgIGFkZHJfbGVuLCB0ZGF0YSk7CisKKyAgICBwal9ncnBfbG9ja19yZWxlYXNlKHNlc3MtPmdycF9sb2NrKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qCisgKiBDYW5jZWwgb3V0Z29pbmcgU1RVTiB0cmFuc2FjdGlvbi4gCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc3R1bl9zZXNzaW9uX2NhbmNlbF9yZXEoIHBqX3N0dW5fc2Vzc2lvbiAqc2VzcywKKwkJCQkJCXBqX3N0dW5fdHhfZGF0YSAqdGRhdGEsCisJCQkJCQlwal9ib29sX3Qgbm90aWZ5LAorCQkJCQkJcGpfc3RhdHVzX3Qgbm90aWZ5X3N0YXR1cykKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNlc3MgJiYgdGRhdGEsIFBKX0VJTlZBTCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTighbm90aWZ5IHx8IG5vdGlmeV9zdGF0dXMhPVBKX1NVQ0NFU1MsIFBKX0VJTlZBTCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihQSl9TVFVOX0lTX1JFUVVFU1QodGRhdGEtPm1zZy0+aGRyLnR5cGUpLCBQSl9FSU5WQUwpOworCisgICAgLyogTG9jayB0aGUgc2Vzc2lvbiBhbmQgcHJldmVudCB1c2VyIGZyb20gZGVzdHJveWluZyB1cyBpbiB0aGUgY2FsbGJhY2sgKi8KKyAgICBwal9ncnBfbG9ja19hY3F1aXJlKHNlc3MtPmdycF9sb2NrKTsKKyAgICBpZiAoc2Vzcy0+aXNfZGVzdHJveWluZykgeworCXBqX2dycF9sb2NrX3JlbGVhc2Uoc2Vzcy0+Z3JwX2xvY2spOworCXJldHVybiBQSl9FSU5WQUxJRE9QOworICAgIH0KKworICAgIGlmIChub3RpZnkpIHsKKwkoc2Vzcy0+Y2Iub25fcmVxdWVzdF9jb21wbGV0ZSkoc2Vzcywgbm90aWZ5X3N0YXR1cywgdGRhdGEtPnRva2VuLCAKKwkJCQkgICAgICAgdGRhdGEsIE5VTEwsIE5VTEwsIDApOworICAgIH0KKworICAgIC8qIEp1c3QgZGVzdHJveSB0ZGF0YS4gVGhpcyB3aWxsIGRlc3Ryb3kgdGhlIHRyYW5zYWN0aW9uIGFzIHdlbGwgKi8KKyAgICBwal9zdHVuX21zZ19kZXN0cm95X3RkYXRhKHNlc3MsIHRkYXRhKTsKKworICAgIHBqX2dycF9sb2NrX3JlbGVhc2Uoc2Vzcy0+Z3JwX2xvY2spOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBFeHBsaWNpdGx5IHJlcXVlc3QgcmV0cmFuc21pc3Npb24gb2YgdGhlIHJlcXVlc3QuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc3R1bl9zZXNzaW9uX3JldHJhbnNtaXRfcmVxKHBqX3N0dW5fc2Vzc2lvbiAqc2VzcywKKwkJCQkJCSAgIHBqX3N0dW5fdHhfZGF0YSAqdGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9ib29sX3QgbW9kX2NvdW50KQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4oc2VzcyAmJiB0ZGF0YSwgUEpfRUlOVkFMKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKFBKX1NUVU5fSVNfUkVRVUVTVCh0ZGF0YS0+bXNnLT5oZHIudHlwZSksIFBKX0VJTlZBTCk7CisKKyAgICAvKiBMb2NrIHRoZSBzZXNzaW9uIGFuZCBwcmV2ZW50IHVzZXIgZnJvbSBkZXN0cm95aW5nIHVzIGluIHRoZSBjYWxsYmFjayAqLworICAgIHBqX2dycF9sb2NrX2FjcXVpcmUoc2Vzcy0+Z3JwX2xvY2spOworICAgIGlmIChzZXNzLT5pc19kZXN0cm95aW5nKSB7CisJcGpfZ3JwX2xvY2tfcmVsZWFzZShzZXNzLT5ncnBfbG9jayk7CisJcmV0dXJuIFBKX0VJTlZBTElET1A7CisgICAgfQorCisgICAgc3RhdHVzID0gcGpfc3R1bl9jbGllbnRfdHN4X3JldHJhbnNtaXQodGRhdGEtPmNsaWVudF90c3gsIG1vZF9jb3VudCk7CisKKyAgICBwal9ncnBfbG9ja19yZWxlYXNlKHNlc3MtPmdycF9sb2NrKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyogU2VuZCByZXNwb25zZSAqLworc3RhdGljIHBqX3N0YXR1c190IHNlbmRfcmVzcG9uc2UocGpfc3R1bl9zZXNzaW9uICpzZXNzLCB2b2lkICp0b2tlbiwKKwkJCQkgcGpfcG9vbF90ICpwb29sLCBwal9zdHVuX21zZyAqcmVzcG9uc2UsCisJCQkJIGNvbnN0IHBqX3N0dW5fcmVxX2NyZWRfaW5mbyAqYXV0aF9pbmZvLAorCQkJCSBwal9ib29sX3QgcmV0cmFuc21pc3Npb24sCisJCQkJIGNvbnN0IHBqX3NvY2thZGRyX3QgKmFkZHIsIHVuc2lnbmVkIGFkZHJfbGVuKQoreworICAgIHBqX3VpbnQ4X3QgKm91dF9wa3Q7CisgICAgcGpfc2l6ZV90IG91dF9tYXhfbGVuLCBvdXRfbGVuOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIC8qIEFwcGx5IG9wdGlvbnMgKi8KKyAgICBpZiAoIXJldHJhbnNtaXNzaW9uKSB7CisJc3RhdHVzID0gYXBwbHlfbXNnX29wdGlvbnMoc2VzcywgcG9vbCwgYXV0aF9pbmZvLCByZXNwb25zZSk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8qIEFsbG9jIHBhY2tldCBidWZmZXIgKi8KKyAgICBvdXRfbWF4X2xlbiA9IFBKX1NUVU5fTUFYX1BLVF9MRU47CisgICAgb3V0X3BrdCA9IChwal91aW50OF90KikgcGpfcG9vbF9hbGxvYyhwb29sLCBvdXRfbWF4X2xlbik7CisKKyAgICAvKiBFbmNvZGUgKi8KKyAgICBzdGF0dXMgPSBwal9zdHVuX21zZ19lbmNvZGUocmVzcG9uc2UsIG91dF9wa3QsIG91dF9tYXhfbGVuLCAwLCAKKwkJCQkmYXV0aF9pbmZvLT5hdXRoX2tleSwgJm91dF9sZW4pOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCUxPR19FUlJfKHNlc3MsICJFcnJvciBlbmNvZGluZyBtZXNzYWdlIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8qIFByaW50IGxvZyAqLworICAgIGR1bXBfdHhfbXNnKHNlc3MsIHJlc3BvbnNlLCAodW5zaWduZWQpb3V0X2xlbiwgYWRkcik7CisKKyAgICAvKiBTZW5kIHBhY2tldCAqLworICAgIHN0YXR1cyA9IHNlc3MtPmNiLm9uX3NlbmRfbXNnKHNlc3MsIHRva2VuLCBvdXRfcGt0LCAodW5zaWduZWQpb3V0X2xlbiwgCisJCQkJICBhZGRyLCBhZGRyX2xlbik7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBBdXRoZW50aWNhdGUgaW5jb21pbmcgbWVzc2FnZSAqLworc3RhdGljIHBqX3N0YXR1c190IGF1dGhlbnRpY2F0ZV9yZXEocGpfc3R1bl9zZXNzaW9uICpzZXNzLAorCQkJCSAgICB2b2lkICp0b2tlbiwKKwkJCQkgICAgY29uc3QgcGpfdWludDhfdCAqcGt0LAorCQkJCSAgICB1bnNpZ25lZCBwa3RfbGVuLAorCQkJCSAgICBwal9zdHVuX3J4X2RhdGEgKnJkYXRhLAorCQkJCSAgICBwal9wb29sX3QgKnRtcF9wb29sLAorCQkJCSAgICBjb25zdCBwal9zb2NrYWRkcl90ICpzcmNfYWRkciwKKwkJCQkgICAgdW5zaWduZWQgc3JjX2FkZHJfbGVuKQoreworICAgIHBqX3N0dW5fbXNnICpyZXNwb25zZTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBpZiAoUEpfU1RVTl9JU19FUlJPUl9SRVNQT05TRShyZGF0YS0+bXNnLT5oZHIudHlwZSkgfHwgCisJc2Vzcy0+YXV0aF90eXBlID09IFBKX1NUVU5fQVVUSF9OT05FKQorICAgIHsKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwal9zdHVuX2F1dGhlbnRpY2F0ZV9yZXF1ZXN0KHBrdCwgcGt0X2xlbiwgcmRhdGEtPm1zZywgCisJCQkJCSAgJnNlc3MtPmNyZWQsIHRtcF9wb29sLCAmcmRhdGEtPmluZm8sCisJCQkJCSAgJnJlc3BvbnNlKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworCVBKX0xPRyg1LChTTkFNRShzZXNzKSwgIk1lc3NhZ2UgYXV0aGVudGljYXRpb24gZmFpbGVkIikpOworCXNlbmRfcmVzcG9uc2Uoc2VzcywgdG9rZW4sIHRtcF9wb29sLCByZXNwb25zZSwgJnJkYXRhLT5pbmZvLCAKKwkJICAgICAgUEpfRkFMU0UsIHNyY19hZGRyLCBzcmNfYWRkcl9sZW4pOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyogSGFuZGxlIGluY29taW5nIHJlc3BvbnNlICovCitzdGF0aWMgcGpfc3RhdHVzX3Qgb25faW5jb21pbmdfcmVzcG9uc2UocGpfc3R1bl9zZXNzaW9uICpzZXNzLAorCQkJCQl1bnNpZ25lZCBvcHRpb25zLAorCQkJCQljb25zdCBwal91aW50OF90ICpwa3QsCisJCQkJCXVuc2lnbmVkIHBrdF9sZW4sCisJCQkJCXBqX3N0dW5fbXNnICptc2csCisJCQkJCWNvbnN0IHBqX3NvY2thZGRyX3QgKnNyY19hZGRyLAorCQkJCQl1bnNpZ25lZCBzcmNfYWRkcl9sZW4pCit7CisgICAgcGpfc3R1bl90eF9kYXRhICp0ZGF0YTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICAvKiBMb29rdXAgcGVuZGluZyBjbGllbnQgdHJhbnNhY3Rpb24gKi8KKyAgICB0ZGF0YSA9IHRzeF9sb29rdXAoc2VzcywgbXNnKTsKKyAgICBpZiAodGRhdGEgPT0gTlVMTCkgeworCVBKX0xPRyg1LChTTkFNRShzZXNzKSwgCisJCSAgIlRyYW5zYWN0aW9uIG5vdCBmb3VuZCwgcmVzcG9uc2Ugc2lsZW50bHkgZGlzY2FyZGVkIikpOworCXJldHVybiBQSl9TVUNDRVNTOworICAgIH0KKworICAgIGlmIChzZXNzLT5hdXRoX3R5cGUgPT0gUEpfU1RVTl9BVVRIX05PTkUpCisJb3B0aW9ucyB8PSBQSl9TVFVOX05PX0FVVEhFTlRJQ0FURTsKKworICAgIC8qIEF1dGhlbnRpY2F0ZSB0aGUgbWVzc2FnZSwgdW5sZXNzIFBKX1NUVU5fTk9fQVVUSEVOVElDQVRFCisgICAgICogaXMgc3BlY2lmaWVkIGluIHRoZSBvcHRpb24uCisgICAgICovCisgICAgaWYgKChvcHRpb25zICYgUEpfU1RVTl9OT19BVVRIRU5USUNBVEUpID09IDAgJiYgCisJdGRhdGEtPmF1dGhfaW5mby5hdXRoX2tleS5zbGVuICE9IDAgJiYgCisJcGpfc3R1bl9hdXRoX3ZhbGlkX2Zvcl9tc2cobXNnKSkKKyAgICB7CisJc3RhdHVzID0gcGpfc3R1bl9hdXRoZW50aWNhdGVfcmVzcG9uc2UocGt0LCBwa3RfbGVuLCBtc2csIAorCQkJCQkgICAgICAgJnRkYXRhLT5hdXRoX2luZm8uYXV0aF9rZXkpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBQSl9MT0coNSwoU05BTUUoc2VzcyksIAorCQkgICAgICAiUmVzcG9uc2UgYXV0aGVudGljYXRpb24gZmFpbGVkIikpOworCSAgICByZXR1cm4gc3RhdHVzOworCX0KKyAgICB9CisKKyAgICAvKiBQYXNzIHRoZSByZXNwb25zZSB0byB0aGUgdHJhbnNhY3Rpb24uIAorICAgICAqIElmIHRoZSBtZXNzYWdlIGlzIGFjY2VwdGVkLCB0cmFuc2FjdGlvbiBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCwKKyAgICAgKiBhbmQgdGhpcyB3aWxsIGNhbGwgdGhlIHNlc3Npb24gY2FsbGJhY2sgdG9vLgorICAgICAqLworICAgIHN0YXR1cyA9IHBqX3N0dW5fY2xpZW50X3RzeF9vbl9yeF9tc2codGRhdGEtPmNsaWVudF90c3gsIG1zZywgCisJCQkJCSAgc3JjX2FkZHIsIHNyY19hZGRyX2xlbik7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCisvKiBGb3IgcmVxdWVzdHMsIGNoZWNrIGlmIHdlIGNhY2hlIHRoZSByZXNwb25zZSAqLworc3RhdGljIHBqX3N0YXR1c190IGNoZWNrX2NhY2hlZF9yZXNwb25zZShwal9zdHVuX3Nlc3Npb24gKnNlc3MsCisJCQkJCSBwal9wb29sX3QgKnRtcF9wb29sLAorCQkJCQkgY29uc3QgcGpfc3R1bl9tc2cgKm1zZywKKwkJCQkJIGNvbnN0IHBqX3NvY2thZGRyX3QgKnNyY19hZGRyLAorCQkJCQkgdW5zaWduZWQgc3JjX2FkZHJfbGVuKQoreworICAgIHBqX3N0dW5fdHhfZGF0YSAqdDsKKworICAgIC8qIEZpcnN0IGxvb2t1cCByZXNwb25zZSBpbiByZXNwb25zZSBjYWNoZSAqLworICAgIHQgPSBzZXNzLT5jYWNoZWRfcmVzcG9uc2VfbGlzdC5uZXh0OworICAgIHdoaWxlICh0ICE9ICZzZXNzLT5jYWNoZWRfcmVzcG9uc2VfbGlzdCkgeworCWlmICh0LT5tc2dfbWFnaWMgPT0gbXNnLT5oZHIubWFnaWMgJiYKKwkgICAgdC0+bXNnLT5oZHIudHlwZSA9PSBtc2ctPmhkci50eXBlICYmCisJICAgIHBqX21lbWNtcCh0LT5tc2dfa2V5LCBtc2ctPmhkci50c3hfaWQsIAorCQkgICAgICBzaXplb2YobXNnLT5oZHIudHN4X2lkKSk9PTApCisJeworCSAgICBicmVhazsKKwl9CisJdCA9IHQtPm5leHQ7CisgICAgfQorCisgICAgaWYgKHQgIT0gJnNlc3MtPmNhY2hlZF9yZXNwb25zZV9saXN0KSB7CisJLyogRm91bmQgcmVzcG9uc2UgaW4gdGhlIGNhY2hlICovCisKKwlQSl9MT0coNSwoU05BTUUoc2VzcyksIAorCQkgIlJlcXVlc3QgcmV0cmFuc21pc3Npb24sIHNlbmRpbmcgY2FjaGVkIHJlc3BvbnNlIikpOworCisJc2VuZF9yZXNwb25zZShzZXNzLCB0LT50b2tlbiwgdG1wX3Bvb2wsIHQtPm1zZywgJnQtPmF1dGhfaW5mbywgCisJCSAgICAgIFBKX1RSVUUsIHNyY19hZGRyLCBzcmNfYWRkcl9sZW4pOworCXJldHVybiBQSl9TVUNDRVNTOworICAgIH0KKworICAgIHJldHVybiBQSl9FTk9URk9VTkQ7Cit9CisKKy8qIEhhbmRsZSBpbmNvbWluZyByZXF1ZXN0ICovCitzdGF0aWMgcGpfc3RhdHVzX3Qgb25faW5jb21pbmdfcmVxdWVzdChwal9zdHVuX3Nlc3Npb24gKnNlc3MsCisJCQkJICAgICAgIHVuc2lnbmVkIG9wdGlvbnMsCisJCQkJICAgICAgIHZvaWQgKnRva2VuLAorCQkJCSAgICAgICBwal9wb29sX3QgKnRtcF9wb29sLAorCQkJCSAgICAgICBjb25zdCBwal91aW50OF90ICppbl9wa3QsCisJCQkJICAgICAgIHVuc2lnbmVkIGluX3BrdF9sZW4sCisJCQkJICAgICAgIHBqX3N0dW5fbXNnICptc2csCisJCQkJICAgICAgIGNvbnN0IHBqX3NvY2thZGRyX3QgKnNyY19hZGRyLAorCQkJCSAgICAgICB1bnNpZ25lZCBzcmNfYWRkcl9sZW4pCit7CisgICAgcGpfc3R1bl9yeF9kYXRhIHJkYXRhOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIC8qIEluaXQgcmRhdGEgKi8KKyAgICByZGF0YS5tc2cgPSBtc2c7CisgICAgcGpfYnplcm8oJnJkYXRhLmluZm8sIHNpemVvZihyZGF0YS5pbmZvKSk7CisKKyAgICBpZiAoc2Vzcy0+YXV0aF90eXBlID09IFBKX1NUVU5fQVVUSF9OT05FKQorCW9wdGlvbnMgfD0gUEpfU1RVTl9OT19BVVRIRU5USUNBVEU7CisKKyAgICAvKiBBdXRoZW50aWNhdGUgdGhlIG1lc3NhZ2UsIHVubGVzcyBQSl9TVFVOX05PX0FVVEhFTlRJQ0FURQorICAgICAqIGlzIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9uLgorICAgICAqLworICAgIGlmICgob3B0aW9ucyAmIFBKX1NUVU5fTk9fQVVUSEVOVElDQVRFKSA9PSAwKSB7CisJc3RhdHVzID0gYXV0aGVudGljYXRlX3JlcShzZXNzLCB0b2tlbiwgKGNvbnN0IHBqX3VpbnQ4X3QqKSBpbl9wa3QsIAorCQkJCSAgaW5fcGt0X2xlbiwmcmRhdGEsIHRtcF9wb29sLCBzcmNfYWRkciwgCisJCQkJICBzcmNfYWRkcl9sZW4pOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICByZXR1cm4gc3RhdHVzOworCX0KKyAgICB9CisKKyAgICAvKiBEaXN0cmlidXRlIHRvIGhhbmRsZXIsIG9yIHJlc3BvbmQgd2l0aCBCYWQgUmVxdWVzdCAqLworICAgIGlmIChzZXNzLT5jYi5vbl9yeF9yZXF1ZXN0KSB7CisJc3RhdHVzID0gKCpzZXNzLT5jYi5vbl9yeF9yZXF1ZXN0KShzZXNzLCBpbl9wa3QsIGluX3BrdF9sZW4sICZyZGF0YSwKKwkJCQkJICAgdG9rZW4sIHNyY19hZGRyLCBzcmNfYWRkcl9sZW4pOworICAgIH0gZWxzZSB7CisJcGpfc3RyX3QgZXJyX3RleHQ7CisJcGpfc3R1bl9tc2cgKnJlc3BvbnNlOworCisJZXJyX3RleHQgPSBwal9zdHIoIkNhbGxiYWNrIGlzIG5vdCBzZXQgdG8gaGFuZGxlIHJlcXVlc3QiKTsKKwlzdGF0dXMgPSBwal9zdHVuX21zZ19jcmVhdGVfcmVzcG9uc2UodG1wX3Bvb2wsIG1zZywgCisJCQkJCSAgICAgUEpfU1RVTl9TQ19CQURfUkVRVUVTVCwgCisJCQkJCSAgICAgJmVycl90ZXh0LCAmcmVzcG9uc2UpOworCWlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUyAmJiByZXNwb25zZSkgeworCSAgICBzdGF0dXMgPSBzZW5kX3Jlc3BvbnNlKHNlc3MsIHRva2VuLCB0bXBfcG9vbCwgcmVzcG9uc2UsIAorCQkJCSAgIE5VTEwsIFBKX0ZBTFNFLCBzcmNfYWRkciwgc3JjX2FkZHJfbGVuKTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKiBIYW5kbGUgaW5jb21pbmcgaW5kaWNhdGlvbiAqLworc3RhdGljIHBqX3N0YXR1c190IG9uX2luY29taW5nX2luZGljYXRpb24ocGpfc3R1bl9zZXNzaW9uICpzZXNzLAorCQkJCQkgIHZvaWQgKnRva2VuLAorCQkJCQkgIHBqX3Bvb2xfdCAqdG1wX3Bvb2wsCisJCQkJCSAgY29uc3QgcGpfdWludDhfdCAqaW5fcGt0LAorCQkJCQkgIHVuc2lnbmVkIGluX3BrdF9sZW4sCisJCQkJCSAgY29uc3QgcGpfc3R1bl9tc2cgKm1zZywKKwkJCQkJICBjb25zdCBwal9zb2NrYWRkcl90ICpzcmNfYWRkciwKKwkJCQkJICB1bnNpZ25lZCBzcmNfYWRkcl9sZW4pCit7CisgICAgUEpfVU5VU0VEX0FSRyh0bXBfcG9vbCk7CisKKyAgICAvKiBEaXN0cmlidXRlIHRvIGhhbmRsZXIgKi8KKyAgICBpZiAoc2Vzcy0+Y2Iub25fcnhfaW5kaWNhdGlvbikgeworCXJldHVybiAoKnNlc3MtPmNiLm9uX3J4X2luZGljYXRpb24pKHNlc3MsIGluX3BrdCwgaW5fcGt0X2xlbiwgbXNnLAorCQkJCQkgICAgdG9rZW4sIHNyY19hZGRyLCBzcmNfYWRkcl9sZW4pOworICAgIH0gZWxzZSB7CisJcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgfQorfQorCisKKy8qIFByaW50IG91dGdvaW5nIG1lc3NhZ2UgdG8gbG9nICovCitzdGF0aWMgdm9pZCBkdW1wX3J4X21zZyhwal9zdHVuX3Nlc3Npb24gKnNlc3MsIGNvbnN0IHBqX3N0dW5fbXNnICptc2csCisJCQl1bnNpZ25lZCBwa3Rfc2l6ZSwgY29uc3QgcGpfc29ja2FkZHJfdCAqYWRkcikKK3sKKyAgICBjaGFyIHNyY19pbmZvW1BKX0lORVQ2X0FERFJTVFJMRU4rMTBdOworICAgIAorICAgIGlmICgoUEpfU1RVTl9JU19SRVFVRVNUKG1zZy0+aGRyLnR5cGUpICYmIAorCSAoc2Vzcy0+bG9nX2ZsYWcgJiBQSl9TVFVOX1NFU1NfTE9HX1JYX1JFUSk9PTApIHx8CisJKFBKX1NUVU5fSVNfUkVTUE9OU0UobXNnLT5oZHIudHlwZSkgJiYKKwkgKHNlc3MtPmxvZ19mbGFnICYgUEpfU1RVTl9TRVNTX0xPR19SWF9SRVMpPT0wKSB8fAorCShQSl9TVFVOX0lTX0lORElDQVRJT04obXNnLT5oZHIudHlwZSkgJiYKKwkgKHNlc3MtPmxvZ19mbGFnICYgUEpfU1RVTl9TRVNTX0xPR19SWF9JTkQpPT0wKSkKKyAgICB7CisJcmV0dXJuOworICAgIH0KKworICAgIHBqX3NvY2thZGRyX3ByaW50KGFkZHIsIHNyY19pbmZvLCBzaXplb2Yoc3JjX2luZm8pLCAzKTsKKworICAgIFBKX0xPRyg1LChTTkFNRShzZXNzKSwKKwkgICAgICAiUlggJWQgYnl0ZXMgU1RVTiBtZXNzYWdlIGZyb20gJXM6XG4iCisJICAgICAgIi0tLSBiZWdpbiBTVFVOIG1lc3NhZ2UgLS0tXG4iCisJICAgICAgIiVzIgorCSAgICAgICItLS0gZW5kIG9mIFNUVU4gbWVzc2FnZSAtLS1cbiIsCisJICAgICAgcGt0X3NpemUsIHNyY19pbmZvLAorCSAgICAgIHBqX3N0dW5fbXNnX2R1bXAobXNnLCBzZXNzLT5kdW1wX2J1Ziwgc2l6ZW9mKHNlc3MtPmR1bXBfYnVmKSwgCisJCQkgICAgICAgTlVMTCkpKTsKKworfQorCisvKiBJbmNvbWluZyBwYWNrZXQgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc3R1bl9zZXNzaW9uX29uX3J4X3BrdChwal9zdHVuX3Nlc3Npb24gKnNlc3MsCisJCQkJCSAgICAgIGNvbnN0IHZvaWQgKnBhY2tldCwKKwkJCQkJICAgICAgcGpfc2l6ZV90IHBrdF9zaXplLAorCQkJCQkgICAgICB1bnNpZ25lZCBvcHRpb25zLAorCQkJCQkgICAgICB2b2lkICp0b2tlbiwKKwkJCQkJICAgICAgcGpfc2l6ZV90ICpwYXJzZWRfbGVuLAorCQkJCQkgICAgICBjb25zdCBwal9zb2NrYWRkcl90ICpzcmNfYWRkciwKKwkJCQkJICAgICAgdW5zaWduZWQgc3JjX2FkZHJfbGVuKQoreworICAgIHBqX3N0dW5fbXNnICptc2csICpyZXNwb25zZTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNlc3MgJiYgcGFja2V0ICYmIHBrdF9zaXplLCBQSl9FSU5WQUwpOworCisgICAgLyogTG9jayB0aGUgc2Vzc2lvbiBhbmQgcHJldmVudCB1c2VyIGZyb20gZGVzdHJveWluZyB1cyBpbiB0aGUgY2FsbGJhY2sgKi8KKyAgICBwal9ncnBfbG9ja19hY3F1aXJlKHNlc3MtPmdycF9sb2NrKTsKKworICAgIGlmIChzZXNzLT5pc19kZXN0cm95aW5nKSB7CisJcGpfZ3JwX2xvY2tfcmVsZWFzZShzZXNzLT5ncnBfbG9jayk7CisJcmV0dXJuIFBKX0VJTlZBTElET1A7CisgICAgfQorCisgICAgcGpfbG9nX3B1c2hfaW5kZW50KCk7CisKKyAgICAvKiBSZXNldCBwb29sICovCisgICAgcGpfcG9vbF9yZXNldChzZXNzLT5yeF9wb29sKTsKKworICAgIC8qIFRyeSB0byBwYXJzZSB0aGUgbWVzc2FnZSAqLworICAgIHN0YXR1cyA9IHBqX3N0dW5fbXNnX2RlY29kZShzZXNzLT5yeF9wb29sLCAoY29uc3QgcGpfdWludDhfdCopcGFja2V0LAorCQkJICAgICAgICBwa3Rfc2l6ZSwgb3B0aW9ucywgCisJCQkJJm1zZywgcGFyc2VkX2xlbiwgJnJlc3BvbnNlKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlMT0dfRVJSXyhzZXNzLCAiU1RVTiBtc2dfZGVjb2RlKCkgZXJyb3IiLCBzdGF0dXMpOworCWlmIChyZXNwb25zZSkgeworCSAgICBzZW5kX3Jlc3BvbnNlKHNlc3MsIHRva2VuLCBzZXNzLT5yeF9wb29sLCByZXNwb25zZSwgTlVMTCwKKwkJCSAgUEpfRkFMU0UsIHNyY19hZGRyLCBzcmNfYWRkcl9sZW4pOworCX0KKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICBkdW1wX3J4X21zZyhzZXNzLCBtc2csICh1bnNpZ25lZClwa3Rfc2l6ZSwgc3JjX2FkZHIpOworCisgICAgLyogRm9yIHJlcXVlc3RzLCBjaGVjayBpZiB3ZSBoYXZlIGNhY2hlZCByZXNwb25zZSAqLworICAgIHN0YXR1cyA9IGNoZWNrX2NhY2hlZF9yZXNwb25zZShzZXNzLCBzZXNzLT5yeF9wb29sLCBtc2csIAorCQkJCSAgIHNyY19hZGRyLCBzcmNfYWRkcl9sZW4pOworICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIC8qIEhhbmRsZSBtZXNzYWdlICovCisgICAgaWYgKFBKX1NUVU5fSVNfU1VDQ0VTU19SRVNQT05TRShtc2ctPmhkci50eXBlKSB8fAorCVBKX1NUVU5fSVNfRVJST1JfUkVTUE9OU0UobXNnLT5oZHIudHlwZSkpCisgICAgeworCXN0YXR1cyA9IG9uX2luY29taW5nX3Jlc3BvbnNlKHNlc3MsIG9wdGlvbnMsIAorCQkJCSAgICAgIChjb25zdCBwal91aW50OF90KikgcGFja2V0LCAKKwkJCQkgICAgICAodW5zaWduZWQpcGt0X3NpemUsIG1zZywgCisJCQkJICAgICAgc3JjX2FkZHIsIHNyY19hZGRyX2xlbik7CisKKyAgICB9IGVsc2UgaWYgKFBKX1NUVU5fSVNfUkVRVUVTVChtc2ctPmhkci50eXBlKSkgeworCisJc3RhdHVzID0gb25faW5jb21pbmdfcmVxdWVzdChzZXNzLCBvcHRpb25zLCB0b2tlbiwgc2Vzcy0+cnhfcG9vbCwgCisJCQkJICAgICAoY29uc3QgcGpfdWludDhfdCopIHBhY2tldCwgCisJCQkJICAgICAodW5zaWduZWQpcGt0X3NpemUsIAorCQkJCSAgICAgbXNnLCBzcmNfYWRkciwgc3JjX2FkZHJfbGVuKTsKKworICAgIH0gZWxzZSBpZiAoUEpfU1RVTl9JU19JTkRJQ0FUSU9OKG1zZy0+aGRyLnR5cGUpKSB7CisKKwlzdGF0dXMgPSBvbl9pbmNvbWluZ19pbmRpY2F0aW9uKHNlc3MsIHRva2VuLCBzZXNzLT5yeF9wb29sLCAKKwkJCQkJKGNvbnN0IHBqX3VpbnQ4X3QqKSBwYWNrZXQsIAorCQkJCQkodW5zaWduZWQpcGt0X3NpemUsIG1zZywgc3JjX2FkZHIsIAorCQkJCQlzcmNfYWRkcl9sZW4pOworCisgICAgfSBlbHNlIHsKKwlwal9hc3NlcnQoISJVbmV4cGVjdGVkISIpOworCXN0YXR1cyA9IFBKX0VCVUc7CisgICAgfQorCitvbl9yZXR1cm46CisgICAgcGpfbG9nX3BvcF9pbmRlbnQoKTsKKworICAgIGlmIChwal9ncnBfbG9ja19yZWxlYXNlKHNlc3MtPmdycF9sb2NrKSkKKwlyZXR1cm4gUEpfRUdPTkU7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS9mOC9mODM4MjE2MDgzYjgxNjNjNWI3OWE0Y2ZiOTQwOGI2MmI1OTNjMjRmLnN2bi1iYXNlIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvZjgvZjgzODIxNjA4M2I4MTYzYzViNzlhNGNmYjk0MDhiNjJiNTkzYzI0Zi5zdm4tYmFzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzM4ODQxCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvZjgvZjgzODIxNjA4M2I4MTYzYzViNzlhNGNmYjk0MDhiNjJiNTkzYzI0Zi5zdm4tYmFzZQpAQCAtMCwwICsxLDI3IEBACisvKiAkSWQkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbXBvcnQgPFVJS2l0L1VJS2l0Lmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyAgICAKKyAgICBOU0F1dG9yZWxlYXNlUG9vbCAqIHBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKKyAgICBpbnQgcmV0VmFsID0gVUlBcHBsaWNhdGlvbk1haW4oYXJnYywgYXJndiwgbmlsLCBuaWwpOworICAgIFtwb29sIHJlbGVhc2VdOworICAgIHJldHVybiByZXRWYWw7Cit9CmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS9mOC9mODQwNDA0NTNkMjlkNGQ3NjVlOTllMGYwNTNkODNiNjcyN2JhNzFmLnN2bi1iYXNlIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvZjgvZjg0MDQwNDUzZDI5ZDRkNzY1ZTk5ZTBmMDUzZDgzYjY3MjdiYTcxZi5zdm4tYmFzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDE4MjA2Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvZjgvZjg0MDQwNDUzZDI5ZDRkNzY1ZTk5ZTBmMDUzZDgzYjY3MjdiYTcxZi5zdm4tYmFzZQpAQCAtMCwwICsxLDk1NiBAQAorLyogJElkJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisKKyNpbmNsdWRlICJ0ZXN0LmgiCisKKyNpZiBJTkNMVURFX0hUVFBfQ0xJRU5UX1RFU1QKKworI2RlZmluZSBUSElTX0ZJTEUJICAgICJ0ZXN0X2h0dHAiCisvLyNkZWZpbmUgVkVSQk9TRQorI2RlZmluZSBTVFJfUFJFQyhzKSAoaW50KXMuc2xlbiwgcy5wdHIKKyNkZWZpbmUgVVNFX0xPQ0FMX1NFUlZFUgorCisjaW5jbHVkZSA8cGpsaWIuaD4KKyNpbmNsdWRlIDxwamxpYi11dGlsLmg+CisKKyNkZWZpbmUgQUNUSU9OX1JFUExZCTAKKyNkZWZpbmUgQUNUSU9OX0lHTk9SRQktMQorCitzdGF0aWMgc3RydWN0IHNlcnZlcl90Cit7CisgICAgcGpfc29ja190CSAgICAgc29jazsKKyAgICBwal91aW50MTZfdAkgICAgIHBvcnQ7CisgICAgcGpfdGhyZWFkX3QJICAgICp0aHJlYWQ7CisKKyAgICAvKiBBY3Rpb246CisgICAgICoJMDogICAgcmVwbHkgd2l0aCB0aGUgcmVzcG9uc2UgaW4gcmVzcC4KKyAgICAgKiAtMTogICAgaWdub3JlIHF1ZXJ5ICh0byBzaW11bGF0ZSB0aW1lb3V0KS4KKyAgICAgKiBvdGhlcjogcmVwbHkgd2l0aCB0aGF0IGVycm9yCisgICAgICovCisgICAgaW50CQkgICAgYWN0aW9uOworICAgIHBqX2Jvb2xfdCAgICAgICBzZW5kX2NvbnRlbnRfbGVuZ3RoOworICAgIHVuc2lnbmVkCSAgICBkYXRhX3NpemU7CisgICAgdW5zaWduZWQgICAgICAgIGJ1Zl9zaXplOworfSBnX3NlcnZlcjsKKworc3RhdGljIHBqX2Jvb2xfdCB0aHJlYWRfcXVpdDsKK3N0YXRpYyBwal90aW1lcl9oZWFwX3QgKnRpbWVyX2hlYXA7CitzdGF0aWMgcGpfaW9xdWV1ZV90ICppb3F1ZXVlOworc3RhdGljIHBqX3Bvb2xfdCAqcG9vbDsKK3N0YXRpYyBwal9odHRwX3JlcSAqaHR0cF9yZXE7CitzdGF0aWMgcGpfYm9vbF90IHRlc3RfY2FuY2VsID0gUEpfRkFMU0U7CitzdGF0aWMgcGpfc2l6ZV90IHRvdGFsX3NpemU7CitzdGF0aWMgcGpfc2l6ZV90IHNlbmRfc2l6ZSA9IDA7CitzdGF0aWMgcGpfc3RhdHVzX3Qgc3N0YXR1czsKK3N0YXRpYyBwal9zb2NrYWRkcl9pbiBhZGRyOworc3RhdGljIGludCBjb3VudGVyID0gMDsKKworc3RhdGljIGludCBzZXJ2ZXJfdGhyZWFkKHZvaWQgKnApCit7CisgICAgc3RydWN0IHNlcnZlcl90ICpzcnYgPSAoc3RydWN0IHNlcnZlcl90KilwOworICAgIGNoYXIgKnBrdCA9IChjaGFyKilwal9wb29sX2FsbG9jKHBvb2wsIHNydi0+YnVmX3NpemUpOworICAgIHBqX3NvY2tfdCBuZXdzb2NrID0gUEpfSU5WQUxJRF9TT0NLRVQ7CisKKyAgICB3aGlsZSAoIXRocmVhZF9xdWl0KSB7CisJcGpfc3NpemVfdCBwa3RfbGVuOworCWludCByYzsKKyAgICAgICAgcGpfZmRfc2V0X3QgcnNldDsKKwlwal90aW1lX3ZhbCB0aW1lb3V0ID0gezAsIDUwMH07CisKKwl3aGlsZSAoIXRocmVhZF9xdWl0KSB7CisJICAgIFBKX0ZEX1pFUk8oJnJzZXQpOworCSAgICBQSl9GRF9TRVQoc3J2LT5zb2NrLCAmcnNldCk7CisJICAgIHJjID0gcGpfc29ja19zZWxlY3QoKGludClzcnYtPnNvY2srMSwgJnJzZXQsIE5VTEwsIE5VTEwsICZ0aW1lb3V0KTsKKwkgICAgaWYgKHJjICE9IDEpIHsKKwkJY29udGludWU7CisJICAgIH0KKworCSAgICByYyA9IHBqX3NvY2tfYWNjZXB0KHNydi0+c29jaywgJm5ld3NvY2ssIE5VTEwsIE5VTEwpOworCSAgICBpZiAocmMgPT0gUEpfU1VDQ0VTUykgeworCQlicmVhazsKKwkgICAgfQorCX0KKworCWlmICh0aHJlYWRfcXVpdCkKKwkgICAgYnJlYWs7CisKKwl3aGlsZSAoIXRocmVhZF9xdWl0KSB7CisgICAgICAgICAgICBQSl9GRF9aRVJPKCZyc2V0KTsKKyAgICAgICAgICAgIFBKX0ZEX1NFVChuZXdzb2NrLCAmcnNldCk7CisgICAgICAgICAgICByYyA9IHBqX3NvY2tfc2VsZWN0KChpbnQpbmV3c29jaysxLCAmcnNldCwgTlVMTCwgTlVMTCwgJnRpbWVvdXQpOworICAgICAgICAgICAgaWYgKHJjICE9IDEpIHsKKyAgICAgICAgCVBKX0xPRygzLCgiaHR0cCB0ZXN0IiwgImNsaWVudCB0aW1lb3V0IikpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwa3RfbGVuID0gc3J2LT5idWZfc2l6ZTsKKyAgICAgICAgICAgIHJjID0gcGpfc29ja19yZWN2KG5ld3NvY2ssIHBrdCwgJnBrdF9sZW4sIDApOworICAgICAgICAgICAgaWYgKHJjID09IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisJaWYgKHRocmVhZF9xdWl0KQorCSAgICBicmVhazsKKworCS8qIFNpbXVsYXRlIG5ldHdvcmsgUlRUICovCisJcGpfdGhyZWFkX3NsZWVwKDUwKTsKKworCWlmIChzcnYtPmFjdGlvbiA9PSBBQ1RJT05fSUdOT1JFKSB7CisJICAgIGNvbnRpbnVlOworCX0gZWxzZSBpZiAoc3J2LT5hY3Rpb24gPT0gQUNUSU9OX1JFUExZKSB7CisgICAgICAgICAgICBwal9zaXplX3Qgc2VuZF9zaXplID0gMDsKKwkgICAgdW5zaWduZWQgY3RyID0gMDsKKyAgICAgICAgICAgIHBqX2Fuc2lfc3ByaW50Zihwa3QsICJIVFRQLzEuMCAyMDAgT0tcclxuIik7CisgICAgICAgICAgICBpZiAoc3J2LT5zZW5kX2NvbnRlbnRfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcGpfYW5zaV9zcHJpbnRmKHBrdCArIHBqX2Fuc2lfc3RybGVuKHBrdCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29udGVudC1MZW5ndGg6ICVkXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNydi0+ZGF0YV9zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBqX2Fuc2lfc3ByaW50Zihwa3QgKyBwal9hbnNpX3N0cmxlbihwa3QpLCAiXHJcbiIpOworICAgICAgICAgICAgcGt0X2xlbiA9IHBqX2Fuc2lfc3RybGVuKHBrdCk7CisgICAgICAgICAgICByYyA9IHBqX3NvY2tfc2VuZChuZXdzb2NrLCBwa3QsICZwa3RfbGVuLCAwKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgIAlwal9zb2NrX2Nsb3NlKG5ld3NvY2spOworICAgICAgICAJY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoc2VuZF9zaXplIDwgc3J2LT5kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICBwa3RfbGVuID0gc3J2LT5kYXRhX3NpemUgLSBzZW5kX3NpemU7CisgICAgICAgICAgICAgICAgaWYgKHBrdF9sZW4gPiAoc2lnbmVkKXNydi0+YnVmX3NpemUpCisgICAgICAgICAgICAgICAgICAgIHBrdF9sZW4gPSBzcnYtPmJ1Zl9zaXplOworICAgICAgICAgICAgICAgIHNlbmRfc2l6ZSArPSBwa3RfbGVuOworICAgICAgICAgICAgICAgIHBqX2NyZWF0ZV9yYW5kb21fc3RyaW5nKHBrdCwgcGt0X2xlbik7CisgICAgICAgICAgICAgICAgcGpfYW5zaV9zcHJpbnRmKHBrdCwgIlxuUGFja2V0OiAlZCIsICsrY3RyKTsKKyAgICAgICAgICAgICAgICBwa3RbcGpfYW5zaV9zdHJsZW4ocGt0KV0gPSAnXG4nOworCQlyYyA9IHBqX3NvY2tfc2VuZChuZXdzb2NrLCBwa3QsICZwa3RfbGVuLCAwKTsKKwkJaWYgKHJjICE9IFBKX1NVQ0NFU1MpCisJCSAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBqX3NvY2tfY2xvc2UobmV3c29jayk7CisJfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBvbl9kYXRhX3JlYWQocGpfaHR0cF9yZXEgKmhyZXEsIHZvaWQgKmRhdGEsIHBqX3NpemVfdCBzaXplKQoreworICAgIFBKX1VOVVNFRF9BUkcoaHJlcSk7CisgICAgUEpfVU5VU0VEX0FSRyhkYXRhKTsKKworICAgIFBKX0xPRyg1LCAoVEhJU19GSUxFLCAiXG5EYXRhIHJlY2VpdmVkOiAlZCBieXRlcyIsIHNpemUpKTsKKyAgICBpZiAoc2l6ZSA+IDApIHsKKyNpZmRlZiBWRVJCT1NFCisgICAgICAgIHByaW50ZigiJS4qc1xuIiwgKGludClzaXplLCAoY2hhciAqKWRhdGEpOworI2VuZGlmCisgICAgfQorfQorCitzdGF0aWMgdm9pZCBvbl9zZW5kX2RhdGEocGpfaHR0cF9yZXEgKmhyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmRhdGEsIHBqX3NpemVfdCAqc2l6ZSkKK3sKKyAgICBjaGFyICpzZGF0YTsKKyAgICBwal9zaXplX3Qgc2VuZHN6ID0gODM5NzsKKworICAgIFBKX1VOVVNFRF9BUkcoaHJlcSk7CisKKyAgICBpZiAoc2VuZF9zaXplICsgc2VuZHN6ID4gdG90YWxfc2l6ZSkgeworICAgICAgICBzZW5kc3ogPSB0b3RhbF9zaXplIC0gc2VuZF9zaXplOworICAgIH0KKyAgICBzZW5kX3NpemUgKz0gc2VuZHN6OworCisgICAgc2RhdGEgPSAoY2hhciopcGpfcG9vbF9hbGxvYyhwb29sLCBzZW5kc3opOworICAgIHBqX2NyZWF0ZV9yYW5kb21fc3RyaW5nKHNkYXRhLCBzZW5kc3opOworICAgIHBqX2Fuc2lfc3ByaW50ZihzZGF0YSwgIlxuU2VnbWVudCAjJWRcbiIsICsrY291bnRlcik7CisgICAgKmRhdGEgPSBzZGF0YTsKKyAgICAqc2l6ZSA9IHNlbmRzejsKKworICAgIFBKX0xPRyg1LCAoVEhJU19GSUxFLCAiXG5TZW5kaW5nIGRhdGEgcHJvZ3Jlc3M6ICVkIG91dCBvZiAlZCBieXRlcyIsIAorICAgICAgICAgICBzZW5kX3NpemUsIHRvdGFsX3NpemUpKTsKK30KKworCitzdGF0aWMgdm9pZCBvbl9jb21wbGV0ZShwal9odHRwX3JlcSAqaHJlcSwgcGpfc3RhdHVzX3Qgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGpfaHR0cF9yZXNwICpyZXNwKQoreworICAgIFBKX1VOVVNFRF9BUkcoaHJlcSk7CisKKyAgICBpZiAoc3RhdHVzID09IFBKX0VDQU5DRUxMRUQpIHsKKyAgICAgICAgUEpfTE9HKDUsIChUSElTX0ZJTEUsICJSZXF1ZXN0IGNhbmNlbGxlZCIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IFBKX0VUSU1FRE9VVCkgeworICAgICAgICBQSl9MT0coNSwgKFRISVNfRklMRSwgIlJlcXVlc3QgdGltZWQgb3V0ISIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICJFcnJvciAlZCIsIHN0YXR1cykpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFBKX0xPRyg1LCAoVEhJU19GSUxFLCAiXG5EYXRhIGNvbXBsZXRlZDogJWQgYnl0ZXMiLCByZXNwLT5zaXplKSk7CisgICAgaWYgKHJlc3AtPnNpemUgPiAwICYmIHJlc3AtPmRhdGEpIHsKKyNpZmRlZiBWRVJCT1NFCisgICAgICAgIHByaW50ZigiJS4qc1xuIiwgKGludClyZXNwLT5zaXplLCAoY2hhciAqKXJlc3AtPmRhdGEpOworI2VuZGlmCisgICAgfQorfQorCitzdGF0aWMgdm9pZCBvbl9yZXNwb25zZShwal9odHRwX3JlcSAqaHJlcSwgY29uc3QgcGpfaHR0cF9yZXNwICpyZXNwKQoreworICAgIHBqX3NpemVfdCBpOworCisgICAgUEpfVU5VU0VEX0FSRyhocmVxKTsKKyAgICBQSl9VTlVTRURfQVJHKHJlc3ApOworICAgIFBKX1VOVVNFRF9BUkcoaSk7CisKKyNpZmRlZiBWRVJCT1NFCisgICAgcHJpbnRmKCIlLipzLCAlZCwgJS4qc1xuIiwgU1RSX1BSRUMocmVzcC0+dmVyc2lvbiksCisgICAgICAgICAgIHJlc3AtPnN0YXR1c19jb2RlLCBTVFJfUFJFQyhyZXNwLT5yZWFzb24pKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcmVzcC0+aGVhZGVycy5jb3VudDsgaSsrKSB7CisgICAgICAgIHByaW50ZigiJS4qcyA6ICUuKnNcbiIsIAorICAgICAgICAgICAgICAgU1RSX1BSRUMocmVzcC0+aGVhZGVycy5oZWFkZXJbaV0ubmFtZSksCisgICAgICAgICAgICAgICBTVFJfUFJFQyhyZXNwLT5oZWFkZXJzLmhlYWRlcltpXS52YWx1ZSkpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKHRlc3RfY2FuY2VsKSB7CisJLyogTmVlZCB0byBkZWxheSBjbG9zaW5nIHRoZSBjbGllbnQgc29ja2V0IGhlcmUsIG90aGVyd2lzZSB0aGUKKwkgKiBzZXJ2ZXIgd2lsbCBnZXQgU0lHUElQRSB3aGVuIHNlbmRpbmcgcmVzcG9uc2UuCisJICovCisJcGpfdGhyZWFkX3NsZWVwKDEwMCk7CisgICAgICAgIHBqX2h0dHBfcmVxX2NhbmNlbChocmVxLCBQSl9UUlVFKTsKKyAgICAgICAgdGVzdF9jYW5jZWwgPSBQSl9GQUxTRTsKKyAgICB9Cit9CisKKworcGpfc3RhdHVzX3QgcGFyc2VfdXJsKGNvbnN0IGNoYXIgKnVybCwgcGpfaHR0cF91cmwgKmh1cmwpCit7CisgICAgcGpfc3RyX3Qgc3VybDsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBwal9jc3RyKCZzdXJsLCB1cmwpOworICAgIHN0YXR1cyA9IHBqX2h0dHBfcmVxX3BhcnNlX3VybCgmc3VybCwgaHVybCk7CisjaWZkZWYgVkVSQk9TRQorICAgIGlmICghc3RhdHVzKSB7CisgICAgICAgIHByaW50ZigiVVJMOiAlc1xuUHJvdG9jb2w6ICUuKnNcbkhvc3Q6ICUuKnNcblBvcnQ6ICVkXG5QYXRoOiAlLipzXG5cbiIsCisgICAgICAgICAgICAgICB1cmwsIFNUUl9QUkVDKGh1cmwtPnByb3RvY29sKSwgU1RSX1BSRUMoaHVybC0+aG9zdCksCisgICAgICAgICAgICAgICBodXJsLT5wb3J0LCBTVFJfUFJFQyhodXJsLT5wYXRoKSk7CisgICAgfSBlbHNlIHsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHBhcnNlX3VybF90ZXN0KCkKK3sKKyAgICBzdHJ1Y3QgdGVzdF9kYXRhCisgICAgeworCWNoYXIgKnVybDsKKwlwal9zdGF0dXNfdCByZXN1bHQ7CisJY29uc3QgY2hhciAqdXNlcm5hbWU7CisJY29uc3QgY2hhciAqcGFzc3dkOworCWNvbnN0IGNoYXIgKmhvc3Q7CisJaW50IHBvcnQ7CisJY29uc3QgY2hhciAqcGF0aDsKKyAgICB9IHRlc3RfZGF0YVtdID0KKyAgICB7CisJLyogU2ltcGxlIFVSTCB3aXRob3V0ICcvJyBpbiB0aGUgZW5kICovCisgICAgICAgIHsiaHR0cDovL3d3dy5wanNpcC5vcmciLCBQSl9TVUNDRVNTLCAiIiwgIiIsICJ3d3cucGpzaXAub3JnIiwgODAsICIvIn0sCisKKyAgICAgICAgLyogU2ltcGxlIFVSTCB3aXRoIHBvcnQgbnVtYmVyIGJ1dCB3aXRob3V0ICcvJyBpbiB0aGUgZW5kICovCisgICAgICAgIHsiaHR0cDovL3Bqc2lwLm9yZzo4MDgwIiwgUEpfU1VDQ0VTUywgIiIsICIiLCAicGpzaXAub3JnIiwgODA4MCwgIi8ifSwKKworICAgICAgICAvKiBVUkwgd2l0aCBwYXRoICovCisgICAgICAgIHsiaHR0cDovLzEyNy4wLjAuMToyODAvSm9vbWxhL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTUmSXRlbWlkPTYiLAorICAgICAgICAJUEpfU1VDQ0VTUywgIiIsICIiLCAiMTI3LjAuMC4xIiwgMjgwLAorICAgICAgICAJIi9Kb29tbGEvaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9NSZJdGVtaWQ9NiJ9LAorCisJLyogVVJMIHdpdGggcG9ydCBhbmQgcGF0aCAqLworCXsiaHR0cDovL3Bqc2lwLm9yZzo4MS9hYm91dC11cy8iLCBQSl9TVUNDRVNTLCAiIiwgIiIsICJwanNpcC5vcmciLCA4MSwgIi9hYm91dC11cy8ifSwKKworCS8qIHVuc3VwcG9ydGVkIHByb3RvY29sICovCisJeyJmdHA6Ly93d3cucGpzaXAub3JnIiwgUEpfRU5PVFNVUCwgIiIsICIiLCAiIiwgODAsICIifSwKKworCS8qIGludmFsaWQgZm9ybWF0ICovCisJeyJodHRwOi9wanNpcC5vcmcvYWJvdXQtdXMvIiwgUEpMSUJfVVRJTF9FSFRUUElOVVJMLCAiIiwgIiIsICIiLCA4MCwgIiJ9LAorCisJLyogaW52YWxpZCBwb3J0IG51bWJlciAqLworCXsiaHR0cDovL3Bqc2lwLm9yZzp4eXovIiwgUEpMSUJfVVRJTF9FSFRUUElOUE9SVCwgIiIsICIiLCAiIiwgODAsICIifSwKKworCS8qIHdpdGggdXNlcm5hbWUgYW5kIHBhc3N3b3JkICovCisJeyJodHRwOi8vdXNlcjpwYXNzQHBqc2lwLm9yZyIsIFBKX1NVQ0NFU1MsICJ1c2VyIiwgInBhc3MiLCAicGpzaXAub3JnIiwgODAsICIvIn0sCisKKwkvKiBwYXNzd29yZCBvbmx5Ki8KKwl7Imh0dHA6Ly86cGFzc0BwanNpcC5vcmciLCBQSl9TVUNDRVNTLCAiIiwgInBhc3MiLCAicGpzaXAub3JnIiwgODAsICIvIn0sCisKKwkvKiB1c2VyIG9ubHkqLworCXsiaHR0cDovL3VzZXI6QHBqc2lwLm9yZyIsIFBKX1NVQ0NFU1MsICJ1c2VyIiwgIiIsICJwanNpcC5vcmciLCA4MCwgIi8ifSwKKworCS8qIGVtcHR5IHVzZXJuYW1lIGFuZCBwYXNzd2QqLworCXsiaHR0cDovLzpAcGpzaXAub3JnIiwgUEpfU1VDQ0VTUywgIiIsICIiLCAicGpzaXAub3JnIiwgODAsICIvIn0sCisKKwkvKiAnQCcgY2hhcmFjdGVyIGluIHVzZXJuYW1lIGFuZCBwYXRoICovCisJeyJodHRwOi8vdXNlckBwanNpcC5vcmcvQCIsIFBKX1NVQ0NFU1MsICJ1c2VyIiwgIiIsICJwanNpcC5vcmciLCA4MCwgIi9AIn0sCisKKwkvKiAnQCcgY2hhcmFjdGVyIGluIHBhdGggKi8KKwl7Imh0dHA6Ly9wanNpcC5vcmcvQCIsIFBKX1NVQ0NFU1MsICIiLCAiIiwgInBqc2lwLm9yZyIsIDgwLCAiL0AifSwKKworCS8qICdAJyBjaGFyYWN0ZXIgaW4gcGF0aCAqLworCXsiaHR0cDovL3Bqc2lwLm9yZy9vbmVAIiwgUEpfU1VDQ0VTUywgIiIsICIiLCAicGpzaXAub3JnIiwgODAsICIvb25lQCJ9LAorCisJLyogSW52YWxpZCBVUkwgKi8KKwl7Imh0dHA6Ly86IiwgUEpfRUlOVkFMLCAiIiwgIiIsICIiLCAwLCAiIn0sCisKKwkvKiBJbnZhbGlkIFVSTCAqLworCXsiaHR0cDovL0AiLCBQSl9FSU5WQUwsICIiLCAiIiwgIiIsIDAsICIifSwKKworCS8qIEludmFsaWQgVVJMICovCisJeyJodHRwIiwgUEpfRUlOVkFMLCAiIiwgIiIsICIiLCAwLCAiIn0sCisKKwkvKiBJbnZhbGlkIFVSTCAqLworCXsiaHR0cDovIiwgUEpfRUlOVkFMLCAiIiwgIiIsICIiLCAwLCAiIn0sCisKKwkvKiBJbnZhbGlkIFVSTCAqLworCXsiaHR0cDovLyIsIFBKX0VJTlZBTCwgIiIsICIiLCAiIiwgMCwgIiJ9LAorCisJLyogSW52YWxpZCBVUkwgKi8KKwl7Imh0dHA6Ly8vIiwgUEpfRUlOVkFMLCAiIiwgIiIsICIiLCAwLCAiIn0sCisKKwkvKiBJbnZhbGlkIFVSTCAqLworCXsiaHR0cDovL0AvIiwgUEpfRUlOVkFMLCAiIiwgIiIsICIiLCAwLCAiIn0sCisKKwkvKiBJbnZhbGlkIFVSTCAqLworCXsiaHR0cDovLy9AIiwgUEpfRUlOVkFMLCAiIiwgIiIsICIiLCAwLCAiIn0sCisKKwkvKiBJbnZhbGlkIFVSTCAqLworCXsiaHR0cDovLzo6OiIsIFBKX0VJTlZBTCwgIiIsICIiLCAiIiwgMCwgIiJ9LAorICAgIH07CisgICAgdW5zaWduZWQgaTsKKworICAgIGZvciAoaT0wOyBpPFBKX0FSUkFZX1NJWkUodGVzdF9kYXRhKTsgKytpKSB7CisJc3RydWN0IHRlc3RfZGF0YSAqcHRkOworCXBqX2h0dHBfdXJsIGh1cmw7CisJcGpfc3RhdHVzX3Qgc3RhdHVzOworCisJcHRkID0gJnRlc3RfZGF0YVtpXTsKKworCVBKX0xPRygzLCAoVEhJU19GSUxFLCAiLi4gJXMiLCBwdGQtPnVybCkpOworCXN0YXR1cyA9IHBhcnNlX3VybChwdGQtPnVybCwgJmh1cmwpOworCisJaWYgKHN0YXR1cyAhPSBwdGQtPnJlc3VsdCkgeworCSAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiJWQiLCBzdGF0dXMpKTsKKwkgICAgcmV0dXJuIC0xMTsKKwl9CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICBjb250aW51ZTsKKwlpZiAocGpfc3RyY21wMigmaHVybC51c2VybmFtZSwgcHRkLT51c2VybmFtZSkpCisJICAgIHJldHVybiAtMTI7CisJaWYgKHBqX3N0cmNtcDIoJmh1cmwucGFzc3dkLCBwdGQtPnBhc3N3ZCkpCisJICAgIHJldHVybiAtMTM7CisJaWYgKHBqX3N0cmNtcDIoJmh1cmwuaG9zdCwgcHRkLT5ob3N0KSkKKwkgICAgcmV0dXJuIC0xNDsKKwlpZiAoaHVybC5wb3J0ICE9IHB0ZC0+cG9ydCkKKwkgICAgcmV0dXJuIC0xNTsKKwlpZiAocGpfc3RyY21wMigmaHVybC5wYXRoLCBwdGQtPnBhdGgpKQorCSAgICByZXR1cm4gLTE2OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKiAKKyAqIEdFVCByZXF1ZXN0IHNjZW5hcmlvIDE6IHVzaW5nIG9uX3Jlc3BvbnNlKCkgYW5kIG9uX2RhdGFfcmVhZCgpCisgKiBTZXJ2ZXIgcmVwbGllcyB3aXRoIGNvbnRlbnQtbGVuZ3RoLiBBcHBsaWNhdGlvbiBjYW5jZWxzIHRoZSAKKyAqIHJlcXVlc3QgdXBvbiByZWNlaXZpbmcgdGhlIHJlc3BvbnNlLCB0aGVuIHN0YXJ0IGl0IGFnYWluLgorICovCitpbnQgaHR0cF9jbGllbnRfdGVzdDEoKQoreworICAgIHBqX3N0cl90IHVybDsKKyAgICBwal9odHRwX3JlcV9jYWxsYmFjayBoY2I7CisgICAgcGpfaHR0cF9yZXFfcGFyYW0gcGFyYW07CisgICAgY2hhciB1cmxidWZbODBdOworCisgICAgcGpfYnplcm8oJmhjYiwgc2l6ZW9mKGhjYikpOworICAgIGhjYi5vbl9jb21wbGV0ZSA9ICZvbl9jb21wbGV0ZTsKKyAgICBoY2Iub25fZGF0YV9yZWFkID0gJm9uX2RhdGFfcmVhZDsKKyAgICBoY2Iub25fcmVzcG9uc2UgPSAmb25fcmVzcG9uc2U7CisgICAgcGpfaHR0cF9yZXFfcGFyYW1fZGVmYXVsdCgmcGFyYW0pOworCisgICAgLyogQ3JlYXRlIHBvb2wsIHRpbWVyLCBhbmQgaW9xdWV1ZSAqLworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZShtZW0sIE5VTEwsIDgxOTIsIDQwOTYsIE5VTEwpOworICAgIGlmIChwal90aW1lcl9oZWFwX2NyZWF0ZShwb29sLCAxNiwgJnRpbWVyX2hlYXApKQorICAgICAgICByZXR1cm4gLTMxOworICAgIGlmIChwal9pb3F1ZXVlX2NyZWF0ZShwb29sLCAxNiwgJmlvcXVldWUpKQorICAgICAgICByZXR1cm4gLTMyOworCisjaWZkZWYgVVNFX0xPQ0FMX1NFUlZFUgorCisgICAgdGhyZWFkX3F1aXQgPSBQSl9GQUxTRTsKKyAgICBnX3NlcnZlci5hY3Rpb24gPSBBQ1RJT05fUkVQTFk7CisgICAgZ19zZXJ2ZXIuc2VuZF9jb250ZW50X2xlbmd0aCA9IFBKX1RSVUU7CisgICAgZ19zZXJ2ZXIuZGF0YV9zaXplID0gMjk3MDsKKyAgICBnX3NlcnZlci5idWZfc2l6ZSA9IDEwMjQ7CisKKyAgICBzc3RhdHVzID0gcGpfc29ja19zb2NrZXQocGpfQUZfSU5FVCgpLCBwal9TT0NLX1NUUkVBTSgpLCAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdfc2VydmVyLnNvY2spOworICAgIGlmIChzc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiAtNDE7CisKKyAgICBwal9zb2NrYWRkcl9pbl9pbml0KCZhZGRyLCBOVUxMLCAwKTsKKworICAgIHNzdGF0dXMgPSBwal9zb2NrX2JpbmQoZ19zZXJ2ZXIuc29jaywgJmFkZHIsIHNpemVvZihhZGRyKSk7CisgICAgaWYgKHNzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIC00MzsKKworICAgIHsKKwlwal9zb2NrYWRkcl9pbiBhZGRyOworCWludCBhZGRyX2xlbiA9IHNpemVvZihhZGRyKTsKKwlzc3RhdHVzID0gcGpfc29ja19nZXRzb2NrbmFtZShnX3NlcnZlci5zb2NrLCAmYWRkciwgJmFkZHJfbGVuKTsKKwlpZiAoc3N0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICByZXR1cm4gLTQ0OworCWdfc2VydmVyLnBvcnQgPSBwal9zb2NrYWRkcl9pbl9nZXRfcG9ydCgmYWRkcik7CisJcGpfYW5zaV9zbnByaW50Zih1cmxidWYsIHNpemVvZih1cmxidWYpLAorCQkJICJodHRwOi8vMTI3LjAuMC4xOiVkL2Fib3V0LXVzLyIsCisJCQkgZ19zZXJ2ZXIucG9ydCk7CisJdXJsID0gcGpfc3RyKHVybGJ1Zik7CisgICAgfQorCisgICAgc3N0YXR1cyA9IHBqX3NvY2tfbGlzdGVuKGdfc2VydmVyLnNvY2ssIDgpOworICAgIGlmIChzc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiAtNDU7CisKKyAgICBzc3RhdHVzID0gcGpfdGhyZWFkX2NyZWF0ZShwb29sLCBOVUxMLCAmc2VydmVyX3RocmVhZCwgJmdfc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsICZnX3NlcnZlci50aHJlYWQpOworICAgIGlmIChzc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiAtNDc7CisKKyNlbHNlCisgICAgcGpfY3N0cigmdXJsLCAiaHR0cDovL3d3dy50ZWx1dS5jb20vYWJvdXQtdXMvIik7CisjZW5kaWYKKworICAgIGlmIChwal9odHRwX3JlcV9jcmVhdGUocG9vbCwgJnVybCwgdGltZXJfaGVhcCwgaW9xdWV1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW0sICZoY2IsICZodHRwX3JlcSkpCisgICAgICAgIHJldHVybiAtMzM7CisKKyAgICB0ZXN0X2NhbmNlbCA9IFBKX1RSVUU7CisgICAgaWYgKHBqX2h0dHBfcmVxX3N0YXJ0KGh0dHBfcmVxKSkKKyAgICAgICAgcmV0dXJuIC0zNTsKKworICAgIHdoaWxlIChwal9odHRwX3JlcV9pc19ydW5uaW5nKGh0dHBfcmVxKSkgeworICAgICAgICBwal90aW1lX3ZhbCBkZWxheSA9IHswLCA1MH07CisJcGpfaW9xdWV1ZV9wb2xsKGlvcXVldWUsICZkZWxheSk7CisJcGpfdGltZXJfaGVhcF9wb2xsKHRpbWVyX2hlYXAsIE5VTEwpOworICAgIH0KKworICAgIGlmIChwal9odHRwX3JlcV9zdGFydChodHRwX3JlcSkpCisgICAgICAgIHJldHVybiAtMzc7CisKKyAgICB3aGlsZSAocGpfaHR0cF9yZXFfaXNfcnVubmluZyhodHRwX3JlcSkpIHsKKyAgICAgICAgcGpfdGltZV92YWwgZGVsYXkgPSB7MCwgNTB9OworCXBqX2lvcXVldWVfcG9sbChpb3F1ZXVlLCAmZGVsYXkpOworCXBqX3RpbWVyX2hlYXBfcG9sbCh0aW1lcl9oZWFwLCBOVUxMKTsKKyAgICB9CisKKyNpZmRlZiBVU0VfTE9DQUxfU0VSVkVSCisgICAgdGhyZWFkX3F1aXQgPSBQSl9UUlVFOworICAgIHBqX3RocmVhZF9qb2luKGdfc2VydmVyLnRocmVhZCk7CisgICAgcGpfc29ja19jbG9zZShnX3NlcnZlci5zb2NrKTsKKyNlbmRpZgorCisgICAgcGpfaHR0cF9yZXFfZGVzdHJveShodHRwX3JlcSk7CisgICAgcGpfaW9xdWV1ZV9kZXN0cm95KGlvcXVldWUpOworICAgIHBqX3RpbWVyX2hlYXBfZGVzdHJveSh0aW1lcl9oZWFwKTsKKyAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogCisgKiBHRVQgcmVxdWVzdCBzY2VuYXJpbyAyOiB1c2luZyBvbl9jb21wbGV0ZSgpIHRvIGdldCB0aGUgCisgKiBjb21wbGV0ZSBkYXRhLiBTZXJ2ZXIgZG9lcyBub3QgcmVwbHkgd2l0aCBjb250ZW50LWxlbmd0aC4KKyAqIFJlcXVlc3QgdGltZWQgb3V0LCBhcHBsaWNhdGlvbiBzZXRzIGEgbG9uZ2VyIHRpbWVvdXQsIHRoZW4KKyAqIHRoZW4gcmVzdGFydCB0aGUgcmVxdWVzdC4KKyAqLworaW50IGh0dHBfY2xpZW50X3Rlc3QyKCkKK3sKKyAgICBwal9zdHJfdCB1cmw7CisgICAgcGpfaHR0cF9yZXFfY2FsbGJhY2sgaGNiOworICAgIHBqX2h0dHBfcmVxX3BhcmFtIHBhcmFtOworICAgIHBqX3RpbWVfdmFsIHRpbWVvdXQ7CisgICAgY2hhciB1cmxidWZbODBdOworCisgICAgcGpfYnplcm8oJmhjYiwgc2l6ZW9mKGhjYikpOworICAgIGhjYi5vbl9jb21wbGV0ZSA9ICZvbl9jb21wbGV0ZTsKKyAgICBoY2Iub25fcmVzcG9uc2UgPSAmb25fcmVzcG9uc2U7CisgICAgcGpfaHR0cF9yZXFfcGFyYW1fZGVmYXVsdCgmcGFyYW0pOworCisgICAgLyogQ3JlYXRlIHBvb2wsIHRpbWVyLCBhbmQgaW9xdWV1ZSAqLworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZShtZW0sIE5VTEwsIDgxOTIsIDQwOTYsIE5VTEwpOworICAgIGlmIChwal90aW1lcl9oZWFwX2NyZWF0ZShwb29sLCAxNiwgJnRpbWVyX2hlYXApKQorICAgICAgICByZXR1cm4gLTQxOworICAgIGlmIChwal9pb3F1ZXVlX2NyZWF0ZShwb29sLCAxNiwgJmlvcXVldWUpKQorICAgICAgICByZXR1cm4gLTQyOworCisjaWZkZWYgVVNFX0xPQ0FMX1NFUlZFUgorCisgICAgcGpfY3N0cigmdXJsLCAiaHR0cDovLzEyNy4wLjAuMTozODAiKTsKKyAgICBwYXJhbS50aW1lb3V0LnNlYyA9IDA7CisgICAgcGFyYW0udGltZW91dC5tc2VjID0gMjAwMDsKKworICAgIHRocmVhZF9xdWl0ID0gUEpfRkFMU0U7CisgICAgZ19zZXJ2ZXIuYWN0aW9uID0gQUNUSU9OX0lHTk9SRTsKKyAgICBnX3NlcnZlci5zZW5kX2NvbnRlbnRfbGVuZ3RoID0gUEpfRkFMU0U7CisgICAgZ19zZXJ2ZXIuZGF0YV9zaXplID0gNDE3MzsKKyAgICBnX3NlcnZlci5idWZfc2l6ZSA9IDEwMjQ7CisKKyAgICBzc3RhdHVzID0gcGpfc29ja19zb2NrZXQocGpfQUZfSU5FVCgpLCBwal9TT0NLX1NUUkVBTSgpLCAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdfc2VydmVyLnNvY2spOworICAgIGlmIChzc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiAtNDE7CisKKyAgICBwal9zb2NrYWRkcl9pbl9pbml0KCZhZGRyLCBOVUxMLCAwKTsKKworICAgIHNzdGF0dXMgPSBwal9zb2NrX2JpbmQoZ19zZXJ2ZXIuc29jaywgJmFkZHIsIHNpemVvZihhZGRyKSk7CisgICAgaWYgKHNzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIC00MzsKKworICAgIHsKKwlwal9zb2NrYWRkcl9pbiBhZGRyOworCWludCBhZGRyX2xlbiA9IHNpemVvZihhZGRyKTsKKwlzc3RhdHVzID0gcGpfc29ja19nZXRzb2NrbmFtZShnX3NlcnZlci5zb2NrLCAmYWRkciwgJmFkZHJfbGVuKTsKKwlpZiAoc3N0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICByZXR1cm4gLTQ0OworCWdfc2VydmVyLnBvcnQgPSBwal9zb2NrYWRkcl9pbl9nZXRfcG9ydCgmYWRkcik7CisJcGpfYW5zaV9zbnByaW50Zih1cmxidWYsIHNpemVvZih1cmxidWYpLAorCQkJICJodHRwOi8vMTI3LjAuMC4xOiVkIiwKKwkJCSBnX3NlcnZlci5wb3J0KTsKKwl1cmwgPSBwal9zdHIodXJsYnVmKTsKKyAgICB9CisKKyAgICBzc3RhdHVzID0gcGpfc29ja19saXN0ZW4oZ19zZXJ2ZXIuc29jaywgOCk7CisgICAgaWYgKHNzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIC00NTsKKworICAgIHNzdGF0dXMgPSBwal90aHJlYWRfY3JlYXRlKHBvb2wsIE5VTEwsICZzZXJ2ZXJfdGhyZWFkLCAmZ19zZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgJmdfc2VydmVyLnRocmVhZCk7CisgICAgaWYgKHNzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIC00NzsKKworI2Vsc2UKKyAgICBwal9jc3RyKCZ1cmwsICJodHRwOi8vd3d3Lmdvb2dsZS5jb20uc2ciKTsKKyAgICBwYXJhbS50aW1lb3V0LnNlYyA9IDA7CisgICAgcGFyYW0udGltZW91dC5tc2VjID0gNTA7CisjZW5kaWYKKworICAgIHBqX2h0dHBfaGVhZGVyc19hZGRfZWxtdDIoJnBhcmFtLmhlYWRlcnMsIChjaGFyKikiQWNjZXB0IiwKKwkJCSAgICAgKGNoYXIqKSJpbWFnZS9naWYsIGltYWdlL3gteGJpdG1hcCwgaW1hZ2UvanBlZywgIgorCQkJCSAgICAiaW1hZ2UvcGpwZWcsIGFwcGxpY2F0aW9uL3gtbXMtYXBwbGljYXRpb24sIgorCQkJCSAgICAiIGFwcGxpY2F0aW9uL3ZuZC5tcy14cHNkb2N1bWVudCwgIgorCQkJICAgICAgICAgICAgImFwcGxpY2F0aW9uL3hhbWwreG1sLCAiCisJCQkgICAgICAgICAgICAiYXBwbGljYXRpb24veC1tcy14YmFwLCAiCisJCQkgICAgICAgICAgICAiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2gsICIKKwkJCSAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwsICIKKwkJCSAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCwgIgorCQkJICAgICAgICAgICAgImFwcGxpY2F0aW9uL21zd29yZCwgKi8qIik7CisgICAgcGpfaHR0cF9oZWFkZXJzX2FkZF9lbG10MigmcGFyYW0uaGVhZGVycywgKGNoYXIqKSJBY2NlcHQtTGFuZ3VhZ2UiLAorCSAgICAgICAgICAgICAgICAgICAgICAoY2hhciopImVuLXNnIik7CisgICAgcGpfaHR0cF9oZWFkZXJzX2FkZF9lbG10MigmcGFyYW0uaGVhZGVycywgKGNoYXIqKSJVc2VyLUFnZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikiTW96aWxsYS80LjAgKGNvbXBhdGlibGU7IE1TSUUgNy4wOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldpbmRvd3MgTlQgNi4wOyBTTENDMTsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuTkVUIENMUiAyLjAuNTA3Mjc7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLk5FVCBDTFIgMy4wLjA0NTA2KSIpOworICAgIGlmIChwal9odHRwX3JlcV9jcmVhdGUocG9vbCwgJnVybCwgdGltZXJfaGVhcCwgaW9xdWV1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW0sICZoY2IsICZodHRwX3JlcSkpCisgICAgICAgIHJldHVybiAtNDM7CisKKyAgICBpZiAocGpfaHR0cF9yZXFfc3RhcnQoaHR0cF9yZXEpKQorICAgICAgICByZXR1cm4gLTQ1OworCisgICAgd2hpbGUgKHBqX2h0dHBfcmVxX2lzX3J1bm5pbmcoaHR0cF9yZXEpKSB7CisgICAgICAgIHBqX3RpbWVfdmFsIGRlbGF5ID0gezAsIDUwfTsKKwlwal9pb3F1ZXVlX3BvbGwoaW9xdWV1ZSwgJmRlbGF5KTsKKwlwal90aW1lcl9oZWFwX3BvbGwodGltZXJfaGVhcCwgTlVMTCk7CisgICAgfQorCisjaWZkZWYgVVNFX0xPQ0FMX1NFUlZFUgorICAgIGdfc2VydmVyLmFjdGlvbiA9IEFDVElPTl9SRVBMWTsKKyNlbmRpZgorCisgICAgdGltZW91dC5zZWMgPSAwOyB0aW1lb3V0Lm1zZWMgPSAxMDAwMDsKKyAgICBwal9odHRwX3JlcV9zZXRfdGltZW91dChodHRwX3JlcSwgJnRpbWVvdXQpOworICAgIGlmIChwal9odHRwX3JlcV9zdGFydChodHRwX3JlcSkpCisgICAgICAgIHJldHVybiAtNDc7CisKKyAgICB3aGlsZSAocGpfaHR0cF9yZXFfaXNfcnVubmluZyhodHRwX3JlcSkpIHsKKyAgICAgICAgcGpfdGltZV92YWwgZGVsYXkgPSB7MCwgNTB9OworCXBqX2lvcXVldWVfcG9sbChpb3F1ZXVlLCAmZGVsYXkpOworCXBqX3RpbWVyX2hlYXBfcG9sbCh0aW1lcl9oZWFwLCBOVUxMKTsKKyAgICB9CisKKyNpZmRlZiBVU0VfTE9DQUxfU0VSVkVSCisgICAgdGhyZWFkX3F1aXQgPSBQSl9UUlVFOworICAgIHBqX3RocmVhZF9qb2luKGdfc2VydmVyLnRocmVhZCk7CisgICAgcGpfc29ja19jbG9zZShnX3NlcnZlci5zb2NrKTsKKyNlbmRpZgorCisgICAgcGpfaHR0cF9yZXFfZGVzdHJveShodHRwX3JlcSk7CisgICAgcGpfaW9xdWV1ZV9kZXN0cm95KGlvcXVldWUpOworICAgIHBqX3RpbWVyX2hlYXBfZGVzdHJveSh0aW1lcl9oZWFwKTsKKyAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoKKyAqIFBVVCByZXF1ZXN0IHNjZW5hcmlvIDE6IHNlbmRpbmcgdGhlIHdob2xlIGRhdGEgYXQgb25jZQorICovCitpbnQgaHR0cF9jbGllbnRfdGVzdF9wdXQxKCkKK3sKKyAgICBwal9zdHJfdCB1cmw7CisgICAgcGpfaHR0cF9yZXFfY2FsbGJhY2sgaGNiOworICAgIHBqX2h0dHBfcmVxX3BhcmFtIHBhcmFtOworICAgIGNoYXIgKmRhdGE7CisgICAgaW50IGxlbmd0aCA9IDM4NzU7CisgICAgY2hhciB1cmxidWZbODBdOworCisgICAgcGpfYnplcm8oJmhjYiwgc2l6ZW9mKGhjYikpOworICAgIGhjYi5vbl9jb21wbGV0ZSA9ICZvbl9jb21wbGV0ZTsKKyAgICBoY2Iub25fZGF0YV9yZWFkID0gJm9uX2RhdGFfcmVhZDsKKyAgICBoY2Iub25fcmVzcG9uc2UgPSAmb25fcmVzcG9uc2U7CisKKyAgICAvKiBDcmVhdGUgcG9vbCwgdGltZXIsIGFuZCBpb3F1ZXVlICovCisgICAgcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKG1lbSwgTlVMTCwgODE5MiwgNDA5NiwgTlVMTCk7CisgICAgaWYgKHBqX3RpbWVyX2hlYXBfY3JlYXRlKHBvb2wsIDE2LCAmdGltZXJfaGVhcCkpCisgICAgICAgIHJldHVybiAtNTE7CisgICAgaWYgKHBqX2lvcXVldWVfY3JlYXRlKHBvb2wsIDE2LCAmaW9xdWV1ZSkpCisgICAgICAgIHJldHVybiAtNTI7CisKKyNpZmRlZiBVU0VfTE9DQUxfU0VSVkVSCisgICAgdGhyZWFkX3F1aXQgPSBQSl9GQUxTRTsKKyAgICBnX3NlcnZlci5hY3Rpb24gPSBBQ1RJT05fUkVQTFk7CisgICAgZ19zZXJ2ZXIuc2VuZF9jb250ZW50X2xlbmd0aCA9IFBKX1RSVUU7CisgICAgZ19zZXJ2ZXIuZGF0YV9zaXplID0gMDsKKyAgICBnX3NlcnZlci5idWZfc2l6ZSA9IDQwOTY7CisKKyAgICBzc3RhdHVzID0gcGpfc29ja19zb2NrZXQocGpfQUZfSU5FVCgpLCBwal9TT0NLX1NUUkVBTSgpLCAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdfc2VydmVyLnNvY2spOworICAgIGlmIChzc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiAtNDE7CisKKyAgICBwal9zb2NrYWRkcl9pbl9pbml0KCZhZGRyLCBOVUxMLCAwKTsKKworICAgIHNzdGF0dXMgPSBwal9zb2NrX2JpbmQoZ19zZXJ2ZXIuc29jaywgJmFkZHIsIHNpemVvZihhZGRyKSk7CisgICAgaWYgKHNzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIC00MzsKKworICAgIHsKKwlwal9zb2NrYWRkcl9pbiBhZGRyOworCWludCBhZGRyX2xlbiA9IHNpemVvZihhZGRyKTsKKwlzc3RhdHVzID0gcGpfc29ja19nZXRzb2NrbmFtZShnX3NlcnZlci5zb2NrLCAmYWRkciwgJmFkZHJfbGVuKTsKKwlpZiAoc3N0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICByZXR1cm4gLTQ0OworCWdfc2VydmVyLnBvcnQgPSBwal9zb2NrYWRkcl9pbl9nZXRfcG9ydCgmYWRkcik7CisJcGpfYW5zaV9zbnByaW50Zih1cmxidWYsIHNpemVvZih1cmxidWYpLAorCQkJICJodHRwOi8vMTI3LjAuMC4xOiVkL3Rlc3QvdGVzdC50eHQiLAorCQkJIGdfc2VydmVyLnBvcnQpOworCXVybCA9IHBqX3N0cih1cmxidWYpOworICAgIH0KKworICAgIHNzdGF0dXMgPSBwal9zb2NrX2xpc3RlbihnX3NlcnZlci5zb2NrLCA4KTsKKyAgICBpZiAoc3N0YXR1cyAhPSBQSl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gLTQ1OworCisgICAgc3N0YXR1cyA9IHBqX3RocmVhZF9jcmVhdGUocG9vbCwgTlVMTCwgJnNlcnZlcl90aHJlYWQsICZnX3NlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAmZ19zZXJ2ZXIudGhyZWFkKTsKKyAgICBpZiAoc3N0YXR1cyAhPSBQSl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gLTQ3OworCisjZWxzZQorICAgIHBqX2NzdHIoJnVybCwgImh0dHA6Ly8xMjcuMC4wLjE6MjgwL3Rlc3QvdGVzdC50eHQiKTsKKworI2VuZGlmCisKKyAgICBwal9odHRwX3JlcV9wYXJhbV9kZWZhdWx0KCZwYXJhbSk7CisgICAgcGpfc3Ryc2V0MigmcGFyYW0ubWV0aG9kLCAoY2hhciopIlBVVCIpOworICAgIGRhdGEgPSAoY2hhciopcGpfcG9vbF9hbGxvYyhwb29sLCBsZW5ndGgpOworICAgIHBqX2NyZWF0ZV9yYW5kb21fc3RyaW5nKGRhdGEsIGxlbmd0aCk7CisgICAgcGpfYW5zaV9zcHJpbnRmKGRhdGEsICJQVVQgdGVzdFxuIik7CisgICAgcGFyYW0ucmVxZGF0YS5kYXRhID0gZGF0YTsKKyAgICBwYXJhbS5yZXFkYXRhLnNpemUgPSBsZW5ndGg7CisgICAgaWYgKHBqX2h0dHBfcmVxX2NyZWF0ZShwb29sLCAmdXJsLCB0aW1lcl9oZWFwLCBpb3F1ZXVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbSwgJmhjYiwgJmh0dHBfcmVxKSkKKyAgICAgICAgcmV0dXJuIC01MzsKKworICAgIGlmIChwal9odHRwX3JlcV9zdGFydChodHRwX3JlcSkpCisgICAgICAgIHJldHVybiAtNTU7CisKKyAgICB3aGlsZSAocGpfaHR0cF9yZXFfaXNfcnVubmluZyhodHRwX3JlcSkpIHsKKyAgICAgICAgcGpfdGltZV92YWwgZGVsYXkgPSB7MCwgNTB9OworCXBqX2lvcXVldWVfcG9sbChpb3F1ZXVlLCAmZGVsYXkpOworCXBqX3RpbWVyX2hlYXBfcG9sbCh0aW1lcl9oZWFwLCBOVUxMKTsKKyAgICB9CisKKyNpZmRlZiBVU0VfTE9DQUxfU0VSVkVSCisgICAgdGhyZWFkX3F1aXQgPSBQSl9UUlVFOworICAgIHBqX3RocmVhZF9qb2luKGdfc2VydmVyLnRocmVhZCk7CisgICAgcGpfc29ja19jbG9zZShnX3NlcnZlci5zb2NrKTsKKyNlbmRpZgorCisgICAgcGpfaHR0cF9yZXFfZGVzdHJveShodHRwX3JlcSk7CisgICAgcGpfaW9xdWV1ZV9kZXN0cm95KGlvcXVldWUpOworICAgIHBqX3RpbWVyX2hlYXBfZGVzdHJveSh0aW1lcl9oZWFwKTsKKyAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoKKyAqIFBVVCByZXF1ZXN0IHNjZW5hcmlvIDI6IHVzaW5nIG9uX3NlbmRfZGF0YSgpIGNhbGxiYWNrIHRvCisgKiBzZW5kaW5nIHRoZSBkYXRhIGluIGNodW5rcworICovCitpbnQgaHR0cF9jbGllbnRfdGVzdF9wdXQyKCkKK3sKKyAgICBwal9zdHJfdCB1cmw7CisgICAgcGpfaHR0cF9yZXFfY2FsbGJhY2sgaGNiOworICAgIHBqX2h0dHBfcmVxX3BhcmFtIHBhcmFtOworICAgIGNoYXIgdXJsYnVmWzgwXTsKKworICAgIHBqX2J6ZXJvKCZoY2IsIHNpemVvZihoY2IpKTsKKyAgICBoY2Iub25fY29tcGxldGUgPSAmb25fY29tcGxldGU7CisgICAgaGNiLm9uX3NlbmRfZGF0YSA9ICZvbl9zZW5kX2RhdGE7CisgICAgaGNiLm9uX2RhdGFfcmVhZCA9ICZvbl9kYXRhX3JlYWQ7CisgICAgaGNiLm9uX3Jlc3BvbnNlID0gJm9uX3Jlc3BvbnNlOworCisgICAgLyogQ3JlYXRlIHBvb2wsIHRpbWVyLCBhbmQgaW9xdWV1ZSAqLworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZShtZW0sIE5VTEwsIDgxOTIsIDQwOTYsIE5VTEwpOworICAgIGlmIChwal90aW1lcl9oZWFwX2NyZWF0ZShwb29sLCAxNiwgJnRpbWVyX2hlYXApKQorICAgICAgICByZXR1cm4gLTUxOworICAgIGlmIChwal9pb3F1ZXVlX2NyZWF0ZShwb29sLCAxNiwgJmlvcXVldWUpKQorICAgICAgICByZXR1cm4gLTUyOworCisjaWZkZWYgVVNFX0xPQ0FMX1NFUlZFUgorICAgIHRocmVhZF9xdWl0ID0gUEpfRkFMU0U7CisgICAgZ19zZXJ2ZXIuYWN0aW9uID0gQUNUSU9OX1JFUExZOworICAgIGdfc2VydmVyLnNlbmRfY29udGVudF9sZW5ndGggPSBQSl9UUlVFOworICAgIGdfc2VydmVyLmRhdGFfc2l6ZSA9IDA7CisgICAgZ19zZXJ2ZXIuYnVmX3NpemUgPSAxNjM4NDsKKworICAgIHNzdGF0dXMgPSBwal9zb2NrX3NvY2tldChwal9BRl9JTkVUKCksIHBqX1NPQ0tfU1RSRUFNKCksIDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ19zZXJ2ZXIuc29jayk7CisgICAgaWYgKHNzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIC00MTsKKworICAgIHBqX3NvY2thZGRyX2luX2luaXQoJmFkZHIsIE5VTEwsIDApOworCisgICAgc3N0YXR1cyA9IHBqX3NvY2tfYmluZChnX3NlcnZlci5zb2NrLCAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKyAgICBpZiAoc3N0YXR1cyAhPSBQSl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gLTQzOworCisgICAgeworCXBqX3NvY2thZGRyX2luIGFkZHI7CisJaW50IGFkZHJfbGVuID0gc2l6ZW9mKGFkZHIpOworCXNzdGF0dXMgPSBwal9zb2NrX2dldHNvY2tuYW1lKGdfc2VydmVyLnNvY2ssICZhZGRyLCAmYWRkcl9sZW4pOworCWlmIChzc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIHJldHVybiAtNDQ7CisJZ19zZXJ2ZXIucG9ydCA9IHBqX3NvY2thZGRyX2luX2dldF9wb3J0KCZhZGRyKTsKKwlwal9hbnNpX3NucHJpbnRmKHVybGJ1Ziwgc2l6ZW9mKHVybGJ1ZiksCisJCQkgImh0dHA6Ly8xMjcuMC4wLjE6JWQvdGVzdC90ZXN0Mi50eHQiLAorCQkJIGdfc2VydmVyLnBvcnQpOworCXVybCA9IHBqX3N0cih1cmxidWYpOworICAgIH0KKworICAgIHNzdGF0dXMgPSBwal9zb2NrX2xpc3RlbihnX3NlcnZlci5zb2NrLCA4KTsKKyAgICBpZiAoc3N0YXR1cyAhPSBQSl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gLTQ1OworCisgICAgc3N0YXR1cyA9IHBqX3RocmVhZF9jcmVhdGUocG9vbCwgTlVMTCwgJnNlcnZlcl90aHJlYWQsICZnX3NlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAmZ19zZXJ2ZXIudGhyZWFkKTsKKyAgICBpZiAoc3N0YXR1cyAhPSBQSl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gLTQ3OworCisjZWxzZQorICAgIHBqX2NzdHIoJnVybCwgImh0dHA6Ly8xMjcuMC4wLjE6MjgwL3Rlc3QvdGVzdDIudHh0Iik7CisKKyNlbmRpZgorCisgICAgcGpfaHR0cF9yZXFfcGFyYW1fZGVmYXVsdCgmcGFyYW0pOworICAgIHBqX3N0cnNldDIoJnBhcmFtLm1ldGhvZCwgKGNoYXIqKSJQVVQiKTsKKyAgICB0b3RhbF9zaXplID0gMTUzODM7CisgICAgc2VuZF9zaXplID0gMDsKKyAgICBwYXJhbS5yZXFkYXRhLnRvdGFsX3NpemUgPSB0b3RhbF9zaXplOworICAgIGlmIChwal9odHRwX3JlcV9jcmVhdGUocG9vbCwgJnVybCwgdGltZXJfaGVhcCwgaW9xdWV1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW0sICZoY2IsICZodHRwX3JlcSkpCisgICAgICAgIHJldHVybiAtNTM7CisKKyAgICBpZiAocGpfaHR0cF9yZXFfc3RhcnQoaHR0cF9yZXEpKQorICAgICAgICByZXR1cm4gLTU1OworCisgICAgd2hpbGUgKHBqX2h0dHBfcmVxX2lzX3J1bm5pbmcoaHR0cF9yZXEpKSB7CisgICAgICAgIHBqX3RpbWVfdmFsIGRlbGF5ID0gezAsIDUwfTsKKwlwal9pb3F1ZXVlX3BvbGwoaW9xdWV1ZSwgJmRlbGF5KTsKKwlwal90aW1lcl9oZWFwX3BvbGwodGltZXJfaGVhcCwgTlVMTCk7CisgICAgfQorCisjaWZkZWYgVVNFX0xPQ0FMX1NFUlZFUgorICAgIHRocmVhZF9xdWl0ID0gUEpfVFJVRTsKKyAgICBwal90aHJlYWRfam9pbihnX3NlcnZlci50aHJlYWQpOworICAgIHBqX3NvY2tfY2xvc2UoZ19zZXJ2ZXIuc29jayk7CisjZW5kaWYKKworICAgIHBqX2h0dHBfcmVxX2Rlc3Ryb3koaHR0cF9yZXEpOworICAgIHBqX2lvcXVldWVfZGVzdHJveShpb3F1ZXVlKTsKKyAgICBwal90aW1lcl9oZWFwX2Rlc3Ryb3kodGltZXJfaGVhcCk7CisgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK2ludCBodHRwX2NsaWVudF90ZXN0X2RlbGV0ZSgpCit7CisgICAgcGpfc3RyX3QgdXJsOworICAgIHBqX2h0dHBfcmVxX2NhbGxiYWNrIGhjYjsKKyAgICBwal9odHRwX3JlcV9wYXJhbSBwYXJhbTsKKyAgICBjaGFyIHVybGJ1Zls4MF07CisKKyAgICBwal9iemVybygmaGNiLCBzaXplb2YoaGNiKSk7CisgICAgaGNiLm9uX2NvbXBsZXRlID0gJm9uX2NvbXBsZXRlOworICAgIGhjYi5vbl9yZXNwb25zZSA9ICZvbl9yZXNwb25zZTsKKworICAgIC8qIENyZWF0ZSBwb29sLCB0aW1lciwgYW5kIGlvcXVldWUgKi8KKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUobWVtLCBOVUxMLCA4MTkyLCA0MDk2LCBOVUxMKTsKKyAgICBpZiAocGpfdGltZXJfaGVhcF9jcmVhdGUocG9vbCwgMTYsICZ0aW1lcl9oZWFwKSkKKyAgICAgICAgcmV0dXJuIC02MTsKKyAgICBpZiAocGpfaW9xdWV1ZV9jcmVhdGUocG9vbCwgMTYsICZpb3F1ZXVlKSkKKyAgICAgICAgcmV0dXJuIC02MjsKKworI2lmZGVmIFVTRV9MT0NBTF9TRVJWRVIKKyAgICB0aHJlYWRfcXVpdCA9IFBKX0ZBTFNFOworICAgIGdfc2VydmVyLmFjdGlvbiA9IEFDVElPTl9SRVBMWTsKKyAgICBnX3NlcnZlci5zZW5kX2NvbnRlbnRfbGVuZ3RoID0gUEpfVFJVRTsKKyAgICBnX3NlcnZlci5kYXRhX3NpemUgPSAwOworICAgIGdfc2VydmVyLmJ1Zl9zaXplID0gMTAyNDsKKworICAgIHNzdGF0dXMgPSBwal9zb2NrX3NvY2tldChwal9BRl9JTkVUKCksIHBqX1NPQ0tfU1RSRUFNKCksIDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ19zZXJ2ZXIuc29jayk7CisgICAgaWYgKHNzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIC00MTsKKworICAgIHBqX3NvY2thZGRyX2luX2luaXQoJmFkZHIsIE5VTEwsIDApOworCisgICAgc3N0YXR1cyA9IHBqX3NvY2tfYmluZChnX3NlcnZlci5zb2NrLCAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKyAgICBpZiAoc3N0YXR1cyAhPSBQSl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gLTQzOworCisgICAgeworCXBqX3NvY2thZGRyX2luIGFkZHI7CisJaW50IGFkZHJfbGVuID0gc2l6ZW9mKGFkZHIpOworCXNzdGF0dXMgPSBwal9zb2NrX2dldHNvY2tuYW1lKGdfc2VydmVyLnNvY2ssICZhZGRyLCAmYWRkcl9sZW4pOworCWlmIChzc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIHJldHVybiAtNDQ7CisJZ19zZXJ2ZXIucG9ydCA9IHBqX3NvY2thZGRyX2luX2dldF9wb3J0KCZhZGRyKTsKKwlwal9hbnNpX3NucHJpbnRmKHVybGJ1Ziwgc2l6ZW9mKHVybGJ1ZiksCisJCQkgImh0dHA6Ly8xMjcuMC4wLjE6JWQvdGVzdC90ZXN0Mi50eHQiLAorCQkJIGdfc2VydmVyLnBvcnQpOworCXVybCA9IHBqX3N0cih1cmxidWYpOworICAgIH0KKworICAgIHNzdGF0dXMgPSBwal9zb2NrX2xpc3RlbihnX3NlcnZlci5zb2NrLCA4KTsKKyAgICBpZiAoc3N0YXR1cyAhPSBQSl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gLTQ1OworCisgICAgc3N0YXR1cyA9IHBqX3RocmVhZF9jcmVhdGUocG9vbCwgTlVMTCwgJnNlcnZlcl90aHJlYWQsICZnX3NlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAmZ19zZXJ2ZXIudGhyZWFkKTsKKyAgICBpZiAoc3N0YXR1cyAhPSBQSl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gLTQ3OworCisjZWxzZQorICAgIHBqX2NzdHIoJnVybCwgImh0dHA6Ly8xMjcuMC4wLjE6MjgwL3Rlc3QvdGVzdDIudHh0Iik7CisjZW5kaWYKKworICAgIHBqX2h0dHBfcmVxX3BhcmFtX2RlZmF1bHQoJnBhcmFtKTsKKyAgICBwal9zdHJzZXQyKCZwYXJhbS5tZXRob2QsIChjaGFyKikiREVMRVRFIik7CisgICAgaWYgKHBqX2h0dHBfcmVxX2NyZWF0ZShwb29sLCAmdXJsLCB0aW1lcl9oZWFwLCBpb3F1ZXVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbSwgJmhjYiwgJmh0dHBfcmVxKSkKKyAgICAgICAgcmV0dXJuIC02MzsKKworICAgIGlmIChwal9odHRwX3JlcV9zdGFydChodHRwX3JlcSkpCisgICAgICAgIHJldHVybiAtNjU7CisKKyAgICB3aGlsZSAocGpfaHR0cF9yZXFfaXNfcnVubmluZyhodHRwX3JlcSkpIHsKKyAgICAgICAgcGpfdGltZV92YWwgZGVsYXkgPSB7MCwgNTB9OworCXBqX2lvcXVldWVfcG9sbChpb3F1ZXVlLCAmZGVsYXkpOworCXBqX3RpbWVyX2hlYXBfcG9sbCh0aW1lcl9oZWFwLCBOVUxMKTsKKyAgICB9CisKKyNpZmRlZiBVU0VfTE9DQUxfU0VSVkVSCisgICAgdGhyZWFkX3F1aXQgPSBQSl9UUlVFOworICAgIHBqX3RocmVhZF9qb2luKGdfc2VydmVyLnRocmVhZCk7CisgICAgcGpfc29ja19jbG9zZShnX3NlcnZlci5zb2NrKTsKKyNlbmRpZgorCisgICAgcGpfaHR0cF9yZXFfZGVzdHJveShodHRwX3JlcSk7CisgICAgcGpfaW9xdWV1ZV9kZXN0cm95KGlvcXVldWUpOworICAgIHBqX3RpbWVyX2hlYXBfZGVzdHJveSh0aW1lcl9oZWFwKTsKKyAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworaW50IGh0dHBfY2xpZW50X3Rlc3QoKQoreworICAgIGludCByYzsKKyAgICAKKyAgICBQSl9MT0coMywgKFRISVNfRklMRSwgIi4uVGVzdGluZyBVUkwgcGFyc2luZyIpKTsKKyAgICByYyA9IHBhcnNlX3VybF90ZXN0KCk7CisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4gcmM7CisKKyAgICBQSl9MT0coMywgKFRISVNfRklMRSwgIi4uVGVzdGluZyBHRVQgcmVxdWVzdCBzY2VuYXJpbyAxIikpOworICAgIHJjID0gaHR0cF9jbGllbnRfdGVzdDEoKTsKKyAgICBpZiAocmMpCisgICAgICAgIHJldHVybiByYzsKKworICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAiLi5UZXN0aW5nIEdFVCByZXF1ZXN0IHNjZW5hcmlvIDIiKSk7CisgICAgcmMgPSBodHRwX2NsaWVudF90ZXN0MigpOworICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICIuLlRlc3RpbmcgUFVUIHJlcXVlc3Qgc2NlbmFyaW8gMSIpKTsKKyAgICByYyA9IGh0dHBfY2xpZW50X3Rlc3RfcHV0MSgpOworICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICIuLlRlc3RpbmcgUFVUIHJlcXVlc3Qgc2NlbmFyaW8gMiIpKTsKKyAgICByYyA9IGh0dHBfY2xpZW50X3Rlc3RfcHV0MigpOworICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICIuLlRlc3RpbmcgREVMRVRFIHJlcXVlc3QiKSk7CisgICAgcmMgPSBodHRwX2NsaWVudF90ZXN0X2RlbGV0ZSgpOworICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKyNlbHNlCisvKiBUbyBwcmV2ZW50IHdhcm5pbmcgYWJvdXQgInRyYW5zbGF0aW9uIHVuaXQgaXMgZW1wdHkiCisgKiB3aGVuIHRoaXMgdGVzdCBpcyBkaXNhYmxlZC4gCisgKi8KK2ludCBkdW1teV9odHRwX2NsaWVudF90ZXN0OworI2VuZGlmCS8qIElOQ0xVREVfSFRUUF9DTElFTlRfVEVTVCAqLwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvZjgvZjg1OTQyZDM1MzYzNzVjYjc5ZWJlYjdmMmNkNzIyZDE5ZGI5YTI4Mi5zdm4tYmFzZSBiL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lL2Y4L2Y4NTk0MmQzNTM2Mzc1Y2I3OWViZWI3ZjJjZDcyMmQxOWRiOWEyODIuc3ZuLWJhc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNjY2Q0MgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lL2Y4L2Y4NTk0MmQzNTM2Mzc1Y2I3OWViZWI3ZjJjZDcyMmQxOWRiOWEyODIuc3ZuLWJhc2UKQEAgLTAsMCArMSwxNDAgQEAKKy8qICRJZCQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpfQ09NUEFUX09TX0RBUldJTk9TX0hfXworI2RlZmluZSBfX1BKX0NPTVBBVF9PU19EQVJXSU5PU19IX18KKworLyoqCisgKiBAZmlsZSBvc19kYXJ3aW5vcy5oCisgKiBAYnJpZWYgRGVzY3JpYmVzIERhcndpbi9NYWNPU1ggb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpY3MuCisgKi8KKworI2RlZmluZSBQSl9PU19OQU1FCQkgICAgImRhcndpbiIKKworI2RlZmluZSBQSl9IQVNfQVJQQV9JTkVUX0gJICAgIDEKKyNkZWZpbmUgUEpfSEFTX0FTU0VSVF9ICQkgICAgMQorI2RlZmluZSBQSl9IQVNfQ1RZUEVfSAkJICAgIDEKKyNkZWZpbmUgUEpfSEFTX0VSUk5PX0gJCSAgICAxCisjZGVmaW5lIFBKX0hBU19MSU5VWF9TT0NLRVRfSAkgICAgMAorI2RlZmluZSBQSl9IQVNfTUFMTE9DX0gJCSAgICAwCisjZGVmaW5lIFBKX0hBU19ORVREQl9ICQkgICAgMQorI2RlZmluZSBQSl9IQVNfTkVUSU5FVF9JTl9ICSAgICAxCisjZGVmaW5lIFBKX0hBU19ORVRJTkVUX1RDUF9ICSAgICAxCisjZGVmaW5lIFBKX0hBU19TRVRKTVBfSAkJICAgIDEKKyNkZWZpbmUgUEpfSEFTX1NUREFSR19ICQkgICAgMQorI2RlZmluZSBQSl9IQVNfU1REREVGX0gJCSAgICAxCisjZGVmaW5lIFBKX0hBU19TVERJT19ICQkgICAgMQorI2RlZmluZSBQSl9IQVNfU1RETElCX0gJCSAgICAxCisjZGVmaW5lIFBKX0hBU19TVFJJTkdfSAkJICAgIDEKKyNkZWZpbmUgUEpfSEFTX1NZU19JT0NUTF9ICSAgICAxCisjZGVmaW5lIFBKX0hBU19TWVNfU0VMRUNUX0gJICAgIDEKKyNkZWZpbmUgUEpfSEFTX1NZU19TT0NLRVRfSAkgICAgMQorI2RlZmluZSBQSl9IQVNfU1lTX1RJTUVfSAkgICAgMQorI2RlZmluZSBQSl9IQVNfU1lTX1RJTUVCX0gJICAgIDEKKyNkZWZpbmUgUEpfSEFTX1NZU19UWVBFU19ICSAgICAxCisjZGVmaW5lIFBKX0hBU19USU1FX0gJCSAgICAxCisjZGVmaW5lIFBKX0hBU19VTklTVERfSAkJICAgIDEKKworI2RlZmluZSBQSl9IQVNfTVNXU09DS19ICSAgICAwCisjZGVmaW5lIFBKX0hBU19XSU5TT0NLX0gJICAgIDAKKyNkZWZpbmUgUEpfSEFTX1dJTlNPQ0syX0gJICAgIDAKKworLyogSXMgZXJybm8gYSBnb29kIHdheSB0byByZXRyaWV2ZSBPUyBlcnJvcnM/CisgKi8KKyNkZWZpbmUgUEpfSEFTX0VSUk5PX1ZBUgkgICAgMQorCisvKiBIYXMgaW5ldF9hdG9uKCkgPworICovICAgCisjZGVmaW5lIFBKX1NPQ0tfSEFTX0lORVRfQVRPTgkgICAgMQorCisvKiBXaGVuIHRoaXMgbWFjcm8gaXMgc2V0LCBnZXRzb2Nrb3B0KFNPTF9TT0NLRVQsIFNPX0VSUk9SKSB3aWxsIHJldHVybgorICogdGhlIHN0YXR1cyBvZiBub24tYmxvY2tpbmcgY29ubmVjdCgpIG9wZXJhdGlvbi4KKyAqLworI2RlZmluZSBQSl9IQVNfU09fRVJST1IgICAgICAgICAgICAgMQorCisvKiBUaGlzIHZhbHVlIHNwZWNpZmllcyB0aGUgdmFsdWUgc2V0IGluIGVycm5vIGJ5IHRoZSBPUyB3aGVuIGEgbm9uLWJsb2NraW5nCisgKiBzb2NrZXQgcmVjdigpIGNhbiBub3QgcmV0dXJuIGltbWVkaWF0ZSBkYWF0YS4KKyAqLworI2RlZmluZSBQSl9CTE9DS0lOR19FUlJPUl9WQUwgICAgICAgRVdPVUxEQkxPQ0sKKworLyogVGhpcyB2YWx1ZSBzcGVjaWZpZXMgdGhlIHZhbHVlIHNldCBpbiBlcnJubyBieSB0aGUgT1Mgd2hlbiBhIG5vbi1ibG9ja2luZworICogc29ja2V0IGNvbm5lY3QoKSBjYW4gbm90IGdldCBjb25uZWN0ZWQgaW1tZWRpYXRlbHkuCisgKi8KKyNkZWZpbmUgUEpfQkxPQ0tJTkdfQ09OTkVDVF9FUlJPUl9WQUwgICBFSU5QUk9HUkVTUworCisvKiBEZWZhdWx0IHRocmVhZGluZyBpcyBlbmFibGVkLCB1bmxlc3MgaXQncyBvdmVycmlkZGVuLiAqLworI2lmbmRlZiBQSl9IQVNfVEhSRUFEUworIyAgZGVmaW5lIFBKX0hBU19USFJFQURTCQkoMSkKKyNlbmRpZgorCisjZGVmaW5lIFBKX0hBU19ISUdIX1JFU19USU1FUgkJMQorI2RlZmluZSBQSl9IQVNfTUFMTE9DCQkJMQorI2lmbmRlZiBQSl9PU19IQVNfQ0hFQ0tfU1RBQ0sKKyMgICBkZWZpbmUgUEpfT1NfSEFTX0NIRUNLX1NUQUNLICAgICAgICAwCisjZW5kaWYKKyNkZWZpbmUgUEpfTkFUSVZFX1NUUklOR19JU19VTklDT0RFCTAKKworI2RlZmluZSBQSl9BVE9NSUNfVkFMVUVfVFlQRQkJbG9uZworCisvKiBTZXQgMSBpZiBuYXRpdmUgc29ja2FkZHJfaW4gaGFzIHNpbl9sZW4gbWVtYmVyLiAKKyAqIERlZmF1bHQ6IDAKKyAqLworI2RlZmluZSBQSl9TT0NLQUREUl9IQVNfTEVOCQkxCisKKy8qCisgKiBnY2MgY29tcGxhaW5zIHRoYXQgaXQgY2FuIG5vdCB1c2UgcHJlY29tcGlsZWQgaGVhZGVyIGJlY2F1c2UKKyAqIHRoZSB2YWx1ZSBvZiBGRF9TRVRTSVpFIHRoYXQgd2UgZGVjbGFyZSBpbiBwai9jb25maWcuaCBpcworICogZGlmZmVyZW50IHRoYW4gdGhlIHZhbHVlIGluIC91c3IvaW5jbHVkZS9zeXMvdHlwZXMuaC4KKyAqCisgKiBUaGlzIGNoYW5nZXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIERhcndpbi4KKyAqLworI2RlZmluZSBQSl9JT1FVRVVFX01BWF9IQU5ETEVTCQkxMDI0CisKKy8qKgorICogSWYgdGhpcyBtYWNybyBpcyBzZXQsIGl0IHRlbGxzIHNlbGVjdCBJL08gUXVldWUgdGhhdCBzZWxlY3QoKSBuZWVkcyB0bworICogYmUgZ2l2ZW4gY29ycmVjdCB2YWx1ZSBvZiBuZmRzIChpLmUuIGxhcmdlc3QgZmQgKyAxKS4gVGhpcyByZXF1aXJlcworICogc2VsZWN0IGlvcXVldWUgdG8gcmUtc2NhbiB0aGUgZGVzY3JpcHRvcnMgb24gZWFjaCByZWdpc3RyYXRpb24gYW5kCisgKiB1bnJlZ2lzdHJhdGlvbi4KKyAqIElmIHRoaXMgbWFjcm8gaXMgbm90IHNldCwgdGhlbiBpb3F1ZXVlIHdpbGwgYWx3YXlzIGdpdmUgRkRfU0VUU0laRSBmb3IKKyAqIG5mZHMgYXJndW1lbnQgd2hlbiBjYWxsaW5nIHNlbGVjdCgpLgorICoKKyAqIERlZmF1bHQ6IDAKKyAqLworI2RlZmluZSBQSl9TRUxFQ1RfTkVFRFNfTkZEUwkJMAorCisvKiBJZiAxLCB1c2UgUmVhZC9Xcml0ZSBtdXRleCBlbXVsYXRpb24gZm9yIHBsYXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQgaXQgKi8KKyNkZWZpbmUgUEpfRU1VTEFURV9SV01VVEVYCQkwCisKKy8qIElmIDEsIHBqX3RocmVhZF9jcmVhdGUoKSBzaG91bGQgZW5mb3JjZSB0aGUgc3RhY2sgc2l6ZSB3aGVuIGNyZWF0aW5nIAorICogdGhyZWFkcy4KKyAqIERlZmF1bHQ6IDAgKGxldCBPUyBkZWNpZGUgdGhlIHRocmVhZCdzIHN0YWNrIHNpemUpLgorICovCisjZGVmaW5lIFBKX1RIUkVBRF9TRVRfU1RBQ0tfU0laRSAgICAJMAorCisvKiBJZiAxLCBwal90aHJlYWRfY3JlYXRlKCkgc2hvdWxkIGFsbG9jYXRlIHN0YWNrIGZyb20gdGhlIHBvb2wgc3VwcGxpZWQuCisgKiBEZWZhdWx0OiAwIChsZXQgT1MgYWxsb2NhdGUgbWVtb3J5IGZvciB0aHJlYWQncyBzdGFjaykuCisgKi8KKyNkZWZpbmUgUEpfVEhSRUFEX0FMTE9DQVRFX1NUQUNLICAgIAkwCisKKy8qIE1hY09TIGhhcyBoYWQgc29ja2xlbiBzaW5jZSAxMC40ICovCisjZGVmaW5lIFBKX0hBU19TT0NLTEVOX1QJCTEKKworCisjZW5kaWYJLyogX19QSl9DT01QQVRfT1NfREFSV0lOT1NfSF9fICovCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lL2Y4L2Y4ODE4ZGMxZDYzNjA1MTUxODYxODUyZDg4ZjgzMWQ0ODhhZTMzMjIuc3ZuLWJhc2UgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS9mOC9mODgxOGRjMWQ2MzYwNTE1MTg2MTg1MmQ4OGY4MzFkNDg4YWUzMzIyLnN2bi1iYXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMGNjYjYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS9mOC9mODgxOGRjMWQ2MzYwNTE1MTg2MTg1MmQ4OGY4MzFkNDg4YWUzMzIyLnN2bi1iYXNlCkBAIC0wLDAgKzEsMTYzIEBACisjIEJ5IGRlZmF1bHQsIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIGluY2x1ZGVzIG1haW4uby4KKyMgT1MgbWFrZSBmaWxlIG1heSBvdmVycmlkZSB0aGlzIHdpdGggb3Mtc3BlY2lmaWMgZmlsZXMKK2V4cG9ydCBQSk5BVEhfVEVTVF9PQkpTID0gbWFpbi5vCisKK2luY2x1ZGUgLi4vLi4vYnVpbGQubWFrCitpbmNsdWRlIC4uLy4uL3ZlcnNpb24ubWFrCitpbmNsdWRlICQoUEpESVIpL2J1aWxkL2NvbW1vbi5tYWsKKworZXhwb3J0IExJQkRJUiA6PSAuLi9saWIKK2V4cG9ydCBCSU5ESVIgOj0gLi4vYmluCisKK1JVTEVTX01BSyA6PSAkKFBKRElSKS9idWlsZC9ydWxlcy5tYWsKKworUEpMSUJfTElCOj0uLi8uLi9wamxpYi9saWIvbGlicGotJChUQVJHRVRfTkFNRSkkKExJQkVYVCkKK1BKTElCX1VUSUxfTElCOj0uLi8uLi9wamxpYi11dGlsL2xpYi9saWJwamxpYi11dGlsLSQoVEFSR0VUX05BTUUpJChMSUJFWFQpCisKK2V4cG9ydCBQSk5BVEhfTElCOj1saWJwam5hdGgtJChUQVJHRVRfTkFNRSkkKExJQkVYVCkKKworaWZlcSAoJChQSl9TSEFSRURfTElCUkFSSUVTKSwpCitlbHNlCitleHBvcnQgUEpOQVRIX1NPTkFNRSA6PSBsaWJwam5hdGguJChTSExJQl9TVUZGSVgpCitleHBvcnQgUEpOQVRIX1NITElCIDo9ICQoUEpOQVRIX1NPTkFNRSkuJChQSl9WRVJTSU9OX01BSk9SKQorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBHYXRoZXIgYWxsIGZsYWdzLgorIworZXhwb3J0IF9DRkxBR1MgCTo9ICQoQ0NfQ0ZMQUdTKSAkKE9TX0NGTEFHUykgJChIT1NUX0NGTEFHUykgJChNX0NGTEFHUykgXAorCQkgICAkKENGTEFHUykgJChDQ19JTkMpLi4vaW5jbHVkZSAkKENDX0lOQykuLi8uLi9wamxpYi9pbmNsdWRlIFwKKwkJICAgJChDQ19JTkMpLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlCitleHBvcnQgX0NYWEZMQUdTOj0gJChfQ0ZMQUdTKSAkKENDX0NYWEZMQUdTKSAkKE9TX0NYWEZMQUdTKSAkKE1fQ1hYRkxBR1MpIFwKKwkJICAgJChIT1NUX0NYWEZMQUdTKSAkKENYWEZMQUdTKQorZXhwb3J0IF9MREZMQUdTIDo9ICQoQ0NfTERGTEFHUykgJChPU19MREZMQUdTKSAkKE1fTERGTEFHUykgJChIT1NUX0xERkxBR1MpIFwKKwkJICAgJChBUFBfTERGTEFHUykgJChMREZMQUdTKSAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBEZWZpbmVzIGZvciBidWlsZGluZyBQSk5BVEggbGlicmFyeQorIworZXhwb3J0IFBKTkFUSF9TUkNESVIgPSAuLi9zcmMvcGpuYXRoCitleHBvcnQgUEpOQVRIX09CSlMgKz0gJChPU19PQkpTKSAkKE1fT0JKUykgJChDQ19PQkpTKSAkKEhPU1RfT0JKUykgXAorCQllcnJuby5vIGljZV9zZXNzaW9uLm8gaWNlX3N0cmFucy5vIG5hdF9kZXRlY3QubyBzdHVuX2F1dGgubyBcCisJCXN0dW5fbXNnLm8gc3R1bl9tc2dfZHVtcC5vIHN0dW5fc2Vzc2lvbi5vIHN0dW5fc29jay5vIFwKKwkJc3R1bl90cmFuc2FjdGlvbi5vIHR1cm5fc2Vzc2lvbi5vIHR1cm5fc29jay5vCitleHBvcnQgUEpOQVRIX0NGTEFHUyArPSAkKF9DRkxBR1MpCitleHBvcnQgUEpOQVRIX0NYWEZMQUdTICs9ICQoX0NYWEZMQUdTKQorZXhwb3J0IFBKTkFUSF9MREZMQUdTICs9ICQoUEpMSUJfVVRJTF9MRExJQikgJChQSkxJQl9MRExJQikgJChfTERGTEFHUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBEZWZpbmVzIGZvciBidWlsZGluZyB0ZXN0IGFwcGxpY2F0aW9uCisjCitleHBvcnQgUEpOQVRIX1RFU1RfU1JDRElSID0gLi4vc3JjL3BqbmF0aC10ZXN0CitleHBvcnQgUEpOQVRIX1RFU1RfT0JKUyArPSBpY2VfdGVzdC5vIHN0dW4ubyBzZXNzX2F1dGgubyBzZXJ2ZXIubyBjb25jdXJfdGVzdC5vIFwKKwkJCSAgICBzdHVuX3NvY2tfdGVzdC5vIHR1cm5fc29ja190ZXN0Lm8gdGVzdC5vCitleHBvcnQgUEpOQVRIX1RFU1RfQ0ZMQUdTICs9ICQoX0NGTEFHUykKK2V4cG9ydCBQSk5BVEhfVEVTVF9DWFhGTEFHUyArPSAkKF9DWFhGTEFHUykKK2V4cG9ydCBQSk5BVEhfVEVTVF9MREZMQUdTICs9ICQoUEpOQVRIX0xETElCKSAkKFBKTElCX1VUSUxfTERMSUIpICQoUEpMSUJfTERMSUIpICQoX0xERkxBR1MpCitleHBvcnQgUEpOQVRIX1RFU1RfRVhFOj1wam5hdGgtdGVzdC0kKFRBUkdFVF9OQU1FKSQoSE9TVF9FWEUpCisKKwkKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRGVmaW5lcyBmb3IgYnVpbGRpbmcgVFVSTiBjbGllbnQgYXBwbGljYXRpb24KKyMKK2V4cG9ydCBQSlRVUk5fQ0xJRU5UX1NSQ0RJUiA9IC4uL3NyYy9wanR1cm4tY2xpZW50CitleHBvcnQgUEpUVVJOX0NMSUVOVF9PQkpTICs9IGNsaWVudF9tYWluLm8KK2V4cG9ydCBQSlRVUk5fQ0xJRU5UX0NGTEFHUyArPSAkKF9DRkxBR1MpCitleHBvcnQgUEpUVVJOX0NMSUVOVF9DWFhGTEFHUyArPSAkKF9DWFhGTEFHUykKK2V4cG9ydCBQSlRVUk5fQ0xJRU5UX0xERkxBR1MgKz0gJChQSk5BVEhfTERMSUIpICQoUEpMSUJfVVRJTF9MRExJQikgJChQSkxJQl9MRExJQikgJChfTERGTEFHUykKK2V4cG9ydCBQSlRVUk5fQ0xJRU5UX0VYRTo9cGp0dXJuLWNsaWVudC0kKFRBUkdFVF9OQU1FKSQoSE9TVF9FWEUpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRGVmaW5lcyBmb3IgYnVpbGRpbmcgVFVSTiBzZXJ2ZXIgYXBwbGljYXRpb24KKyMKK2V4cG9ydCBQSlRVUk5fU1JWX1NSQ0RJUiA9IC4uL3NyYy9wanR1cm4tc3J2CitleHBvcnQgUEpUVVJOX1NSVl9PQkpTICs9IGFsbG9jYXRpb24ubyBhdXRoLm8gbGlzdGVuZXJfdWRwLm8gXAorCQkJICBsaXN0ZW5lcl90Y3AubyBzZXJ2ZXIubyBtYWluLm8KK2V4cG9ydCBQSlRVUk5fU1JWX0NGTEFHUyArPSAkKF9DRkxBR1MpCitleHBvcnQgUEpUVVJOX1NSVl9DWFhGTEFHUyArPSAkKF9DWFhGTEFHUykKK2V4cG9ydCBQSlRVUk5fU1JWX0xERkxBR1MgKz0gJChQSk5BVEhfTERMSUIpICQoUEpMSUJfVVRJTF9MRExJQikgJChQSkxJQl9MRExJQikgJChfTERGTEFHUykKK2V4cG9ydCBQSlRVUk5fU1JWX0VYRTo9cGp0dXJuLXNydi0kKFRBUkdFVF9OQU1FKSQoSE9TVF9FWEUpCisKKwkKKwkKK2V4cG9ydCBDQ19PVVQgQ0MgQVIgUkFOTElCIEhPU1RfTVYgSE9TVF9STSBIT1NUX1JNRElSIEhPU1RfTUtESVIgT0JKRVhUIExEIExET1VUIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBNYWluIGVudHJ5CisjCisjICQoVEFSR0VUKSBpcyBkZWZpbmVkIGluIG9zLSQoT1NfTkFNRSkubWFrIGZpbGUgaW4gY3VycmVudCBkaXJlY3RvcnkuCisjCitUQVJHRVRTIDo9ICQoUEpOQVRIX0xJQikgJChQSk5BVEhfU09OQU1FKSAkKFBKTkFUSF9URVNUX0VYRSkgJChQSlRVUk5fQ0xJRU5UX0VYRSkgJChQSlRVUk5fU1JWX0VYRSkKKworYWxsOiAkKFRBUkdFVFMpCisKK2RvYzoKKwljZCAuLiAmJiBybSAtcmYgZG9jcy8kKFBKX1ZFUlNJT04pICYmIGRveHlnZW4gZG9jcy9kb3h5Z2VuLmNmZworCUBpZiBbIC1uICIkKFdXV0RJUikiIF0gJiYgISBbIC1kICIkKFdXV0RJUikvZG9jcy8kKFBKX1ZFUlNJT04pL3BqbmF0aC9kb2NzL2h0bWwiIF0gOyB0aGVuIFwKKwkJZWNobyAiQ3JlYXRpbmcgZG9jcy8kKFBKX1ZFUlNJT04pL3BqbmF0aC9kb2NzL2h0bWwiIDsgXAorCQlta2RpciAtcCAkKFdXV0RJUikvZG9jcy8kKFBKX1ZFUlNJT04pL3BqbmF0aC9kb2NzL2h0bWwgOyBcCisJZmkgCisJQGlmIFsgLW4gIiQoV1dXRElSKSIgXSAmJiBbIC1kICIkKFdXV0RJUikvZG9jcy8kKFBKX1ZFUlNJT04pL3BqbmF0aC9kb2NzL2h0bWwiIF0gOyB0aGVuIFwKKwkJZWNobyAiQ29weWluZyBkb2NzLyQoUEpfVkVSU0lPTikgdG8gJChXV1dESVIpL2RvY3MvJChQSl9WRVJTSU9OKS9wam5hdGgvZG9jcy9odG1sLi4iIDsgXAorCQljcCAtdiAtYSAuLi9kb2NzLyQoUEpfVkVSU0lPTikvaHRtbC8qICQoV1dXRElSKS9kb2NzLyQoUEpfVkVSU0lPTikvcGpuYXRoL2RvY3MvaHRtbC8gOyBcCisJZmkKKworZGVwOiBkZXBlbmQKK2Rpc3RjbGVhbjogcmVhbGNsZWFuCisKKy5QSE9OWTogYWxsIGRlcCBkZXBlbmQgY2xlYW4gcmVhbGNsZWFuIGRpc3RjbGVhbgorLlBIT05ZOiAkKFRBUkdFVFMpCisuUEhPTlk6ICQoUEpOQVRIX0xJQikgJChQSk5BVEhfU09OQU1FKQorLlBIT05ZOiAkKFBKTkFUSF9URVNUX0VYRSkgJChQSlRVUk5fQ0xJRU5UX0VYRSkgJChQSlRVUk5fU1JWX0VYRSkKKworcGpuYXRoOiAkKFBKTkFUSF9MSUIpCiskKFBKTkFUSF9TT05BTUUpOiAkKFBKTkFUSF9MSUIpCiskKFBKTkFUSF9MSUIpICQoUEpOQVRIX1NPTkFNRSk6ICQoUEpMSUJfTElCKSAkKFBKTElCX1NPTkFNRSkgJChQSkxJQl9VVElMX0xJQikgJChQSkxJQl9VVElMX1NPTkFNRSkKKwkkKE1BS0UpIC1mICQoUlVMRVNfTUFLKSBBUFA9UEpOQVRIIGFwcD1wam5hdGggJChzdWJzdCAvLCQoSE9TVF9QU0VQKSwkKExJQkRJUikvJEApCisKK3BqbmF0aC10ZXN0OiAkKFBKTkFUSF9URVNUX0VYRSkKKyQoUEpOQVRIX1RFU1RfRVhFKTogJChQSk5BVEhfTElCKSAkKFBKTkFUSF9TT05BTUUpCisJJChNQUtFKSAtZiAkKFJVTEVTX01BSykgQVBQPVBKTkFUSF9URVNUIGFwcD1wam5hdGgtdGVzdCAkKHN1YnN0IC8sJChIT1NUX1BTRVApLCQoQklORElSKS8kQCkKKworcGp0dXJuLWNsaWVudDogJChQSlRVUk5fQ0xJRU5UX0VYRSkKKyQoUEpUVVJOX0NMSUVOVF9FWEUpOiAkKFBKTkFUSF9MSUIpICQoUEpOQVRIX1NPTkFNRSkKKwkkKE1BS0UpIC1mICQoUlVMRVNfTUFLKSBBUFA9UEpUVVJOX0NMSUVOVCBhcHA9cGp0dXJuLWNsaWVudCAkKHN1YnN0IC8sJChIT1NUX1BTRVApLCQoQklORElSKS8kQCkKKworcGp0dXJuLXNydjogJChQSlRVUk5fU1JWX0VYRSkKKyQoUEpUVVJOX1NSVl9FWEUpOiAkKFBKTkFUSF9MSUIpICQoUEpOQVRIX1NPTkFNRSkKKwkkKE1BS0UpIC1mICQoUlVMRVNfTUFLKSBBUFA9UEpUVVJOX1NSViBhcHA9cGp0dXJuLXNydiAkKHN1YnN0IC8sJChIT1NUX1BTRVApLCQoQklORElSKS8kQCkKKworLlBIT05ZOiBwam5hdGgua28KK3BqbmF0aC5rbzoKKwllY2hvIE1ha2luZyAkQAorCSQoTUFLRSkgLWYgJChSVUxFU19NQUspIEFQUD1QSk5BVEggYXBwPXBqbmF0aCAkKHN1YnN0IC8sJChIT1NUX1BTRVApLCQoTElCRElSKS8kQCkKKworLlBIT05ZOiBwam5hdGgtdGVzdC5rbworcGpuYXRoLXRlc3Qua286CisJJChNQUtFKSAtZiAkKFJVTEVTX01BSykgQVBQPVBKTkFUSF9URVNUIGFwcD1wam5hdGgtdGVzdCAkKHN1YnN0IC8sJChIT1NUX1BTRVApLCQoTElCRElSKS8kQCkKKworY2xlYW46CisJJChNQUtFKSAtZiAkKFJVTEVTX01BSykgQVBQPVBKTkFUSCBhcHA9cGpuYXRoICRACisJJChNQUtFKSAtZiAkKFJVTEVTX01BSykgQVBQPVBKTkFUSF9URVNUIGFwcD1wam5hdGgtdGVzdCAkQAorCSQoTUFLRSkgLWYgJChSVUxFU19NQUspIEFQUD1QSlRVUk5fQ0xJRU5UIGFwcD1wanR1cm4tY2xpZW50ICRACisJJChNQUtFKSAtZiAkKFJVTEVTX01BSykgQVBQPVBKVFVSTl9TUlYgYXBwPXBqdHVybi1zcnYgJEAKKworcmVhbGNsZWFuOgorCSQoc3Vic3QgQEAsJChzdWJzdCAvLCQoSE9TVF9QU0VQKSwucGpuYXRoLSQoVEFSR0VUX05BTUUpLmRlcGVuZCksJChIT1NUX1JNUikpCisJJChzdWJzdCBAQCwkKHN1YnN0IC8sJChIT1NUX1BTRVApLC5wam5hdGgtdGVzdC0kKFRBUkdFVF9OQU1FKS5kZXBlbmQpLCQoSE9TVF9STVIpKQorCSQoc3Vic3QgQEAsJChzdWJzdCAvLCQoSE9TVF9QU0VQKSwucGp0dXJuLWNsaWVudC0kKFRBUkdFVF9OQU1FKS5kZXBlbmQpLCQoSE9TVF9STVIpKQorCSQoc3Vic3QgQEAsJChzdWJzdCAvLCQoSE9TVF9QU0VQKSwucGp0dXJuLXNydi0kKFRBUkdFVF9OQU1FKS5kZXBlbmQpLCQoSE9TVF9STVIpKQorCSQoTUFLRSkgLWYgJChSVUxFU19NQUspIEFQUD1QSk5BVEggYXBwPXBqbmF0aCAkQAorCSQoTUFLRSkgLWYgJChSVUxFU19NQUspIEFQUD1QSk5BVEhfVEVTVCBhcHA9cGpuYXRoLXRlc3QgJEAKKwkkKE1BS0UpIC1mICQoUlVMRVNfTUFLKSBBUFA9UEpUVVJOX0NMSUVOVCBhcHA9cGp0dXJuLWNsaWVudCAkQAorCSQoTUFLRSkgLWYgJChSVUxFU19NQUspIEFQUD1QSlRVUk5fU1JWIGFwcD1wanR1cm4tc3J2ICRACisKK2RlcGVuZDoKKwkkKE1BS0UpIC1mICQoUlVMRVNfTUFLKSBBUFA9UEpOQVRIIGFwcD1wam5hdGggJEAKKwkkKE1BS0UpIC1mICQoUlVMRVNfTUFLKSBBUFA9UEpOQVRIX1RFU1QgYXBwPXBqbmF0aC10ZXN0ICRACisJJChNQUtFKSAtZiAkKFJVTEVTX01BSykgQVBQPVBKVFVSTl9DTElFTlQgYXBwPXBqdHVybi1jbGllbnQgJEAKKwkkKE1BS0UpIC1mICQoUlVMRVNfTUFLKSBBUFA9UEpUVVJOX1NSViBhcHA9cGp0dXJuLXNydiAkQAorCWVjaG8gJyQoQklORElSKS8kKFBKTkFUSF9URVNUX0VYRSk6ICQoTElCRElSKS8kKFBKTkFUSF9MSUIpICQoUEpMSUJfVVRJTF9MSUIpICQoUEpMSUJfTElCKScgPj4gLnBqbmF0aC10ZXN0LSQoVEFSR0VUX05BTUUpLmRlcGVuZAorCWVjaG8gJyQoQklORElSKS8kKFBKVFVSTl9DTElFTlRfRVhFKTogJChMSUJESVIpLyQoUEpOQVRIX0xJQikgJChQSkxJQl9VVElMX0xJQikgJChQSkxJQl9MSUIpJyA+PiAucGp0dXJuLWNsaWVudC0kKFRBUkdFVF9OQU1FKS5kZXBlbmQKKwllY2hvICckKEJJTkRJUikvJChQSlRVUk5fU1JWX0VYRSk6ICQoTElCRElSKS8kKFBKTkFUSF9MSUIpICQoUEpMSUJfVVRJTF9MSUIpICQoUEpMSUJfTElCKScgPj4gLnBqdHVybi1zcnYtJChUQVJHRVRfTkFNRSkuZGVwZW5kCisKKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvZjgvZjg4ODIzN2JkODliODczZWM5OGNhZjZkNDgyYmY1NzUwNzgxN2ZmZi5zdm4tYmFzZSBiL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lL2Y4L2Y4ODgyMzdiZDg5Yjg3M2VjOThjYWY2ZDQ4MmJmNTc1MDc4MTdmZmYuc3ZuLWJhc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVlZWQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lL2Y4L2Y4ODgyMzdiZDg5Yjg3M2VjOThjYWY2ZDQ4MmJmNTc1MDc4MTdmZmYuc3ZuLWJhc2UKQEAgLTAsMCArMSw0NjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogICBJVFUtVCBHLjcyMi4xICgyMDA1LTA1KSAtIEZpeGVkIHBvaW50IGltcGxlbWVudGF0aW9uIGZvciBtYWluIGJvZHkgYW5kIEFubmV4IEMKKyoqICAgPiBTb2Z0d2FyZSBSZWxlYXNlIDIuMSAoMjAwOC0wNikKKyoqICAgICAoU2ltcGxlIHJlcGFja2FnaW5nOyBubyBjaGFuZ2UgZnJvbSAyMDA1LTA1IFJlbGVhc2UgMi4wIGNvZGUpCisqKgorKiogICCpIDIwMDQgUG9seWNvbSwgSW5jLgorKioKKyoqCSBBbGwgcmlnaHRzIHJlc2VydmVkLgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIEZpbGVuYW1lOiAgICBjb21tb24uYyAgICAKKworICBQdXJwb3NlOiAgICAgQ29udGFpbnMgdGhlIGZ1bmN0aW9ucyB1c2VkIGZvciBib3RoIEcuNzIyLjEgQW5uZXggQyBlbmNvZGVyIGFuZCBkZWNvZGVyCisJCQorICBEZXNpZ24gTm90ZXM6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEluY2x1ZGUgZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiaHVmZl9kZWYuaCIKKyNpbmNsdWRlICJodWZmX3RhYi5oIgorI2luY2x1ZGUgInRhYmxlcy5oIgorI2luY2x1ZGUgImNvdW50LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb246ICAgIGNhdGVnb3JpemUKKworIFN5bnRheDogICAgICB2b2lkIGNhdGVnb3JpemUoV29yZDE2IG51bWJlcl9vZl9hdmFpbGFibGVfYml0cywgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1iZXJfb2ZfcmVnaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHJtc19pbmRleCwgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBwb3dlcl9jYXRlZ29yaWVzLCAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgY2F0ZWdvcnlfYmFsYW5jZXMpICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgICBpbnB1dHM6ICAgbnVtYmVyX29mX3JlZ2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1zX2luZGV4W01BWF9OVU1CRVJfT0ZfUkVHSU9OU10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgb3V0cHV0czogIHBvd2VyX2NhdGVnb3JpZXNbTUFYX05VTUJFUl9PRl9SRUdJT05TXSAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfYmFsYW5jZXNbTUFYX05VTV9DQVRFR09SSVpBVElPTl9DT05UUk9MX1BPU1NJQklMSVRJRVMtMV0KKworIERlc2NyaXB0aW9uOiBDb21wdXRlcyBhIHNlcmllcyBvZiBjYXRlZ29yaXphdGlvbnMgCisKKyBXTU9QUzogICAgIDdrSHogfCAgICAyNGtiaXQgICAgfCAgICAgMzJrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBVkcgIHwgICAgMC4xNCAgICAgIHwgICAgIDAuMTQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gIAorICAgICAgICAgICAgTUFYICB8ICAgIDAuMTUgICAgICB8ICAgICAwLjE1CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAorICAgCQkJCisgICAgICAgICAgIDE0a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdCAgICAgfCAgICAgNDhrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAwLjQyICAgICAgfCAgICAgMC40NSAgICAgICB8ICAgICAwLjQ4ICAgCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIE1BWCAgfCAgICAwLjQ3ICAgICAgfCAgICAgMC41MiAgICAgICB8ICAgICAwLjUyICAgCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY2F0ZWdvcml6ZShXb3JkMTYgbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzLAorCQkgICAgICAgIFdvcmQxNiBudW1iZXJfb2ZfcmVnaW9ucywKKwkJICAgICAgICBXb3JkMTYgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcywKKwkJICAgICAgICBXb3JkMTYgKnJtc19pbmRleCwKKwkJICAgICAgICBXb3JkMTYgKnBvd2VyX2NhdGVnb3JpZXMsCisJCSAgICAgICAgV29yZDE2ICpjYXRlZ29yeV9iYWxhbmNlcykKK3sKKyAgICAKKyAgICBXb3JkMTYgb2Zmc2V0OworICAgIFdvcmQxNiB0ZW1wOworICAgIFdvcmQxNiBmcmFtZV9zaXplOworCisgICAgLyogQXQgaGlnaGVyIGJpdCByYXRlcywgdGhlcmUgaXMgYW4gaW5jcmVhc2UgZm9yIG1vc3QgY2F0ZWdvcmllcyBpbiBhdmVyYWdlIGJpdAorICAgICAgIGNvbnN1bXB0aW9uIHBlciByZWdpb24uIFdlIGNvbXBlbnNhdGUgZm9yIHRoaXMgYnkgcHJldGVuZGluZyB3ZSBoYXZlIGZld2VyCisgICAgICAgYXZhaWxhYmxlIGJpdHMuICovCisgICAgdGVzdCgpOworICAgIGlmIChudW1iZXJfb2ZfcmVnaW9ucyA9PSBOVU1CRVJfT0ZfUkVHSU9OUykKKyAgICB7CisgICAgICAgIGZyYW1lX3NpemUgPSBEQ1RfTEVOR1RIOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmcmFtZV9zaXplID0gTUFYX0RDVF9MRU5HVEg7CisgICAgfQorCisgICAgdGVtcCA9IHN1YihudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMsZnJhbWVfc2l6ZSk7CisgICAgCisgICAgdGVzdCgpOworICAgIGlmICh0ZW1wID4gMCkKKyAgICB7CisgICAgICAgIG51bWJlcl9vZl9hdmFpbGFibGVfYml0cyA9IHN1YihudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMsZnJhbWVfc2l6ZSk7CisgICAgICAgIG51bWJlcl9vZl9hdmFpbGFibGVfYml0cyA9IGV4dHJhY3RfbChMX211bHQwKG51bWJlcl9vZl9hdmFpbGFibGVfYml0cyw1KSk7CisgICAgICAgIG51bWJlcl9vZl9hdmFpbGFibGVfYml0cyA9IHNocl9ub2NoZWNrKG51bWJlcl9vZl9hdmFpbGFibGVfYml0cywzKTsKKyAgICAgICAgbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzID0gYWRkKG51bWJlcl9vZl9hdmFpbGFibGVfYml0cyxmcmFtZV9zaXplKTsKKyAgICB9CisKKyAgICAvKiBjYWxjdWxhdGUgdGhlIG9mZnNldCB1c2luZyB0aGUgb3JpZ2luYWwgY2F0ZWdvcnkgYXNzaWdubWVudHMgKi8KKyAgICBvZmZzZXQgPSBjYWxjX29mZnNldChybXNfaW5kZXgsbnVtYmVyX29mX3JlZ2lvbnMsbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzKTsKKworCisKKyAgICAvKiBjb21wdXRlIHRoZSBwb3dlciBjYXRlZ29yaWVzIGJhc2VkIG9uIHRoZSB1bmlmb3JtIG9mZnNldCAqLworICAgIGNvbXB1dGVfcmF3X3Bvd19jYXRlZ29yaWVzKHBvd2VyX2NhdGVnb3JpZXMscm1zX2luZGV4LG51bWJlcl9vZl9yZWdpb25zLG9mZnNldCk7CisgICAgCisgICAgCisgICAgLyogYWRqdXN0IHRoZSBjYXRlZ29yeSBhc3NpZ25tZW50cyAqLworICAgIC8qIGNvbXB1dGUgdGhlIG5ldyBwb3dlciBjYXRlZ29yaWVzIGFuZCBjYXRlZ29yeSBiYWxhbmNlcyAqLworICAgIGNvbXBfcG93ZXJjYXRfYW5kX2NhdGJhbGFuY2UocG93ZXJfY2F0ZWdvcmllcyxjYXRlZ29yeV9iYWxhbmNlcyxybXNfaW5kZXgsbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzLG51bWJlcl9vZl9yZWdpb25zLG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXMsb2Zmc2V0KTsKKworfQorICAgIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9uOiAgICBjb21wX3Bvd2VyY2F0X2FuZF9jYXRiYWxhbmNlCisKKyBTeW50YXg6ICAgICAgdm9pZCBjb21wX3Bvd2VyY2F0X2FuZF9jYXRiYWxhbmNlKFdvcmQxNiAqcG93ZXJfY2F0ZWdvcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqY2F0ZWdvcnlfYmFsYW5jZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnJtc19pbmRleCwgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG51bWJlcl9vZl9hdmFpbGFibGVfYml0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBvZmZzZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaW5wdXRzOiAgICpybXNfaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX3JlZ2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcworICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG91dHB1dHM6ICAqcG93ZXJfY2F0ZWdvcmllcyAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICpjYXRlZ29yeV9iYWxhbmNlcyAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyBEZXNjcmlwdGlvbjogQ29tcHV0ZXMgdGhlIHBvd2VyX2NhdGVnb3JpZXMgYW5kIHRoZSBjYXRlZ29yeSBiYWxhbmNlcworCisgV01PUFM6ICAgICA3a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgQVZHICB8ICAgIDAuMTAgICAgICB8ICAgICAwLjEwCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tICAKKyAgICAgICAgICAgIE1BWCAgfCAgICAwLjExICAgICAgfCAgICAgMC4xMQorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAKKwkJCQkKKyAgICAgICAgICAgMTRrSHogfCAgICAyNGtiaXQgICAgfCAgICAgMzJrYml0ICAgICB8ICAgICA0OGtiaXQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgQVZHICB8ICAgIDAuMzIgICAgICB8ICAgICAwLjM1ICAgICAgIHwgICAgIDAuMzggICAKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgTUFYICB8ICAgIDAuMzggICAgICB8ICAgICAwLjQyICAgICAgIHwgICAgIDAuNDMgICAKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGNvbXBfcG93ZXJjYXRfYW5kX2NhdGJhbGFuY2UoV29yZDE2ICpwb3dlcl9jYXRlZ29yaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqY2F0ZWdvcnlfYmFsYW5jZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpybXNfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG51bWJlcl9vZl9hdmFpbGFibGVfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXMsCisJCQkJCQkJCSAgV29yZDE2IG9mZnNldCkKK3sKKyAgICAKKyAgICBXb3JkMTYgZXhwZWN0ZWRfbnVtYmVyX29mX2NvZGVfYml0czsKKyAgICBXb3JkMTYgcmVnaW9uOworICAgIFdvcmQxNiBtYXhfcmVnaW9uOworICAgIFdvcmQxNiBqOworICAgIFdvcmQxNiBtYXhfcmF0ZV9jYXRlZ29yaWVzW01BWF9OVU1CRVJfT0ZfUkVHSU9OU107CisgICAgV29yZDE2IG1pbl9yYXRlX2NhdGVnb3JpZXNbTUFYX05VTUJFUl9PRl9SRUdJT05TXTsKKyAgICBXb3JkMTYgdGVtcF9jYXRlZ29yeV9iYWxhbmNlc1syKk1BWF9OVU1fQ0FURUdPUklaQVRJT05fQ09OVFJPTF9QT1NTSUJJTElUSUVTXTsKKyAgICBXb3JkMTYgcmF3X21heCwgcmF3X21pbjsKKyAgICBXb3JkMTYgcmF3X21heF9pbmRleD0wLCByYXdfbWluX2luZGV4PTA7CisgICAgV29yZDE2IG1heF9yYXRlX3BvaW50ZXIsIG1pbl9yYXRlX3BvaW50ZXI7CisgICAgV29yZDE2IG1heCwgbWluOworICAgIFdvcmQxNiBpdGVtcDA7CisgICAgV29yZDE2IGl0ZW1wMTsKKyAgICBXb3JkMTYgbWluX3BsdXNfbWF4OworICAgIFdvcmQxNiB0d29feF9udW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHM7CisKKyAgICBXb3JkMTYgdGVtcDsKKworICAgIGV4cGVjdGVkX251bWJlcl9vZl9jb2RlX2JpdHMgPSAwOworICAgIG1vdmUxNigpOworCisgICAgZm9yIChyZWdpb249MDsgcmVnaW9uPG51bWJlcl9vZl9yZWdpb25zOyByZWdpb24rKykKKyAgICAgICAgZXhwZWN0ZWRfbnVtYmVyX29mX2NvZGVfYml0cyA9IGFkZChleHBlY3RlZF9udW1iZXJfb2ZfY29kZV9iaXRzLGV4cGVjdGVkX2JpdHNfdGFibGVbcG93ZXJfY2F0ZWdvcmllc1tyZWdpb25dXSk7CisKKworICAgIGZvciAocmVnaW9uPTA7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspIAorICAgIHsKKyAgICAgICAgbWF4X3JhdGVfY2F0ZWdvcmllc1tyZWdpb25dID0gcG93ZXJfY2F0ZWdvcmllc1tyZWdpb25dOworICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgCisgICAgICAgIG1pbl9yYXRlX2NhdGVnb3JpZXNbcmVnaW9uXSA9IHBvd2VyX2NhdGVnb3JpZXNbcmVnaW9uXTsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgfQorICAgIAorICAgIG1heCA9IGV4cGVjdGVkX251bWJlcl9vZl9jb2RlX2JpdHM7CisgICAgbW92ZTE2KCk7CisgICAgbWluID0gZXhwZWN0ZWRfbnVtYmVyX29mX2NvZGVfYml0czsKKyAgICBtb3ZlMTYoKTsKKyAgICBtYXhfcmF0ZV9wb2ludGVyID0gbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllczsKKyAgICBtb3ZlMTYoKTsKKyAgICBtaW5fcmF0ZV9wb2ludGVyID0gbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllczsKKyAgICBtb3ZlMTYoKTsKKyAgICAKKyAgICBmb3IgKGo9MDsgajxudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzLTE7IGorKykgCisgICAgeworICAgICAgICBtaW5fcGx1c19tYXggPSBhZGQobWF4LG1pbik7CisgICAgICAgIHR3b194X251bWJlcl9vZl9hdmFpbGFibGVfYml0cyA9IHNobF9ub2NoZWNrKG51bWJlcl9vZl9hdmFpbGFibGVfYml0cywxKTsKKyAgICAgICAgCisgICAgICAgIHRlbXAgPSBzdWIobWluX3BsdXNfbWF4LHR3b194X251bWJlcl9vZl9hdmFpbGFibGVfYml0cyk7CisgICAgICAgIHRlc3QoKTsKKyAgICAgICAgaWYgKHRlbXAgPD0gMCkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHJhd19taW4gPSA5OTsKKyAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICAgICAgLyogU2VhcmNoIGZyb20gbG93ZXN0IGZyZXEgcmVnaW9ucyB0byBoaWdoZXN0IGZvciBiZXN0ICovCisgICAgICAgICAgICAvKiByZWdpb24gdG8gcmVhc3NpZ24gdG8gYSBoaWdoZXIgYml0IHJhdGUgY2F0ZWdvcnkuICAgKi8KKyAgICAgICAgICAgIGZvciAocmVnaW9uPTA7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgICAgICBpZiAobWF4X3JhdGVfY2F0ZWdvcmllc1tyZWdpb25dID4gMCkgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpdGVtcDAgPSBzaGxfbm9jaGVjayhtYXhfcmF0ZV9jYXRlZ29yaWVzW3JlZ2lvbl0sMSk7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1wMSA9IHN1YihvZmZzZXQscm1zX2luZGV4W3JlZ2lvbl0pOworICAgICAgICAgICAgICAgICAgICBpdGVtcDAgPSBzdWIoaXRlbXAxLGl0ZW1wMCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB0ZW1wID0gc3ViKGl0ZW1wMCxyYXdfbWluKTsKKyAgICAgICAgICAgICAgICAgICAgdGVzdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcCA8IDApIAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYXdfbWluID0gaXRlbXAwOworICAgICAgICAgICAgICAgICAgICAgICAgcmF3X21pbl9pbmRleCA9IHJlZ2lvbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1heF9yYXRlX3BvaW50ZXIgPSBzdWIobWF4X3JhdGVfcG9pbnRlciwxKTsKKyAgICAgICAgICAgIHRlbXBfY2F0ZWdvcnlfYmFsYW5jZXNbbWF4X3JhdGVfcG9pbnRlcl0gPSByYXdfbWluX2luZGV4OworICAgICAgICAgICAgbW92ZTE2KCk7CisKKyAgICAgICAgCW1heCA9IHN1YihtYXgsZXhwZWN0ZWRfYml0c190YWJsZVttYXhfcmF0ZV9jYXRlZ29yaWVzW3Jhd19taW5faW5kZXhdXSk7CisgICAgICAgIAltYXhfcmF0ZV9jYXRlZ29yaWVzW3Jhd19taW5faW5kZXhdID0gc3ViKG1heF9yYXRlX2NhdGVnb3JpZXNbcmF3X21pbl9pbmRleF0sMSk7CisgICAgICAgIAltb3ZlMTYoKTsKKworICAgICAgICAgICAgbWF4ID0gYWRkKG1heCxleHBlY3RlZF9iaXRzX3RhYmxlW21heF9yYXRlX2NhdGVnb3JpZXNbcmF3X21pbl9pbmRleF1dKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIAorICAgICAgICB7CisgICAgICAgICAgICByYXdfbWF4ID0gLTk5OworICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgICAgICAvKiBTZWFyY2ggZnJvbSBoaWdoZXN0IGZyZXEgcmVnaW9ucyB0byBsb3dlc3QgZm9yIGJlc3QgcmVnaW9uIHRvIHJlYXNzaWduIHRvCisgICAgICAgICAgICBhIGxvd2VyIGJpdCByYXRlIGNhdGVnb3J5LiAqLworICAgICAgICAgICAgbWF4X3JlZ2lvbiA9IHN1YihudW1iZXJfb2ZfcmVnaW9ucywxKTsKKyAgICAgICAgICAgIGZvciAocmVnaW9uPSBtYXhfcmVnaW9uOyByZWdpb24gPj0gMDsgcmVnaW9uLS0pIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSBzdWIobWluX3JhdGVfY2F0ZWdvcmllc1tyZWdpb25dLChOVU1fQ0FURUdPUklFUy0xKSk7CisgICAgICAgICAgICAgICAgdGVzdCgpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wIDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1wMCA9IHNobF9ub2NoZWNrKG1pbl9yYXRlX2NhdGVnb3JpZXNbcmVnaW9uXSwxKTsKKyAgICAgICAgICAgICAgICAgICAgaXRlbXAxID0gc3ViKG9mZnNldCxybXNfaW5kZXhbcmVnaW9uXSk7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1wMCA9IHN1YihpdGVtcDEsaXRlbXAwKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBzdWIoaXRlbXAwLHJhd19tYXgpOworICAgICAgICAgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wID4gMCkgCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhd19tYXggPSBpdGVtcDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhd19tYXhfaW5kZXggPSByZWdpb247CisgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRlbXBfY2F0ZWdvcnlfYmFsYW5jZXNbbWluX3JhdGVfcG9pbnRlcl0gPSByYXdfbWF4X2luZGV4OworICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1pbl9yYXRlX3BvaW50ZXIgPSBhZGQobWluX3JhdGVfcG9pbnRlciwxKTsKKyAgICAgICAgICAgIG1pbiA9IHN1YihtaW4sZXhwZWN0ZWRfYml0c190YWJsZVttaW5fcmF0ZV9jYXRlZ29yaWVzW3Jhd19tYXhfaW5kZXhdXSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1pbl9yYXRlX2NhdGVnb3JpZXNbcmF3X21heF9pbmRleF0gPSBhZGQobWluX3JhdGVfY2F0ZWdvcmllc1tyYXdfbWF4X2luZGV4XSwxKTsKKyAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtaW4gPSBhZGQobWluLGV4cGVjdGVkX2JpdHNfdGFibGVbbWluX3JhdGVfY2F0ZWdvcmllc1tyYXdfbWF4X2luZGV4XV0pOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGZvciAocmVnaW9uPTA7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspCisgICAgeworICAgICAgICBwb3dlcl9jYXRlZ29yaWVzW3JlZ2lvbl0gPSBtYXhfcmF0ZV9jYXRlZ29yaWVzW3JlZ2lvbl07CisgICAgICAgIG1vdmUxNigpOworICAgIH0KKyAgICAKKyAgICBmb3IgKGo9MDsgajxudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzLTE7IGorKykKKyAgICB7CisgICAgICAgIGNhdGVnb3J5X2JhbGFuY2VzW2pdID0gdGVtcF9jYXRlZ29yeV9iYWxhbmNlc1ttYXhfcmF0ZV9wb2ludGVyKytdOworICAgICAgICBtb3ZlMTYoKTsKKyAgICB9CisKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbjogICAgY2FsY19vZmZzZXQKKworIFN5bnRheDogICAgICBvZmZzZXQ9Y2FsY19vZmZzZXQoV29yZDE2ICpybXNfaW5kZXgsV29yZDE2IG51bWJlcl9vZl9yZWdpb25zLFdvcmQxNiBhdmFpbGFibGVfYml0cykgIAorCisgICAgICAgICAgICAgICAgaW5wdXQ6ICBXb3JkMTYgKnJtc19pbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG51bWJlcl9vZl9yZWdpb25zCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYXZhaWxhYmxlX2JpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG91dHB1dDogV29yZDE2IG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgIAorCisgRGVzY3JpcHRpb246IENhbGN1bGF0ZXMgdGhlIHRoZSBjYXRlZ29yeSBvZmZzZXQuICBUaGlzIGlzIHRoZSBzaGlmdCByZXF1aXJlZAorICAgICAgICAgICAgICBUbyBnZXQgdGhlIG1vc3Qgb3V0IG9mIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGJpdHMuICBBIGJpbmFyeSAKKyAgICAgICAgICAgICAgdHlwZSBzZWFyY2ggaXMgdXNlZCB0byBmaW5kIHRoZSBvZmZzZXQuCisKKyBXTU9QUzogICAgIDdrSHogfCAgICAyNGtiaXQgICAgfCAgICAgMzJrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBVkcgIHwgICAgMC4wNCAgICAgIHwgICAgIDAuMDQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gIAorICAgICAgICAgICAgTUFYICB8ICAgIDAuMDQgICAgICB8ICAgICAwLjA0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAorCisgICAgICAgICAgIDE0a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdCAgICAgfCAgICAgNDhrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAwLjA4ICAgICAgfCAgICAgMC4wOCAgICAgICB8ICAgICAwLjA4ICAgCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIE1BWCAgfCAgICAwLjA5ICAgICAgfCAgICAgMC4wOSAgICAgICB8ICAgICAwLjA5ICAgCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworV29yZDE2IGNhbGNfb2Zmc2V0KFdvcmQxNiAqcm1zX2luZGV4LFdvcmQxNiBudW1iZXJfb2ZfcmVnaW9ucyxXb3JkMTYgYXZhaWxhYmxlX2JpdHMpICAgIAoreworCisgICAgV29yZDE2IGFuc3dlcjsKKyAgICBXb3JkMTYgZGVsdGE7CisgICAgV29yZDE2IHRlc3Rfb2Zmc2V0OworICAgIFdvcmQxNiByZWdpb24sajsKKyAgICBXb3JkMTYgcG93ZXJfY2F0c1tNQVhfTlVNQkVSX09GX1JFR0lPTlNdOworICAgIFdvcmQxNiBiaXRzOworICAgIFdvcmQxNiBvZmZzZXQ7CisgICAgV29yZDE2IHRlbXA7CisKKyAgICAvKiBpbml0aWFsaXplIHZhcnMgKi8KKyAgICBhbnN3ZXIgPSAtMzI7CisgICAgbW92ZTE2KCk7CisgICAgZGVsdGEgPSAzMjsKKyAgICBtb3ZlMTYoKTsKKyAgICAKKyAgICBkbyAKKyAgICB7CisgICAgICAgIHRlc3Rfb2Zmc2V0ID0gYWRkKGFuc3dlcixkZWx0YSk7CisgICAgICAgIAorICAgICAgICAvKiBvYnRhaW4gYSBjYXRlZ29yeSBmb3IgZWFjaCByZWdpb24gKi8KKyAgICAgICAgLyogdXNpbmcgdGhlIHRlc3Qgb2Zmc2V0ICAgICAgICAgICAgICovCisgICAgICAgIGZvciAocmVnaW9uPTA7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspIAorICAgICAgICB7CisgICAgICAgICAgICBqID0gc3ViKHRlc3Rfb2Zmc2V0LHJtc19pbmRleFtyZWdpb25dKTsKKyAgICAgICAgICAgIGogPSBzaHJfbm9jaGVjayhqLDEpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBFbnN1cmUgaiBpcyBiZXR3ZWVuIDAgYW5kIE5VTV9DQVQtMSAqLworICAgICAgICAgICAgdGVzdCgpOworICAgICAgICAgICAgaWYgKGogPCAwKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRlbXAgPSBzdWIoaixOVU1fQ0FURUdPUklFUy0xKTsKKyAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgIGlmICh0ZW1wID4gMCkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaiA9IHN1YihOVU1fQ0FURUdPUklFUywxKTsKKyAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvd2VyX2NhdHNbcmVnaW9uXSA9IGo7CisgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgfQorICAgICAgICBiaXRzID0gMDsKKyAgICAgICAgbW92ZTE2KCk7CisKKyAgICAgICAgLyogY29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJpdHMgdGhhdCB3aWxsIGJlIHVzZWQgZ2l2ZW4gdGhlIGNhdCBhc3NpZ25tZW50cyAqLworICAgICAgICBmb3IgKHJlZ2lvbj0wOyByZWdpb248bnVtYmVyX29mX3JlZ2lvbnM7IHJlZ2lvbisrKQorICAgICAgICAgICAgYml0cyA9IGFkZChiaXRzLGV4cGVjdGVkX2JpdHNfdGFibGVbcG93ZXJfY2F0c1tyZWdpb25dXSk7CisKKyAgICAgICAgLyogaWYgKGJpdHMgPiBhdmFpbGFibGVfYml0cyAtIDMyKSB0aGVuIGRpdmlkZSB0aGUgb2Zmc2V0IHJlZ2lvbiBmb3IgdGhlIGJpbiBzZWFyY2ggKi8KKyAgICAgICAgb2Zmc2V0ID0gc3ViKGF2YWlsYWJsZV9iaXRzLDMyKTsKKyAgICAgICAgdGVtcCA9IHN1YihiaXRzLG9mZnNldCk7CisgICAgICAgIHRlc3QoKTsKKyAgICAgICAgaWYgKHRlbXAgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYW5zd2VyID0gdGVzdF9vZmZzZXQ7CisgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgfQorICAgICAgICBkZWx0YSA9IHNocl9ub2NoZWNrKGRlbHRhLDEpOworICAgICAgICB0ZXN0KCk7IC8qIGZvciB0aGUgd2hpbGUgbG9vcCAqLworICAgIH0gd2hpbGUgKGRlbHRhID4gMCk7CisKKyAgICByZXR1cm4oYW5zd2VyKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbjogICAgY29tcHV0ZV9yYXdfcG93X2NhdGVnb3JpZXMKKworIFN5bnRheDogICAgICB2b2lkIGNvbXB1dGVfcmF3X3Bvd19jYXRlZ29yaWVzKFdvcmQxNiAqcG93ZXJfY2F0ZWdvcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnJtc19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG9mZnNldCkKKyAgICAgICAgICAgICAgaW5wdXRzOiAgKnJtc19pbmRleAorICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfcmVnaW9ucworICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIG91dHB1dHM6ICpwb3dlcl9jYXRlZ29yaWVzICAgICAgICAgICAgICAgICAgICAKKworCisKKyBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgcG93ZXIgY2F0ZWdvcmllcyBnaXZlbiB0aGUgb2Zmc2V0CisgICAgICAgICAgICAgIFRoaXMgaXMga2luZCBvZiByZWR1bmRhbnQgc2luY2UgdGhleSB3ZXJlIGFscmVhZHkgY29tcHV0ZWQKKyAgICAgICAgICAgICAgaW4gY2FsY19vZmZzZXQgdG8gZGV0ZXJtaW5lIHRoZSBvZmZzZXQuCisKKyBXTU9QUzogICAgICAgICAgfCAgICAyNGtiaXQgICAgfCAgICAgMzJrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBVkcgIHwgICAgMC4wMSAgICAgIHwgICAgIDAuMDEKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gIAorICAgICAgICAgICAgTUFYICB8ICAgIDAuMDEgICAgICB8ICAgICAwLjAxCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAorCisgICAgICAgICAgIDE0a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdCAgICAgfCAgICAgNDhrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAwLjAxICAgICAgfCAgICAgMC4wMSAgICAgICB8ICAgICAwLjAxICAgCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIE1BWCAgfCAgICAwLjAxICAgICAgfCAgICAgMC4wMSAgICAgICB8ICAgICAwLjAxICAgCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjb21wdXRlX3Jhd19wb3dfY2F0ZWdvcmllcyhXb3JkMTYgKnBvd2VyX2NhdGVnb3JpZXMsV29yZDE2ICpybXNfaW5kZXgsV29yZDE2IG51bWJlcl9vZl9yZWdpb25zLFdvcmQxNiBvZmZzZXQpCit7CisgICAgV29yZDE2IHJlZ2lvbjsKKyAgICBXb3JkMTYgajsKKyAgICBXb3JkMTYgdGVtcDsKKworICAgIGZvciAocmVnaW9uPTA7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspIAorICAgIHsKKyAgICAgICAgaiA9IHN1YihvZmZzZXQscm1zX2luZGV4W3JlZ2lvbl0pOworICAgICAgICBqID0gc2hyX25vY2hlY2soaiwxKTsKKyAgICAgICAgCisgICAgICAgIC8qIG1ha2Ugc3VyZSBqIGlzIGJldHdlZW4gMCBhbmQgTlVNX0NBVC0xICovCisgICAgICAgIHRlc3QoKTsKKyAgICAgICAgaWYgKGogPCAwKSAKKyAgICAgICAgeworICAgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgfQorICAgICAgICB0ZW1wID0gc3ViKGosKE5VTV9DQVRFR09SSUVTLTEpKTsKKyAgICAgICAgdGVzdCgpOworICAgICAgICBpZiAodGVtcCA+IDApIAorICAgICAgICAgICAgaiA9IHN1YihOVU1fQ0FURUdPUklFUywxKTsKKyAgICAgICAgCisgICAgICAgIHBvd2VyX2NhdGVnb3JpZXNbcmVnaW9uXSA9IGo7CisgICAgICAgIG1vdmUxNigpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvZjgvZjhiNWU1ODA0NzI2MjQ0MzNhZDE3ZWE3MGIyYzY4ZjRmZTJkMmRlOS5zdm4tYmFzZSBiL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lL2Y4L2Y4YjVlNTgwNDcyNjI0NDMzYWQxN2VhNzBiMmM2OGY0ZmUyZDJkZTkuc3ZuLWJhc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA4MWFlZAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lL2Y4L2Y4YjVlNTgwNDcyNjI0NDMzYWQxN2VhNzBiMmM2OGY0ZmUyZDJkZTkuc3ZuLWJhc2UKQEAgLTAsMCArMSwyMjYgQEAKKyMgJElkJAoraW1wb3J0IHRpbWUKK2ltcG9ydCBpbXAKK2ltcG9ydCBzeXMKK2ltcG9ydCBpbmNfY29uc3QgYXMgY29uc3QKK2Zyb20gaW5jX2NmZyBpbXBvcnQgKgorCisjIExvYWQgY29uZmlndXJhdGlvbgorY2ZnX2ZpbGUgPSBpbXAubG9hZF9zb3VyY2UoImNmZ19maWxlIiwgQVJHU1sxXSkKKworIyBDaGVjayBtZWRpYSBmbG93IGJldHdlZW4gdWExIGFuZCB1YTIKK2RlZiBjaGVja19tZWRpYSh1YTEsIHVhMik6CisJdWExLnNlbmQoIiMiKQorCXVhMS5leHBlY3QoIiMiKQorCXVhMS5zZW5kKCIxMTIyIikKKwl1YTIuZXhwZWN0KGNvbnN0LlJYX0RUTUYgKyAiMSIpCisJdWEyLmV4cGVjdChjb25zdC5SWF9EVE1GICsgIjEiKQorCXVhMi5leHBlY3QoY29uc3QuUlhfRFRNRiArICIyIikKKwl1YTIuZXhwZWN0KGNvbnN0LlJYX0RUTUYgKyAiMiIpCisKKworIyBUZXN0IGJvZHkgZnVuY3Rpb24KK2RlZiB0ZXN0X2Z1bmModCk6CisJY2FsbGVlID0gdC5wcm9jZXNzWzBdCisJY2FsbGVyID0gdC5wcm9jZXNzWzFdCisKKwkjIGlmIGhhdmVfcmVnIHRoZW4gd2FpdCBmb3IgY291cGxlIG9mIHNlY29uZHMgZm9yIFBVQkxJU0gKKwkjIHRvIGNvbXBsZXRlIChqdXN0IGluIGNhc2UgcFVCTElTSCBpcyB1c2VkKQorCWlmIGNhbGxlZS5pbnN0X3BhcmFtLmhhdmVfcmVnOgorCQl0aW1lLnNsZWVwKDEpCisJaWYgY2FsbGVyLmluc3RfcGFyYW0uaGF2ZV9yZWc6CisJCXRpbWUuc2xlZXAoMSkKKworCSMgQ2FsbGVyIG1ha2luZyBjYWxsCisJY2FsbGVyLnNlbmQoIm0iKQorCWNhbGxlci5zZW5kKHQuaW5zdF9wYXJhbXNbMF0udXJpKQorCWNhbGxlci5leHBlY3QoY29uc3QuU1RBVEVfQ0FMTElORykKKwkKKwkjIENhbGxlZSB3YWl0cyBmb3IgY2FsbCBhbmQgYW5zd2VycyB3aXRoIDE4MC9SaW5naW5nCisJdGltZS5zbGVlcCgwLjIpCisJY2FsbGVlLmV4cGVjdChjb25zdC5FVkVOVF9JTkNPTUlOR19DQUxMKQorCWNhbGxlZS5zZW5kKCJhIikKKwljYWxsZWUuc2VuZCgiMTgwIikKKwljYWxsZWUuZXhwZWN0KCJTSVAvMi4wIDE4MCIpCisJY2FsbGVyLmV4cGVjdCgiU0lQLzIuMCAxODAiKQorCisJIyBTeW5jaHJvbml6ZSBzdGRvdXQKKwljYWxsZXIuc3luY19zdGRvdXQoKQorCWNhbGxlZS5zeW5jX3N0ZG91dCgpCisKKwkjIENhbGxlZSBhbnN3ZXJzIHdpdGggMjAwL09LCisJY2FsbGVlLnNlbmQoImEiKQorCWNhbGxlZS5zZW5kKCIyMDAiKQorCisJIyBXYWl0IHVudGlsIGNhbGwgaXMgY29ubmVjdGVkIGluIGJvdGggZW5kcG9pbnRzCisJdGltZS5zbGVlcCgwLjIpCisJY2FsbGVyLmV4cGVjdChjb25zdC5TVEFURV9DT05GSVJNRUQpCisJY2FsbGVlLmV4cGVjdChjb25zdC5TVEFURV9DT05GSVJNRUQpCisKKwkjIFN5bmNocm9uaXplIHN0ZG91dAorCWNhbGxlci5zeW5jX3N0ZG91dCgpCisJY2FsbGVlLnN5bmNfc3Rkb3V0KCkKKwl0aW1lLnNsZWVwKDAuMSkKKwljYWxsZXIuc3luY19zdGRvdXQoKQorCWNhbGxlZS5zeW5jX3N0ZG91dCgpCisKKwkjIFRlc3QgdGhhdCBtZWRpYSBpcyBva2F5CisJdGltZS5zbGVlcCgwLjMpCisJY2hlY2tfbWVkaWEoY2FsbGVyLCBjYWxsZWUpCisJY2hlY2tfbWVkaWEoY2FsbGVlLCBjYWxsZXIpCisKKwkjIEhvbGQgY2FsbCBieSBjYWxsZXIKKwljYWxsZXIuc2VuZCgiSCIpCisJY2FsbGVyLmV4cGVjdCgiSU5WSVRFIHNpcDoiKQorCWNhbGxlZS5leHBlY3QoIklOVklURSBzaXA6IikKKwljYWxsZXIuZXhwZWN0KGNvbnN0Lk1FRElBX0hPTEQpCisJY2FsbGVlLmV4cGVjdChjb25zdC5NRURJQV9IT0xEKQorCQorCSMgU3luY2hyb25pemUgc3Rkb3V0CisJY2FsbGVyLnN5bmNfc3Rkb3V0KCkKKwljYWxsZWUuc3luY19zdGRvdXQoKQorCisJIyBSZWxlYXNlIGhvbGQKKwl0aW1lLnNsZWVwKDAuNSkKKwljYWxsZXIuc2VuZCgidiIpCisJY2FsbGVyLmV4cGVjdCgiSU5WSVRFIHNpcDoiKQorCWNhbGxlZS5leHBlY3QoIklOVklURSBzaXA6IikKKwljYWxsZXIuZXhwZWN0KGNvbnN0Lk1FRElBX0FDVElWRSwgdGl0bGU9IndhaXRpbmcgZm9yIG1lZGlhIGFjdGl2ZSBhZnRlciBjYWxsIGhvbGQiKQorCWNhbGxlZS5leHBlY3QoY29uc3QuTUVESUFfQUNUSVZFLCB0aXRsZT0id2FpdGluZyBmb3IgbWVkaWEgYWN0aXZlIGFmdGVyIGNhbGwgaG9sZCIpCisKKwkjIFN5bmNocm9uaXplIHN0ZG91dAorCWNhbGxlci5zeW5jX3N0ZG91dCgpCisJY2FsbGVlLnN5bmNfc3Rkb3V0KCkKKworCSMgVGVzdCB0aGF0IG1lZGlhIGlzIG9rYXkKKwljaGVja19tZWRpYShjYWxsZXIsIGNhbGxlZSkKKwljaGVja19tZWRpYShjYWxsZWUsIGNhbGxlcikKKworCSMgU3luY2hyb25pemUgc3Rkb3V0CisJY2FsbGVyLnN5bmNfc3Rkb3V0KCkKKwljYWxsZWUuc3luY19zdGRvdXQoKQorCisJIyBIb2xkIGNhbGwgYnkgY2FsbGVlCisJY2FsbGVlLnNlbmQoIkgiKQorCWNhbGxlZS5leHBlY3QoIklOVklURSBzaXA6IikKKwljYWxsZXIuZXhwZWN0KCJJTlZJVEUgc2lwOiIpCisJY2FsbGVyLmV4cGVjdChjb25zdC5NRURJQV9IT0xEKQorCWNhbGxlZS5leHBlY3QoY29uc3QuTUVESUFfSE9MRCkKKwkKKwkjIFN5bmNocm9uaXplIHN0ZG91dAorCWNhbGxlci5zeW5jX3N0ZG91dCgpCisJY2FsbGVlLnN5bmNfc3Rkb3V0KCkKKworCSMgUmVsZWFzZSBob2xkCisJdGltZS5zbGVlcCgwLjEpCisJY2FsbGVlLnNlbmQoInYiKQorCWNhbGxlZS5leHBlY3QoIklOVklURSBzaXA6IikKKwljYWxsZXIuZXhwZWN0KCJJTlZJVEUgc2lwOiIpCisJY2FsbGVlLmV4cGVjdChjb25zdC5NRURJQV9BQ1RJVkUsIHRpdGxlPSJ3YWl0aW5nIGZvciBtZWRpYSBhY3RpdmUgYWZ0ZXIgY2FsbCBob2xkIikKKwljYWxsZXIuZXhwZWN0KGNvbnN0Lk1FRElBX0FDVElWRSwgdGl0bGU9IndhaXRpbmcgZm9yIG1lZGlhIGFjdGl2ZSBhZnRlciBjYWxsIGhvbGQiKQorCisJIyBTeW5jaHJvbml6ZSBzdGRvdXQKKwljYWxsZXIuc3luY19zdGRvdXQoKQorCWNhbGxlZS5zeW5jX3N0ZG91dCgpCisKKwkjIFRlc3QgdGhhdCBtZWRpYSBpcyBva2F5CisJIyBXYWl0IGZvciBzb21lIHRpbWUgZm9yIElDRSBuZWdvdGlhdGlvbgorCXRpbWUuc2xlZXAoMC42KQorCWNoZWNrX21lZGlhKGNhbGxlciwgY2FsbGVlKQorCWNoZWNrX21lZGlhKGNhbGxlZSwgY2FsbGVyKQorCisJIyBTeW5jaHJvbml6ZSBzdGRvdXQKKwljYWxsZXIuc3luY19zdGRvdXQoKQorCWNhbGxlZS5zeW5jX3N0ZG91dCgpCisKKwkjIFVQREFURSAoYnkgY2FsbGVyKQorCWNhbGxlci5zZW5kKCJVIikKKwkjY2FsbGVyLnN5bmNfc3Rkb3V0KCkKKwljYWxsZWUuZXhwZWN0KGNvbnN0Lk1FRElBX0FDVElWRSwgdGl0bGU9IndhaXRpbmcgZm9yIG1lZGlhIGFjdGl2ZSB3aXRoIFVQREFURSIpCisJY2FsbGVyLmV4cGVjdChjb25zdC5NRURJQV9BQ1RJVkUsIHRpdGxlPSJ3YWl0aW5nIGZvciBtZWRpYSBhY3RpdmUgd2l0aCBVUERBVEUiKQorCQorCSMgU3luY2hyb25pemUgc3Rkb3V0CisJY2FsbGVyLnN5bmNfc3Rkb3V0KCkKKwljYWxsZWUuc3luY19zdGRvdXQoKQorCisJIyBUZXN0IHRoYXQgbWVkaWEgaXMgb2theQorCXRpbWUuc2xlZXAoMC4xKQorCWNoZWNrX21lZGlhKGNhbGxlciwgY2FsbGVlKQorCWNoZWNrX21lZGlhKGNhbGxlZSwgY2FsbGVyKQorCisJIyBVUERBVEUgKGJ5IGNhbGxlZSkKKwljYWxsZWUuc2VuZCgiVSIpCisJY2FsbGVlLmV4cGVjdCgiVVBEQVRFIHNpcDoiKQorCWNhbGxlci5leHBlY3QoIlVQREFURSBzaXA6IikKKwljYWxsZXIuZXhwZWN0KGNvbnN0Lk1FRElBX0FDVElWRSwgdGl0bGU9IndhaXRpbmcgZm9yIG1lZGlhIGFjdGl2ZSB3aXRoIFVQREFURSIpCisJY2FsbGVlLmV4cGVjdChjb25zdC5NRURJQV9BQ1RJVkUsIHRpdGxlPSJ3YWl0aW5nIGZvciBtZWRpYSBhY3RpdmUgd2l0aCBVUERBVEUiKQorCQorCSMgU3luY2hyb25pemUgc3Rkb3V0CisJY2FsbGVyLnN5bmNfc3Rkb3V0KCkKKwljYWxsZWUuc3luY19zdGRvdXQoKQorCisJIyBUZXN0IHRoYXQgbWVkaWEgaXMgb2theQorCXRpbWUuc2xlZXAoMC4xKQorCWNoZWNrX21lZGlhKGNhbGxlciwgY2FsbGVlKQorCWNoZWNrX21lZGlhKGNhbGxlZSwgY2FsbGVyKQorCisJIyBTeW5jaHJvbml6ZSBzdGRvdXQKKwljYWxsZXIuc3luY19zdGRvdXQoKQorCWNhbGxlZS5zeW5jX3N0ZG91dCgpCisKKwkjIFNldCBjb2RlY3MgaW4gYm90aCBjYWxsZXIgYW5kIGNhbGxlZSBzbyB0aGF0IHRoZXJlIGlzCisJIyBubyBjb21tb24gY29kZWMgYmV0d2VlbiB0aGVtLgorCSMgSW4gY2FsbGVyIHdlIG9ubHkgZW5hYmxlIFBDTVUsIGluIGNhbGxlZSB3ZSBvbmx5IGVuYWJsZSBQQ01BCisJY2FsbGVyLnNlbmQoIkNwIikKKwljYWxsZXIuZXhwZWN0KCJFbnRlciBjb2RlYyIpCisJY2FsbGVyLnNlbmQoIiogMCIpCisJY2FsbGVyLnNlbmQoIkNwIikKKwljYWxsZXIuZXhwZWN0KCJFbnRlciBjb2RlYyIpCisJY2FsbGVyLnNlbmQoInBjbXUgMTIwIikKKwkKKwljYWxsZWUuc2VuZCgiQ3AiKQorCWNhbGxlZS5leHBlY3QoIkVudGVyIGNvZGVjIikKKwljYWxsZWUuc2VuZCgiKiAwIikKKwljYWxsZWUuc2VuZCgiQ3AiKQorCWNhbGxlZS5leHBlY3QoIkVudGVyIGNvZGVjIikKKwljYWxsZWUuc2VuZCgicGNtYSAxMjAiKQorCisJIyBUZXN0IHdoZW4gVVBEQVRFIGZhaWxzIChieSBjYWxsZWUpCisJY2FsbGVlLnNlbmQoIlUiKQorCWNhbGxlci5leHBlY3QoIlNJUC8yLjAgNDg4IikKKwljYWxsZWUuZXhwZWN0KCJTSVAvMi4wIDQ4OCIpCisJY2FsbGVlLnN5bmNfc3Rkb3V0KCkKKwljYWxsZXIuc3luY19zdGRvdXQoKQorCQorCSMgVGVzdCB0aGF0IG1lZGlhIGlzIHN0aWxsIG9rYXkKKwl0aW1lLnNsZWVwKDAuMSkKKwljaGVja19tZWRpYShjYWxsZXIsIGNhbGxlZSkKKwljaGVja19tZWRpYShjYWxsZWUsIGNhbGxlcikKKworCSMgVGVzdCB3aGVuIFVQREFURSBmYWlscyAoYnkgY2FsbGVyKQorCWNhbGxlci5zZW5kKCJVIikKKwljYWxsZXIuZXhwZWN0KCJVUERBVEUgc2lwOiIpCisJY2FsbGVlLmV4cGVjdCgiVVBEQVRFIHNpcDoiKQorCWNhbGxlZS5leHBlY3QoIlNJUC8yLjAgNDg4IikKKwljYWxsZXIuZXhwZWN0KCJTSVAvMi4wIDQ4OCIpCisJY2FsbGVyLnN5bmNfc3Rkb3V0KCkKKwljYWxsZWUuc3luY19zdGRvdXQoKQorCQorCSMgVGVzdCB0aGF0IG1lZGlhIGlzIHN0aWxsIG9rYXkKKwl0aW1lLnNsZWVwKDAuMSkKKwljaGVja19tZWRpYShjYWxsZWUsIGNhbGxlcikKKwljaGVja19tZWRpYShjYWxsZXIsIGNhbGxlZSkKKworCSMgSGFuZ3VwIGNhbGwKKwl0aW1lLnNsZWVwKDAuMSkKKwljYWxsZXIuc2VuZCgiaCIpCisKKwkjIFdhaXQgdW50aWwgY2FsbHMgYXJlIGNsZWFyZWQgaW4gYm90aCBlbmRwb2ludHMKKwljYWxsZXIuZXhwZWN0KGNvbnN0LlNUQVRFX0RJU0NPTk5FQ1RFRCkKKwljYWxsZWUuZXhwZWN0KGNvbnN0LlNUQVRFX0RJU0NPTk5FQ1RFRCkKKwkKKworIyBIZXJlIHdoZXJlIGl0IGFsbCBjb21lcyB0b2dldGhlcgordGVzdCA9IGNmZ19maWxlLnRlc3RfcGFyYW0KK3Rlc3QudGVzdF9mdW5jID0gdGVzdF9mdW5jCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lL2Y4L2Y4YzA0MDViZTg0ZGE1MTc3MTNjNzYyZWEzZjRmYjYyYWQ2MDY1ZDcuc3ZuLWJhc2UgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS9mOC9mOGMwNDA1YmU4NGRhNTE3NzEzYzc2MmVhM2Y0ZmI2MmFkNjA2NWQ3LnN2bi1iYXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NzM0MGIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS9mOC9mOGMwNDA1YmU4NGRhNTE3NzEzYzc2MmVhM2Y0ZmI2MmFkNjA2NWQ3LnN2bi1iYXNlCkBAIC0wLDAgKzEsOTQ5IEBACisvKiAkSWQkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAxMi0yMDEyIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTIgUmVnaXMgTW9udG95YSAoYWthIHIzZ2lzIC0gd3d3LnIzZ2lzLmZyKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKy8qIFRoaXMgZmlsZSBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgQW5kcm9pZCBPcGVuU0wgRVMgYXVkaW8gZGV2aWNlLgorICogVGhlIG9yaWdpbmFsIGNvZGUgd2FzIG9yaWdpbmFsbHkgcGFydCBvZiBDU2lwU2ltcGxlCisgKiAoaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2NzaXBzaW1wbGUvKSBhbmQgd2FzIGtpbmRseSBkb25hdGVkCisgKiBieSBSZWdpcyBNb250b3lhLgorICovCisKKyNpbmNsdWRlIDxwam1lZGlhLWF1ZGlvZGV2L2F1ZGlvZGV2X2ltcC5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL2xvZy5oPgorI2luY2x1ZGUgPHBqL29zLmg+CisjaW5jbHVkZSA8cGovc3RyaW5nLmg+CisjaW5jbHVkZSA8cGptZWRpYS9lcnJuby5oPgorCisjaWYgZGVmaW5lZChQSk1FRElBX0FVRElPX0RFVl9IQVNfT1BFTlNMKSAmJiBQSk1FRElBX0FVRElPX0RFVl9IQVNfT1BFTlNMICE9IDAKKworI2luY2x1ZGUgPFNMRVMvT3BlblNMRVMuaD4KKworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgI2luY2x1ZGUgPFNMRVMvT3BlblNMRVNfQW5kcm9pZC5oPgorICAgICNpbmNsdWRlIDxTTEVTL09wZW5TTEVTX0FuZHJvaWRDb25maWd1cmF0aW9uLmg+CisgICAgI2luY2x1ZGUgPHN5cy9zeXN0ZW1fcHJvcGVydGllcy5oPgorICAgICNpbmNsdWRlIDxhbmRyb2lkL2FwaS1sZXZlbC5oPgorCisgICAgI2RlZmluZSBXX1NMQnVmZmVyUXVldWVJdGYgU0xBbmRyb2lkU2ltcGxlQnVmZmVyUXVldWVJdGYKKyAgICAjZGVmaW5lIFdfU0xCdWZmZXJRdWV1ZVN0YXRlIFNMQW5kcm9pZFNpbXBsZUJ1ZmZlclF1ZXVlU3RhdGUKKyAgICAjZGVmaW5lIFdfU0xfSUlEX0JVRkZFUlFVRVVFIFNMX0lJRF9BTkRST0lEU0lNUExFQlVGRkVSUVVFVUUKKyNlbHNlCisgICAgI2RlZmluZSBXX1NMQnVmZmVyUXVldWVJdGYgU0xCdWZmZXJRdWV1ZUl0ZgorICAgICNkZWZpbmUgV19TTEJ1ZmZlclF1ZXVlU3RhdGUgU0xCdWZmZXJRdWV1ZVN0YXRlCisgICAgI2RlZmluZSBXX1NMX0lJRF9CVUZGRVJRVUVVRSBTTF9JSURfQlVGRkVSUVVFVUUKKyNlbmRpZgorCisjZGVmaW5lIFRISVNfRklMRQkib3BlbnNsX2Rldi5jIgorI2RlZmluZSBEUklWRVJfTkFNRQkiT3BlblNMIgorCisjZGVmaW5lIE5VTV9CVUZGRVJTIDIKKworc3RydWN0IG9wZW5zbF9hdWRfZmFjdG9yeQoreworICAgIHBqbWVkaWFfYXVkX2Rldl9mYWN0b3J5ICBiYXNlOworICAgIHBqX3Bvb2xfZmFjdG9yeSAgICAgICAgICpwZjsKKyAgICBwal9wb29sX3QgICAgICAgICAgICAgICAqcG9vbDsKKyAgICAKKyAgICBTTE9iamVjdEl0ZiAgICAgICAgICAgICAgZW5naW5lT2JqZWN0OworICAgIFNMRW5naW5lSXRmICAgICAgICAgICAgICBlbmdpbmVFbmdpbmU7CisgICAgU0xPYmplY3RJdGYgICAgICAgICAgICAgIG91dHB1dE1peE9iamVjdDsKK307CisKKy8qCisgKiBTb3VuZCBzdHJlYW0gZGVzY3JpcHRvci4KKyAqIFRoaXMgc3RydWN0IG1heSBiZSB1c2VkIGZvciBib3RoIHVuaWRpcmVjdGlvbmFsIG9yIGJpZGlyZWN0aW9uYWwgc291bmQKKyAqIHN0cmVhbXMuCisgKi8KK3N0cnVjdCBvcGVuc2xfYXVkX3N0cmVhbQoreworICAgIHBqbWVkaWFfYXVkX3N0cmVhbSAgYmFzZTsKKyAgICBwal9wb29sX3QgICAgICAgICAgKnBvb2w7CisgICAgcGpfc3RyX3QgICAgICAgICAgICBuYW1lOworICAgIHBqbWVkaWFfZGlyICAgICAgICAgZGlyOworICAgIHBqbWVkaWFfYXVkX3BhcmFtICAgcGFyYW07CisgICAgCisgICAgdm9pZCAgICAgICAgICAgICAgICp1c2VyX2RhdGE7CisgICAgcGpfYm9vbF90ICAgICAgICAgICBxdWl0X2ZsYWc7CisgICAgcGptZWRpYV9hdWRfcmVjX2NiICByZWNfY2I7CisgICAgcGptZWRpYV9hdWRfcGxheV9jYiBwbGF5X2NiOworCisgICAgcGpfdGltZXN0YW1wCXBsYXlfdGltZXN0YW1wOworICAgIHBqX3RpbWVzdGFtcAlyZWNfdGltZXN0YW1wOworICAgIAorICAgIHBqX2Jvb2xfdAkJcmVjX3RocmVhZF9pbml0aWFsaXplZDsKKyAgICBwal90aHJlYWRfZGVzYwlyZWNfdGhyZWFkX2Rlc2M7CisgICAgcGpfdGhyZWFkX3QgICAgICAgICpyZWNfdGhyZWFkOworICAgIAorICAgIHBqX2Jvb2xfdAkJcGxheV90aHJlYWRfaW5pdGlhbGl6ZWQ7CisgICAgcGpfdGhyZWFkX2Rlc2MJcGxheV90aHJlYWRfZGVzYzsKKyAgICBwal90aHJlYWRfdCAgICAgICAgKnBsYXlfdGhyZWFkOworICAgIAorICAgIC8qIFBsYXllciAqLworICAgIFNMT2JqZWN0SXRmICAgICAgICAgcGxheWVyT2JqOworICAgIFNMUGxheUl0ZiAgICAgICAgICAgcGxheWVyUGxheTsKKyAgICBTTFZvbHVtZUl0ZiAgICAgICAgIHBsYXllclZvbDsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgIHBsYXllckJ1ZmZlclNpemU7CisgICAgY2hhciAgICAgICAgICAgICAgICpwbGF5ZXJCdWZmZXJbTlVNX0JVRkZFUlNdOworICAgIGludCAgICAgICAgICAgICAgICAgcGxheWVyQnVmSWR4OworICAgIAorICAgIC8qIFJlY29yZGVyICovCisgICAgU0xPYmplY3RJdGYgICAgICAgICByZWNvcmRPYmo7CisgICAgU0xSZWNvcmRJdGYgICAgICAgICByZWNvcmRSZWNvcmQ7CisgICAgdW5zaWduZWQgICAgICAgICAgICByZWNvcmRCdWZmZXJTaXplOworICAgIGNoYXIgICAgICAgICAgICAgICAqcmVjb3JkQnVmZmVyW05VTV9CVUZGRVJTXTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlY29yZEJ1ZklkeDsKKworICAgIFdfU0xCdWZmZXJRdWV1ZUl0ZiAgcGxheWVyQnVmUTsKKyAgICBXX1NMQnVmZmVyUXVldWVJdGYgIHJlY29yZEJ1ZlE7Cit9OworCisvKiBGYWN0b3J5IHByb3RvdHlwZXMgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBvcGVuc2xfaW5pdChwam1lZGlhX2F1ZF9kZXZfZmFjdG9yeSAqZik7CitzdGF0aWMgcGpfc3RhdHVzX3Qgb3BlbnNsX2Rlc3Ryb3kocGptZWRpYV9hdWRfZGV2X2ZhY3RvcnkgKmYpOworc3RhdGljIHBqX3N0YXR1c190IG9wZW5zbF9yZWZyZXNoKHBqbWVkaWFfYXVkX2Rldl9mYWN0b3J5ICpmKTsKK3N0YXRpYyB1bnNpZ25lZCBvcGVuc2xfZ2V0X2Rldl9jb3VudChwam1lZGlhX2F1ZF9kZXZfZmFjdG9yeSAqZik7CitzdGF0aWMgcGpfc3RhdHVzX3Qgb3BlbnNsX2dldF9kZXZfaW5mbyhwam1lZGlhX2F1ZF9kZXZfZmFjdG9yeSAqZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV9hdWRfZGV2X2luZm8gKmluZm8pOworc3RhdGljIHBqX3N0YXR1c190IG9wZW5zbF9kZWZhdWx0X3BhcmFtKHBqbWVkaWFfYXVkX2Rldl9mYWN0b3J5ICpmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqbWVkaWFfYXVkX3BhcmFtICpwYXJhbSk7CitzdGF0aWMgcGpfc3RhdHVzX3Qgb3BlbnNsX2NyZWF0ZV9zdHJlYW0ocGptZWRpYV9hdWRfZGV2X2ZhY3RvcnkgKmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGptZWRpYV9hdWRfcGFyYW0gKnBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqbWVkaWFfYXVkX3JlY19jYiByZWNfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV9hdWRfcGxheV9jYiBwbGF5X2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwam1lZGlhX2F1ZF9zdHJlYW0gKipwX2F1ZF9zdHJtKTsKKworLyogU3RyZWFtIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBzdHJtX2dldF9wYXJhbShwam1lZGlhX2F1ZF9zdHJlYW0gKnN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV9hdWRfcGFyYW0gKnBhcmFtKTsKK3N0YXRpYyBwal9zdGF0dXNfdCBzdHJtX2dldF9jYXAocGptZWRpYV9hdWRfc3RyZWFtICpzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwam1lZGlhX2F1ZF9kZXZfY2FwIGNhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdmFsdWUpOworc3RhdGljIHBqX3N0YXR1c190IHN0cm1fc2V0X2NhcChwam1lZGlhX2F1ZF9zdHJlYW0gKnN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqbWVkaWFfYXVkX2Rldl9jYXAgY2FwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp2YWx1ZSk7CitzdGF0aWMgcGpfc3RhdHVzX3Qgc3RybV9zdGFydChwam1lZGlhX2F1ZF9zdHJlYW0gKnN0cm0pOworc3RhdGljIHBqX3N0YXR1c190IHN0cm1fc3RvcChwam1lZGlhX2F1ZF9zdHJlYW0gKnN0cm0pOworc3RhdGljIHBqX3N0YXR1c190IHN0cm1fZGVzdHJveShwam1lZGlhX2F1ZF9zdHJlYW0gKnN0cm0pOworCitzdGF0aWMgcGptZWRpYV9hdWRfZGV2X2ZhY3Rvcnlfb3Agb3BlbnNsX29wID0KK3sKKyAgICAmb3BlbnNsX2luaXQsCisgICAgJm9wZW5zbF9kZXN0cm95LAorICAgICZvcGVuc2xfZ2V0X2Rldl9jb3VudCwKKyAgICAmb3BlbnNsX2dldF9kZXZfaW5mbywKKyAgICAmb3BlbnNsX2RlZmF1bHRfcGFyYW0sCisgICAgJm9wZW5zbF9jcmVhdGVfc3RyZWFtLAorICAgICZvcGVuc2xfcmVmcmVzaAorfTsKKworc3RhdGljIHBqbWVkaWFfYXVkX3N0cmVhbV9vcCBvcGVuc2xfc3RybV9vcCA9Cit7CisgICAgJnN0cm1fZ2V0X3BhcmFtLAorICAgICZzdHJtX2dldF9jYXAsCisgICAgJnN0cm1fc2V0X2NhcCwKKyAgICAmc3RybV9zdGFydCwKKyAgICAmc3RybV9zdG9wLAorICAgICZzdHJtX2Rlc3Ryb3kKK307CisKKy8qIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBidWZmZXIgZmluaXNoZXMgcGxheWluZy4gKi8KK3ZvaWQgYnFQbGF5ZXJDYWxsYmFjayhXX1NMQnVmZmVyUXVldWVJdGYgYnEsIHZvaWQgKmNvbnRleHQpCit7CisgICAgc3RydWN0IG9wZW5zbF9hdWRfc3RyZWFtICpzdHJlYW0gPSAoc3RydWN0IG9wZW5zbF9hdWRfc3RyZWFtKikgY29udGV4dDsKKyAgICBTTHJlc3VsdCByZXN1bHQ7CisgICAgaW50IHN0YXR1czsKKworICAgIHBqX2Fzc2VydChjb250ZXh0ICE9IE5VTEwpOworICAgIHBqX2Fzc2VydChicSA9PSBzdHJlYW0tPnBsYXllckJ1ZlEpOworCisgICAgaWYgKHN0cmVhbS0+cGxheV90aHJlYWRfaW5pdGlhbGl6ZWQgPT0gMCB8fCAhcGpfdGhyZWFkX2lzX3JlZ2lzdGVyZWQoKSkKKyAgICB7CisJcGpfYnplcm8oc3RyZWFtLT5wbGF5X3RocmVhZF9kZXNjLCBzaXplb2YocGpfdGhyZWFkX2Rlc2MpKTsKKwlzdGF0dXMgPSBwal90aHJlYWRfcmVnaXN0ZXIoIm9wZW5zbF9wbGF5Iiwgc3RyZWFtLT5wbGF5X3RocmVhZF9kZXNjLAorCQkJCSAgICAmc3RyZWFtLT5wbGF5X3RocmVhZCk7CisJc3RyZWFtLT5wbGF5X3RocmVhZF9pbml0aWFsaXplZCA9IDE7CisJUEpfTE9HKDUsIChUSElTX0ZJTEUsICJQbGF5ZXIgdGhyZWFkIHN0YXJ0ZWQiKSk7CisgICAgfQorICAgIAorICAgIGlmICghc3RyZWFtLT5xdWl0X2ZsYWcpIHsKKyAgICAgICAgcGptZWRpYV9mcmFtZSBmcmFtZTsKKyAgICAgICAgY2hhciAqIGJ1ZjsKKyAgICAgICAgCisgICAgICAgIGZyYW1lLnR5cGUgPSBQSk1FRElBX0ZSQU1FX1RZUEVfQVVESU87CisgICAgICAgIGZyYW1lLmJ1ZiA9IGJ1ZiA9IHN0cmVhbS0+cGxheWVyQnVmZmVyW3N0cmVhbS0+cGxheWVyQnVmSWR4KytdOworICAgICAgICBmcmFtZS5zaXplID0gc3RyZWFtLT5wbGF5ZXJCdWZmZXJTaXplOworICAgICAgICBmcmFtZS50aW1lc3RhbXAudTY0ID0gc3RyZWFtLT5wbGF5X3RpbWVzdGFtcC51NjQ7CisgICAgICAgIGZyYW1lLmJpdF9pbmZvID0gMDsKKyAgICAgICAgCisgICAgICAgIHN0YXR1cyA9ICgqc3RyZWFtLT5wbGF5X2NiKShzdHJlYW0tPnVzZXJfZGF0YSwgJmZyYW1lKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTIHx8IGZyYW1lLnR5cGUgIT0gUEpNRURJQV9GUkFNRV9UWVBFX0FVRElPKQorICAgICAgICAgICAgcGpfYnplcm8oYnVmLCBzdHJlYW0tPnBsYXllckJ1ZmZlclNpemUpOworICAgICAgICAKKyAgICAgICAgc3RyZWFtLT5wbGF5X3RpbWVzdGFtcC51NjQgKz0gc3RyZWFtLT5wYXJhbS5zYW1wbGVzX3Blcl9mcmFtZSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+cGFyYW0uY2hhbm5lbF9jb3VudDsKKyAgICAgICAgCisgICAgICAgIHJlc3VsdCA9ICgqYnEpLT5FbnF1ZXVlKGJxLCBidWYsIHN0cmVhbS0+cGxheWVyQnVmZmVyU2l6ZSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gU0xfUkVTVUxUX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAiVW5hYmxlIHRvIGVucXVldWUgbmV4dCBwbGF5ZXIgYnVmZmVyICEhISAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHN0cmVhbS0+cGxheWVyQnVmSWR4ICU9IE5VTV9CVUZGRVJTOworICAgIH0KK30KKworLyogVGhpcyBjYWxsYmFjayBoYW5kbGVyIGlzIGNhbGxlZCBldmVyeSB0aW1lIGEgYnVmZmVyIGZpbmlzaGVzIHJlY29yZGluZyAqLwordm9pZCBicVJlY29yZGVyQ2FsbGJhY2soV19TTEJ1ZmZlclF1ZXVlSXRmIGJxLCB2b2lkICpjb250ZXh0KQoreworICAgIHN0cnVjdCBvcGVuc2xfYXVkX3N0cmVhbSAqc3RyZWFtID0gKHN0cnVjdCBvcGVuc2xfYXVkX3N0cmVhbSopIGNvbnRleHQ7CisgICAgU0xyZXN1bHQgcmVzdWx0OworICAgIGludCBzdGF0dXM7CisKKyAgICBwal9hc3NlcnQoY29udGV4dCAhPSBOVUxMKTsKKyAgICBwal9hc3NlcnQoYnEgPT0gc3RyZWFtLT5yZWNvcmRCdWZRKTsKKworICAgIGlmIChzdHJlYW0tPnJlY190aHJlYWRfaW5pdGlhbGl6ZWQgPT0gMCB8fCAhcGpfdGhyZWFkX2lzX3JlZ2lzdGVyZWQoKSkKKyAgICB7CisJcGpfYnplcm8oc3RyZWFtLT5yZWNfdGhyZWFkX2Rlc2MsIHNpemVvZihwal90aHJlYWRfZGVzYykpOworCXN0YXR1cyA9IHBqX3RocmVhZF9yZWdpc3Rlcigib3BlbnNsX3JlYyIsIHN0cmVhbS0+cmVjX3RocmVhZF9kZXNjLAorCQkJCSAgICAmc3RyZWFtLT5yZWNfdGhyZWFkKTsKKwlzdHJlYW0tPnJlY190aHJlYWRfaW5pdGlhbGl6ZWQgPSAxOworCVBKX0xPRyg1LCAoVEhJU19GSUxFLCAiUmVjb3JkZXIgdGhyZWFkIHN0YXJ0ZWQiKSk7IAorICAgIH0KKyAgICAKKyAgICBpZiAoIXN0cmVhbS0+cXVpdF9mbGFnKSB7CisgICAgICAgIHBqbWVkaWFfZnJhbWUgZnJhbWU7CisgICAgICAgIGNoYXIgKmJ1ZjsKKyAgICAgICAgCisgICAgICAgIGZyYW1lLnR5cGUgPSBQSk1FRElBX0ZSQU1FX1RZUEVfQVVESU87CisgICAgICAgIGZyYW1lLmJ1ZiA9IGJ1ZiA9IHN0cmVhbS0+cmVjb3JkQnVmZmVyW3N0cmVhbS0+cmVjb3JkQnVmSWR4KytdOworICAgICAgICBmcmFtZS5zaXplID0gc3RyZWFtLT5yZWNvcmRCdWZmZXJTaXplOworICAgICAgICBmcmFtZS50aW1lc3RhbXAudTY0ID0gc3RyZWFtLT5yZWNfdGltZXN0YW1wLnU2NDsKKyAgICAgICAgZnJhbWUuYml0X2luZm8gPSAwOworICAgICAgICAKKyAgICAgICAgc3RhdHVzID0gKCpzdHJlYW0tPnJlY19jYikoc3RyZWFtLT51c2VyX2RhdGEsICZmcmFtZSk7CisgICAgICAgIAorICAgICAgICBzdHJlYW0tPnJlY190aW1lc3RhbXAudTY0ICs9IHN0cmVhbS0+cGFyYW0uc2FtcGxlc19wZXJfZnJhbWUgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+cGFyYW0uY2hhbm5lbF9jb3VudDsKKyAgICAgICAgCisgICAgICAgIC8qIEFuZCBub3cgZW5xdWV1ZSBuZXh0IGJ1ZmZlciAqLworICAgICAgICByZXN1bHQgPSAoKmJxKS0+RW5xdWV1ZShicSwgYnVmLCBzdHJlYW0tPnJlY29yZEJ1ZmZlclNpemUpOworICAgICAgICBpZiAocmVzdWx0ICE9IFNMX1JFU1VMVF9TVUNDRVNTKSB7CisgICAgICAgICAgICBQSl9MT0coMywgKFRISVNfRklMRSwgIlVuYWJsZSB0byBlbnF1ZXVlIG5leHQgcmVjb3JkIGJ1ZmZlciAhISEgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzdHJlYW0tPnJlY29yZEJ1ZklkeCAlPSBOVU1fQlVGRkVSUzsKKyAgICB9Cit9CisKK3BqX3N0YXR1c190IG9wZW5zbF90b19wal9lcnJvcihTTHJlc3VsdCBjb2RlKQoreworICAgIHN3aXRjaChjb2RlKSB7CisJY2FzZSBTTF9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgIHJldHVybiBQSl9TVUNDRVNTOworCWNhc2UgU0xfUkVTVUxUX1BSRUNPTkRJVElPTlNfVklPTEFURUQ6CisJY2FzZSBTTF9SRVNVTFRfUEFSQU1FVEVSX0lOVkFMSUQ6CisJY2FzZSBTTF9SRVNVTFRfQ09OVEVOVF9DT1JSVVBURUQ6CisJY2FzZSBTTF9SRVNVTFRfRkVBVFVSRV9VTlNVUFBPUlRFRDoKKyAgICAgICAgICAgIHJldHVybiBQSk1FRElBX0VBVURfSU5WT1A7CisJY2FzZSBTTF9SRVNVTFRfTUVNT1JZX0ZBSUxVUkU6CisJY2FzZSBTTF9SRVNVTFRfQlVGRkVSX0lOU1VGRklDSUVOVDoKKyAgICAgICAgICAgIHJldHVybiBQSl9FTk9NRU07CisJY2FzZSBTTF9SRVNVTFRfUkVTT1VSQ0VfRVJST1I6CisJY2FzZSBTTF9SRVNVTFRfUkVTT1VSQ0VfTE9TVDoKKwljYXNlIFNMX1JFU1VMVF9DT05UUk9MX0xPU1Q6CisgICAgICAgICAgICByZXR1cm4gUEpNRURJQV9FQVVEX05PVFJFQURZOworCWNhc2UgU0xfUkVTVUxUX0NPTlRFTlRfVU5TVVBQT1JURUQ6CisgICAgICAgICAgICByZXR1cm4gUEpfRU5PVFNVUDsKKwlkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFBKTUVESUFfRUFVRF9FUlI7CisgICAgfQorfQorCisvKiBJbml0IEFuZHJvaWQgYXVkaW8gZHJpdmVyLiAqLworcGptZWRpYV9hdWRfZGV2X2ZhY3RvcnkqIHBqbWVkaWFfb3BlbnNsX2ZhY3RvcnkocGpfcG9vbF9mYWN0b3J5ICpwZikKK3sKKyAgICBzdHJ1Y3Qgb3BlbnNsX2F1ZF9mYWN0b3J5ICpmOworICAgIHBqX3Bvb2xfdCAqcG9vbDsKKyAgICAKKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUocGYsICJvcGVuc2xlcyIsIDI1NiwgMjU2LCBOVUxMKTsKKyAgICBmID0gUEpfUE9PTF9aQUxMT0NfVChwb29sLCBzdHJ1Y3Qgb3BlbnNsX2F1ZF9mYWN0b3J5KTsKKyAgICBmLT5wZiA9IHBmOworICAgIGYtPnBvb2wgPSBwb29sOworICAgIGYtPmJhc2Uub3AgPSAmb3BlbnNsX29wOworICAgIAorICAgIHJldHVybiAmZi0+YmFzZTsKK30KKworLyogQVBJOiBJbml0IGZhY3RvcnkgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBvcGVuc2xfaW5pdChwam1lZGlhX2F1ZF9kZXZfZmFjdG9yeSAqZikKK3sKKyAgICBzdHJ1Y3Qgb3BlbnNsX2F1ZF9mYWN0b3J5ICpwYSA9IChzdHJ1Y3Qgb3BlbnNsX2F1ZF9mYWN0b3J5KilmOworICAgIFNMcmVzdWx0IHJlc3VsdDsgICAgCisgICAgCisgICAgLyogQ3JlYXRlIGVuZ2luZSAqLworICAgIHJlc3VsdCA9IHNsQ3JlYXRlRW5naW5lKCZwYS0+ZW5naW5lT2JqZWN0LCAwLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAocmVzdWx0ICE9IFNMX1JFU1VMVF9TVUNDRVNTKSB7CisgICAgICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAiQ2Fubm90IGNyZWF0ZSBlbmdpbmUgJWQgIiwgcmVzdWx0KSk7CisgICAgICAgIHJldHVybiBvcGVuc2xfdG9fcGpfZXJyb3IocmVzdWx0KTsKKyAgICB9CisgICAgCisgICAgLyogUmVhbGl6ZSB0aGUgZW5naW5lICovCisgICAgcmVzdWx0ID0gKCpwYS0+ZW5naW5lT2JqZWN0KS0+UmVhbGl6ZShwYS0+ZW5naW5lT2JqZWN0LCBTTF9CT09MRUFOX0ZBTFNFKTsKKyAgICBpZiAocmVzdWx0ICE9IFNMX1JFU1VMVF9TVUNDRVNTKSB7CisgICAgICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAiQ2Fubm90IHJlYWxpemUgZW5naW5lIikpOworICAgICAgICBvcGVuc2xfZGVzdHJveShmKTsKKyAgICAgICAgcmV0dXJuIG9wZW5zbF90b19wal9lcnJvcihyZXN1bHQpOworICAgIH0KKyAgICAKKyAgICAvKiBHZXQgdGhlIGVuZ2luZSBpbnRlcmZhY2UsIHdoaWNoIGlzIG5lZWRlZCBpbiBvcmRlciB0byBjcmVhdGUKKyAgICAgKiBvdGhlciBvYmplY3RzLgorICAgICAqLworICAgIHJlc3VsdCA9ICgqcGEtPmVuZ2luZU9iamVjdCktPkdldEludGVyZmFjZShwYS0+ZW5naW5lT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTF9JSURfRU5HSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGEtPmVuZ2luZUVuZ2luZSk7CisgICAgaWYgKHJlc3VsdCAhPSBTTF9SRVNVTFRfU1VDQ0VTUykgeworICAgICAgICBQSl9MT0coMywgKFRISVNfRklMRSwgIkNhbm5vdCBnZXQgZW5naW5lIGludGVyZmFjZSIpKTsKKyAgICAgICAgb3BlbnNsX2Rlc3Ryb3koZik7CisgICAgICAgIHJldHVybiBvcGVuc2xfdG9fcGpfZXJyb3IocmVzdWx0KTsKKyAgICB9CisgICAgCisgICAgLyogQ3JlYXRlIG91dHB1dCBtaXggKi8KKyAgICByZXN1bHQgPSAoKnBhLT5lbmdpbmVFbmdpbmUpLT5DcmVhdGVPdXRwdXRNaXgocGEtPmVuZ2luZUVuZ2luZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhLT5vdXRwdXRNaXhPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIE5VTEwpOworICAgIGlmIChyZXN1bHQgIT0gU0xfUkVTVUxUX1NVQ0NFU1MpIHsKKyAgICAgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICJDYW5ub3QgY3JlYXRlIG91dHB1dCBtaXgiKSk7CisgICAgICAgIG9wZW5zbF9kZXN0cm95KGYpOworICAgICAgICByZXR1cm4gb3BlbnNsX3RvX3BqX2Vycm9yKHJlc3VsdCk7CisgICAgfQorICAgIAorICAgIC8qIFJlYWxpemUgdGhlIG91dHB1dCBtaXggKi8KKyAgICByZXN1bHQgPSAoKnBhLT5vdXRwdXRNaXhPYmplY3QpLT5SZWFsaXplKHBhLT5vdXRwdXRNaXhPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTF9CT09MRUFOX0ZBTFNFKTsKKyAgICBpZiAocmVzdWx0ICE9IFNMX1JFU1VMVF9TVUNDRVNTKSB7CisgICAgICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAiQ2Fubm90IHJlYWxpemUgb3V0cHV0IG1peCIpKTsKKyAgICAgICAgb3BlbnNsX2Rlc3Ryb3koZik7CisgICAgICAgIHJldHVybiBvcGVuc2xfdG9fcGpfZXJyb3IocmVzdWx0KTsKKyAgICB9CisgICAgCisgICAgUEpfTE9HKDQsKFRISVNfRklMRSwgIk9wZW5TTCBzb3VuZCBsaWJyYXJ5IGluaXRpYWxpemVkIikpOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBBUEk6IERlc3Ryb3kgZmFjdG9yeSAqLworc3RhdGljIHBqX3N0YXR1c190IG9wZW5zbF9kZXN0cm95KHBqbWVkaWFfYXVkX2Rldl9mYWN0b3J5ICpmKQoreworICAgIHN0cnVjdCBvcGVuc2xfYXVkX2ZhY3RvcnkgKnBhID0gKHN0cnVjdCBvcGVuc2xfYXVkX2ZhY3RvcnkqKWY7CisgICAgcGpfcG9vbF90ICpwb29sOworICAgIAorICAgIFBKX0xPRyg0LChUSElTX0ZJTEUsICJPcGVuU0wgc291bmQgbGlicmFyeSBzaHV0dGluZyBkb3duLi4iKSk7CisgICAgCisgICAgLyogRGVzdHJveSBPdXRwdXQgTWl4IG9iamVjdCAqLworICAgIGlmIChwYS0+b3V0cHV0TWl4T2JqZWN0KSB7CisgICAgICAgICgqcGEtPm91dHB1dE1peE9iamVjdCktPkRlc3Ryb3kocGEtPm91dHB1dE1peE9iamVjdCk7CisgICAgICAgIHBhLT5vdXRwdXRNaXhPYmplY3QgPSBOVUxMOworICAgIH0KKyAgICAKKyAgICAvKiBEZXN0cm95IGVuZ2luZSBvYmplY3QsIGFuZCBpbnZhbGlkYXRlIGFsbCBhc3NvY2lhdGVkIGludGVyZmFjZXMgKi8KKyAgICBpZiAocGEtPmVuZ2luZU9iamVjdCkgeworICAgICAgICAoKnBhLT5lbmdpbmVPYmplY3QpLT5EZXN0cm95KHBhLT5lbmdpbmVPYmplY3QpOworICAgICAgICBwYS0+ZW5naW5lT2JqZWN0ID0gTlVMTDsKKyAgICAgICAgcGEtPmVuZ2luZUVuZ2luZSA9IE5VTEw7CisgICAgfQorICAgIAorICAgIHBvb2wgPSBwYS0+cG9vbDsKKyAgICBwYS0+cG9vbCA9IE5VTEw7CisgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworICAgIAorICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBBUEk6IHJlZnJlc2ggdGhlIGxpc3Qgb2YgZGV2aWNlcyAqLworc3RhdGljIHBqX3N0YXR1c190IG9wZW5zbF9yZWZyZXNoKHBqbWVkaWFfYXVkX2Rldl9mYWN0b3J5ICpmKQoreworICAgIFBKX1VOVVNFRF9BUkcoZik7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIEFQSTogR2V0IGRldmljZSBjb3VudC4gKi8KK3N0YXRpYyB1bnNpZ25lZCBvcGVuc2xfZ2V0X2Rldl9jb3VudChwam1lZGlhX2F1ZF9kZXZfZmFjdG9yeSAqZikKK3sKKyAgICBQSl9VTlVTRURfQVJHKGYpOworICAgIHJldHVybiAxOworfQorCisvKiBBUEk6IEdldCBkZXZpY2UgaW5mby4gKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBvcGVuc2xfZ2V0X2Rldl9pbmZvKHBqbWVkaWFfYXVkX2Rldl9mYWN0b3J5ICpmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwam1lZGlhX2F1ZF9kZXZfaW5mbyAqaW5mbykKK3sKKyAgICBQSl9VTlVTRURfQVJHKGYpOworCisgICAgcGpfYnplcm8oaW5mbywgc2l6ZW9mKCppbmZvKSk7CisgICAgCisgICAgcGpfYW5zaV9zdHJjcHkoaW5mby0+bmFtZSwgIk9wZW5TTCBFUyBBdWRpbyIpOworICAgIGluZm8tPmRlZmF1bHRfc2FtcGxlc19wZXJfc2VjID0gODAwMDsKKyAgICBpbmZvLT5jYXBzID0gUEpNRURJQV9BVURfREVWX0NBUF9PVVRQVVRfVk9MVU1FX1NFVFRJTkc7CisgICAgaW5mby0+aW5wdXRfY291bnQgPSAxOworICAgIGluZm8tPm91dHB1dF9jb3VudCA9IDE7CisgICAgCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIEFQSTogZmlsbCBpbiB3aXRoIGRlZmF1bHQgcGFyYW1ldGVyLiAqLworc3RhdGljIHBqX3N0YXR1c190IG9wZW5zbF9kZWZhdWx0X3BhcmFtKHBqbWVkaWFfYXVkX2Rldl9mYWN0b3J5ICpmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqbWVkaWFfYXVkX3BhcmFtICpwYXJhbSkKK3sKKyAgICAKKyAgICBwam1lZGlhX2F1ZF9kZXZfaW5mbyBhZGk7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIAorICAgIHN0YXR1cyA9IG9wZW5zbF9nZXRfZGV2X2luZm8oZiwgaW5kZXgsICZhZGkpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gc3RhdHVzOworICAgIAorICAgIHBqX2J6ZXJvKHBhcmFtLCBzaXplb2YoKnBhcmFtKSk7CisgICAgaWYgKGFkaS5pbnB1dF9jb3VudCAmJiBhZGkub3V0cHV0X2NvdW50KSB7CisgICAgICAgIHBhcmFtLT5kaXIgPSBQSk1FRElBX0RJUl9DQVBUVVJFX1BMQVlCQUNLOworICAgICAgICBwYXJhbS0+cmVjX2lkID0gaW5kZXg7CisgICAgICAgIHBhcmFtLT5wbGF5X2lkID0gaW5kZXg7CisgICAgfSBlbHNlIGlmIChhZGkuaW5wdXRfY291bnQpIHsKKyAgICAgICAgcGFyYW0tPmRpciA9IFBKTUVESUFfRElSX0NBUFRVUkU7CisgICAgICAgIHBhcmFtLT5yZWNfaWQgPSBpbmRleDsKKyAgICAgICAgcGFyYW0tPnBsYXlfaWQgPSBQSk1FRElBX0FVRF9JTlZBTElEX0RFVjsKKyAgICB9IGVsc2UgaWYgKGFkaS5vdXRwdXRfY291bnQpIHsKKyAgICAgICAgcGFyYW0tPmRpciA9IFBKTUVESUFfRElSX1BMQVlCQUNLOworICAgICAgICBwYXJhbS0+cGxheV9pZCA9IGluZGV4OworICAgICAgICBwYXJhbS0+cmVjX2lkID0gUEpNRURJQV9BVURfSU5WQUxJRF9ERVY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFBKTUVESUFfRUFVRF9JTlZERVY7CisgICAgfQorICAgIAorICAgIHBhcmFtLT5jbG9ja19yYXRlID0gYWRpLmRlZmF1bHRfc2FtcGxlc19wZXJfc2VjOworICAgIHBhcmFtLT5jaGFubmVsX2NvdW50ID0gMTsKKyAgICBwYXJhbS0+c2FtcGxlc19wZXJfZnJhbWUgPSBhZGkuZGVmYXVsdF9zYW1wbGVzX3Blcl9zZWMgKiAyMCAvIDEwMDA7CisgICAgcGFyYW0tPmJpdHNfcGVyX3NhbXBsZSA9IDE2OworICAgIHBhcmFtLT5pbnB1dF9sYXRlbmN5X21zID0gUEpNRURJQV9TTkRfREVGQVVMVF9SRUNfTEFURU5DWTsKKyAgICBwYXJhbS0+b3V0cHV0X2xhdGVuY3lfbXMgPSBQSk1FRElBX1NORF9ERUZBVUxUX1BMQVlfTEFURU5DWTsKKyAgICAKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogQVBJOiBjcmVhdGUgc3RyZWFtICovCitzdGF0aWMgcGpfc3RhdHVzX3Qgb3BlbnNsX2NyZWF0ZV9zdHJlYW0ocGptZWRpYV9hdWRfZGV2X2ZhY3RvcnkgKmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGptZWRpYV9hdWRfcGFyYW0gKnBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqbWVkaWFfYXVkX3JlY19jYiByZWNfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV9hdWRfcGxheV9jYiBwbGF5X2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwam1lZGlhX2F1ZF9zdHJlYW0gKipwX2F1ZF9zdHJtKQoreworICAgIC8qIEF1ZGlvIHNpbmsgZm9yIHJlY29yZGVyIGFuZCBhdWRpbyBzb3VyY2UgZm9yIHBsYXllciAqLworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgU0xEYXRhTG9jYXRvcl9BbmRyb2lkU2ltcGxlQnVmZmVyUXVldWUgbG9jX2JxID0KKyAgICAgICAgeyBTTF9EQVRBTE9DQVRPUl9BTkRST0lEU0lNUExFQlVGRkVSUVVFVUUsIE5VTV9CVUZGRVJTIH07CisjZWxzZQorICAgIFNMRGF0YUxvY2F0b3JfQnVmZmVyUXVldWUgbG9jX2JxID0KKyAgICAgICAgeyBTTF9EQVRBTE9DQVRPUl9CVUZGRVJRVUVVRSwgTlVNX0JVRkZFUlMgfTsKKyNlbmRpZgorICAgIHN0cnVjdCBvcGVuc2xfYXVkX2ZhY3RvcnkgKnBhID0gKHN0cnVjdCBvcGVuc2xfYXVkX2ZhY3RvcnkqKWY7CisgICAgcGpfcG9vbF90ICpwb29sOworICAgIHN0cnVjdCBvcGVuc2xfYXVkX3N0cmVhbSAqc3RyZWFtOworICAgIHBqX3N0YXR1c190IHN0YXR1cyA9IFBKX1NVQ0NFU1M7CisgICAgaW50IGksIGJ1ZmZlclNpemU7CisgICAgU0xyZXN1bHQgcmVzdWx0OworICAgIFNMRGF0YUZvcm1hdF9QQ00gZm9ybWF0X3BjbTsKKyAgICAKKyAgICAvKiBPbmx5IHN1cHBvcnRzIGZvciBtb25vIGNoYW5uZWwgZm9yIG5vdyAqLworICAgIFBKX0FTU0VSVF9SRVRVUk4ocGFyYW0tPmNoYW5uZWxfY291bnQgPT0gMSwgUEpfRUlOVkFMKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHBsYXlfY2IgJiYgcmVjX2NiICYmIHBfYXVkX3N0cm0sIFBKX0VJTlZBTCk7CisKKyAgICBQSl9MT0coNCwoVEhJU19GSUxFLCAiQ3JlYXRpbmcgT3BlblNMIHN0cmVhbSIpKTsKKyAgICAKKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUocGEtPnBmLCAib3BlbnNsc3RybSIsIDEwMjQsIDEwMjQsIE5VTEwpOworICAgIGlmICghcG9vbCkKKyAgICAgICAgcmV0dXJuIFBKX0VOT01FTTsKKyAgICAKKyAgICBzdHJlYW0gPSBQSl9QT09MX1pBTExPQ19UKHBvb2wsIHN0cnVjdCBvcGVuc2xfYXVkX3N0cmVhbSk7CisgICAgc3RyZWFtLT5wb29sID0gcG9vbDsKKyAgICBwal9zdHJkdXAyX3dpdGhfbnVsbChwb29sLCAmc3RyZWFtLT5uYW1lLCAiT3BlblNMIik7CisgICAgc3RyZWFtLT5kaXIgPSBQSk1FRElBX0RJUl9DQVBUVVJFX1BMQVlCQUNLOworICAgIHBqX21lbWNweSgmc3RyZWFtLT5wYXJhbSwgcGFyYW0sIHNpemVvZigqcGFyYW0pKTsKKyAgICBzdHJlYW0tPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgICBzdHJlYW0tPnJlY19jYiA9IHJlY19jYjsKKyAgICBzdHJlYW0tPnBsYXlfY2IgPSBwbGF5X2NiOworICAgIGJ1ZmZlclNpemUgPSBwYXJhbS0+c2FtcGxlc19wZXJfZnJhbWUgKiBwYXJhbS0+Yml0c19wZXJfc2FtcGxlIC8gODsKKworICAgIC8qIENvbmZpZ3VyZSBhdWRpbyBQQ00gZm9ybWF0ICovCisgICAgZm9ybWF0X3BjbS5mb3JtYXRUeXBlID0gU0xfREFUQUZPUk1BVF9QQ007CisgICAgZm9ybWF0X3BjbS5udW1DaGFubmVscyA9IHBhcmFtLT5jaGFubmVsX2NvdW50OworICAgIC8qIEhlcmUgc2FtcGxlcyBwZXIgc2VjIHNob3VsZCBiZSBzdXBwb3J0ZWQgZWxzZSB3ZSB3aWxsIGdldCBhbiBlcnJvciAqLworICAgIGZvcm1hdF9wY20uc2FtcGxlc1BlclNlYyAgPSAoU0x1aW50MzIpIHBhcmFtLT5jbG9ja19yYXRlICogMTAwMDsKKyAgICBmb3JtYXRfcGNtLmJpdHNQZXJTYW1wbGUgPSAoU0x1aW50MTYpIHBhcmFtLT5iaXRzX3Blcl9zYW1wbGU7CisgICAgZm9ybWF0X3BjbS5jb250YWluZXJTaXplID0gKFNMdWludDE2KSBwYXJhbS0+Yml0c19wZXJfc2FtcGxlOworICAgIGZvcm1hdF9wY20uY2hhbm5lbE1hc2sgPSBTTF9TUEVBS0VSX0ZST05UX0NFTlRFUjsKKyAgICBmb3JtYXRfcGNtLmVuZGlhbm5lc3MgPSBTTF9CWVRFT1JERVJfTElUVExFRU5ESUFOOworCisgICAgaWYgKHN0cmVhbS0+ZGlyICYgUEpNRURJQV9ESVJfUExBWUJBQ0spIHsKKyAgICAgICAgLyogQXVkaW8gc291cmNlICovCisgICAgICAgIFNMRGF0YVNvdXJjZSBhdWRpb1NyYyA9IHsmbG9jX2JxLCAmZm9ybWF0X3BjbX07CisgICAgICAgIC8qIEF1ZGlvIHNpbmsgKi8KKyAgICAgICAgU0xEYXRhTG9jYXRvcl9PdXRwdXRNaXggbG9jX291dG1peCA9IHtTTF9EQVRBTE9DQVRPUl9PVVRQVVRNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGEtPm91dHB1dE1peE9iamVjdH07CisgICAgICAgIFNMRGF0YVNpbmsgYXVkaW9TbmsgPSB7JmxvY19vdXRtaXgsIE5VTEx9OworICAgICAgICAvKiBBdWRpbyBpbnRlcmZhY2UgKi8KKyNpZmRlZiBfX0FORFJPSURfXworICAgICAgICBpbnQgbnVtSWZhY2UgPSAzOworICAgICAgICBjb25zdCBTTEludGVyZmFjZUlEIGlkc1szXSA9IHtTTF9JSURfQlVGRkVSUVVFVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX0lJRF9WT0xVTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX0lJRF9BTkRST0lEQ09ORklHVVJBVElPTn07CisgICAgICAgIGNvbnN0IFNMYm9vbGVhbiByZXFbM10gPSB7U0xfQk9PTEVBTl9UUlVFLCBTTF9CT09MRUFOX1RSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xfQk9PTEVBTl9UUlVFfTsKKyAgICAgICAgU0xBbmRyb2lkQ29uZmlndXJhdGlvbkl0ZiBwbGF5ZXJDb25maWc7CisgICAgICAgIFNMaW50MzIgc3RyZWFtVHlwZSA9IFNMX0FORFJPSURfU1RSRUFNX1ZPSUNFOworI2Vsc2UKKyAgICAgICAgaW50IG51bUlmYWNlID0gMjsKKyAgICAgICAgY29uc3QgU0xJbnRlcmZhY2VJRCBpZHNbMl0gPSB7U0xfSUlEX0JVRkZFUlFVRVVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTF9JSURfVk9MVU1FfTsKKyAgICAgICAgY29uc3QgU0xib29sZWFuIHJlcVsyXSA9IHtTTF9CT09MRUFOX1RSVUUsIFNMX0JPT0xFQU5fVFJVRX07CisjZW5kaWYKKyAgICAgICAgCisgICAgICAgIC8qIENyZWF0ZSBhdWRpbyBwbGF5ZXIgKi8KKyAgICAgICAgcmVzdWx0ID0gKCpwYS0+ZW5naW5lRW5naW5lKS0+Q3JlYXRlQXVkaW9QbGF5ZXIocGEtPmVuZ2luZUVuZ2luZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbS0+cGxheWVyT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXVkaW9TcmMsICZhdWRpb1NuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtSWZhY2UsIGlkcywgcmVxKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBTTF9SRVNVTFRfU1VDQ0VTUykgeworICAgICAgICAgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICJDYW5ub3QgY3JlYXRlIGF1ZGlvIHBsYXllcjogJWQiLCByZXN1bHQpKTsKKyAgICAgICAgICAgIGdvdG8gb25fZXJyb3I7CisgICAgICAgIH0KKworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgICAgIC8qIFNldCBBbmRyb2lkIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgcmVzdWx0ID0gKCpzdHJlYW0tPnBsYXllck9iaiktPkdldEludGVyZmFjZShzdHJlYW0tPnBsYXllck9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTF9JSURfQU5EUk9JRENPTkZJR1VSQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBsYXllckNvbmZpZyk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gU0xfUkVTVUxUX1NVQ0NFU1MgJiYgcGxheWVyQ29uZmlnKSB7CisgICAgICAgICAgICByZXN1bHQgPSAoKnBsYXllckNvbmZpZyktPlNldENvbmZpZ3VyYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQ29uZmlnLCBTTF9BTkRST0lEX0tFWV9TVFJFQU1fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtVHlwZSwgc2l6ZW9mKFNMaW50MzIpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0ICE9IFNMX1JFU1VMVF9TVUNDRVNTKSB7CisgICAgICAgICAgICBQSl9MT0coNCwgKFRISVNfRklMRSwgIldhcm5pbmc6IFVuYWJsZSB0byBzZXQgYW5kcm9pZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBsYXllciBjb25maWd1cmF0aW9uIikpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAvKiBSZWFsaXplIHRoZSBwbGF5ZXIgKi8KKyAgICAgICAgcmVzdWx0ID0gKCpzdHJlYW0tPnBsYXllck9iaiktPlJlYWxpemUoc3RyZWFtLT5wbGF5ZXJPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX0JPT0xFQU5fRkFMU0UpOworICAgICAgICBpZiAocmVzdWx0ICE9IFNMX1JFU1VMVF9TVUNDRVNTKSB7CisgICAgICAgICAgICBQSl9MT0coMywgKFRISVNfRklMRSwgIkNhbm5vdCByZWFsaXplIHBsYXllciA6ICVkIiwgcmVzdWx0KSk7CisgICAgICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBHZXQgdGhlIHBsYXkgaW50ZXJmYWNlICovCisgICAgICAgIHJlc3VsdCA9ICgqc3RyZWFtLT5wbGF5ZXJPYmopLT5HZXRJbnRlcmZhY2Uoc3RyZWFtLT5wbGF5ZXJPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xfSUlEX1BMQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbS0+cGxheWVyUGxheSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gU0xfUkVTVUxUX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAiQ2Fubm90IGdldCBwbGF5IGludGVyZmFjZSIpKTsKKyAgICAgICAgICAgIGdvdG8gb25fZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qIEdldCB0aGUgYnVmZmVyIHF1ZXVlIGludGVyZmFjZSAqLworICAgICAgICByZXN1bHQgPSAoKnN0cmVhbS0+cGxheWVyT2JqKS0+R2V0SW50ZXJmYWNlKHN0cmVhbS0+cGxheWVyT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX0lJRF9CVUZGRVJRVUVVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtLT5wbGF5ZXJCdWZRKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBTTF9SRVNVTFRfU1VDQ0VTUykgeworICAgICAgICAgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICJDYW5ub3QgZ2V0IGJ1ZmZlciBxdWV1ZSBpbnRlcmZhY2UiKSk7CisgICAgICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBHZXQgdGhlIHZvbHVtZSBpbnRlcmZhY2UgKi8KKyAgICAgICAgcmVzdWx0ID0gKCpzdHJlYW0tPnBsYXllck9iaiktPkdldEludGVyZmFjZShzdHJlYW0tPnBsYXllck9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTF9JSURfVk9MVU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW0tPnBsYXllclZvbCk7CisgICAgICAgIAorICAgICAgICAvKiBSZWdpc3RlciBjYWxsYmFjayBvbiB0aGUgYnVmZmVyIHF1ZXVlICovCisgICAgICAgIHJlc3VsdCA9ICgqc3RyZWFtLT5wbGF5ZXJCdWZRKS0+UmVnaXN0ZXJDYWxsYmFjayhzdHJlYW0tPnBsYXllckJ1ZlEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicVBsYXllckNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW0pOworICAgICAgICBpZiAocmVzdWx0ICE9IFNMX1JFU1VMVF9TVUNDRVNTKSB7CisgICAgICAgICAgICBQSl9MT0coMywgKFRISVNfRklMRSwgIkNhbm5vdCByZWdpc3RlciBwbGF5ZXIgY2FsbGJhY2siKSk7CisgICAgICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzdHJlYW0tPnBsYXllckJ1ZmZlclNpemUgPSBidWZmZXJTaXplOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0JVRkZFUlM7IGkrKykgeworICAgICAgICAgICAgc3RyZWFtLT5wbGF5ZXJCdWZmZXJbaV0gPSAoY2hhciAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9wb29sX2FsbG9jKHN0cmVhbS0+cG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPnBsYXllckJ1ZmZlclNpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0cmVhbS0+ZGlyICYgUEpNRURJQV9ESVJfQ0FQVFVSRSkgeworICAgICAgICAvKiBBdWRpbyBzb3VyY2UgKi8KKyAgICAgICAgU0xEYXRhTG9jYXRvcl9JT0RldmljZSBsb2NfZGV2ID0ge1NMX0RBVEFMT0NBVE9SX0lPREVWSUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xfSU9ERVZJQ0VfQVVESU9JTlBVVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX0RFRkFVTFRERVZJQ0VJRF9BVURJT0lOUFVULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTH07CisgICAgICAgIFNMRGF0YVNvdXJjZSBhdWRpb1NyYyA9IHsmbG9jX2RldiwgTlVMTH07CisgICAgICAgIC8qIEF1ZGlvIHNpbmsgKi8KKyAgICAgICAgU0xEYXRhU2luayBhdWRpb1NuayA9IHsmbG9jX2JxLCAmZm9ybWF0X3BjbX07CisgICAgICAgIC8qIEF1ZGlvIGludGVyZmFjZSAqLworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgICAgIGludCBudW1JZmFjZSA9IDI7CisgICAgICAgIGNvbnN0IFNMSW50ZXJmYWNlSUQgaWRzWzJdID0ge1dfU0xfSUlEX0JVRkZFUlFVRVVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTF9JSURfQU5EUk9JRENPTkZJR1VSQVRJT059OworICAgICAgICBjb25zdCBTTGJvb2xlYW4gcmVxWzJdID0ge1NMX0JPT0xFQU5fVFJVRSwgU0xfQk9PTEVBTl9UUlVFfTsKKyAgICAgICAgU0xBbmRyb2lkQ29uZmlndXJhdGlvbkl0ZiByZWNvcmRlckNvbmZpZzsKKyNlbHNlCisgICAgICAgIGludCBudW1JZmFjZSA9IDE7CisgICAgICAgIGNvbnN0IFNMSW50ZXJmYWNlSUQgaWRzWzFdID0ge1dfU0xfSUlEX0JVRkZFUlFVRVVFfTsKKyAgICAgICAgY29uc3QgU0xib29sZWFuIHJlcVsxXSA9IHtTTF9CT09MRUFOX1RSVUV9OworI2VuZGlmCisgICAgICAgIAorICAgICAgICAvKiBDcmVhdGUgYXVkaW8gcmVjb3JkZXIKKyAgICAgICAgICogKHJlcXVpcmVzIHRoZSBSRUNPUkRfQVVESU8gcGVybWlzc2lvbikKKyAgICAgICAgICovCisgICAgICAgIHJlc3VsdCA9ICgqcGEtPmVuZ2luZUVuZ2luZSktPkNyZWF0ZUF1ZGlvUmVjb3JkZXIocGEtPmVuZ2luZUVuZ2luZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtLT5yZWNvcmRPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1ZGlvU3JjLCAmYXVkaW9TbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtSWZhY2UsIGlkcywgcmVxKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBTTF9SRVNVTFRfU1VDQ0VTUykgeworICAgICAgICAgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICJDYW5ub3QgY3JlYXRlIHJlY29yZGVyOiAlZCIsIHJlc3VsdCkpOworICAgICAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgICAgfQorCisjaWZkZWYgX19BTkRST0lEX18KKyAgICAgICAgLyogU2V0IEFuZHJvaWQgY29uZmlndXJhdGlvbiAqLworICAgICAgICByZXN1bHQgPSAoKnN0cmVhbS0+cmVjb3JkT2JqKS0+R2V0SW50ZXJmYWNlKHN0cmVhbS0+cmVjb3JkT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX0lJRF9BTkRST0lEQ09ORklHVVJBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjb3JkZXJDb25maWcpOworICAgICAgICBpZiAocmVzdWx0ID09IFNMX1JFU1VMVF9TVUNDRVNTKSB7CisgICAgICAgICAgICBTTGludDMyIHN0cmVhbVR5cGUgPSBTTF9BTkRST0lEX1JFQ09SRElOR19QUkVTRVRfR0VORVJJQzsKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMTQKKyAgICAgICAgICAgIGNoYXIgc2RrX3ZlcnNpb25bUFJPUF9WQUxVRV9NQVhdOworICAgICAgICAgICAgcGpfc3RyX3QgcGpfc2RrX3ZlcnNpb247CisgICAgICAgICAgICBpbnQgc2RrX3Y7CisKKyAgICAgICAgICAgIF9fc3lzdGVtX3Byb3BlcnR5X2dldCgicm8uYnVpbGQudmVyc2lvbi5zZGsiLCBzZGtfdmVyc2lvbik7CisgICAgICAgICAgICBwal9zZGtfdmVyc2lvbiA9IHBqX3N0cihzZGtfdmVyc2lvbik7CisgICAgICAgICAgICBzZGtfdiA9IHBqX3N0cnRvdWwoJnBqX3Nka192ZXJzaW9uKTsKKyAgICAgICAgICAgIGlmIChzZGtfdiA+PSAxNCkKKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gU0xfQU5EUk9JRF9SRUNPUkRJTkdfUFJFU0VUX1ZPSUNFX0NPTU1VTklDQVRJT047CisgICAgICAgICAgICBQSl9MT0coNCwgKFRISVNfRklMRSwgIlJlY29yZGluZyBzdHJlYW0gdHlwZSAlZCwgU0RLIDogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIHNka192KSk7CisjZW5kaWYKKyAgICAgICAgICAgIHJlc3VsdCA9ICgqcmVjb3JkZXJDb25maWcpLT5TZXRDb25maWd1cmF0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZGVyQ29uZmlnLCBTTF9BTkRST0lEX0tFWV9SRUNPUkRJTkdfUFJFU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW1UeXBlLCBzaXplb2YoU0xpbnQzMikpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQgIT0gU0xfUkVTVUxUX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIFBKX0xPRyg0LCAoVEhJU19GSUxFLCAiV2FybmluZzogVW5hYmxlIHRvIHNldCBhbmRyb2lkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVjb3JkZXIgY29uZmlndXJhdGlvbiIpKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIAorICAgICAgICAvKiBSZWFsaXplIHRoZSByZWNvcmRlciAqLworICAgICAgICByZXN1bHQgPSAoKnN0cmVhbS0+cmVjb3JkT2JqKS0+UmVhbGl6ZShzdHJlYW0tPnJlY29yZE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xfQk9PTEVBTl9GQUxTRSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gU0xfUkVTVUxUX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAiQ2Fubm90IHJlYWxpemUgcmVjb3JkZXIgOiAlZCIsIHJlc3VsdCkpOworICAgICAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyogR2V0IHRoZSByZWNvcmQgaW50ZXJmYWNlICovCisgICAgICAgIHJlc3VsdCA9ICgqc3RyZWFtLT5yZWNvcmRPYmopLT5HZXRJbnRlcmZhY2Uoc3RyZWFtLT5yZWNvcmRPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xfSUlEX1JFQ09SRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtLT5yZWNvcmRSZWNvcmQpOworICAgICAgICBpZiAocmVzdWx0ICE9IFNMX1JFU1VMVF9TVUNDRVNTKSB7CisgICAgICAgICAgICBQSl9MT0coMywgKFRISVNfRklMRSwgIkNhbm5vdCBnZXQgcmVjb3JkIGludGVyZmFjZSIpKTsKKyAgICAgICAgICAgIGdvdG8gb25fZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qIEdldCB0aGUgYnVmZmVyIHF1ZXVlIGludGVyZmFjZSAqLworICAgICAgICByZXN1bHQgPSAoKnN0cmVhbS0+cmVjb3JkT2JqKS0+R2V0SW50ZXJmYWNlKAorICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5yZWNvcmRPYmosIFdfU0xfSUlEX0JVRkZFUlFVRVVFLAorICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbS0+cmVjb3JkQnVmUSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gU0xfUkVTVUxUX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAiQ2Fubm90IGdldCByZWNvcmRlciBidWZmZXIgcXVldWUgaWZhY2UiKSk7CisgICAgICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBSZWdpc3RlciBjYWxsYmFjayBvbiB0aGUgYnVmZmVyIHF1ZXVlICovCisgICAgICAgIHJlc3VsdCA9ICgqc3RyZWFtLT5yZWNvcmRCdWZRKS0+UmVnaXN0ZXJDYWxsYmFjayhzdHJlYW0tPnJlY29yZEJ1ZlEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicVJlY29yZGVyQ2FsbGJhY2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgc3RyZWFtKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBTTF9SRVNVTFRfU1VDQ0VTUykgeworICAgICAgICAgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICJDYW5ub3QgcmVnaXN0ZXIgcmVjb3JkZXIgY2FsbGJhY2siKSk7CisgICAgICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzdHJlYW0tPnJlY29yZEJ1ZmZlclNpemUgPSBidWZmZXJTaXplOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0JVRkZFUlM7IGkrKykgeworICAgICAgICAgICAgc3RyZWFtLT5yZWNvcmRCdWZmZXJbaV0gPSAoY2hhciAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9wb29sX2FsbG9jKHN0cmVhbS0+cG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPnJlY29yZEJ1ZmZlclNpemUpOworICAgICAgICB9CisKKyAgICB9CisgICAgCisgICAgaWYgKHBhcmFtLT5mbGFncyAmIFBKTUVESUFfQVVEX0RFVl9DQVBfT1VUUFVUX1ZPTFVNRV9TRVRUSU5HKSB7CisJc3RybV9zZXRfY2FwKCZzdHJlYW0tPmJhc2UsIFBKTUVESUFfQVVEX0RFVl9DQVBfT1VUUFVUX1ZPTFVNRV9TRVRUSU5HLAorICAgICAgICAgICAgICAgICAgICAgJnBhcmFtLT5vdXRwdXRfdm9sKTsKKyAgICB9CisgICAgCisgICAgLyogRG9uZSAqLworICAgIHN0cmVhbS0+YmFzZS5vcCA9ICZvcGVuc2xfc3RybV9vcDsKKyAgICAqcF9hdWRfc3RybSA9ICZzdHJlYW0tPmJhc2U7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgCitvbl9lcnJvcjoKKyAgICBzdHJtX2Rlc3Ryb3koJnN0cmVhbS0+YmFzZSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogQVBJOiBHZXQgc3RyZWFtIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBzdHJtX2dldF9wYXJhbShwam1lZGlhX2F1ZF9zdHJlYW0gKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV9hdWRfcGFyYW0gKnBpKQoreworICAgIHN0cnVjdCBvcGVuc2xfYXVkX3N0cmVhbSAqc3RybSA9IChzdHJ1Y3Qgb3BlbnNsX2F1ZF9zdHJlYW0qKXM7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdHJtICYmIHBpLCBQSl9FSU5WQUwpOworICAgIHBqX21lbWNweShwaSwgJnN0cm0tPnBhcmFtLCBzaXplb2YoKnBpKSk7CisKKyAgICBpZiAoc3RybV9nZXRfY2FwKHMsIFBKTUVESUFfQVVEX0RFVl9DQVBfT1VUUFVUX1ZPTFVNRV9TRVRUSU5HLAorICAgICAgICAgICAgICAgICAgICAgJnBpLT5vdXRwdXRfdm9sKSA9PSBQSl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcGktPmZsYWdzIHw9IFBKTUVESUFfQVVEX0RFVl9DQVBfT1VUUFVUX1ZPTFVNRV9TRVRUSU5HOworICAgIH0gICAgCisgICAgCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIEFQSTogZ2V0IGNhcGFiaWxpdHkgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBzdHJtX2dldF9jYXAocGptZWRpYV9hdWRfc3RyZWFtICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwam1lZGlhX2F1ZF9kZXZfY2FwIGNhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcHZhbCkKK3sKKyAgICBzdHJ1Y3Qgb3BlbnNsX2F1ZF9zdHJlYW0gKnN0cm0gPSAoc3RydWN0IG9wZW5zbF9hdWRfc3RyZWFtKilzOyAgICAKKyAgICBwal9zdGF0dXNfdCBzdGF0dXMgPSBQSk1FRElBX0VBVURfSU5WQ0FQOworICAgIAorICAgIFBKX0FTU0VSVF9SRVRVUk4ocyAmJiBwdmFsLCBQSl9FSU5WQUwpOworICAgIAorICAgIGlmIChjYXA9PVBKTUVESUFfQVVEX0RFVl9DQVBfT1VUUFVUX1ZPTFVNRV9TRVRUSU5HICYmCisJKHN0cm0tPnBhcmFtLmRpciAmIFBKTUVESUFfRElSX1BMQVlCQUNLKSkKKyAgICB7CisgICAgICAgIGlmIChzdHJtLT5wbGF5ZXJWb2wpIHsKKyAgICAgICAgICAgIFNMcmVzdWx0IHJlczsKKyAgICAgICAgICAgIFNMbWlsbGliZWwgdm9sLCBtdm9sOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXMgPSAoKnN0cm0tPnBsYXllclZvbCktPkdldE1heFZvbHVtZUxldmVsKHN0cm0tPnBsYXllclZvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm12b2wpOworICAgICAgICAgICAgaWYgKHJlcyA9PSBTTF9SRVNVTFRfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIHJlcyA9ICgqc3RybS0+cGxheWVyVm9sKS0+R2V0Vm9sdW1lTGV2ZWwoc3RybS0+cGxheWVyVm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvbCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBTTF9SRVNVTFRfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAqKGludCAqKXB2YWwgPSAoKGludCl2b2wgLSBTTF9NSUxMSUJFTF9NSU4pICogMTAwIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQpbXZvbCAtIFNMX01JTExJQkVMX01JTik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQSl9TVUNDRVNTOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBBUEk6IHNldCBjYXBhYmlsaXR5ICovCitzdGF0aWMgcGpfc3RhdHVzX3Qgc3RybV9zZXRfY2FwKHBqbWVkaWFfYXVkX3N0cmVhbSAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV9hdWRfZGV2X2NhcCBjYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnZhbHVlKQoreworICAgIHN0cnVjdCBvcGVuc2xfYXVkX3N0cmVhbSAqc3RybSA9IChzdHJ1Y3Qgb3BlbnNsX2F1ZF9zdHJlYW0qKXM7CisgICAgCisgICAgUEpfQVNTRVJUX1JFVFVSTihzICYmIHZhbHVlLCBQSl9FSU5WQUwpOworCisgICAgaWYgKGNhcD09UEpNRURJQV9BVURfREVWX0NBUF9PVVRQVVRfVk9MVU1FX1NFVFRJTkcgJiYKKwkoc3RybS0+cGFyYW0uZGlyICYgUEpNRURJQV9ESVJfUExBWUJBQ0spKQorICAgIHsKKyAgICAgICAgaWYgKHN0cm0tPnBsYXllclZvbCkgeworICAgICAgICAgICAgU0xyZXN1bHQgcmVzOworICAgICAgICAgICAgU0xtaWxsaWJlbCB2b2wsIG12b2w7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJlcyA9ICgqc3RybS0+cGxheWVyVm9sKS0+R2V0TWF4Vm9sdW1lTGV2ZWwoc3RybS0+cGxheWVyVm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXZvbCk7CisgICAgICAgICAgICBpZiAocmVzID09IFNMX1JFU1VMVF9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgdm9sID0gKFNMbWlsbGliZWwpKCooaW50ICopdmFsdWUgKgorICAgICAgICAgICAgICAgICAgICAgICgoaW50KW12b2wgLSBTTF9NSUxMSUJFTF9NSU4pIC8gMTAwICsgU0xfTUlMTElCRUxfTUlOKTsKKyAgICAgICAgICAgICAgICByZXMgPSAoKnN0cm0tPnBsYXllclZvbCktPlNldFZvbHVtZUxldmVsKHN0cm0tPnBsYXllclZvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBTTF9SRVNVTFRfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gUEpNRURJQV9FQVVEX0lOVkNBUDsKK30KKworLyogQVBJOiBzdGFydCBzdHJlYW0uICovCitzdGF0aWMgcGpfc3RhdHVzX3Qgc3RybV9zdGFydChwam1lZGlhX2F1ZF9zdHJlYW0gKnMpCit7CisgICAgc3RydWN0IG9wZW5zbF9hdWRfc3RyZWFtICpzdHJlYW0gPSAoc3RydWN0IG9wZW5zbF9hdWRfc3RyZWFtKilzOworICAgIGludCBpOworICAgIFNMcmVzdWx0IHJlc3VsdCA9IFNMX1JFU1VMVF9TVUNDRVNTOworICAgIAorICAgIFBKX0xPRyg0LCAoVEhJU19GSUxFLCAiU3RhcnRpbmcgJXMgc3RyZWFtLi4iLCBzdHJlYW0tPm5hbWUucHRyKSk7CisgICAgc3RyZWFtLT5xdWl0X2ZsYWcgPSAwOworCisgICAgaWYgKHN0cmVhbS0+cmVjb3JkQnVmUSAmJiBzdHJlYW0tPnJlY29yZFJlY29yZCkgeworICAgICAgICAvKiBFbnF1ZXVlIGFuIGVtcHR5IGJ1ZmZlciB0byBiZSBmaWxsZWQgYnkgdGhlIHJlY29yZGVyCisgICAgICAgICAqIChmb3Igc3RyZWFtaW5nIHJlY29yZGluZywgd2UgbmVlZCB0byBlbnF1ZXVlIGF0IGxlYXN0IDIgZW1wdHkKKyAgICAgICAgICogYnVmZmVycyB0byBzdGFydCB0aGluZ3Mgb2ZmKQorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9CVUZGRVJTOyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdCA9ICgqc3RyZWFtLT5yZWNvcmRCdWZRKS0+RW5xdWV1ZShzdHJlYW0tPnJlY29yZEJ1ZlEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPnJlY29yZEJ1ZmZlcltpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+cmVjb3JkQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAvKiBUaGUgbW9zdCBsaWtlbHkgb3RoZXIgcmVzdWx0IGlzIFNMX1JFU1VMVF9CVUZGRVJfSU5TVUZGSUNJRU5ULAorICAgICAgICAgICAgICogd2hpY2ggZm9yIHRoaXMgY29kZSB3b3VsZCBpbmRpY2F0ZSBhIHByb2dyYW1taW5nIGVycm9yCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBqX2Fzc2VydChyZXN1bHQgPT0gU0xfUkVTVUxUX1NVQ0NFU1MpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXN1bHQgPSAoKnN0cmVhbS0+cmVjb3JkUmVjb3JkKS0+U2V0UmVjb3JkU3RhdGUoCisgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPnJlY29yZFJlY29yZCwgU0xfUkVDT1JEU1RBVEVfUkVDT1JESU5HKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBTTF9SRVNVTFRfU1VDQ0VTUykgeworICAgICAgICAgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICJDYW5ub3Qgc3RhcnQgcmVjb3JkZXIiKSk7CisgICAgICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGlmIChzdHJlYW0tPnBsYXllclBsYXkgJiYgc3RyZWFtLT5wbGF5ZXJCdWZRKSB7CisgICAgICAgIC8qIFNldCB0aGUgcGxheWVyJ3Mgc3RhdGUgdG8gcGxheWluZyAqLworICAgICAgICByZXN1bHQgPSAoKnN0cmVhbS0+cGxheWVyUGxheSktPlNldFBsYXlTdGF0ZShzdHJlYW0tPnBsYXllclBsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX1BMQVlTVEFURV9QTEFZSU5HKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBTTF9SRVNVTFRfU1VDQ0VTUykgeworICAgICAgICAgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICJDYW5ub3Qgc3RhcnQgcGxheWVyIikpOworICAgICAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9CVUZGRVJTOyBpKyspIHsKKyAgICAgICAgICAgIHBqX2J6ZXJvKHN0cmVhbS0+cGxheWVyQnVmZmVyW2ldLCBzdHJlYW0tPnBsYXllckJ1ZmZlclNpemUvMTAwKTsKKyAgICAgICAgICAgIHJlc3VsdCA9ICgqc3RyZWFtLT5wbGF5ZXJCdWZRKS0+RW5xdWV1ZShzdHJlYW0tPnBsYXllckJ1ZlEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPnBsYXllckJ1ZmZlcltpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+cGxheWVyQnVmZmVyU2l6ZS8xMDApOworICAgICAgICAgICAgcGpfYXNzZXJ0KHJlc3VsdCA9PSBTTF9SRVNVTFRfU1VDQ0VTUyk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgUEpfTE9HKDQsIChUSElTX0ZJTEUsICIlcyBzdHJlYW0gc3RhcnRlZCIsIHN0cmVhbS0+bmFtZS5wdHIpKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICAKK29uX2Vycm9yOgorICAgIGlmIChyZXN1bHQgIT0gU0xfUkVTVUxUX1NVQ0NFU1MpCisgICAgICAgIHN0cm1fc3RvcCgmc3RyZWFtLT5iYXNlKTsKKyAgICByZXR1cm4gb3BlbnNsX3RvX3BqX2Vycm9yKHJlc3VsdCk7Cit9CisKKy8qIEFQSTogc3RvcCBzdHJlYW0uICovCitzdGF0aWMgcGpfc3RhdHVzX3Qgc3RybV9zdG9wKHBqbWVkaWFfYXVkX3N0cmVhbSAqcykKK3sKKyAgICBzdHJ1Y3Qgb3BlbnNsX2F1ZF9zdHJlYW0gKnN0cmVhbSA9IChzdHJ1Y3Qgb3BlbnNsX2F1ZF9zdHJlYW0qKXM7CisgICAgCisgICAgaWYgKHN0cmVhbS0+cXVpdF9mbGFnKQorICAgICAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICAKKyAgICBQSl9MT0coNCwgKFRISVNfRklMRSwgIlN0b3BwaW5nIHN0cmVhbSIpKTsKKyAgICAKKyAgICBzdHJlYW0tPnF1aXRfZmxhZyA9IDE7ICAgIAorICAgIAorICAgIGlmIChzdHJlYW0tPnJlY29yZEJ1ZlEgJiYgc3RyZWFtLT5yZWNvcmRSZWNvcmQpIHsKKyAgICAgICAgLyogU3RvcCByZWNvcmRpbmcgYW5kIGNsZWFyIGJ1ZmZlciBxdWV1ZSAqLworICAgICAgICAoKnN0cmVhbS0+cmVjb3JkUmVjb3JkKS0+U2V0UmVjb3JkU3RhdGUoc3RyZWFtLT5yZWNvcmRSZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX1JFQ09SRFNUQVRFX1NUT1BQRUQpOworICAgICAgICAoKnN0cmVhbS0+cmVjb3JkQnVmUSktPkNsZWFyKHN0cmVhbS0+cmVjb3JkQnVmUSk7CisgICAgfQorCisgICAgaWYgKHN0cmVhbS0+cGxheWVyQnVmUSAmJiBzdHJlYW0tPnBsYXllclBsYXkpIHsKKyAgICAgICAgLyogV2FpdCB1bnRpbCB0aGUgUENNIGRhdGEgaXMgZG9uZSBwbGF5aW5nLCB0aGUgYnVmZmVyIHF1ZXVlIGNhbGxiYWNrCisgICAgICAgICAqIHdpbGwgY29udGludWUgdG8gcXVldWUgYnVmZmVycyB1bnRpbCB0aGUgZW50aXJlIFBDTSBkYXRhIGhhcyBiZWVuCisgICAgICAgICAqIHBsYXllZC4gVGhpcyBpcyBpbmRpY2F0ZWQgYnkgd2FpdGluZyBmb3IgdGhlIGNvdW50IG1lbWJlciBvZiB0aGUKKyAgICAgICAgICogU0xCdWZmZXJRdWV1ZVN0YXRlIHRvIGdvIHRvIHplcm8uCisgICAgICAgICAqLworLyogICAgICAKKyAgICAgICAgU0xyZXN1bHQgcmVzdWx0OworICAgICAgICBXX1NMQnVmZmVyUXVldWVTdGF0ZSBzdGF0ZTsKKworICAgICAgICByZXN1bHQgPSAoKnN0cmVhbS0+cGxheWVyQnVmUSktPkdldFN0YXRlKHN0cmVhbS0+cGxheWVyQnVmUSwgJnN0YXRlKTsKKyAgICAgICAgd2hpbGUgKHN0YXRlLmNvdW50KSB7CisgICAgICAgICAgICAoKnN0cmVhbS0+cGxheWVyQnVmUSktPkdldFN0YXRlKHN0cmVhbS0+cGxheWVyQnVmUSwgJnN0YXRlKTsKKyAgICAgICAgfSAqLworICAgICAgICAvKiBTdG9wIHBsYXllciAqLworICAgICAgICAoKnN0cmVhbS0+cGxheWVyUGxheSktPlNldFBsYXlTdGF0ZShzdHJlYW0tPnBsYXllclBsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX1BMQVlTVEFURV9TVE9QUEVEKTsKKyAgICB9CisKKyAgICBQSl9MT0coNCwoVEhJU19GSUxFLCAiT3BlblNMIHN0cmVhbSBzdG9wcGVkIikpOworICAgIAorICAgIHJldHVybiBQSl9TVUNDRVNTOworICAgIAorfQorCisvKiBBUEk6IGRlc3Ryb3kgc3RyZWFtLiAqLworc3RhdGljIHBqX3N0YXR1c190IHN0cm1fZGVzdHJveShwam1lZGlhX2F1ZF9zdHJlYW0gKnMpCit7ICAgIAorICAgIHN0cnVjdCBvcGVuc2xfYXVkX3N0cmVhbSAqc3RyZWFtID0gKHN0cnVjdCBvcGVuc2xfYXVkX3N0cmVhbSopczsKKyAgICAKKyAgICAvKiBTdG9wIHRoZSBzdHJlYW0gKi8KKyAgICBzdHJtX3N0b3Aocyk7CisgICAgCisgICAgaWYgKHN0cmVhbS0+cGxheWVyT2JqKSB7CisgICAgICAgIC8qIERlc3Ryb3kgdGhlIHBsYXllciAqLworICAgICAgICAoKnN0cmVhbS0+cGxheWVyT2JqKS0+RGVzdHJveShzdHJlYW0tPnBsYXllck9iaik7CisgICAgICAgIC8qIEludmFsaWRhdGUgYWxsIGFzc29jaWF0ZWQgaW50ZXJmYWNlcyAqLworICAgICAgICBzdHJlYW0tPnBsYXllck9iaiA9IE5VTEw7CisgICAgICAgIHN0cmVhbS0+cGxheWVyUGxheSA9IE5VTEw7CisgICAgICAgIHN0cmVhbS0+cGxheWVyQnVmUSA9IE5VTEw7CisgICAgICAgIHN0cmVhbS0+cGxheWVyVm9sID0gTlVMTDsKKyAgICB9CisgICAgCisgICAgaWYgKHN0cmVhbS0+cmVjb3JkT2JqKSB7CisgICAgICAgIC8qIERlc3Ryb3kgdGhlIHJlY29yZGVyICovCisgICAgICAgICgqc3RyZWFtLT5yZWNvcmRPYmopLT5EZXN0cm95KHN0cmVhbS0+cmVjb3JkT2JqKTsKKyAgICAgICAgLyogSW52YWxpZGF0ZSBhbGwgYXNzb2NpYXRlZCBpbnRlcmZhY2VzICovCisgICAgICAgIHN0cmVhbS0+cmVjb3JkT2JqID0gTlVMTDsKKyAgICAgICAgc3RyZWFtLT5yZWNvcmRSZWNvcmQgPSBOVUxMOworICAgICAgICBzdHJlYW0tPnJlY29yZEJ1ZlEgPSBOVUxMOworICAgIH0KKyAgICAKKyAgICBwal9wb29sX3JlbGVhc2Uoc3RyZWFtLT5wb29sKTsKKyAgICBQSl9MT0coNCwgKFRISVNfRklMRSwgIk9wZW5TTCBzdHJlYW0gZGVzdHJveWVkIikpOworICAgIAorICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisjZW5kaWYJLyogUEpNRURJQV9BVURJT19ERVZfSEFTX09QRU5TTCAqLwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvZjgvZjhkMDQwMmVjNWVmYTcyYWY0M2Y0MzAwYWMzZjE0YzJkMzkyOTNhYS5zdm4tYmFzZSBiL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lL2Y4L2Y4ZDA0MDJlYzVlZmE3MmFmNDNmNDMwMGFjM2YxNGMyZDM5MjkzYWEuc3ZuLWJhc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU1ZjMxNwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lL2Y4L2Y4ZDA0MDJlYzVlZmE3MmFmNDNmNDMwMGFjM2YxNGMyZDM5MjkzYWEuc3ZuLWJhc2UKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uLy4uL3BvcnRhdWRpby9zcmMvY29tbW9uL3BhX2RlYnVncHJpbnQuaCIKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lL2Y4L2Y4ZDVjODk2NWNhZjU5ODhhMTkwMDdkYTA3YzBlZTVmNmIyYWVmODIuc3ZuLWJhc2UgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS9mOC9mOGQ1Yzg5NjVjYWY1OTg4YTE5MDA3ZGEwN2MwZWU1ZjZiMmFlZjgyLnN2bi1iYXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNDgyYWYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS9mOC9mOGQ1Yzg5NjVjYWY1OTg4YTE5MDA3ZGEwN2MwZWU1ZjZiMmFlZjgyLnN2bi1iYXNlCkBAIC0wLDAgKzEsOTIgQEAKK0VYUE9SVFMKKwlwal9jaXNfYWRkX2FscGhhICAgICAgICAgICAgICAgICAgICAgICAgIEAgMSBOT05BTUUKKwlwal9jaXNfYWRkX2NpcyAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgMiBOT05BTUUKKwlwal9jaXNfYWRkX251bSAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgMyBOT05BTUUKKwlwal9jaXNfYWRkX3JhbmdlICAgICAgICAgICAgICAgICAgICAgICAgIEAgNCBOT05BTUUKKwlwal9jaXNfYWRkX3N0ciAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNSBOT05BTUUKKwlwal9jaXNfYnVmX2luaXQgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNiBOT05BTUUKKwlwal9jaXNfZGVsX3JhbmdlICAgICAgICAgICAgICAgICAgICAgICAgIEAgNyBOT05BTUUKKwlwal9jaXNfZGVsX3N0ciAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgOCBOT05BTUUKKwlwal9jaXNfZHVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgOSBOT05BTUUKKwlwal9jaXNfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgMTAgTk9OQU1FCisJcGpfY2lzX2ludmVydCAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIDExIE5PTkFNRQorCXBqX2NyYzMyX2NhbGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAxMiBOT05BTUUKKwlwal9jcmMzMl9maW5hbCAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgMTMgTk9OQU1FCisJcGpfY3JjMzJfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIDE0IE5PTkFNRQorCXBqX2NyYzMyX3VwZGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgQCAxNSBOT05BTUUKKwlwal9kbnNfZHVtcF9wYWNrZXQgICAgICAgICAgICAgICAgICAgICAgIEAgMTYgTk9OQU1FCisJcGpfZG5zX2dldF90eXBlX25hbWUgICAgICAgICAgICAgICAgICAgICBAIDE3IE5PTkFNRQorCXBqX2Ruc19tYWtlX3F1ZXJ5ICAgICAgICAgICAgICAgICAgICAgICAgQCAxOCBOT05BTUUKKwlwal9kbnNfcGFja2V0X2R1cCAgICAgICAgICAgICAgICAgICAgICAgIEAgMTkgTk9OQU1FCisJcGpfZG5zX3BhcnNlX2FfcmVzcG9uc2UgICAgICAgICAgICAgICAgICBAIDIwIE5PTkFNRQorCXBqX2Ruc19wYXJzZV9wYWNrZXQgICAgICAgICAgICAgICAgICAgICAgQCAyMSBOT05BTUUKKwlwal9kbnNfcmVzb2x2ZXJfYWRkX2VudHJ5ICAgICAgICAgICAgICAgIEAgMjIgTk9OQU1FCisJcGpfZG5zX3Jlc29sdmVyX2NhbmNlbF9xdWVyeSAgICAgICAgICAgICBAIDIzIE5PTkFNRQorCXBqX2Ruc19yZXNvbHZlcl9jcmVhdGUgICAgICAgICAgICAgICAgICAgQCAyNCBOT05BTUUKKwlwal9kbnNfcmVzb2x2ZXJfZGVzdHJveSAgICAgICAgICAgICAgICAgIEAgMjUgTk9OQU1FCisJcGpfZG5zX3Jlc29sdmVyX2R1bXAgICAgICAgICAgICAgICAgICAgICBAIDI2IE5PTkFNRQorCXBqX2Ruc19yZXNvbHZlcl9nZXRfY2FjaGVkX2NvdW50ICAgICAgICAgQCAyNyBOT05BTUUKKwlwal9kbnNfcmVzb2x2ZXJfZ2V0X3NldHRpbmdzICAgICAgICAgICAgIEAgMjggTk9OQU1FCisJcGpfZG5zX3Jlc29sdmVyX2hhbmRsZV9ldmVudHMgICAgICAgICAgICBAIDI5IE5PTkFNRQorCXBqX2Ruc19yZXNvbHZlcl9zZXRfbnMgICAgICAgICAgICAgICAgICAgQCAzMCBOT05BTUUKKwlwal9kbnNfcmVzb2x2ZXJfc2V0X3NldHRpbmdzICAgICAgICAgICAgIEAgMzEgTk9OQU1FCisJcGpfZG5zX3Jlc29sdmVyX3N0YXJ0X3F1ZXJ5ICAgICAgICAgICAgICBAIDMyIE5PTkFNRQorCXBqX2Ruc19zZXR0aW5nc19kZWZhdWx0ICAgICAgICAgICAgICAgICAgQCAzMyBOT05BTUUKKwlwal9kbnNfc3J2X3Jlc29sdmUgICAgICAgICAgICAgICAgICAgICAgIEAgMzQgTk9OQU1FCisJcGpfaG1hY19tZDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIDM1IE5PTkFNRQorCXBqX2htYWNfbWQ1X2ZpbmFsICAgICAgICAgICAgICAgICAgICAgICAgQCAzNiBOT05BTUUKKwlwal9obWFjX21kNV9pbml0ICAgICAgICAgICAgICAgICAgICAgICAgIEAgMzcgTk9OQU1FCisJcGpfaG1hY19tZDVfdXBkYXRlICAgICAgICAgICAgICAgICAgICAgICBAIDM4IE5PTkFNRQorCXBqX2htYWNfc2hhMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAzOSBOT05BTUUKKwlwal9obWFjX3NoYTFfZmluYWwgICAgICAgICAgICAgICAgICAgICAgIEAgNDAgTk9OQU1FCisJcGpfaG1hY19zaGExX2luaXQgICAgICAgICAgICAgICAgICAgICAgICBAIDQxIE5PTkFNRQorCXBqX2htYWNfc2hhMV91cGRhdGUgICAgICAgICAgICAgICAgICAgICAgQCA0MiBOT05BTUUKKwlwal9tZDVfZmluYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNDMgTk9OQU1FCisJcGpfbWQ1X2luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIDQ0IE5PTkFNRQorCXBqX21kNV91cGRhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCA0NSBOT05BTUUKKwlwal9zY2FuX2FkdmFuY2VfbiAgICAgICAgICAgICAgICAgICAgICAgIEAgNDYgTk9OQU1FCisJcGpfc2Nhbl9maW5pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIDQ3IE5PTkFNRQorCXBqX3NjYW5fZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCA0OCBOT05BTUUKKwlwal9zY2FuX2dldF9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgIEAgNDkgTk9OQU1FCisJcGpfc2Nhbl9nZXRfbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIDUwIE5PTkFNRQorCXBqX3NjYW5fZ2V0X25ld2xpbmUgICAgICAgICAgICAgICAgICAgICAgQCA1MSBOT05BTUUKKwlwal9zY2FuX2dldF9xdW90ZSAgICAgICAgICAgICAgICAgICAgICAgIEAgNTIgTk9OQU1FCisJcGpfc2Nhbl9nZXRfcXVvdGVzICAgICAgICAgICAgICAgICAgICAgICBAIDUzIE5PTkFNRQorCXBqX3NjYW5fZ2V0X3VuZXNjYXBlICAgICAgICAgICAgICAgICAgICAgQCA1NCBOT05BTUUKKwlwal9zY2FuX2dldF91bnRpbCAgICAgICAgICAgICAgICAgICAgICAgIEAgNTUgTk9OQU1FCisJcGpfc2Nhbl9nZXRfdW50aWxfY2ggICAgICAgICAgICAgICAgICAgICBAIDU2IE5PTkFNRQorCXBqX3NjYW5fZ2V0X3VudGlsX2NociAgICAgICAgICAgICAgICAgICAgQCA1NyBOT05BTUUKKwlwal9zY2FuX2luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNTggTk9OQU1FCisJcGpfc2Nhbl9wZWVrICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIDU5IE5PTkFNRQorCXBqX3NjYW5fcGVla19uICAgICAgICAgICAgICAgICAgICAgICAgICAgQCA2MCBOT05BTUUKKwlwal9zY2FuX3BlZWtfdW50aWwgICAgICAgICAgICAgICAgICAgICAgIEAgNjEgTk9OQU1FCisJcGpfc2Nhbl9yZXN0b3JlX3N0YXRlICAgICAgICAgICAgICAgICAgICBAIDYyIE5PTkFNRQorCXBqX3NjYW5fc2F2ZV9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgQCA2MyBOT05BTUUKKwlwal9zY2FuX3NraXBfbGluZSAgICAgICAgICAgICAgICAgICAgICAgIEAgNjQgTk9OQU1FCisJcGpfc2Nhbl9za2lwX3doaXRlc3BhY2UgICAgICAgICAgICAgICAgICBAIDY1IE5PTkFNRQorCXBqX3NjYW5fc3RyY21wICAgICAgICAgICAgICAgICAgICAgICAgICAgQCA2NiBOT05BTUUKKwlwal9zY2FuX3N0cmljbXAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNjcgTk9OQU1FCisJcGpfc2Nhbl9zdHJpY21wX2FsbnVtICAgICAgICAgICAgICAgICAgICBAIDY4IE5PTkFNRQorCXBqX3NoYTFfZmluYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCA2OSBOT05BTUUKKwlwal9zaGExX2luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNzAgTk9OQU1FCisJcGpfc2hhMV91cGRhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICBAIDcxIE5PTkFNRQorCXBqX3N0cl91bmVzY2FwZSAgICAgICAgICAgICAgICAgICAgICAgICAgQCA3MiBOT05BTUUKKwlwal9zdHJjcHlfdW5lc2NhcGUgICAgICAgICAgICAgICAgICAgICAgIEAgNzMgTk9OQU1FCisJcGpfc3RybmNweTJfZXNjYXBlICAgICAgICAgICAgICAgICAgICAgICBAIDc0IE5PTkFNRQorCXBqX3N0cm5jcHlfZXNjYXBlICAgICAgICAgICAgICAgICAgICAgICAgQCA3NSBOT05BTUUKKwlwal94bWxfYWRkX2F0dHIgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNzYgTk9OQU1FCisJcGpfeG1sX2FkZF9ub2RlICAgICAgICAgICAgICAgICAgICAgICAgICBAIDc3IE5PTkFNRQorCXBqX3htbF9hdHRyX25ldyAgICAgICAgICAgICAgICAgICAgICAgICAgQCA3OCBOT05BTUUKKwlwal94bWxfY2xvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNzkgTk9OQU1FCisJcGpfeG1sX2ZpbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIDgwIE5PTkFNRQorCXBqX3htbF9maW5kX2F0dHIgICAgICAgICAgICAgICAgICAgICAgICAgQCA4MSBOT05BTUUKKwlwal94bWxfZmluZF9uZXh0X25vZGUgICAgICAgICAgICAgICAgICAgIEAgODIgTk9OQU1FCisJcGpfeG1sX2ZpbmRfbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICBAIDgzIE5PTkFNRQorCXBqX3htbF9ub2RlX25ldyAgICAgICAgICAgICAgICAgICAgICAgICAgQCA4NCBOT05BTUUKKwlwal94bWxfcGFyc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgODUgTk9OQU1FCisJcGpfeG1sX3ByaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIDg2IE5PTkFNRQorCXBqbGliX3V0aWxfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgQCA4NyBOT05BTUUKKwlwanN0dW5fY3JlYXRlX2JpbmRfcmVxICAgICAgICAgICAgICAgICAgIEAgODggTk9OQU1FCisJcGpzdHVuX2dldF9tYXBwZWRfYWRkciAgICAgICAgICAgICAgICAgICBAIDg5IE5PTkFNRQorCXBqc3R1bl9tc2dfZmluZF9hdHRyICAgICAgICAgICAgICAgICAgICAgQCA5MCBOT05BTUUKKwlwanN0dW5fcGFyc2VfbXNnICAgICAgICAgICAgICAgICAgICAgICAgIEAgOTEgTk9OQU1FCg==