ZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk0NDIxMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTI0IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworIyBNdXNpYyBidW5kbGUKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmMgXAorICAgIFN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0NvbnRyb2wuYyBcCisgICAgU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmMgXAorICAgIFN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0luaXQuYyBcCisgICAgU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jIFwKKyAgICBTdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuYyBcCisgICAgU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuYyBcCisgICAgU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMgXAorICAgIEJhc3Mvc3JjL0xWREJFX0NvbnRyb2wuYyBcCisgICAgQmFzcy9zcmMvTFZEQkVfSW5pdC5jIFwKKyAgICBCYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMgXAorICAgIEJhc3Mvc3JjL0xWREJFX1RhYmxlcy5jIFwKKyAgICBCdW5kbGUvc3JjL0xWTV9BUElfU3BlY2lhbHMuYyBcCisgICAgQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jIFwKKyAgICBCdW5kbGUvc3JjL0xWTV9Jbml0LmMgXAorICAgIEJ1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYyBcCisgICAgQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMgXAorICAgIEJ1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYyBcCisgICAgU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jIFwKKyAgICBTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Jbml0LmMgXAorICAgIFNwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jIFwKKyAgICBTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmMgXAorICAgIFNwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Jbml0LmMgXAorICAgIFNwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Qcm9jZXNzLmMgXAorICAgIFNwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jIFwKKyAgICBFcS9zcmMvTFZFUU5CX0NhbGNDb2VmLmMgXAorICAgIEVxL3NyYy9MVkVRTkJfQ29udHJvbC5jIFwKKyAgICBFcS9zcmMvTFZFUU5CX0luaXQuYyBcCisgICAgRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMgXAorICAgIEVxL3NyYy9MVkVRTkJfVGFibGVzLmMgXAorICAgIENvbW1vbi9zcmMvSW5zdEFsbG9jLmMgXAorICAgIENvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYyBcCisgICAgQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMgXAorICAgIENvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jIFwKKyAgICBDb21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jIFwKKyAgICBDb21tb24vc3JjL0ZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMgXAorICAgIENvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jIFwKKyAgICBDb21tb24vc3JjL0JQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxLmMgXAorICAgIENvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYyBcCisgICAgQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jIFwKKyAgICBDb21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyBcCisgICAgQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgXAorICAgIENvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jIFwKKyAgICBDb21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyBcCisgICAgQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jIFwKKyAgICBDb21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmMgXAorICAgIENvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYyBcCisgICAgQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jIFwKKyAgICBDb21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYyBcCisgICAgQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jIFwKKyAgICBDb21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMgXAorICAgIENvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jIFwKKyAgICBDb21tb24vc3JjL0JRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMgXAorICAgIENvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jIFwKKyAgICBDb21tb24vc3JjL0JRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMgXAorICAgIENvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jIFwKKyAgICBDb21tb24vc3JjL1BLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxLmMgXAorICAgIENvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYyBcCisgICAgQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0LmMgXAorICAgIENvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdC5jIFwKKyAgICBDb21tb24vc3JjL0ludDE2TFNoaWZ0VG9JbnQzMl8xNngzMi5jIFwKKyAgICBDb21tb24vc3JjL0Zyb20yaVRvTW9ub18xNi5jIFwKKyAgICBDb21tb24vc3JjL0NvcHlfMTYuYyBcCisgICAgQ29tbW9uL3NyYy9Nb25vVG8ySV8xNi5jIFwKKyAgICBDb21tb24vc3JjL0xvYWRDb25zdF8xNi5jIFwKKyAgICBDb21tb24vc3JjL2RCX3RvX0xpbjMyLmMgXAorICAgIENvbW1vbi9zcmMvU2hpZnRfU2F0X3YxNnh2MTYuYyBcCisgICAgQ29tbW9uL3NyYy9BYnNfMzIuYyBcCisgICAgQ29tbW9uL3NyYy9JbnQzMlJTaGlmdFRvSW50MTZfU2F0XzMyeDE2LmMgXAorICAgIENvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMgXAorICAgIENvbW1vbi9zcmMvbXVsdDNzXzE2eDE2LmMgXAorICAgIENvbW1vbi9zcmMvTm9uTGluQ29tcF9EMTYuYyBcCisgICAgQ29tbW9uL3NyYy9EZWxheU1peF8xNngxNi5jIFwKKyAgICBDb21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuYyBcCisgICAgQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmMgXAorICAgIENvbW1vbi9zcmMvTWFjM3NfU2F0XzE2eDE2LmMgXAorICAgIENvbW1vbi9zcmMvQWRkMl9TYXRfMTZ4MTYuYyBcCisgICAgQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jIFwKKyAgICBDb21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMgXAorICAgIENvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jIFwKKyAgICBDb21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuYyBcCisgICAgQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGFyZ2V0LmMgXAorICAgIENvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jIFwKKyAgICBDb21tb24vc3JjL0xWQ19NaXhlcl9Jbml0LmMgXAorICAgIENvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVC5jIFwKKyAgICBDb21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuYyBcCisgICAgQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jIFwKKyAgICBDb21tb24vc3JjL0xWQ19NaXhlcl9HZXRDdXJyZW50LmMgXAorICAgIENvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYyBcCisgICAgQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMgXAorICAgIENvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jIFwKKyAgICBDb21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jIFwKKyAgICBDb21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jIFwKKyAgICBDb21tb24vc3JjL0xWTV9UaW1lci5jIFwKKyAgICBDb21tb24vc3JjL0xWTV9UaW1lcl9Jbml0LmMKKworTE9DQUxfTU9EVUxFOj0gbGlibXVzaWNidW5kbGUKKworTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChMT0NBTF9QQVRIKS9FcS9saWIgXAorICAgICQoTE9DQUxfUEFUSCkvRXEvc3JjIFwKKyAgICAkKExPQ0FMX1BBVEgpL0Jhc3MvbGliIFwKKyAgICAkKExPQ0FMX1BBVEgpL0Jhc3Mvc3JjIFwKKyAgICAkKExPQ0FMX1BBVEgpL0NvbW1vbi9saWIgXAorICAgICQoTE9DQUxfUEFUSCkvQ29tbW9uL3NyYyBcCisgICAgJChMT0NBTF9QQVRIKS9CdW5kbGUvbGliIFwKKyAgICAkKExPQ0FMX1BBVEgpL0J1bmRsZS9zcmMgXAorICAgICQoTE9DQUxfUEFUSCkvU3BlY3RydW1BbmFseXplci9saWIgXAorICAgICQoTE9DQUxfUEFUSCkvU3BlY3RydW1BbmFseXplci9zcmMgXAorICAgICQoTE9DQUxfUEFUSCkvU3RlcmVvV2lkZW5pbmcvc3JjIFwKKyAgICAkKExPQ0FMX1BBVEgpL1N0ZXJlb1dpZGVuaW5nL2xpYgorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ4NzMxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaApAQCAtMCwwICsxLDQ3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAkQXV0aG9yOiBueHAwMDc3NTMgJAorICAgICAkUmV2aXNpb246IDEwODEgJAorICAgICAkRGF0ZTogMjAxMC0wNy0wNSAxMTo0ODo0NCArMDIwMCAoTW9uLCAwNSBKdWwgMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEhlYWRlciBmaWxlIGZvciB0aGUgYXBwbGljYXRpb24gbGF5ZXIgaW50ZXJmYWNlIG9mIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCAgICAgICAqLworLyogIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGVzIGluY2x1ZGVzIGFsbCBkZWZpbml0aW9ucywgdHlwZXMsIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAqLworLyogIHByb3RvdHlwZXMgcmVxdWlyZWQgYnkgdGhlIGNhbGxpbmcgbGF5ZXIuIEFsbCBvdGhlciB0eXBlcywgc3RydWN0dXJlcyBhbmQgICAgICAgICAgICovCisvKiAgZnVuY3Rpb25zIGFyZSBwcml2YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE5vdGU6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgPT09PT09PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgYWxnb3JpdGhtIGNhbiBleGVjdXRlIGVpdGhlciB3aXRoIHNlcGFyYXRlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBvciB3aXRoICAgKi8KKy8qICAgIGEgY29tbW9uIGJ1ZmZlciwgaS5lLiB0aGUgZGF0YSBpcyBwcm9jZXNzZWQgaW4tcGxhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgTm90ZTogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICA9PT09PT09ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoZSBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgYWxnb3JpdGhtIGFsd2F5cyBwcm9jZXNzZXMgZGF0YSBhcyBzdGVyZW8gaW5wdXQuIE1vbm8qLworLyogIGZvcm1hdCBkYXRhIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBkYXRhIGlzIGludGVybGVhdmVkIGFzIGZvbGxvd3M6ICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICBCeXRlIE9mZnNldCAgICAgICAgIFN0ZXJlbyBJbnB1dCAgICAgICAgIE1vbm8tSW4tU3RlcmVvIElucHV0ICAgICAgICAgICAqLworLyogICAgICAgICAgICAgID09PT09PT09PT09ICAgICAgICAgPT09PT09PT09PT09ICAgICAgICAgPT09PT09PT09PT09PT09PT09PT0gICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICBMZWZ0IFNhbXBsZSAjMSAgICAgICAgICBNb25vIFNhbXBsZSAjMSAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIFJpZ2h0IFNhbXBsZSAjMSAgICAgICAgIE1vbm8gU2FtcGxlICMxICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICAgTGVmdCBTYW1wbGUgIzIgICAgICAgICAgTW9ubyBTYW1wbGUgIzIgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIDYgICAgICAgICAgICAgICBSaWdodCBTYW1wbGUgIzIgICAgICAgICBNb25vIFNhbXBsZSAjMiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb25vIGZvcm1hdCBkYXRhIGlzIG5vdCBzdXBwb3J0ZWQsIHRoZSBjYWxsaW5nIHJvdXRpbmUgbXVzdCBjb252ZXJ0IGEgTW9ubyBzdHJlYW0gICAqLworLyogICAgaW4gdG8gTW9uby1Jbi1TdGVyZW8gZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fTFZEQkVfSF9fCisjZGVmaW5lIF9fTFZEQkVfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIERlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTWVtb3J5IHRhYmxlKi8KKyNkZWZpbmUgTFZEQkVfTlJfTUVNT1JZX1JFR0lPTlMgICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIG1lbW9yeSByZWdpb25zICovCisKKy8qIEJhc3MgRW5oYW5jZW1lbnQgZWZmZWN0IGxldmVsICovCisjZGVmaW5lIExWREJFX0VGRkVDVF8wM0RCICAgICAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVmZmVjdCBkZWZpbmVzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBMVkRCRV9FRkZFQ1RfMDZEQiAgICAgICAgICAgIDYKKyNkZWZpbmUgTFZEQkVfRUZGRUNUXzA5REIgICAgICAgICAgICA5CisjZGVmaW5lIExWREJFX0VGRkVDVF8xMkRCICAgICAgICAgICAgMTIKKyNkZWZpbmUgTFZEQkVfRUZGRUNUXzE1REIgICAgICAgICAgICAxNQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluc3RhbmNlIGhhbmRsZSAqLwordHlwZWRlZiB2b2lkICAgICpMVkRCRV9IYW5kbGVfdDsKKworCisvKiBPcGVyYXRpbmcgbW9kZXMgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWREJFX09GRiAgICAgID0gMCwKKyAgICBMVkRCRV9PTiAgICAgICA9IDEsCisgICAgTFZEQkVfTU9ERV9NQVggPSBMVk1fTUFYSU5UXzMyCit9IExWREJFX01vZGVfZW47CisKKworLyogSGlnaCBwYXNzIGZpbHRlciAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZEQkVfSFBGX09GRiA9IDAsCisgICAgTFZEQkVfSFBGX09OICA9IDEsCisgICAgTFZEQkVfSFBGX01BWCA9IExWTV9NQVhJTlRfMzIKK30gTFZEQkVfRmlsdGVyU2VsZWN0X2VuOworCisKKy8qIFZvbHVtZSBjb250cm9sICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVkRCRV9WT0xVTUVfT0ZGID0gMCwKKyAgICBMVkRCRV9WT0xVTUVfT04gID0gMSwKKyAgICBMVkRCRV9WT0xVTUVfTUFYID0gTFZNX01BWElOVF8zMgorfSBMVkRCRV9Wb2x1bWVfZW47CisKKworLyogTWVtb3J5IFR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVkRCRV9QRVJTSVNURU5UICAgICAgPSAwLAorICAgIExWREJFX1BFUlNJU1RFTlRfREFUQSA9IDEsCisgICAgTFZEQkVfUEVSU0lTVEVOVF9DT0VGID0gMiwKKyAgICBMVkRCRV9TQ1JBVENIICAgICAgICAgPSAzLAorICAgIExWREJFX01FTU9SWV9NQVggICAgICA9IExWTV9NQVhJTlRfMzIKKworfSBMVkRCRV9NZW1vcnlUeXBlc19lbjsKKworCisvKiBGdW5jdGlvbiByZXR1cm4gc3RhdHVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVkRCRV9TVUNDRVNTICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBhIHJvdXRpbmUgKi8KKyAgICBMVkRCRV9BTElHTk1FTlRFUlJPUiA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgLyogTWVtb3J5IGFsaWdubWVudCBlcnJvciAqLworICAgIExWREJFX05VTExBRERSRVNTICAgID0gMiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBOVUxMIGFsbG9jYXRpb24gYWRkcmVzcyAqLworICAgIExWREJFX1RPT01BTllTQU1QTEVTID0gMywgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgZXhjZWVkZWQgKi8KKyAgICBMVkRCRV9TSVpFRVJST1IgICAgICA9IDQsICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jb3JyZWN0IHN0cnVjdHVyZSBzaXplICovCisgICAgTFZEQkVfU1RBVFVTX01BWCAgICAgPSBMVk1fTUFYSU5UXzMyCit9IExWREJFX1JldHVyblN0YXR1c19lbjsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgTGlua2VkIGVudW1lcmF0ZWQgdHlwZSBhbmQgY2FwYWJpbGl0eSBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgY2FwYWJpbGl0eSBkZWZpbml0aW9ucyBhcmUgdXNlZCB0byBkZWZpbmUgdGhlIHJlcXVpcmVkIGNhcGFiaWxpdGllcyBhdCAgICAgICAgICAqLworLyogIGluaXRpYWxpc2F0aW9uLCB0aGVzZSBhcmUgYWRkZWQgdG9nZXRoZXIgdG8gZ2l2ZSB0aGUgY2FwYWJpbGl0eSB3b3JkLiBUaGUgICAgICAgICAgICovCisvKiAgZW51bWVyYXRlZCB0eXBlIGlzIHVzZWQgdG8gc2VsZWN0IHRoZSBtb2RlIHRocm91Z2ggYSBjb250cm9sIGZ1bmN0aW9uIGF0IHJ1biB0aW1lLiAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBjYXBhYmlsaXR5IGRlZmluaXRpb24gaXMgcmVsYXRlZCB0byB0aGUgZW51bWVyYXRlZCB0eXBlIHZhbHVlIGJ5IHRoZSBlcXVhdGlvbjogICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIENhcGFiaWxpdHlfdmFsdWUgPSAyXkVudW1lcmF0ZWRfdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRm9yIGV4YW1wbGUsIGEgbW9kdWxlIGNvdWxkIGJlIGNvbmZpZ3VyZCBhdCBpbml0aWFsaXNhdGlvbiB0byBzdXBwb3J0IHR3byBzYW1wbGUgICAgKi8KKy8qICByYXRlcyBvbmx5IGJ5IGNhbGxpbmcgdGhlIGluaXQgZnVuY3Rpb24gd2l0aCB0aGUgdmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBDYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSA9IExWREJFX0NBUF8zMjAwMCArIExWQ1NfREJFXzQ0MTAwOyAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBhbmQgYXQgcnVuIHRpbWUgaXQgd291bGQgYmUgcGFzc2VkIHRoZSB2YWx1ZSBMVkRCRV9GU18zMjAwMCB0aHJvdWdoIHRoZSBjb250cm9sICAgICAqLworLyogIGZ1bmN0aW9uIHRvIHNlbGVjdCBvcGVyYXRpb24gYXQgMzJrSHogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQmFzcyBFbmhhbmNlbWVudCBjZW50cmUgZnJlcXVlbmN5CisgKi8KKyNkZWZpbmUgTFZEQkVfQ0FQX0NFTlRSRV81NUh6ICAgICAgIDEKKyNkZWZpbmUgTFZEQkVfQ0FQX0NFTlRSRV82Nkh6ICAgICAgIDIKKyNkZWZpbmUgTFZEQkVfQ0FQX0NFTlRSRV83OEh6ICAgICAgIDQKKyNkZWZpbmUgTFZEQkVfQ0FQX0NFTlRSRV85MEh6ICAgICAgIDgKKwordHlwZWRlZiBlbnVtCit7CisgICAgTFZEQkVfQ0VOVFJFXzU1SFogPSAwLAorICAgIExWREJFX0NFTlRSRV82NkhaID0gMSwKKyAgICBMVkRCRV9DRU5UUkVfNzhIWiA9IDIsCisgICAgTFZEQkVfQ0VOVFJFXzkwSFogPSAzLAorICAgIExWREJFX0NFTlRSRV9NQVggID0gTFZNX01BWElOVF8zMgorfSBMVkRCRV9DZW50cmVGcmVxX2VuOworCisKKy8qCisgKiBTdXBwb3J0ZWQgc2FtcGxlIHJhdGVzIGluIHNhbXBsZXMgcGVyIHNlY29uZAorICovCisjZGVmaW5lIExWREJFX0NBUF9GU184MDAwICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzExMDI1ICAgICAgICAgICAgICAgMgorI2RlZmluZSBMVkRCRV9DQVBfRlNfMTIwMDAgICAgICAgICAgICAgICA0CisjZGVmaW5lIExWREJFX0NBUF9GU18xNjAwMCAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzIyMDUwICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzI0MDAwICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzMyMDAwICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzQ0MTAwICAgICAgICAgICAgICAgMTI4CisjZGVmaW5lIExWREJFX0NBUF9GU180ODAwMCAgICAgICAgICAgICAgIDI1NgorCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVkRCRV9GU184MDAwICA9IDAsCisgICAgTFZEQkVfRlNfMTEwMjUgPSAxLAorICAgIExWREJFX0ZTXzEyMDAwID0gMiwKKyAgICBMVkRCRV9GU18xNjAwMCA9IDMsCisgICAgTFZEQkVfRlNfMjIwNTAgPSA0LAorICAgIExWREJFX0ZTXzI0MDAwID0gNSwKKyAgICBMVkRCRV9GU18zMjAwMCA9IDYsCisgICAgTFZEQkVfRlNfNDQxMDAgPSA3LAorICAgIExWREJFX0ZTXzQ4MDAwID0gOCwKKyAgICBMVkRCRV9GU19NQVggICA9IExWTV9NQVhJTlRfMzIKK30gTFZEQkVfRnNfZW47CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gc2l6ZSBpbiBieXRlcyAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgQWxpZ25tZW50OyAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiBhbGlnbm1lbnQgaW4gYnl0ZXMgKi8KKyAgICBMVkRCRV9NZW1vcnlUeXBlc19lbiAgICAgIFR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gdHlwZSAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnBCYXNlQWRkcmVzczsgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHJlZ2lvbiBiYXNlIGFkZHJlc3MgKi8KK30gTFZEQkVfTWVtb3J5UmVnaW9uX3Q7CisKKworLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVkRCRV9NZW1vcnlSZWdpb25fdCAgICBSZWdpb25bTFZEQkVfTlJfTUVNT1JZX1JFR0lPTlNdOyAgLyogT25lIGRlZmluaXRpb24gZm9yIGVhY2ggcmVnaW9uICovCit9IExWREJFX01lbVRhYl90OworCisKKy8qIFBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZEQkVfTW9kZV9lbiAgICAgICAgICAgT3BlcmF0aW5nTW9kZTsKKyAgICBMVkRCRV9Gc19lbiAgICAgICAgICAgICBTYW1wbGVSYXRlOworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEVmZmVjdExldmVsOworICAgIExWREJFX0NlbnRyZUZyZXFfZW4gICAgIENlbnRyZUZyZXF1ZW5jeTsKKyAgICBMVkRCRV9GaWx0ZXJTZWxlY3RfZW4gICBIUEZTZWxlY3Q7CisgICAgTFZEQkVfVm9sdW1lX2VuICAgICAgICAgVm9sdW1lQ29udHJvbDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBWb2x1bWVkQjsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBIZWFkcm9vbWRCOworCit9IExWREJFX1BhcmFtc190OworCisKKy8qIENhcGFiaWxpdHkgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgU2FtcGxlUmF0ZTsgICAgICAgICAgICAgICAvKiBTYW1wbGluZyByYXRlIGNhcGFiaWxpdGllcyAqLworICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgQ2VudHJlRnJlcXVlbmN5OyAgICAgICAgICAvKiBDZW50cmUgZnJlcXVlbmN5IGNhcGFiaWxpdGllcyAqLworICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgTWF4QmxvY2tTaXplOyAgICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgaW4gc2FtcGxlIHBhaXJzICovCit9IExWREJFX0NhcGFiaWxpdGllc190OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWREJFX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgKi8KKy8qICAgIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICBoSW5zdGFuY2UgPSBJbnN0YW5jZSBoYW5kbGUgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGJhc2UgYWRkcmVzc2VzIGZvciB0aGUgaW5zdGFuY2UgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIChoSW5zdGFuY2U9TlVMTCkgdGhlIG1lbW9yeSAgICAqLworLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZnJlZSAoaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlKSB0aGUgbWVtb3J5ICAgICAqLworLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBDYXBhYmlsaXRpZXMgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGVzICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkRCRV9TVUNDRVNTICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIDEuICAgIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkRCRV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX01lbW9yeShMVkRCRV9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9NZW1UYWJfdCAgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QgICAgICpwQ2FwYWJpbGl0aWVzKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkRCRV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQ3JlYXRlIGFuZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIEJhc3MgRW5oYW5jZW1lbnQgbW9kdWxlICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGFsZ29yaXRobSBpbnN0YW5jZSBieSBjYWxsaW5nIHdpdGggICAgICAgICAqLworLyogICAgaEluc3RhbmNlIHNldCB0byBOVUxMLiBJbiB0aGlzIGNhc2UgdGhlIGFsZ29yaXRobSByZXR1cm5zIHRoZSBuZXcgaW5zdGFuY2UgICAgICAgICovCisvKiAgICBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBmb3JjZSBhIGZ1bGwgcmUtaW5pdGlhbGlzYXRpb24gb2YgdGhlIGFsZ29yaXRobSAgICAgICovCisvKiAgICBieSBjYWxsaW5nIHdpdGggaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlLiBJbiB0aGlzIGNhc2UgdGhlIG1lbW9yeSB0YWJsZSAgICAgICAgKi8KKy8qICAgIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIGVuc3VyZWQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gICAqLworLyogICAgTFZEQkVfTWVtb3J5IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkRCRV9TVUNDRVNTICAgICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWREJFX0FMSUdOTUVOVEVSUk9SICAgICAgICBJbnN0YW5jZSBvciBzY3JhdGNoIG1lbW9yeSBvbiBpbmNvcnJlY3QgYWxpZ25tZW50ICAgICAgICovCisvKiAgICBMVkRCRV9OVUxMQUREUkVTUyAgICAgICAgICAgIE9uZSBvciBtb3JlIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gICAgIFRoZSBpbnN0YW5jZSBoYW5kbGUgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWVtb3J5ICAgKi8KKy8qICAgICAgICByZWdpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgMi4gICAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfSW5pdChMVkRCRV9IYW5kbGVfdCAgICAgICAgICAgICAqcGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfTWVtVGFiX3QgICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICAqcENhcGFiaWxpdGllcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgIExWREJFX0dldFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFJlcXVlc3QgdGhlIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycy4gVGhlIGN1cnJlbnQgcGFyYW1ldGVyIHNldCBpcyByZXR1cm5lZCAgICAqLworLyogICAgdmlhIHRoZSBwYXJhbWV0ZXIgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gICAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9HZXRQYXJhbWV0ZXJzKExWREJFX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgKnBQYXJhbXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICBMVkRCRV9HZXRDYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBSZXF1ZXN0IHRoZSBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgY2FwYWJpbGl0aWVzLiBUaGUgaW5pdGlhbCBjYXBhYmlsaXRpZXMgYXJlICAgKi8KKy8qICByZXR1cm5lZCB2aWEgdGhlIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgY2FwYWJpbGl0aXkgc3RydWN0dXJlICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWREJFX1N1Y2Nlc3MgICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICAgIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkRCRV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfR2V0Q2FwYWJpbGl0aWVzKExWREJFX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICpwQ2FwYWJpbGl0aWVzKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWREJFX0NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNldHMgb3IgY2hhbmdlcyB0aGUgQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzLiBDaGFuZ2luZyB0aGUgcGFyYW1ldGVycyB3aGlsZSB0aGUgICovCisvKiAgbW9kdWxlIGlzIHByb2Nlc3Npbmcgc2lnbmFscyBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZGUgZWZmZWN0czogICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEdlbmVyYWwgcGFyYW1ldGVyczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgPT09PT09PT09PT09PT09PT09PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBPcGVyYXRpbmdNb2RlOiAgICAgIENoYW5naW5nIHRoZSBtb2RlIG9mIG9wZXJhdGlvbiBtYXkgY2F1c2UgYSBjaGFuZ2UgaW4gdm9sdW1lICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgbGV2ZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTYW1wbGVSYXRlOiAgICAgICAgIENoYW5naW5nIHRoZSBzYW1wbGUgcmF0ZSBtYXkgY2F1c2UgcG9wcyBhbmQgY2xpY2tzLiAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRWZmZWN0TGV2ZWw6ICAgICAgICBDaGFuZ2luZyB0aGUgZWZmZWN0IGxldmVsIHNldHRpbmcgd2lsbCBoYXZlIG5vIHNpZGUgZWZmZWN0cyAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENlbnRyZUZyZXF1ZW5jeTogICAgQ2hhbmdpbmcgdGhlIGNlbnRyZSBmcmVxdWVuY3kgbWF5IGNhdXNlIHBvcHMgYW5kIGNsaWNrcyAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBIUEZTZWxlY3Q6ICAgICAgICAgIFNlbGVjdGluZy9kZS1zZWxlY3RpbmcgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgbWF5IGNhdXNlIHBvcHMgYW5kICAqLworLyogICAgICAgICAgICAgICAgICAgICAgY2xpY2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBWb2x1bWVkQiAgICAgICAgICAgIENoYW5naW5nIHRoZSB2b2x1bWUgc2V0dGluZyB3aWxsIGhhdmUgbm8gc2lkZSBlZmZlY3RzICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBhIHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Db250cm9sKExWREJFX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAqcFBhcmFtcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZEQkVfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQcm9jZXNzIGZ1bmN0aW9uIGZvciB0aGUgQmFzcyBFbmhhbmNlbWVudCBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbkRhdGEgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1TYW1wbGVzICAgICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkRCRV9TVUNDRVNTICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgTFZEQkVfVE9PTUFOWVNBTVBMRVMgICAgTnVtU2FtcGxlcyB3YXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gYmxvY2sgc2l6ZSAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBOdW1TYW1wbGVzKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX19MVkRCRV9IX18gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NGE3ODY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oCkBAIC0wLDAgKzEsNTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fTFZEQkVfQ09FRkZTX0hfXworI2RlZmluZSBfX0xWREJFX0NPRUZGU19IX18KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEdlbmVyYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMVkRCRV9TQ0FMRVNISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEhpZ2ggUGFzcyBGaWx0ZXIgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA1NUh6ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAxMDI5NTU2MzI4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTg4NDkgKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAgLTIwNTkxMTI2NTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MTc2OTggKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjk1NTYzMjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1ODg0OSAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMjA4MTk4NjM3NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkzOTAwMSAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMTAxMDE4MzkxNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTQwODA3ICovCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDM4MjEwODMxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjY5MDkgKi8KKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIwNzY0MjE2NjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MzM4MTggKi8KKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMzgyMTA4MzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2NjkwOSAqLworI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjA5OTk1MDcxMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk1NTczMiAqLworI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTAyNzIzODQ1MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTU2NjkwICovCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDQwMDc5OTQzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Njg2NTAgKi8KKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIwODAxNTk4ODUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MzczMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDAwNzk5NDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2ODY1MCAqLworI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEwMzgxMTcwMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk1OTMyNyAqLworI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTAzMDk0MDQ3NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTYwMTM4ICovCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ1MzgxOTg4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzM1ODggKi8KKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIwOTA3NjM5NzYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NDcxNzYgKi8KKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDUzODE5ODggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3MzU4OCAqLworI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjExNDcyNzc5MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk2OTQ5NCAqLworI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA0MTQ3ODE0NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY5OTUyICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ5NzY2NTIzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzc2NzEgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIwOTk1MzMwNDYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NTUzNDMgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDk3NjY1MjMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NzY3MSAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEyMzcxNDM4MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk3Nzg2MyAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1MDIzMjc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc4MTA1ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDUwNzExMDUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzg1NTEgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMDE0MjIxMDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NTcxMDIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTA3MTEwNTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3ODU1MSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEyNTY0NTQ5OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk3OTY2MiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1MjEyMzUyNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc5ODY2ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDUzMzg1NzU5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODEwNDIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMDY3NzE1MTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NjIwODQgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTMzODU3NTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MTA0MiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEzMTEwNDc5NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4NDc0NiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1NzQ4Njk0OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTg0ODYxICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDU1NTkyNDk4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODMwOTcgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMTExODQ5OTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NjYxOTQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTU1OTI0OTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MzA5NyAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEzNTU5ODY1OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4ODkzMSAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2MTkyMjI0OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTg4OTkyICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDU2MDY3Mjc2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODM1MzkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMTIxMzQ1NTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NjcwNzkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTYwNjcyNzYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MzUzOSAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEzNjU2NDI5NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4OTgzMSAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2Mjg3NzcxNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTg5ODgyICovCisKKyAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNjZIeiAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyMzI5MzI3MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTUzMDE2ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0yMDQ2NTg2NTQyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTA2MDMyICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAxMDIzMjkzMjcxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTMwMTYgKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAgLTIwNjg4OTY4NjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MjY4MTAgKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgICA5OTc5MzExMTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkyOTM5NiAqLworI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTAzMzYyNDIyOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTYyNjM4ICovCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDY3MjQ4NDU1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTI1Mjc1ICovCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDMzNjI0MjI4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjI2MzggKi8KKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIwOTA0NDgwMDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NDY4ODEgKi8KKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMTgxODIzMDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk0ODI1NiAqLworI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTAzNTg1NzY2MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY0NzE4ICovCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDcxNzE1MzI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTI5NDM1ICovCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDM1ODU3NjYyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjQ3MTggKi8KKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIwOTUwODAzMzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NTExOTYgKi8KKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMjI1ODcxNTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1MjM1OSAqLworI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA0MjE5NzUyOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTcwNjIyICovCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDg0Mzk1MDU2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTQxMjQ0ICovCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDQyMTk3NTI4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzA2MjIgKi8KKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMDgxNzc5MTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NjMzOTQgKi8KKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMzUxNDI2OTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2NDA1MiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA0NzQ0NTE0NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc1NTA5ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDk0ODkwMjg5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTUxMDE5ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDQ3NDQ1MTQ1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzU1MDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMTg5NjEwMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NzM0MzYgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDU1OTMxMDIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3Mzc4NCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA0ODU3NjE3NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc2NTYzICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDk3MTUyMzQ5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTUzMTI1ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4NTc2MTc1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzY1NjMgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMjEyNzgyNTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NzU1OTQgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDc4NTIzNzkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NTg4OSAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA1MTc4MDExOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc5NTQ3ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMTAzNTYwMjM3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTU5MDkzICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDUxNzgwMTE5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzk1NDcgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMjc4MjkxODcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODE2OTUgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTQyNjU2MjMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MTg2MSAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA1NDQyNDcyMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgyMDEwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMTA4ODQ5NDQ0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTY0MDE5ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDU0NDI0NzIyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODIwMTAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzMyMjE3MjMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODY3MTggKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTk1NzM5OTMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4NjgwNSAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA1NDk5Mzg1MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgyNTQwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMTA5OTg3NzAyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTY1MDc5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDU0OTkzODUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODI1NDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzQzODA0NzUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODc3OTcgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjA3MTgxMTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4Nzg3MSAqLworCisgLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDc4SHogKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDEwMTY1MDQyMDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk0NjY5MyAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMjAzMzAwODQwNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjg5MzM4NyAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMTAxNjUwNDIwMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTQ2NjkzICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0yMDU0NjIzMzkwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTEzNTE3ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgOTg0NzMzODUzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45MTcxMDUgKi8KKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwMjg2NDM3NDEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1Nzk5OSAqLworI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjA1NzI4NzQ4MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkxNTk5OCAqLworI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTAyODY0Mzc0MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTU3OTk5ICovCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMDgwMDgzNzY5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTM3MjI5ICovCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDA4MzkzOTA0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45MzkxNDAgKi8KKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwMzEyNzEwNjcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2MDQ0NiAqLworI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjA2MjU0MjEzMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkyMDg5MiAqLworI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTAzMTI3MTA2NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTYwNDQ2ICovCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMDg1NTU3MDQ4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTQyMzI2ICovCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDEzNTUxNjIwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NDM5NDQgKi8KKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwMzg3MzQ2MjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2NzM5NyAqLworI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjA3NzQ2OTI1NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkzNDc5NCAqLworI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTAzODczNDYyOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY3Mzk3ICovCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTAxMDMzMzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTU2NzQwICovCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDI4Mjc1MjI4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTc2NTYgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNDQ5MTg1ODQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3MzE1NiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjA4OTgzNzE2OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk0NjMxMyAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA0NDkxODU4NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTczMTU2ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTEzNzc1ODU0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTY4NjA3ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDQwNTU1MDA3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjkwOTIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNDYyNTIxNjQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NDM5OCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjA5MjUwNDMyOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk0ODc5NyAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA0NjI1MjE2NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc0Mzk4ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTE2NTE0MjI5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTcxMTU3ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDQzMjEyNzE5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzE1NjggKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNTAwMzEzMDEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NzkxOCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjEwMDA2MjYwMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk1NTgzNiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA1MDAzMTMwMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc3OTE4ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTI0MjU1OTAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTc4MzY3ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDUwNzYyNjM5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzg1OTkgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNTMxNTIyNTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MDgyNCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjEwNjMwNDUxNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk2MTY0OSAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA1MzE1MjI1OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgwODI0ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTMwNjI4NzQyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTg0MzAzICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDU3MDE4MTgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODQ0MjUgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNTM4MjQwODcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MTQ1MCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjEwNzY0ODE3MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk2MjkwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA1MzgyNDA4NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgxNDUwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTMxOTk4MTU0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTg1NTc4ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDU4MzY3MjAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODU2ODEgKi8KKworIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA5MEh6ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAxMDA5NzYwMDUzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NDA0MTIgKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAgLTIwMTk1MjAxMDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS44ODA4MjUgKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDk3NjAwNTMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk0MDQxMiAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMjA0MDM1NzEzOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkwMDIzMSAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDk3MTcxMTEyOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTA0OTc3ICovCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDIzNjg3MjE3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTMzODMgKi8KKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIwNDczNzQ0MzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MDY3NjYgKi8KKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMjM2ODcyMTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1MzM4MyAqLworI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMjA2OTcyMjM5NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkyNzU3OSAqLworI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDk5ODY5OTYwNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTMwMTExICovCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDI2NzA0NzU0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTYxOTMgKi8KKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIwNTM0MDk1MDggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MTIzODcgKi8KKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMjY3MDQ3NTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1NjE5MyAqLworI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMjA3NjAzNTk5NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkzMzQ1OSAqLworI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAgMTAwNDU5NTkxOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTM1NjAzICovCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDM1MjgzMjI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjQxODMgKi8KKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIwNzA1NjY0NTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MjgzNjUgKi8KKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMzUyODMyMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2NDE4MyAqLworI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMjA5Mzg4OTgxMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk1MDA4NyAqLworI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAgMTAyMTQ1MzMyNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTUxMzAzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDQyMzk4MTE2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzA4MDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIwODQ3OTYyMzIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NDE2MTggKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDIzOTgxMTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3MDgwOSAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEwODU5MTA1NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk2Mzc3OCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAgMTAzNTU0MTE4OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY0NDIzICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDQzOTMzMzAyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzIyMzkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIwODc4NjY2MDQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NDQ0NzcgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDM5MzMzMDIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3MjIzOSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMjExMTc1MDQ5NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk2NjcyMSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAgMTAzODU5MzYwMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY3MjY2ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4Mjg1MzkxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzYyOTIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIwOTY1NzA3ODMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NTI1ODQgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDgyODUzOTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NjI5MiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEyMDY4MjczNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk3NTA0MCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA0NzI3MTI5NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc1MzQ3ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDUxODgxMzMwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzk2NDEgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMDM3NjI2NjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NTkyODIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTE4ODEzMzAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3OTY0MSAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEyODAzNTgwOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4MTg4OCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1NDQ2ODUzMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgyMDUwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDUyNjU1NjE5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODAzNjIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMDUzMTEyMzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NjA3MjQgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTI2NTU2MTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MDM2MiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEyOTYxNTg3MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4MzM1OSAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1NjAyMTQ5MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgzNDk3ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCYW5kIFBhc3MgRmlsdGVyIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNTVIeiAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTg3NTI0NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA5MTk3ICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgLTk4NzUyNDcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDkxOTcgKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAgLTIxMjU1MTk4MzAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45Nzk1NDUgKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDEwNTM3NjI2MjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MTM5MyAqLworI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgNzE4Mzk1MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA2NjkxICovCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTcxODM5NTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDY2OTEgKi8KKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzE5MDE2NTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODU0ODggKi8KKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTkyMDc1NDggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4NjQ2NCAqLworI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgNjYwMzg3MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA2MTUwICovCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTY2MDM4NzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDYxNTAgKi8KKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzMyMzgwOTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODY3MzMgKi8KKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjAzODExNDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4NzU1NyAqLworI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgNDk2MDU5MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA0NjIwICovCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTQ5NjA1OTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDQ2MjAgKi8KKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzY5NDkwNTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45OTAxODkgKi8KKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjM3MDU3NjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MDY1MyAqLworI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMzYwNDEzMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAzMzU3ICovCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTM2MDQxMzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDMzNTcgKi8KKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzk5MjkwODUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45OTI5NjQgKi8KKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjY0NTAwOTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MzIwOSAqLworI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMxMjIwNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAzMDg1ICovCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTMzMTIyMDcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDMwODUgKi8KKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxNDA1NjA2MDYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45OTM1NTIgKi8KKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjcwNDA3MDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5Mzc1OSAqLworI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ4NjA5MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAyMzE1ICovCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTI0ODYwOTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDIzMTUgKi8KKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxNDIzMjg5NjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45OTUxOTkgKi8KKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjg3MTIwNjcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NTMxNiAqLworI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgwNTEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAxNjgxICovCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTE4MDUxMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDE2ODEgKi8KKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxNDM3NjU3NzIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45OTY1MzcgKi8KKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNzAwODk3NzAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NjU5OSAqLworI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY1ODY4NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAxNTQ1ICovCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTE2NTg2ODcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDE1NDUgKi8KKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxNDQwNzIyOTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45OTY4MjMgKi8KKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNzAzODYwMzYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5Njg3NSAqLworCisgLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDY2SHogKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM1ODAxODkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAxMjY0OCAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTEzNTgwMTg5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDEyNjQ4ICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0yMTE3MTYxMTc1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTcxNzYwICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ2MjY2OTQ1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzQ0MTIgKi8KKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDk4ODg1NTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwOTIwOSAqLworI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC05ODg4NTU5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA5MjA5ICovCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTI1OTcyNzM4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTc5OTY2ICovCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDUzNzM1Njk4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODEzNjggKi8KKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwOTE5NTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwODQ2OCAqLworI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC05MDkxOTU0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA4NDY4ICovCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTI3ODE4MDA0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTgxNjg1ICovCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDU1MzQ3MzU2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODI4NjkgKi8KKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDY4MzM1MjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwNjM2NCAqLworI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC02ODMzNTI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA2MzY0ICovCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTMyOTQxNzM5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTg2NDU3ICovCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDU5OTE2NTE3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODcxMjQgKi8KKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ5NjczMDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwNDYyNiAqLworI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC00OTY3MzA5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA0NjI2ICovCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTM3MDU2MDAzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTkwMjg4ICovCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDYzNjkyMTcwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTA2NDEgKi8KKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1NjU0NDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwNDI1MiAqLworI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC00NTY1NDQ1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA0MjUyICovCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTM3OTI3ODQyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTkxMTAwICovCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDY0NTA1MjAyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTEzOTggKi8KKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0Mjc3NjEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMzE5MiAqLworI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0zNDI3NzYxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAzMTkyICovCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTQwMzY5MDA3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTkzMzc0ICovCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDY2ODA2OTIwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTM1NDEgKi8KKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0ODk0NjYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMjMxOCAqLworI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNDg5NDY2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAyMzE4ICovCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTQyMzUyMzQyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTk1MjIxICovCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDY4NzA1MjQwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTUzMDkgKi8KKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyODc2MzIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMjEzMSAqLworI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0yMjg3NjMyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAyMTMxICovCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTQyNzc1NDM2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTk1NjE1ICovCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDY5MTEzNTgxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTU2OTAgKi8KKworIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA3OEh6ICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5OTQxMTgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMTg1NzIgKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOTk0MTE4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAxODU3MiAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMjEwMzE4Njc0OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk1ODc0NSAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMTAzMzM5NzY0OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTYyNDI3ICovCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NTQzOTM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMTM1NDUgKi8KKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgIC0xNDU0MzkzNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAxMzU0NSAqLworI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjExNTk2NjYzOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk3MDY0NyAqLworI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA0NDMxNzEzNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTcyNTk2ICovCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMzc2OTk5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMTI0NTggKi8KKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgIC0xMzM3Njk5OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAxMjQ1OCAqLworI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjExODY1MTcwOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk3MzE0OCAqLworI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA0NjY3ODAyOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc0Nzk1ICovCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDY0MjIyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDkzNzMgKi8KKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDA2NDIyMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwOTM3MyAqLworI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEyNjEyNDM0MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4MDEwOCAqLworI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1MzM4MDMwNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgxMDM3ICovCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MzIxNzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDY4MTkgKi8KKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtNzMyMTc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwNjgxOSAqLworI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEzMjE0Mzc3MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4NTcxNCAqLworI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1ODkyODcwMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTg2MjA0ICovCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NzMwNjQwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDYyNjggKi8KKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtNjczMDY0MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwNjI2OCAqLworI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEzMzQyMTYwNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4NjkwNCAqLworI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2MDEyNDY2OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTg3MzE4ICovCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDU1OTY1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDQ3MDkgKi8KKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtNTA1NTk2NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwNDcwOSAqLworI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEzNzAwMzk3NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk5MDI0MCAqLworI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2MzUxMjgwMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkwNDczICovCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNjczNTE2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDM0MjEgKi8KKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtMzY3MzUxNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMzQyMSAqLworI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEzOTkxOTM5NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk5Mjk1NSAqLworI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2NjMwOTcxOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkzMDc4ICovCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMzc1OTkwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDMxNDQgKi8KKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtMzM3NTk5MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMzE0NCAqLworI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjE0MDU0MTkwNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk5MzUzNSAqLworI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2NjkxMTY2MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkzNjM5ICovCisKKyAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgOTBIeiAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDQzODU0OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDIyNzYwICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtMjQ0Mzg1NDggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMjI3NjAgKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAgLTIwOTI4MDEzNDcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NDkwNzMgKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQyOTg3NTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1Mzk1MyAqLworI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxNzg0NDM4NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDE2NjE5ICovCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAtMTc4NDQzODUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMTY2MTkgKi8KKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMDg2MDQ5MjEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NjM3OTEgKi8KKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMzc2Mzk3OTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2NjM3NyAqLworI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxNjQxNjcwNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDE1Mjg5ICovCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAtMTY0MTY3MDcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMTUyODkgKi8KKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMTE5MjI5MzYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NjY4ODIgKi8KKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDA1MjgyMTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2OTA2NyAqLworI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxMjM1OTg4MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDExNTExICovCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAtMTIzNTk4ODMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMTE1MTEgKi8KKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMjExNTIxNjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NzU0NzcgKi8KKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDg3MzU4MTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NjcxMSAqLworI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgODk5NzE3MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA4Mzc5ICovCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTg5OTcxNzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDgzNzkgKi8KKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMjg1ODA3NjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODIzOTUgKi8KKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTU1MzkxMTMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MzA0NyAqLworI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgODI3MTgxOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA3NzA0ICovCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTgyNzE4MTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDc3MDQgKi8KKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzAxNTcwMTMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODM4NjMgKi8KKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTcwMDY2MjEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4NDQxNCAqLworI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgNjIxNTkxOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA1Nzg5ICovCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTYyMTU5MTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDU3ODkgKi8KKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzQ1NzQ1MjEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODc5NzcgKi8KKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjExNjYwMzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4ODI4OCAqLworI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUxNzY1MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA0MjA3ICovCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTQ1MTc2NTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDQyMDcgKi8KKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzgxNjc5MjYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45OTEzMjQgKi8KKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjQ2MDE4OTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MTQ4OCAqLworI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgNDE1MjAyNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAzODY3ICovCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTQxNTIwMjQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDM4NjcgKi8KKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzg5MzUwMDIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45OTIwMzggKi8KKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjUzNDE2MjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MjE3NyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXV0b21hdGljIEdhaW4gQ29udHJvbCB0aW1lIGNvbnN0YW50cyBhbmQgZ2FpbiBzZXR0aW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBR0MgVGltZSBjb25zdGFudHMgKi8KKyNkZWZpbmUgQUdDX0FUVEFDS19GczgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjc1NzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjg0MTM5NSAqLworI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTEwMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODkwOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuODgyMjIzICovCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5MjA1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC44OTEyNTEgKi8KKyNkZWZpbmUgQUdDX0FUVEFDS19GczE2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAwNTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkxNzI3NiAqLworI2RlZmluZSBBR0NfQVRUQUNLX0ZzMjIwNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDc3OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTM5MjY3ICovCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMyNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwOTM1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NDQwNjEgKi8KKyNkZWZpbmUgQUdDX0FUVEFDS19GczMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEzODMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1Nzc0NSAqLworI2RlZmluZSBBR0NfQVRUQUNLX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTc1NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY5MTU4ICovCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxODM4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzE2MjggKi8KKyNkZWZpbmUgREVDQVlfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDA0MiAqLworI2RlZmluZSBBR0NfREVDQVlfRnMxMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDMwICovCisjZGVmaW5lIEFHQ19ERUNBWV9GczEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMjggKi8KKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAyMSAqLworI2RlZmluZSBBR0NfREVDQVlfRnMyMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDE1ICovCisjZGVmaW5lIEFHQ19ERUNBWV9GczI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMTQgKi8KKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAxMCAqLworI2RlZmluZSBBR0NfREVDQVlfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDA4ICovCisjZGVmaW5lIEFHQ19ERUNBWV9GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDcgKi8KKworLyogQUdDIEdhaW4gc2V0dGluZ3MgKi8KKyNkZWZpbmUgQUdDX0dBSU5fU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgQUdDX0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgQUdDX1RBUkdFVExFVkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMxNzAzMzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xMDAwMDBkQiAqLworI2RlZmluZSBBR0NfSFBGR0FJTl8wZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDczOTcwNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDEyNTM4ICovCisjZGVmaW5lIEFHQ19HQUlOXzBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQUdDX0hQRkdBSU5fMWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTcwMDYwNzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjU4NDg5MyAqLworI2RlZmluZSBBR0NfR0FJTl8xZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjc1NDA3OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMTIyMDE4ICovCisjZGVmaW5lIEFHQ19IUEZHQUlOXzJkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA4OTE3Nzg4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC43NzgyNzkgKi8KKyNkZWZpbmUgQUdDX0dBSU5fMmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjk1MDQ3NjEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI1ODkyNSAqLworI2RlZmluZSBBR0NfSFBGR0FJTl8zZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2NzE2MzY5MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk1MjYyICovCisjZGVmaW5lIEFHQ19HQUlOXzNkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwNzM5NzA0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40MTI1MzggKi8KKyNkZWZpbmUgQUdDX0hQRkdBSU5fNGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMzI1MTY2NzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjIzODcyMSAqLworI2RlZmluZSBBR0NfR0FJTl80ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1NzAwNjA3MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTg0ODkzICovCisjZGVmaW5lIEFHQ19IUEZHQUlOXzVkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA1ODQzOTI0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS41MTE4ODYgKi8KKyNkZWZpbmUgQUdDX0dBSU5fNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDg5MTc3ODggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjc3ODI3OSAqLworI2RlZmluZSBBR0NfSFBGR0FJTl82ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4ODExODQ1MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuODE4MzgzICovCisjZGVmaW5lIEFHQ19HQUlOXzZkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjY3MTYzNjkzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTUyNjIgKi8KKyNkZWZpbmUgQUdDX0hQRkdBSU5fN2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODA0MzE5OTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAyLjE2MjI3OCAqLworI2RlZmluZSBBR0NfR0FJTl83ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzMjUxNjY3NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMjM4NzIxICovCisjZGVmaW5lIEFHQ19IUEZHQUlOXzhkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjg0MDA5NDgzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMi41NDgxMzQgKi8KKyNkZWZpbmUgQUdDX0dBSU5fOGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDU4NDM5MjQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjUxMTg4NiAqLworI2RlZmluZSBBR0NfSFBGR0FJTl85ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMDIyNTM0MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDIuOTgxMDcyICovCisjZGVmaW5lIEFHQ19HQUlOXzlkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDg4MTE4NDUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS44MTgzODMgKi8KKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MzA2MjE2ODEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAzLjQ2NjgzNiAqLworI2RlZmluZSBBR0NfR0FJTl8xMGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4MDQzMTk5MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDIuMTYyMjc4ICovCisjZGVmaW5lIEFHQ19IUEZHQUlOXzExZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDc2OTI4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNC4wMTE4NzIgKi8KKyNkZWZpbmUgQUdDX0dBSU5fMTFkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ODQwMDk0ODMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAyLjU0ODEzNCAqLworI2RlZmluZSBBR0NfSFBGR0FJTl8xMmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI0MTA4ODA0NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDQuNjIzNDEzICovCisjZGVmaW5lIEFHQ19HQUlOXzEyZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODAwMjI1MzQzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMi45ODEwNzIgKi8KKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTNkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0MjUyNzc3NjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSA1LjMwOTU3MyAqLworI2RlZmluZSBBR0NfR0FJTl8xM2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkzMDYyMTY4MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDMuNDY2ODM2ICovCisjZGVmaW5lIEFHQ19IUEZHQUlOXzE0ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjMxOTQyMDM5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNi4wNzk0NTggKi8KKyNkZWZpbmUgQUdDX0dBSU5fMTRkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNzY5Mjg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSA0LjAxMTg3MiAqLworI2RlZmluZSBBR0NfSFBGR0FJTl8xNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg2MzgyMzE2MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDYuOTQzMjgyICovCisjZGVmaW5lIEFHQ19HQUlOXzE1ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjQxMDg4MDQ1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNC42MjM0MTMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFZvbHVtZSBjb250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVm9sdW1lIGNvbnRyb2wgZ2FpbiAqLworI2RlZmluZSBWT0xVTUVfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEluIGRCcyAqLworI2RlZmluZSBWT0xVTUVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEluIGRCcyAqLworCisvKiBWb2x1bWUgY29udHJvbCB0aW1lIGNvbnN0YW50cyAqLworI2RlZmluZSBWT0xfVENfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMSAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBWT0xfVENfRnM4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTg4OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDI0NjkwICovCisjZGVmaW5lIFZPTF9UQ19GczExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4ODUwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMTc5NzcgKi8KKyNkZWZpbmUgVk9MX1RDX0ZzMTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTczMzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAxNjUyOSAqLworI2RlZmluZSBWT0xfVENfRnMxNjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzAyNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDEyNDIyICovCisjZGVmaW5lIFZPTF9UQ19GczIyMDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NDY4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDkwMjkgKi8KKyNkZWZpbmUgVk9MX1RDX0ZzMjQwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3MDIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwODI5OSAqLworI2RlZmluZSBWT0xfVENfRnMzMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjUzMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA2MjMxICovCisjZGVmaW5lIFZPTF9UQ19GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NzQ1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDQ1MjUgKi8KKyNkZWZpbmUgVk9MX1RDX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzNjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwNDE1OCAqLworI2RlZmluZSBNSVhfVENfRnM4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOTM2NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuODk2MTUxICovCisjZGVmaW5lIE1JWF9UQ19GczExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwMjMwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45MjI1NDggKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA0MjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkyODQxNSAqLworI2RlZmluZSBNSVhfVENfRnMxNjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDk3OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTQ1Mzg3ICovCisjZGVmaW5lIE1JWF9UQ19GczIyMDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxNDUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTk4MDQgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMjQwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE1NTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2Mjk1NiAqLworI2RlZmluZSBNSVhfVENfRnMzMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTg1MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTcxOTczICovCisjZGVmaW5lIE1JWF9UQ19GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzk1MTUgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIxNTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MTE1MCAqLworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTY2NTEzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMKQEAgLTAsMCArMSwzNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogbnhwMDA3NzUzICQKKyAgICAgJFJldmlzaW9uOiAxMjIzICQKKyAgICAgJERhdGU6IDIwMTAtMDctMTUgMTQ6Mjc6MDEgKzAyMDAgKFRodSwgMTUgSnVsIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkRCRS5oIgorI2luY2x1ZGUgIkxWREJFX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiTFZEQkVfQ29lZmZzLmgiCisjaW5jbHVkZSAiTFZEQkVfVGFibGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICBMVkRCRV9HZXRQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBSZXF1ZXN0IHRoZSBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycy4gVGhlIGN1cnJlbnQgcGFyYW1ldGVyIHNldCBpcyAgICAgKi8KKy8qICByZXR1cm5lZCB2aWEgdGhlIHBhcmFtZXRlciBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWREJFX1NVQ0NFU1MgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICAgIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkRCRV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfR2V0UGFyYW1ldGVycyhMVkRCRV9IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAgKnBQYXJhbXMpCit7CisKKyAgICBMVkRCRV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKworICAgICpwUGFyYW1zID0gcEluc3RhbmNlLT5QYXJhbXM7CisKKyAgICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICBMVkRCRV9HZXRDYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiBEeW5hbWljIEJhc3MgRW5obmFjZW1lbnQgY2FwYWJpbGl0aWVzLiBUaGUgY3VycmVudCBjYXBhYmlsaXRpZXMgYXJlICovCisvKiByZXR1cm5lZCB2aWEgdGhlIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgY2FwYWJpbGl0eSBzdHJ1Y3R1cmUgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWREJFX1N1Y2Nlc3MgICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICAgIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkRCRV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfR2V0Q2FwYWJpbGl0aWVzKExWREJFX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICpwQ2FwYWJpbGl0aWVzKQoreworCisgICAgTFZEQkVfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0oTFZEQkVfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisKKyAgICAqcENhcGFiaWxpdGllcyA9IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzOworCisgICAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZEQkVfU2V0RmlsdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNldHMgdGhlIGZpbHRlciBjb2VmZmljaWVudHMgYW5kIGNsZWFycyB0aGUgZGF0YSBoaXN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAgICBMVkRCRV9TZXRGaWx0ZXJzKExWREJFX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCit7CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgdGFibGUgb2Zmc2V0cworICAgICAqLworICAgIExWTV9VSU5UMTYgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGUgKyAoTFZNX1VJTlQxNikocFBhcmFtcy0+Q2VudHJlRnJlcXVlbmN5ICogKDErTFZEQkVfRlNfNDgwMDApKSk7CisKKworICAgIC8qCisgICAgICogU2V0dXAgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIKKyAgICAgKi8KKyAgICBMb2FkQ29uc3RfMTYoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLworICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopJnBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMsICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgIHNpemVvZihwSW5zdGFuY2UtPnBEYXRhLT5IUEZUYXBzKS9zaXplb2YoTFZNX0lOVDE2KSk7ICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCUV9DMzJfQ29lZnNfdCAqKSZMVkRCRV9IUEZfVGFibGVbT2Zmc2V0XSk7CisKKworICAgIC8qCisgICAgICogU2V0dXAgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKKyAgICAgKi8KKyAgICBMb2FkQ29uc3RfMTYoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLworICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopJnBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMsICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgIHNpemVvZihwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzKS9zaXplb2YoTFZNX0lOVDE2KSk7ICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdCgmcEluc3RhbmNlLT5wQ29lZi0+QlBGSW5zdGFuY2UsICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRGF0YS0+QlBGVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCUF9DMzJfQ29lZnNfdCAqKSZMVkRCRV9CUEZfVGFibGVbT2Zmc2V0XSk7CisKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZEQkVfU2V0QUdDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNldHMgdGhlIEFHQyBnYWluIGxldmVsIGFuZCBhdHRhY2sgYW5kIGRlY2F5IHRpbWVzIGNvbnN0YW50cy4gICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAgICBMVkRCRV9TZXRBR0MoTFZEQkVfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQoreworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGF0dGFjayBhbmQgZGVjYXkgdGltZSBjb25zdGFudHMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfQXR0YWNrID0gTFZEQkVfQUdDX0FUVEFDS19UYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsgIC8qIEF0dGFjayBtdWx0aXBsaWVyICovCisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX0RlY2F5ICA9IExWREJFX0FHQ19ERUNBWV9UYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsgICAvKiBEZWNheSBtdWx0aXBsZXIgKi8KKworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGJvb3N0IGdhaW4KKyAgICAgKi8KKyAgICBpZiAocFBhcmFtcy0+SFBGU2VsZWN0ID09IExWREJFX0hQRl9PTikKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19NYXhHYWluICAgPSBMVkRCRV9BR0NfSFBGR0FJTl9UYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5FZmZlY3RMZXZlbF07ICAvKiBIaWdoIHBhc3MgZmlsdGVyIG9uICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19NYXhHYWluICAgPSBMVkRCRV9BR0NfR0FJTl9UYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5FZmZlY3RMZXZlbF07ICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIG9mZiAqLworICAgIH0KKyAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfR2FpblNoaWZ0ID0gQUdDX0dBSU5fU0hJRlQ7CisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX1RhcmdldCA9IEFHQ19UQVJHRVRMRVZFTDsKKworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZEQkVfU2V0Vm9sdW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvbnZlcnRzIHRoZSBpbnB1dCB2b2x1bWUgZGVtYW5kIGZyb20gZEJzIHRvIGxpbmVhci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGUgdm9sdW1lIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgc2V0dGluZ3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgREJFICAgICAgICAgVm9sIENvbnRyb2wgICAgICAgICAgIFZvbHVtZSBzZXR0aW5nICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgID09PSAgICAgICAgID09PT09PT09PT09ICAgICAgICAgPT09PT09PT09PT09PT09PT09PSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBPZmYgICAgICAgICAgICAgT2ZmICAgICAgICAgICAgICAgICBIZWFkcm9vbWRCICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgT2ZmICAgICAgICAgICAgIE9uICAgICAgICAgICAgICBWb2x1bWVkQitIZWFkcm9vbWRCICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIE9uICAgICAgICAgICAgICBPZmYgICAgICAgICAgICAgICAgIEhlYWRyb29tZEIgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBPbiAgICAgICAgICAgICAgT24gICAgICAgICAgICAgIFZvbHVtZWRCK0hlYWRyb29tZEIgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgICAgTFZEQkVfU2V0Vm9sdW1lKExWREJFX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKK3sKKworICAgIExWTV9VSU5UMTYgICAgICBkQlNoaWZ0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDZkQiBzaGlmdHMgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgZEJPZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUYWJsZSBvZmZzZXQgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgVm9sdW1lID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXF1aXJlZCB2b2x1bWUgaW4gZEJzICovCisKKyAgICAvKgorICAgICAqIEFwcGx5IHRoZSB2b2x1bWUgaWYgZW5hYmxlZAorICAgICAqLworICAgIGlmIChwUGFyYW1zLT5Wb2x1bWVDb250cm9sID09IExWREJFX1ZPTFVNRV9PTikKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIExpbWl0IHRoZSBnYWluIHRvIHRoZSBtYXhpbXVtIGFsbG93ZWQKKyAgICAgICAgICovCisgICAgICAgIGlmICAocFBhcmFtcy0+Vm9sdW1lZEIgPiBWT0xVTUVfTUFYKQorICAgICAgICB7CisgICAgICAgICAgICBWb2x1bWUgPSBWT0xVTUVfTUFYOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgVm9sdW1lID0gcFBhcmFtcy0+Vm9sdW1lZEI7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSByZXF1aXJlZCBnYWluIGFuZCBzaGlmdHMKKyAgICAgKi8KKyAgICBkQk9mZnNldCA9IChMVk1fVUlOVDE2KSg2ICsgVm9sdW1lICUgNik7ICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIGRCcyAwLTUgKi8KKyAgICBkQlNoaWZ0cyA9IChMVk1fVUlOVDE2KShWb2x1bWUgLyAtNik7ICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIDZkQiBzaGlmdHMgKi8KKworCisgICAgLyoKKyAgICAgKiBXaGVuIERCRSBpcyBlbmFibGVkIHVzZSBBR0Mgdm9sdW1lCisgICAgICovCisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID0gKChMVk1fSU5UMzIpTFZEQkVfVm9sdW1lVGFibGVbZEJPZmZzZXRdIDw8IDE2KTsKKyAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQgPSBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQgPj4gZEJTaGlmdHM7CisKKyAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5Wb2x1bWVUQyAgICA9IExWREJFX1ZvbHVtZVRDVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07ICAgLyogVm9sdW1lIHVwZGF0ZSB0aW1lIGNvbnN0YW50ICovCisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVm9sdW1lU2hpZnQgPSBWT0xVTUVfU0hJRlQrMTsKKworICAgIC8qCisgICAgICogV2hlbiBEQkUgaXMgZGlzYWJsZWQgdXNlIHRoZSBieXBhc3Mgdm9sdW1lIGNvbnRyb2wKKyAgICAgKi8KKyAgICBpZihkQlNoaWZ0cyA+IDApCisgICAgeworICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sKCgoTFZNX0lOVDMyKUxWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSkgPj4gZEJTaGlmdHMpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLChMVk1fSU5UMzIpTFZEQkVfVm9sdW1lVGFibGVbZEJPZmZzZXRdKTsKKyAgICB9CisKKyAgICBwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSAxOworICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfTUlYRVJfVEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRnNfZW4pcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMik7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkRCRV9Db250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTZXRzIG9yIGNoYW5nZXMgdGhlIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycy4gQ2hhbmdpbmcgdGhlIHBhcmFtZXRlcnMgd2hpbGUgdGhlICAqLworLyogIG1vZHVsZSBpcyBwcm9jZXNzaW5nIHNpZ25hbHMgbWF5IGhhdmUgdGhlIGZvbGxvd2luZyBzaWRlIGVmZmVjdHM6ICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBHZW5lcmFsIHBhcmFtZXRlcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogID09PT09PT09PT09PT09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgT3BlcmF0aW5nTW9kZTogICAgICBDaGFuZ2luZyB0aGUgbW9kZSBvZiBvcGVyYXRpb24gbWF5IGNhdXNlIGEgY2hhbmdlIGluIHZvbHVtZSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgIGxldmVsIG9yIGNhdXNlIHBvcHMgYW5kIGNsaWNrcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2FtcGxlUmF0ZTogICAgICAgICBDaGFuZ2luZyB0aGUgc2FtcGxlIHJhdGUgbWF5IGNhdXNlIHBvcHMgYW5kIGNsaWNrcy4gICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEVmZmVjdExldmVsOiAgICAgICAgQ2hhbmdpbmcgdGhlIGVmZmVjdCBsZXZlbCBtYXkgY2F1c2UgcG9wcyBhbmQgY2xpY2tzICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDZW50cmVGcmVxdWVuY3k6ICAgIENoYW5naW5nIHRoZSBjZW50cmUgZnJlcXVlbmN5IG1heSBjYXVzZSBwb3BzIGFuZCBjbGlja3MgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSFBGU2VsZWN0OiAgICAgICAgICBTZWxlY3RpbmcvZGUtc2VsZWN0aW5nIHRoZSBoaWdoIHBhc3MgZmlsdGVyIG1heSBjYXVzZSBwb3BzIGFuZCAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgIGNsaWNrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVm9sdW1lZEIgICAgICAgICAgICBDaGFuZ2luZyB0aGUgdm9sdW1lIHNldHRpbmcgd2lsbCBoYXZlIG5vIHNpZGUgZWZmZWN0cyAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWREJFX1NVQ0NFU1MgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkRCRV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfQ29udHJvbChMVkRCRV9IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICAgICAqcFBhcmFtcykKK3sKKworICAgIExWREJFX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgZmlsdGVycworICAgICAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuQ2VudHJlRnJlcXVlbmN5ICE9IHBQYXJhbXMtPkNlbnRyZUZyZXF1ZW5jeSkpCisgICAgeworICAgICAgICBMVkRCRV9TZXRGaWx0ZXJzKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7ICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzICovCisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgQUdDIGlzIHRoZSBlZmZlY3QgbGV2ZWwgaGFzIGNoYW5nZWQKKyAgICAgKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLkVmZmVjdExldmVsICE9IHBQYXJhbXMtPkVmZmVjdExldmVsKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ICE9IHBQYXJhbXMtPkhQRlNlbGVjdCkpCisgICAgeworICAgICAgICBMVkRCRV9TZXRBR0MocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzICovCisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgVm9sdW1lIGlmIHRoZSB2b2x1bWUgZGVtYW5kIGhhcyBjaGFuZ2VkCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5Wb2x1bWVkQiAhPSBwUGFyYW1zLT5Wb2x1bWVkQikgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLkhlYWRyb29tZEIgIT0gcFBhcmFtcy0+SGVhZHJvb21kQikgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlZvbHVtZUNvbnRyb2wgIT0gcFBhcmFtcy0+Vm9sdW1lQ29udHJvbCkpCisgICAgeworICAgICAgICBMVkRCRV9TZXRWb2x1bWUocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzICovCisgICAgfQorCisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGU9PUxWREJFX09OICYmIHBQYXJhbXMtPk9wZXJhdGluZ01vZGU9PUxWREJFX09GRikKKyAgICB7CisgICAgICAgIExWREJFX1BhcmFtc190ICBQYXJhbXMgID0gKnBQYXJhbXM7ICAgICAgICAgICAgIC8qIG1ha2UgbG9jYWwgY29weSBvZiBwYXJhbXMgKi8KKyAgICAgICAgUGFyYW1zLkVmZmVjdExldmVsICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogemVybyBlZmZlY3QgbGV2ZWwgYmVmb3JlIHN3aXRjaGluZyBvZmYgbW9kdWxlKi8KKyAgICAgICAgcEluc3RhbmNlLT5iVHJhbnNpdGlvbk9uVG9PZmYgID0gTFZNX1RSVUU7ICAgICAgICAgICAgIC8qIFNldCB0aGUgQ2FsbEJhY2sgKi8KKyAgICAgICAgTFZEQkVfU2V0QUdDKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgJlBhcmFtcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyAqLworICAgIH0KKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZT09TFZEQkVfT0ZGICYmIHBQYXJhbXMtPk9wZXJhdGluZ01vZGU9PUxWREJFX09OKQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5iVHJhbnNpdGlvbk9uVG9PZmYgID0gTFZNX0ZBTFNFOyAgICAgLyogU2V0IHRoZSBDYWxsQmFjayAqLworICAgICAgICBMVkRCRV9TZXRBR0MocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzICovCisgICAgfQorCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPlBhcmFtcyA9ICpwUGFyYW1zOworCisKKyAgICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NTg2OWM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYwpAQCAtMCwwICsxLDI2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAkQXV0aG9yOiBueHAwMDc3NTMgJAorICAgICAkUmV2aXNpb246IDEwODEgJAorICAgICAkRGF0ZTogMjAxMC0wNy0wNSAxMTo0ODo0NCArMDIwMCAoTW9uLCAwNSBKdWwgMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWREJFLmgiCisjaW5jbHVkZSAiTFZEQkVfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkRCRV9NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICovCisvKiAgICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICovCisvKiAgICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgKi8KKy8qICBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgKi8KKy8qICB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICovCisvKiAgICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAxLiAgICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9NZW1vcnkoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX01lbVRhYl90ICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QgICAgICAqcENhcGFiaWxpdGllcykKK3sKKworICAgIExWTV9VSU5UMzIgICAgICAgICAgU2NyYXRjaFNpemU7CisgICAgTFZEQkVfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0gKExWREJFX0luc3RhbmNlX3QgKiloSW5zdGFuY2U7CisKKworICAgIC8qCisgICAgICogRmlsbCBpbiB0aGUgbWVtb3J5IHRhYmxlCisgICAgICovCisgICAgaWYgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEluc3RhbmNlIG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX0lOU1RBTkNFXS5TaXplICAgICAgICAgPSBzaXplb2YoTFZEQkVfSW5zdGFuY2VfdCk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9JTlNUQU5DRV0uQWxpZ25tZW50ICAgID0gTFZEQkVfSU5TVEFOQ0VfQUxJR047CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9JTlNUQU5DRV0uVHlwZSAgICAgICAgID0gTFZEQkVfUEVSU0lTVEVOVDsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBEYXRhIG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSAgICAgICAgID0gc2l6ZW9mKExWREJFX0RhdGFfdCk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLkFsaWdubWVudCAgICA9IExWREJFX1BFUlNJU1RFTlRfREFUQV9BTElHTjsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uVHlwZSAgICAgICAgID0gTFZEQkVfUEVSU0lTVEVOVF9EQVRBOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBDb2VmIG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gc2l6ZW9mKExWREJFX0NvZWZfdCk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLkFsaWdubWVudCAgICA9IExWREJFX1BFUlNJU1RFTlRfQ09FRl9BTElHTjsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uVHlwZSAgICAgICAgID0gTFZEQkVfUEVSU0lTVEVOVF9DT0VGOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBTY3JhdGNoIG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgU2NyYXRjaFNpemUgPSAoTFZNX1VJTlQzMikoTFZEQkVfU0NSQVRDSEJVRkZFUlNfSU5QTEFDRSpzaXplb2YoTFZNX0lOVDE2KSpwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0uU2l6ZSAgICAgICAgID0gU2NyYXRjaFNpemU7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5BbGlnbm1lbnQgICAgPSBMVkRCRV9TQ1JBVENIX0FMSUdOOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0uVHlwZSAgICAgICAgID0gTFZEQkVfU0NSQVRDSDsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBSZWFkIGJhY2sgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KKyAgICAgICAgKnBNZW1vcnlUYWJsZSA9IHBJbnN0YW5jZS0+TWVtb3J5VGFibGU7CisgICAgfQorCisgICAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWREJFX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IG1vZHVsZSAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gYWxnb3JpdGhtIGluc3RhbmNlIGJ5IGNhbGxpbmcgd2l0aCAgICAgICAgICovCisvKiAgICBoSW5zdGFuY2Ugc2V0IHRvIE5VTEwuIEluIHRoaXMgY2FzZSB0aGUgYWxnb3JpdGhtIHJldHVybnMgdGhlIG5ldyBpbnN0YW5jZSAgICAgICAgKi8KKy8qICAgIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGEgZnVsbCByZS1pbml0aWFsaXNhdGlvbiBvZiB0aGUgYWxnb3JpdGhtICAgICAgKi8KKy8qICAgIGJ5IGNhbGxpbmcgd2l0aCBoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUuIEluIHRoaXMgY2FzZSB0aGUgbWVtb3J5IHRhYmxlICAgICAgICAqLworLyogICAgc2hvdWxkIGJlIGNvcnJlY3QgZm9yIHRoZSBpbnN0YW5jZSwgdGhpcyBjYW4gYmUgZW5zdXJlZCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiAgICovCisvKiAgICBEQkVfTWVtb3J5IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWREJFX1NVQ0NFU1MgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZEQkVfQUxJR05NRU5URVJST1IgICAgSW5zdGFuY2Ugb3Igc2NyYXRjaCBtZW1vcnkgb24gaW5jb3JyZWN0IGFsaWdubWVudCAgICAgICAgICAgKi8KKy8qICAgIExWREJFX05VTExBRERSRVNTICAgICAgICBJbnN0YW5jZSBvciBzY3JhdGNoIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgICAgVGhlIGluc3RhbmNlIGhhbmRsZSBpcyB0aGUgcG9pbnRlciB0byB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBtZW1vcnkgICAqLworLyogICAgICAgIHJlZ2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAyLiAgICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkRCRV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Jbml0KExWREJFX0hhbmRsZV90ICAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX01lbVRhYl90ICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICpwQ2FwYWJpbGl0aWVzKQoreworCisgICAgTFZEQkVfSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2U7CisgICAgTFZNaXhlcjNfMVN0X3N0ICAgICAgICpwTWl4ZXJfSW5zdGFuY2U7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIGk7CisgICAgTFZNX0lOVDMyICAgICAgICAgICAgIE1peEdhaW47CisKKworICAgIC8qCisgICAgICogU2V0IHRoZSBpbnN0YW5jZSBoYW5kbGUgaWYgbm90IGFscmVhZHkgaW5pdGlhbGlzZWQKKyAgICAgKi8KKyAgICBpZiAoKnBoSW5zdGFuY2UgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICAqcGhJbnN0YW5jZSA9IChMVkRCRV9IYW5kbGVfdClwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0VdLnBCYXNlQWRkcmVzczsKKyAgICB9CisgICAgcEluc3RhbmNlID0oTFZEQkVfSW5zdGFuY2VfdCAgKikqcGhJbnN0YW5jZTsKKworCisgICAgLyoKKyAgICAgKiBDaGVjayB0aGUgbWVtb3J5IHRhYmxlIGZvciBOVUxMIHBvaW50ZXJzIGFuZCBpbmNvcnJlY3RseSBhbGlnbmVkIGRhdGEKKyAgICAgKi8KKyAgICBmb3IgKGk9MDsgaTxMVkRCRV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLlNpemUhPTApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3M9PUxWTV9OVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybihMVkRCRV9OVUxMQUREUkVTUyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKChMVk1fVUlOVDMyKXBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLnBCYXNlQWRkcmVzcyAlIHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLkFsaWdubWVudCkhPTApeworICAgICAgICAgICAgICAgIHJldHVybihMVkRCRV9BTElHTk1FTlRFUlJPUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogU2F2ZSB0aGUgbWVtb3J5IHRhYmxlIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcyA9ICpwQ2FwYWJpbGl0aWVzOworCisKKyAgICAvKgorICAgICAqIFNhdmUgdGhlIG1lbW9yeSB0YWJsZSBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlCisgICAgICovCisgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZSA9ICpwTWVtb3J5VGFibGU7CisKKworICAgIC8qCisgICAgICogU2V0IHRoZSBkZWZhdWx0IGluc3RhbmNlIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5DZW50cmVGcmVxdWVuY3kgICA9ICAgIExWREJFX0NFTlRSRV81NUhaOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLkVmZmVjdExldmVsICAgICAgID0gICAgMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5IZWFkcm9vbWRCICAgICAgICA9ICAgIDA7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ICAgICAgICAgPSAgICBMVkRCRV9IUEZfT0ZGOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgICAgID0gICAgTFZEQkVfT0ZGOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgICAgICAgID0gICAgTFZEQkVfRlNfODAwMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5Wb2x1bWVDb250cm9sICAgICA9ICAgIExWREJFX1ZPTFVNRV9PRkY7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuVm9sdW1lZEIgICAgICAgICAgPSAgICAwOworCisKKyAgICAvKgorICAgICAqIFNldCBwb2ludGVyIHRvIGRhdGEgYW5kIGNvZWYgbWVtb3J5CisgICAgICovCisgICAgcEluc3RhbmNlLT5wRGF0YSA9IHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzczsKKyAgICBwSW5zdGFuY2UtPnBDb2VmID0gcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzOworCisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIGZpbHRlcnMKKyAgICAgKi8KKyAgICBMVkRCRV9TZXRGaWx0ZXJzKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGZpbHRlciB0YXBzIGFuZCBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlBhcmFtcyk7CisKKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgQUdDCisgICAgICovCisgICAgTFZEQkVfU2V0QUdDKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBBR0MgZ2FpbiAqLworICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QYXJhbXMpOworICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19HYWluID0gcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX01heEdhaW47ICAgLyogRGVmYXVsdCB0byB0aGUgYmFzcyBib29zdCBzZXR0aW5nICovCisKKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgdm9sdW1lCisgICAgICovCisgICAgTFZEQkVfU2V0Vm9sdW1lKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgVm9sdW1lICovCisgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlBhcmFtcyk7CisKKyAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5Wb2x1bWUgPSBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQ7ICAvKiBJbml0aWFsaXNlIGFzIHRoZSB0YXJnZXQgKi8KKworICAgIHBNaXhlcl9JbnN0YW5jZSA9ICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWU7CisgICAgTWl4R2FpbiA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pOworICAgIExWQ19NaXhlcl9Jbml0KCZwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLE1peEdhaW4sTWl4R2Fpbik7CisKKyAgICAvKiBDb25maWd1cmUgdGhlIG1peGVyIHByb2Nlc3MgcGF0aCAqLworICAgIHBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSA9IDA7CisgICAgcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKKyAgICBwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayA9IExWTV9OVUxMOworICAgIHBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSAwOworCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXNlIHRoZSBjbGlja3MgbWluaW1pc2F0aW9uIHZhcmlhYmxlCisgICAgICovCisgICAgcEluc3RhbmNlLT5iVHJhbnNpdGlvbk9uVG9PZmYgICA9ICAgTFZNX0ZBTFNFOworCisgICAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZTA5Y2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaApAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAkQXV0aG9yOiBueHAwMDc3NTMgJAorICAgICAkUmV2aXNpb246IDEwODEgJAorICAgICAkRGF0ZTogMjAxMC0wNy0wNSAxMTo0ODo0NCArMDIwMCAoTW9uLCAwNSBKdWwgMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEhlYWRlciBmaWxlIGZvciB0aGUgcHJpdmF0ZSBsYXllciBpbnRlcmZhY2Ugb2YgRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IG1vZHVsZSAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlcyBpbmNsdWRlcyBhbGwgZGVmaW5pdGlvbnMsIHR5cGVzLCBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KKy8qICBwcm90b3R5cGVzIHJlcXVpcmVkIGJ5IHRoZSBleGVjdXRpb24gbGF5ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0xWREJFX1BSSVZBVEVfSF9fCisjZGVmaW5lIF9fTFZEQkVfUFJJVkFURV9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkRCRS5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FsbGluZyBvciBBcHBsaWNhdGlvbiBsYXllciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkxWQ19NaXhlci5oIgorI2luY2x1ZGUgIkFHQy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBEZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEdlbmVyYWwgKi8KKyNkZWZpbmUgICAgTFZEQkVfSU5WQUxJRCAgICAgICAgICAgIDB4RkZGRiAgICAgICAgLyogSW52YWxpZCBpbml0IHBhcmFtZXRlciAqLworCisvKiBNZW1vcnkgKi8KKyNkZWZpbmUgTFZEQkVfTUVNUkVHSU9OX0lOU1RBTkNFICAgICAgICAgMCAgICAgICAvKiBPZmZzZXQgdG8gdGhlIGluc3RhbmNlIG1lbW9yeSByZWdpb24gKi8KKyNkZWZpbmUgTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQSAgMSAgICAgICAvKiBPZmZzZXQgdG8gcGVyc2lzdGVudCBkYXRhIG1lbW9yeSByZWdpb24gKi8KKyNkZWZpbmUgTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRiAgMiAgICAgICAvKiBPZmZzZXQgdG8gcGVyc2lzdGVudCBjb2VmZmljaWVudCByZWdpb24gKi8KKyNkZWZpbmUgTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0ggICAgICAgICAgMyAgICAgICAvKiBPZmZzZXQgdG8gZGF0YSBzY3JhdGNoIG1lbW9yeSByZWdpb24gKi8KKworI2RlZmluZSBMVkRCRV9JTlNUQU5DRV9BTElHTiAgICAgICAgICAgICA0ICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIHN0cnVjdHVyZXMgKi8KKyNkZWZpbmUgTFZEQkVfUEVSU0lTVEVOVF9EQVRBX0FMSUdOICAgICAgNCAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBkYXRhICovCisjZGVmaW5lIExWREJFX1BFUlNJU1RFTlRfQ09FRl9BTElHTiAgICAgIDQgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgY29lZiAqLworI2RlZmluZSBMVkRCRV9TQ1JBVENIX0FMSUdOICAgICAgICAgICAgICA0ICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgZGF0YSAqLworCisjZGVmaW5lIExWREJFX1NDUkFUQ0hCVUZGRVJTX0lOUExBQ0UgICAgIDQgICAgICAgLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworCisjZGVmaW5lIExWREJFX01JWEVSX1RDICAgICAgICAgICAgICAgICAgIDUgICAgICAgLyogTWl4ZXIgdGltZSAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGF0YSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogQUdDIHBhcmFtZXRlcnMgKi8KKyAgICBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl90ICAgQUdDSW5zdGFuY2U7ICAgICAgICAvKiBBR0MgaW5zdGFuY2UgcGFyYW1ldGVycyAqLworCisgICAgLyogUHJvY2VzcyB2YXJpYWJsZXMgKi8KKyAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAgICAgSFBGVGFwczsgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIHRhcHMgKi8KKyAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICAgQlBGVGFwczsgICAgICAgICAgICAvKiBCYW5kIHBhc3MgZmlsdGVyIHRhcHMgKi8KKyAgICBMVk1peGVyM18xU3Rfc3QgICAgICAgICAgICAgQnlwYXNzVm9sdW1lOyAgICAgICAvKiBCeXBhc3Mgdm9sdW1lIHNjYWxlciAqLworCit9IExWREJFX0RhdGFfdDsKKworLyogQ29lZnMgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIFByb2Nlc3MgdmFyaWFibGVzICovCisgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAgIEhQRkluc3RhbmNlOyAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciBpbnN0YW5jZSAqLworICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgICBCUEZJbnN0YW5jZTsgICAgICAgIC8qIEJhbmQgcGFzcyBmaWx0ZXIgaW5zdGFuY2UgKi8KKworfSBMVkRCRV9Db2VmX3Q7CisKKy8qIEluc3RhbmNlIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBQdWJsaWMgcGFyYW1ldGVycyAqLworICAgIExWREJFX01lbVRhYl90ICAgICAgICAgICAgICAgIE1lbW9yeVRhYmxlOyAgICAgICAgLyogSW5zdGFuY2UgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KKyAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAgICAgICAgICBQYXJhbXM7ICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICAgICAgQ2FwYWJpbGl0aWVzOyAgICAgICAgIC8qIEluc3RhbmNlIGNhcGFiaWxpdGllcyAqLworCisgICAgLyogRGF0YSBhbmQgY29lZmZpY2llbnQgcG9pbnRlcnMgKi8KKyAgICBMVkRCRV9EYXRhX3QgICAgICAgICAgICAgICAgKnBEYXRhOyAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBkYXRhICovCisgICAgTFZEQkVfQ29lZl90ICAgICAgICAgICAgICAgICpwQ29lZjsgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgY29lZmZpY2llbnRzICovCisKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgYlRyYW5zaXRpb25PblRvT2ZmOworCit9IExWREJFX0luc3RhbmNlX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAgICBMVkRCRV9TZXRBR0MoTFZEQkVfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICAgICAqcFBhcmFtcyk7CisKKwordm9pZCAgICBMVkRCRV9TZXRWb2x1bWUoTFZEQkVfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICAqcFBhcmFtcyk7CisKKwordm9pZCAgICBMVkRCRV9TZXRGaWx0ZXJzKExWREJFX0luc3RhbmNlX3QgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAqcFBhcmFtcyk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAgICAgLyogX19MVkRCRV9QUklWQVRFX0hfXyAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM1ZWVjMDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IG54cDAwNzc1MyAkCisgICAgICRSZXZpc2lvbjogMTA4MSAkCisgICAgICREYXRlOiAyMDEwLTA3LTA1IDExOjQ4OjQ0ICswMjAwIChNb24sIDA1IEp1bCAyMDEwKSAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZEQkUuaCIKKyNpbmNsdWRlICJMVkRCRV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkFHQy5oIgorI2luY2x1ZGUgIkxWREJFX0NvZWZmcy5oIiAgICAgICAgICAgICAgIC8qIEZpbHRlciBjb2VmZmljaWVudHMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWREJFX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHJvY2VzcyBmdW5jdGlvbiBmb3IgdGhlIEJhc3MgRW5oYW5jZW1lbnQgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0YSBjYW4gYmUgcHJvY2Vzc2VkIGluIHR3byBmb3JtYXRzLCBzdGVyZW8gb3IgbW9uby1pbi1zdGVyZW8uIERhdGEgaW4gbW9ubyAgICAgICAgICAgICovCisvKiAgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQsIHRoZSBjYWxsaW5nIHJvdXRpbmUgbXVzdCBjb252ZXJ0IHRoZSBtb25vIHN0cmVhbSB0byAgICAgICAgICAgICovCisvKiAgbW9uby1pbi1zdGVyZW8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBfX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgIF9fX19fX19fICAgICAgICAgICovCisvKiAgICAgIHwgICAgICAgIHwgICAgX19fX18gICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT58ICAgICAgICAgICB8ICAgfCAgICAgICAgfCAgICAgICAgICovCisvKiAgICAgIHwgMTYtYml0IHwgICB8ICAgICB8ICB8ICAgIF9fX19fX19fICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgfCAzMi1iaXQgfCAgICAgICAgICovCisvKiAtKy0tPnwgICB0byAgIHwtLT58IEhQRiB8LS18ICAgfCAgICAgICAgfCAgICBfX19fXyAgICB8IEFHQyBNaXhlciB8LS0+fCAgIHRvICAgfC0tfCAgICAgICovCisvKiAgfCAgIHwgMzItYml0IHwgICB8X19fX198ICB8ICAgfCBTdGVyZW8gfCAgIHwgICAgIHwgICB8ICAgICAgICAgICB8ICAgfCAxNi1iaXQgfCAgfCAgICAgICovCisvKiAgfCAgIHxfX19fX19fX3wgICAgICAgICAgICB8LS0+fCAgIHRvICAgfC0tPnwgQlBGIHwtLT58ICAgICAgICAgICB8ICAgfF9fX19fX19ffCAgMCAgICAgICovCisvKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgTW9ubyAgfCAgIHxfX19fX3wgICB8X19fX19fX19fX198ICAgICAgICAgICAgICAgIFwtLT4gICovCisvKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fX19fICAgICAgICAgICAgICAgICAgMCAgICAgICovCisvKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICovCisvKiAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IFZvbHVtZSAgfC0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENvbnRyb2wgfCAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluRGF0YSAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnVtU2FtcGxlcyAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBMVkRCRV9UT09NQU5ZU0FNUExFUyAgICBOdW1TYW1wbGVzIHdhcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSBibG9jayBzaXplICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBtdXN0IGJlIDMyLWJpdCBmb3JtYXQuIFRoZSBpbnB1dCBpcyBzY2FsZWQgYnkgYSBzaGlmdCAgICAgICovCisvKiAgICAgd2hlbiBjb252ZXJ0aW5nIGZyb20gMTYtYml0IGZvcm1hdCwgdGhpcyBzY2FsaW5nIGFsbG93cyBmb3IgaW50ZXJuYWwgaGVhZHJvb20gaW4gdGhlICovCisvKiAgICAgYmFzcyBlbmhhbmNlbWVudCBhbGdvcml0aG0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMi4gRm9yIGEgMTYtYml0IGltcGxlbWVudGF0aW9uIHRoZSBjb252ZXJzdGlvbiB0byAzMi1iaXQgaXMgcmVtb3ZlZCBhbmQgcmVwbGFjZWQgd2l0aCAgICovCisvKiAgICAgdGhlIGhlYWRyb29tIGxvc3MuIFRoaXMgaGVhZHJvb20gbG9zcyBpcyBjb21wZW5zYXRlZCBpbiB0aGUgdm9sdW1lIGNvbnRyb2wgc28gdGhlICAgICovCisvKiAgICAgb3ZlcmFsbCBlbmQgdG8gZW5kIGdhaW4gaXMgb2RCLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Qcm9jZXNzKExWREJFX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CisKKyAgICBMVkRCRV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICpwU2NyYXRjaCAgPSAoTFZNX0lOVDMyICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICpwTW9ubyAgICAgPSAoTFZNX0lOVDMyICopcE91dERhdGE7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAqcElucHV0ICAgID0gKExWTV9JTlQxNiAqKXBJbkRhdGE7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICAgKi8KKyAgICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybihMVkRCRV9UT09NQU5ZU0FNUExFUyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgYWxnb3JpdGhtIGlzIGVuYWJsZWQKKyAgICAgKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgIT0gTFZEQkVfT0ZGKSB8fAorICAgICAgICAocEluc3RhbmNlLT5iVHJhbnNpdGlvbk9uVG9PZmYgPT0gTFZNX1RSVUUpKQorICAgIHsKKworICAgICAgICAvKgorICAgICAgICAgKiBDb252ZXJ0IDE2LWJpdCBzYW1wbGVzIHRvIDMyLWJpdCBhbmQgc2NhbGUKKyAgICAgICAgICogKEZvciBhIDE2LWJpdCBpbXBsZW1lbnRhdGlvbiBhcHBseSBoZWFkcm9vbSBsb3NzIGhlcmUpCisgICAgICAgICAqLworICAgICAgICBJbnQxNkxTaGlmdFRvSW50MzJfMTZ4MzIocElucHV0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgMTYtYml0IGRhdGEgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAzMi1iaXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSwgICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfU0NBTEVTSElGVCk7ICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdCBzY2FsZSAgICAgICAgICAgICAqLworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgaWYgc2VsZWN0ZWQKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5IUEZTZWxlY3QgPT0gTFZEQkVfSFBGX09OKQorICAgICAgICB7CisgICAgICAgICAgICAgIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwgICAgLyogRmlsdGVyIGluc3RhbmNlICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIgKilwU2NyYXRjaCwgICAgICAgICAgICAgICAvKiBTb3VyY2UgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMiAqKXBTY3JhdGNoLCAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICAgKi8KKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ3JlYXRlIHRoZSBtb25vIHN0cmVhbQorICAgICAgICAgKi8KKyAgICAgICAgRnJvbTJpVG9Nb25vXzMyKHBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBNb25vLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9ubyBkZXN0aW5hdGlvbiAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICAgKi8KKworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBiYW5kIHBhc3MgZmlsdGVyCisgICAgICAgICAqLworICAgICAgICAgIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyKCZwSW5zdGFuY2UtPnBDb2VmLT5CUEZJbnN0YW5jZSwgICAgIC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIgKilwTW9ubywgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIgKilwTW9ubywgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAgICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgQUdDIGFuZCBtaXgKKyAgICAgICAgICovCisgICAgICAgIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQSgmcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UsICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTW9ubywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAgICovCisKKyAgICAgICAgaWYocEluc3RhbmNlLT5iVHJhbnNpdGlvbk9uVG9PZmYgPT0gTFZNX1RSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX0dhaW4gPT0gcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX1RhcmdldCkmJgorICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfR2FpbiA9PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5iVHJhbnNpdGlvbk9uVG9PZmYgPSBMVk1fRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29udmVydCAzMi1iaXQgc2FtcGxlcyB0byAxNi1iaXQgYW5kIHNhdHVyYXRlCisgICAgICAgICAqIChOb3QgcmVxdWlyZWQgZm9yIDE2LWJpdCBpbXBsZW1lbmF0aW9ucykKKyAgICAgICAgICovCisgICAgICAgIEludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYocFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAzMi1iaXQgZGF0YSAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIDE2LWJpdCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSwgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfU0NBTEVTSElGVCk7ICAgICAgICAgICAgICAgIC8qIFNoaWZ0IHNjYWxlICAgICAgICAgICAgICovCisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIGJ1dCB2b2x1bWUgbWFuYWdlbWVudCBpcyByZXF1aXJlZCB0byBjb21wZW5zYXRlIGZvcgorICAgICAgICAgKiBoZWFkcm9vbSBhbmQgdm9sdW1lIChpZiBlbmFibGVkKQorICAgICAgICAgKi8KKyAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcykpOyAgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICAgICovCisKKyAgICB9CisKKyAgICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7Cit9CisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYThjYTVhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jCkBAIC0wLDAgKzEsNDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDA5ICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMjggMTQ6MTQ6MTUgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWREJFLmgiCisjaW5jbHVkZSAiTFZEQkVfQ29lZmZzLmgiICAgICAgICAgICAgICAgLyogRmlsdGVyIGNvZWZmaWNpZW50cyAqLworI2luY2x1ZGUgIkJJUVVBRC5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQ29lZmZpY2llbnRzIGNvbnN0YW50IHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogSGlnaCBQYXNzIEZpbHRlciBDb2VmZmljaWVudCB0YWJsZQorICovCitjb25zdCBCUV9DMzJfQ29lZnNfdCBMVkRCRV9IUEZfVGFibGVbXSA9IHsKKyAgICAvKiBDb2VmZmljaWVudHMgZm9yIDU1SHogY2VudHJlIGZyZXF1ZW5jeSAqLworICAgIHtIUEZfRnM4MDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM4MDAwX0ZjNTVfQTEsCisgICAgIEhQRl9GczgwMDBfRmM1NV9BMCwKKyAgICAgLUhQRl9GczgwMDBfRmM1NV9CMiwKKyAgICAgLUhQRl9GczgwMDBfRmM1NV9CMX0sCisgICAge0hQRl9GczExMDI1X0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTEwMjVfRmM1NV9BMSwKKyAgICAgSFBGX0ZzMTEwMjVfRmM1NV9BMCwKKyAgICAgLUhQRl9GczExMDI1X0ZjNTVfQjIsCisgICAgIC1IUEZfRnMxMTAyNV9GYzU1X0IxfSwKKyAgICB7SFBGX0ZzMTIwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxMjAwMF9GYzU1X0ExLAorICAgICBIUEZfRnMxMjAwMF9GYzU1X0EwLAorICAgICAtSFBGX0ZzMTIwMDBfRmM1NV9CMiwKKyAgICAgLUhQRl9GczEyMDAwX0ZjNTVfQjF9LAorICAgIHtIUEZfRnMxNjAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE2MDAwX0ZjNTVfQTEsCisgICAgIEhQRl9GczE2MDAwX0ZjNTVfQTAsCisgICAgIC1IUEZfRnMxNjAwMF9GYzU1X0IyLAorICAgICAtSFBGX0ZzMTYwMDBfRmM1NV9CMX0sCisgICAge0hQRl9GczIyMDUwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMjIwNTBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzMjIwNTBfRmM1NV9BMCwKKyAgICAgLUhQRl9GczIyMDUwX0ZjNTVfQjIsCisgICAgIC1IUEZfRnMyMjA1MF9GYzU1X0IxfSwKKyAgICB7SFBGX0ZzMjQwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMyNDAwMF9GYzU1X0ExLAorICAgICBIUEZfRnMyNDAwMF9GYzU1X0EwLAorICAgICAtSFBGX0ZzMjQwMDBfRmM1NV9CMiwKKyAgICAgLUhQRl9GczI0MDAwX0ZjNTVfQjF9LAorICAgIHtIUEZfRnMzMjAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczMyMDAwX0ZjNTVfQTEsCisgICAgIEhQRl9GczMyMDAwX0ZjNTVfQTAsCisgICAgIC1IUEZfRnMzMjAwMF9GYzU1X0IyLAorICAgICAtSFBGX0ZzMzIwMDBfRmM1NV9CMX0sCisgICAge0hQRl9GczQ0MTAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzNDQxMDBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzNDQxMDBfRmM1NV9BMCwKKyAgICAgLUhQRl9GczQ0MTAwX0ZjNTVfQjIsCisgICAgIC1IUEZfRnM0NDEwMF9GYzU1X0IxfSwKKyAgICB7SFBGX0ZzNDgwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM0ODAwMF9GYzU1X0ExLAorICAgICBIUEZfRnM0ODAwMF9GYzU1X0EwLAorICAgICAtSFBGX0ZzNDgwMDBfRmM1NV9CMiwKKyAgICAgLUhQRl9GczQ4MDAwX0ZjNTVfQjF9LAorCisgICAgLyogQ29lZmZpY2llbnRzIGZvciA2Nkh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICB7SFBGX0ZzODAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzODAwMF9GYzY2X0ExLAorICAgICBIUEZfRnM4MDAwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnM4MDAwX0ZjNjZfQjIsCisgICAgIC1IUEZfRnM4MDAwX0ZjNjZfQjF9LAorICAgIHtIUEZfRnMxMTAyNV9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczExMDI1X0ZjNjZfQTEsCisgICAgIEhQRl9GczExMDI1X0ZjNjZfQTAsCisgICAgIC1IUEZfRnMxMTAyNV9GYzY2X0IyLAorICAgICAtSFBGX0ZzMTEwMjVfRmM2Nl9CMX0sCisgICAge0hQRl9GczEyMDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTIwMDBfRmM2Nl9BMSwKKyAgICAgSFBGX0ZzMTIwMDBfRmM2Nl9BMCwKKyAgICAgLUhQRl9GczEyMDAwX0ZjNjZfQjIsCisgICAgIC1IUEZfRnMxMjAwMF9GYzY2X0IxfSwKKyAgICB7SFBGX0ZzMTYwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxNjAwMF9GYzY2X0ExLAorICAgICBIUEZfRnMxNjAwMF9GYzY2X0EwLAorICAgICAtSFBGX0ZzMTYwMDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9GczE2MDAwX0ZjNjZfQjF9LAorICAgIHtIUEZfRnMyMjA1MF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczIyMDUwX0ZjNjZfQTEsCisgICAgIEhQRl9GczIyMDUwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnMyMjA1MF9GYzY2X0IyLAorICAgICAtSFBGX0ZzMjIwNTBfRmM2Nl9CMX0sCisgICAge0hQRl9GczI0MDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMjQwMDBfRmM2Nl9BMSwKKyAgICAgSFBGX0ZzMjQwMDBfRmM2Nl9BMCwKKyAgICAgLUhQRl9GczI0MDAwX0ZjNjZfQjIsCisgICAgIC1IUEZfRnMyNDAwMF9GYzY2X0IxfSwKKyAgICB7SFBGX0ZzMzIwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMzMjAwMF9GYzY2X0ExLAorICAgICBIUEZfRnMzMjAwMF9GYzY2X0EwLAorICAgICAtSFBGX0ZzMzIwMDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9GczMyMDAwX0ZjNjZfQjF9LAorICAgIHtIUEZfRnM0NDEwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczQ0MTAwX0ZjNjZfQTEsCisgICAgIEhQRl9GczQ0MTAwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnM0NDEwMF9GYzY2X0IyLAorICAgICAtSFBGX0ZzNDQxMDBfRmM2Nl9CMX0sCisgICAge0hQRl9GczQ4MDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzNDgwMDBfRmM2Nl9BMSwKKyAgICAgSFBGX0ZzNDgwMDBfRmM2Nl9BMCwKKyAgICAgLUhQRl9GczQ4MDAwX0ZjNjZfQjIsCisgICAgIC1IUEZfRnM0ODAwMF9GYzY2X0IxfSwKKworICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNzhIeiBjZW50cmUgZnJlcXVlbmN5ICovCisgICAge0hQRl9GczgwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczgwMDBfRmM3OF9BMSwKKyAgICAgSFBGX0ZzODAwMF9GYzc4X0EwLAorICAgICAtSFBGX0ZzODAwMF9GYzc4X0IyLAorICAgICAtSFBGX0ZzODAwMF9GYzc4X0IxfSwKKyAgICB7SFBGX0ZzMTEwMjVfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxMTAyNV9GYzc4X0ExLAorICAgICBIUEZfRnMxMTAyNV9GYzc4X0EwLAorICAgICAtSFBGX0ZzMTEwMjVfRmM3OF9CMiwKKyAgICAgLUhQRl9GczExMDI1X0ZjNzhfQjF9LAorICAgIHtIUEZfRnMxMjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczEyMDAwX0ZjNzhfQTEsCisgICAgIEhQRl9GczEyMDAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnMxMjAwMF9GYzc4X0IyLAorICAgICAtSFBGX0ZzMTIwMDBfRmM3OF9CMX0sCisgICAge0hQRl9GczE2MDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTYwMDBfRmM3OF9BMSwKKyAgICAgSFBGX0ZzMTYwMDBfRmM3OF9BMCwKKyAgICAgLUhQRl9GczE2MDAwX0ZjNzhfQjIsCisgICAgIC1IUEZfRnMxNjAwMF9GYzc4X0IxfSwKKyAgICB7SFBGX0ZzMjIwNTBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMyMjA1MF9GYzc4X0ExLAorICAgICBIUEZfRnMyMjA1MF9GYzc4X0EwLAorICAgICAtSFBGX0ZzMjIwNTBfRmM3OF9CMiwKKyAgICAgLUhQRl9GczIyMDUwX0ZjNzhfQjF9LAorICAgIHtIUEZfRnMyNDAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczI0MDAwX0ZjNzhfQTEsCisgICAgIEhQRl9GczI0MDAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnMyNDAwMF9GYzc4X0IyLAorICAgICAtSFBGX0ZzMjQwMDBfRmM3OF9CMX0sCisgICAge0hQRl9GczMyMDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMzIwMDBfRmM3OF9BMSwKKyAgICAgSFBGX0ZzMzIwMDBfRmM3OF9BMCwKKyAgICAgLUhQRl9GczMyMDAwX0ZjNzhfQjIsCisgICAgIC1IUEZfRnMzMjAwMF9GYzc4X0IxfSwKKyAgICB7SFBGX0ZzNDQxMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM0NDEwMF9GYzc4X0ExLAorICAgICBIUEZfRnM0NDEwMF9GYzc4X0EwLAorICAgICAtSFBGX0ZzNDQxMDBfRmM3OF9CMiwKKyAgICAgLUhQRl9GczQ0MTAwX0ZjNzhfQjF9LAorICAgIHtIUEZfRnM0ODAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczQ4MDAwX0ZjNzhfQTEsCisgICAgIEhQRl9GczQ4MDAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnM0ODAwMF9GYzc4X0IyLAorICAgICAtSFBGX0ZzNDgwMDBfRmM3OF9CMX0sCisKKyAgICAvKiBDb2VmZmljaWVudHMgZm9yIDkwSHogY2VudHJlIGZyZXF1ZW5jeSAqLworICAgIHtIUEZfRnM4MDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM4MDAwX0ZjOTBfQTEsCisgICAgIEhQRl9GczgwMDBfRmM5MF9BMCwKKyAgICAgLUhQRl9GczgwMDBfRmM5MF9CMiwKKyAgICAgLUhQRl9GczgwMDBfRmM5MF9CMX0sCisgICAge0hQRl9GczExMDI1X0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTEwMjVfRmM5MF9BMSwKKyAgICAgSFBGX0ZzMTEwMjVfRmM5MF9BMCwKKyAgICAgLUhQRl9GczExMDI1X0ZjOTBfQjIsCisgICAgIC1IUEZfRnMxMTAyNV9GYzkwX0IxfSwKKyAgICB7SFBGX0ZzMTIwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxMjAwMF9GYzkwX0ExLAorICAgICBIUEZfRnMxMjAwMF9GYzkwX0EwLAorICAgICAtSFBGX0ZzMTIwMDBfRmM5MF9CMiwKKyAgICAgLUhQRl9GczEyMDAwX0ZjOTBfQjF9LAorICAgIHtIUEZfRnMxNjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE2MDAwX0ZjOTBfQTEsCisgICAgIEhQRl9GczE2MDAwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnMxNjAwMF9GYzkwX0IyLAorICAgICAtSFBGX0ZzMTYwMDBfRmM5MF9CMX0sCisgICAge0hQRl9GczIyMDUwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMjIwNTBfRmM5MF9BMSwKKyAgICAgSFBGX0ZzMjIwNTBfRmM5MF9BMCwKKyAgICAgLUhQRl9GczIyMDUwX0ZjOTBfQjIsCisgICAgIC1IUEZfRnMyMjA1MF9GYzkwX0IxfSwKKyAgICB7SFBGX0ZzMjQwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMyNDAwMF9GYzkwX0ExLAorICAgICBIUEZfRnMyNDAwMF9GYzkwX0EwLAorICAgICAtSFBGX0ZzMjQwMDBfRmM5MF9CMiwKKyAgICAgLUhQRl9GczI0MDAwX0ZjOTBfQjF9LAorICAgIHtIUEZfRnMzMjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczMyMDAwX0ZjOTBfQTEsCisgICAgIEhQRl9GczMyMDAwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnMzMjAwMF9GYzkwX0IyLAorICAgICAtSFBGX0ZzMzIwMDBfRmM5MF9CMX0sCisgICAge0hQRl9GczQ0MTAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzNDQxMDBfRmM5MF9BMSwKKyAgICAgSFBGX0ZzNDQxMDBfRmM5MF9BMCwKKyAgICAgLUhQRl9GczQ0MTAwX0ZjOTBfQjIsCisgICAgIC1IUEZfRnM0NDEwMF9GYzkwX0IxfSwKKyAgICB7SFBGX0ZzNDgwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM0ODAwMF9GYzkwX0ExLAorICAgICBIUEZfRnM0ODAwMF9GYzkwX0EwLAorICAgICAtSFBGX0ZzNDgwMDBfRmM5MF9CMiwKKyAgICAgLUhQRl9GczQ4MDAwX0ZjOTBfQjF9fTsKKworLyoKKyAqIEJhbmQgUGFzcyBGaWx0ZXIgY29lZmZpY2llbnQgdGFibGUKKyAqLworY29uc3QgQlBfQzMyX0NvZWZzX3QgTFZEQkVfQlBGX1RhYmxlW10gPSB7CisgICAgLyogQ29lZmZpY2llbnRzIGZvciA1NUh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICB7QlBGX0ZzODAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczgwMDBfRmM1NV9CMiwKKyAgICAgLUJQRl9GczgwMDBfRmM1NV9CMX0sCisgICAge0JQRl9GczExMDI1X0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczExMDI1X0ZjNTVfQjIsCisgICAgIC1CUEZfRnMxMTAyNV9GYzU1X0IxfSwKKyAgICB7QlBGX0ZzMTIwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTIwMDBfRmM1NV9CMiwKKyAgICAgLUJQRl9GczEyMDAwX0ZjNTVfQjF9LAorICAgIHtCUEZfRnMxNjAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxNjAwMF9GYzU1X0IyLAorICAgICAtQlBGX0ZzMTYwMDBfRmM1NV9CMX0sCisgICAge0JQRl9GczIyMDUwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczIyMDUwX0ZjNTVfQjIsCisgICAgIC1CUEZfRnMyMjA1MF9GYzU1X0IxfSwKKyAgICB7QlBGX0ZzMjQwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMjQwMDBfRmM1NV9CMiwKKyAgICAgLUJQRl9GczI0MDAwX0ZjNTVfQjF9LAorICAgIHtCUEZfRnMzMjAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMzMjAwMF9GYzU1X0IyLAorICAgICAtQlBGX0ZzMzIwMDBfRmM1NV9CMX0sCisgICAge0JQRl9GczQ0MTAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczQ0MTAwX0ZjNTVfQjIsCisgICAgIC1CUEZfRnM0NDEwMF9GYzU1X0IxfSwKKyAgICB7QlBGX0ZzNDgwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzNDgwMDBfRmM1NV9CMiwKKyAgICAgLUJQRl9GczQ4MDAwX0ZjNTVfQjF9LAorCisgICAgLyogQ29lZmZpY2llbnRzIGZvciA2Nkh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICB7QlBGX0ZzODAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczgwMDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9GczgwMDBfRmM2Nl9CMX0sCisgICAge0JQRl9GczExMDI1X0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczExMDI1X0ZjNjZfQjIsCisgICAgIC1CUEZfRnMxMTAyNV9GYzY2X0IxfSwKKyAgICB7QlBGX0ZzMTIwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTIwMDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9GczEyMDAwX0ZjNjZfQjF9LAorICAgIHtCUEZfRnMxNjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxNjAwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzMTYwMDBfRmM2Nl9CMX0sCisgICAge0JQRl9GczIyMDUwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczIyMDUwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnMyMjA1MF9GYzY2X0IxfSwKKyAgICB7QlBGX0ZzMjQwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMjQwMDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9GczI0MDAwX0ZjNjZfQjF9LAorICAgIHtCUEZfRnMzMjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMzMjAwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzMzIwMDBfRmM2Nl9CMX0sCisgICAge0JQRl9GczQ0MTAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczQ0MTAwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnM0NDEwMF9GYzY2X0IxfSwKKyAgICB7QlBGX0ZzNDgwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzNDgwMDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9GczQ4MDAwX0ZjNjZfQjF9LAorCisgICAgLyogQ29lZmZpY2llbnRzIGZvciA3OEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICB7QlBGX0ZzODAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczgwMDBfRmM3OF9CMiwKKyAgICAgLUJQRl9GczgwMDBfRmM3OF9CMX0sCisgICAge0JQRl9GczExMDI1X0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczExMDI1X0ZjNzhfQjIsCisgICAgIC1CUEZfRnMxMTAyNV9GYzc4X0IxfSwKKyAgICB7QlBGX0ZzMTIwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTIwMDBfRmM3OF9CMiwKKyAgICAgLUJQRl9GczEyMDAwX0ZjNzhfQjF9LAorICAgIHtCUEZfRnMxNjAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxNjAwMF9GYzc4X0IyLAorICAgICAtQlBGX0ZzMTYwMDBfRmM3OF9CMX0sCisgICAge0JQRl9GczIyMDUwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczIyMDUwX0ZjNzhfQjIsCisgICAgIC1CUEZfRnMyMjA1MF9GYzc4X0IxfSwKKyAgICB7QlBGX0ZzMjQwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMjQwMDBfRmM3OF9CMiwKKyAgICAgLUJQRl9GczI0MDAwX0ZjNzhfQjF9LAorICAgIHtCUEZfRnMzMjAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMzMjAwMF9GYzc4X0IyLAorICAgICAtQlBGX0ZzMzIwMDBfRmM3OF9CMX0sCisgICAge0JQRl9GczQ0MTAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczQ0MTAwX0ZjNzhfQjIsCisgICAgIC1CUEZfRnM0NDEwMF9GYzc4X0IxfSwKKyAgICB7QlBGX0ZzNDgwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzNDgwMDBfRmM3OF9CMiwKKyAgICAgLUJQRl9GczQ4MDAwX0ZjNzhfQjF9LAorCisgICAgLyogQ29lZmZpY2llbnRzIGZvciA5MEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICB7QlBGX0ZzODAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczgwMDBfRmM5MF9CMiwKKyAgICAgLUJQRl9GczgwMDBfRmM5MF9CMX0sCisgICAge0JQRl9GczExMDI1X0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczExMDI1X0ZjOTBfQjIsCisgICAgIC1CUEZfRnMxMTAyNV9GYzkwX0IxfSwKKyAgICB7QlBGX0ZzMTIwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTIwMDBfRmM5MF9CMiwKKyAgICAgLUJQRl9GczEyMDAwX0ZjOTBfQjF9LAorICAgIHtCUEZfRnMxNjAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxNjAwMF9GYzkwX0IyLAorICAgICAtQlBGX0ZzMTYwMDBfRmM5MF9CMX0sCisgICAge0JQRl9GczIyMDUwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczIyMDUwX0ZjOTBfQjIsCisgICAgIC1CUEZfRnMyMjA1MF9GYzkwX0IxfSwKKyAgICB7QlBGX0ZzMjQwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMjQwMDBfRmM5MF9CMiwKKyAgICAgLUJQRl9GczI0MDAwX0ZjOTBfQjF9LAorICAgIHtCUEZfRnMzMjAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMzMjAwMF9GYzkwX0IyLAorICAgICAtQlBGX0ZzMzIwMDBfRmM5MF9CMX0sCisgICAge0JQRl9GczQ0MTAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczQ0MTAwX0ZjOTBfQjIsCisgICAgIC1CUEZfRnM0NDEwMF9GYzkwX0IxfSwKKyAgICB7QlBGX0ZzNDgwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzNDgwMDBfRmM5MF9CMiwKKyAgICAgLUJQRl9GczQ4MDAwX0ZjOTBfQjF9fTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFHQyBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQXR0YWNrIHRpbWUgKHNpZ25hbCB0b28gbGFyZ2UpICovCitjb25zdCBMVk1fSU5UMTYgTFZEQkVfQUdDX0FUVEFDS19UYWJsZVtdID0geworICAgIEFHQ19BVFRBQ0tfRnM4MDAwLAorICAgIEFHQ19BVFRBQ0tfRnMxMTAyNSwKKyAgICBBR0NfQVRUQUNLX0ZzMTIwMDAsCisgICAgQUdDX0FUVEFDS19GczE2MDAwLAorICAgIEFHQ19BVFRBQ0tfRnMyMjA1MCwKKyAgICBBR0NfQVRUQUNLX0ZzMjQwMDAsCisgICAgQUdDX0FUVEFDS19GczMyMDAwLAorICAgIEFHQ19BVFRBQ0tfRnM0NDEwMCwKKyAgICBBR0NfQVRUQUNLX0ZzNDgwMDB9OworCisvKiBEZWNheSB0aW1lIChzaWduYWwgdG9vIHNtYWxsKSAqLworY29uc3QgTFZNX0lOVDE2IExWREJFX0FHQ19ERUNBWV9UYWJsZVtdID0geworICAgIEFHQ19ERUNBWV9GczgwMDAsCisgICAgQUdDX0RFQ0FZX0ZzMTEwMjUsCisgICAgQUdDX0RFQ0FZX0ZzMTIwMDAsCisgICAgQUdDX0RFQ0FZX0ZzMTYwMDAsCisgICAgQUdDX0RFQ0FZX0ZzMjIwNTAsCisgICAgQUdDX0RFQ0FZX0ZzMjQwMDAsCisgICAgQUdDX0RFQ0FZX0ZzMzIwMDAsCisgICAgQUdDX0RFQ0FZX0ZzNDQxMDAsCisgICAgQUdDX0RFQ0FZX0ZzNDgwMDB9OworCisvKiBHYWluIGZvciB1c2Ugd2l0aG91dCB0aGUgaGlnaCBwYXNzIGZpbHRlciAqLworY29uc3QgTFZNX0lOVDMyIExWREJFX0FHQ19HQUlOX1RhYmxlW10gPSB7CisgICAgQUdDX0dBSU5fMGRCLAorICAgIEFHQ19HQUlOXzFkQiwKKyAgICBBR0NfR0FJTl8yZEIsCisgICAgQUdDX0dBSU5fM2RCLAorICAgIEFHQ19HQUlOXzRkQiwKKyAgICBBR0NfR0FJTl81ZEIsCisgICAgQUdDX0dBSU5fNmRCLAorICAgIEFHQ19HQUlOXzdkQiwKKyAgICBBR0NfR0FJTl84ZEIsCisgICAgQUdDX0dBSU5fOWRCLAorICAgIEFHQ19HQUlOXzEwZEIsCisgICAgQUdDX0dBSU5fMTFkQiwKKyAgICBBR0NfR0FJTl8xMmRCLAorICAgIEFHQ19HQUlOXzEzZEIsCisgICAgQUdDX0dBSU5fMTRkQiwKKyAgICBBR0NfR0FJTl8xNWRCfTsKKworLyogR2FpbiBmb3IgdXNlIHdpdGggdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgKi8KK2NvbnN0IExWTV9JTlQzMiBMVkRCRV9BR0NfSFBGR0FJTl9UYWJsZVtdID0geworICAgIEFHQ19IUEZHQUlOXzBkQiwKKyAgICBBR0NfSFBGR0FJTl8xZEIsCisgICAgQUdDX0hQRkdBSU5fMmRCLAorICAgIEFHQ19IUEZHQUlOXzNkQiwKKyAgICBBR0NfSFBGR0FJTl80ZEIsCisgICAgQUdDX0hQRkdBSU5fNWRCLAorICAgIEFHQ19IUEZHQUlOXzZkQiwKKyAgICBBR0NfSFBGR0FJTl83ZEIsCisgICAgQUdDX0hQRkdBSU5fOGRCLAorICAgIEFHQ19IUEZHQUlOXzlkQiwKKyAgICBBR0NfSFBGR0FJTl8xMGRCLAorICAgIEFHQ19IUEZHQUlOXzExZEIsCisgICAgQUdDX0hQRkdBSU5fMTJkQiwKKyAgICBBR0NfSFBGR0FJTl8xM2RCLAorICAgIEFHQ19IUEZHQUlOXzE0ZEIsCisgICAgQUdDX0hQRkdBSU5fMTVkQn07CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBWb2x1bWUgY29udHJvbCBnYWluIGFuZCB0aW1lIGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGRCIHRvIGxpbmVhciBjb252ZXJzaW9uIHRhYmxlICovCitjb25zdCBMVk1fSU5UMTYgTFZEQkVfVm9sdW1lVGFibGVbXSA9IHsKKyAgICAweDQwMDAsICAgICAgICAgICAgIC8qIC02ZEIgKi8KKyAgICAweDQ3RkIsICAgICAgICAgICAgIC8qIC01ZEIgKi8KKyAgICAweDUwQzMsICAgICAgICAgICAgIC8qIC00ZEIgKi8KKyAgICAweDVBOUUsICAgICAgICAgICAgIC8qIC0zZEIgKi8KKyAgICAweDY1QUQsICAgICAgICAgICAgIC8qIC0yZEIgKi8KKyAgICAweDcyMTUsICAgICAgICAgICAgIC8qIC0xZEIgKi8KKyAgICAweDdGRkZ9OyAgICAgICAgICAgIC8qICAwZEIgKi8KKworY29uc3QgTFZNX0lOVDE2IExWREJFX1ZvbHVtZVRDVGFibGVbXSA9IHsKKyAgICBWT0xfVENfRnM4MDAwLAorICAgIFZPTF9UQ19GczExMDI1LAorICAgIFZPTF9UQ19GczEyMDAwLAorICAgIFZPTF9UQ19GczE2MDAwLAorICAgIFZPTF9UQ19GczIyMDUwLAorICAgIFZPTF9UQ19GczI0MDAwLAorICAgIFZPTF9UQ19GczMyMDAwLAorICAgIFZPTF9UQ19GczQ0MTAwLAorICAgIFZPTF9UQ19GczQ4MDAwfTsKKworY29uc3QgTFZNX0lOVDE2IExWREJFX01peGVyVENUYWJsZVtdID0geworICAgIE1JWF9UQ19GczgwMDAsCisgICAgTUlYX1RDX0ZzMTEwMjUsCisgICAgTUlYX1RDX0ZzMTIwMDAsCisgICAgTUlYX1RDX0ZzMTYwMDAsCisgICAgTUlYX1RDX0ZzMjIwNTAsCisgICAgTUlYX1RDX0ZzMjQwMDAsCisgICAgTUlYX1RDX0ZzMzIwMDAsCisgICAgTUlYX1RDX0ZzNDQxMDAsCisgICAgTUlYX1RDX0ZzNDgwMDB9OworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40Y2I2ZDIxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkCisgICAgICRSZXZpc2lvbjogMTAwOSAkCisgICAgICREYXRlOiAyMDEwLTA2LTI4IDE0OjE0OjE1ICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9fTFZCREVfVEFCTEVTX0hfXworI2RlZmluZSBfX0xWQkRFX1RBQkxFU19IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQ29lZmZpY2llbnRzIGNvbnN0YW50IHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogSGlnaCBQYXNzIEZpbHRlciBDb2VmZmljaWVudCB0YWJsZQorICovCitleHRlcm4gY29uc3QgQlFfQzMyX0NvZWZzX3QgTFZEQkVfSFBGX1RhYmxlW107CisKKy8qCisgKiBCYW5kIFBhc3MgRmlsdGVyIGNvZWZmaWNpZW50IHRhYmxlCisgKi8KK2V4dGVybiBjb25zdCBCUF9DMzJfQ29lZnNfdCBMVkRCRV9CUEZfVGFibGVbXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBR0MgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEF0dGFjayB0aW1lIChzaWduYWwgdG9vIGxhcmdlKSAqLworZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVkRCRV9BR0NfQVRUQUNLX1RhYmxlW107CisKKy8qIERlY2F5IHRpbWUgKHNpZ25hbCB0b28gc21hbGwpICovCitleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWREJFX0FHQ19ERUNBWV9UYWJsZVtdOworCisvKiBHYWluIGZvciB1c2Ugd2l0aG91dCB0aGUgaGlnaCBwYXNzIGZpbHRlciAqLworZXh0ZXJuIGNvbnN0IExWTV9JTlQzMiBMVkRCRV9BR0NfR0FJTl9UYWJsZVtdOworCisvKiBHYWluIGZvciB1c2Ugd2l0aCB0aGUgaGlnaCBwYXNzIGZpbHRlciAqLworZXh0ZXJuIGNvbnN0IExWTV9JTlQzMiBMVkRCRV9BR0NfSFBGR0FJTl9UYWJsZVtdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFZvbHVtZSBjb250cm9sIGdhaW4gYW5kIHRpbWUgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZEIgdG8gbGluZWFyIGNvbnZlcnNpb24gdGFibGUgKi8KK2V4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZEQkVfVm9sdW1lVGFibGVbXTsKKworZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVkRCRV9Wb2x1bWVUQ1RhYmxlW107CisKK2V4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZEQkVfTWl4ZXJUQ1RhYmxlW107CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBfX0xWQkRFX1RBQkxFU19IX18gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDQ3MjE4MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCkBAIC0wLDAgKzEsNjM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkCisgICAgICRSZXZpc2lvbjogMTAwMiAkCisgICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjQwOjA5ICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEhlYWRlciBmaWxlIGZvciB0aGUgYXBwbGljYXRpb24gbGF5ZXIgaW50ZXJmYWNlIG9mIENvbmNlcnQgU291bmQsIEJhc3MgRW5oYW5jZW1lbnQsICovCisvKiAgRXF1YWxpemVyLCBQb3dlciBTcGVjdHJ1bSBBbmFseXplciwgVHJlYmJsZSBFbmhhbmNlbWVudCBhbmQgdm9sdW1lIG1hbmFnZW1lbnQgICAgICAgKi8KKy8qICBidW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlcyBpbmNsdWRlcyBhbGwgZGVmaW5pdGlvbnMsIHR5cGVzLCBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KKy8qICBwcm90b3R5cGVzIHJlcXVpcmVkIGJ5IHRoZSBjYWxsaW5nIGxheWVyLiBBbGwgb3RoZXIgdHlwZXMsIHN0cnVjdHVyZXMgYW5kICAgICAgICAgICAqLworLyogIGZ1bmN0aW9ucyBhcmUgcHJpdmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTm90ZTogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICA9PT09PT09ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBhbGdvcml0aG0gY2FuIGV4ZWN1dGUgZWl0aGVyIHdpdGggc2VwYXJhdGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG9yIHdpdGggICAgICovCisvKiAgYSBjb21tb24gYnVmZmVyLCBpLmUuIHRoZSBkYXRhIGlzIHByb2Nlc3NlZCBpbi1wbGFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3RlOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogID09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhyZWUgZGF0YSBmb3JtYXRzIGFyZSBzdXBwb3J0IFN0ZXJlbyxNb25vLUluLVN0ZXJlbyBhbmQgTW9uby4gVGhlIGRhdGEgaXMgICAgICAgICAgKi8KKy8qICBpbnRlcmxlYXZlZCBhcyBmb2xsb3dzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQnl0ZSBPZmZzZXQgICAgICAgICBTdGVyZW8gSW5wdXQgICAgICAgICBNb25vLUluLVN0ZXJlbyBJbnB1dCAgICAgICBNb25vIElucHV0ICAgICAgKi8KKy8qICA9PT09PT09PT09PSAgICAgICAgID09PT09PT09PT09PSAgICAgICAgID09PT09PT09PT09PT09PT09PT09ICAgICA9PT09PT09PT09PT09PSAgICAqLworLyogICAgICAwICAgICAgICAgICAgICAgTGVmdCBTYW1wbGUgIzEgICAgICAgICAgTW9ubyBTYW1wbGUgIzEgICAgICAgIE1vbm8gU2FtcGxlICMxICAgICovCisvKiAgICAgIDIgICAgICAgICAgICAgICBSaWdodCBTYW1wbGUgIzEgICAgICAgICBNb25vIFNhbXBsZSAjMSAgICAgICAgTW9ubyBTYW1wbGUgIzIgICAgKi8KKy8qICAgICAgNCAgICAgICAgICAgICAgIExlZnQgU2FtcGxlICMyICAgICAgICAgIE1vbm8gU2FtcGxlICMyICAgICAgICBNb25vIFNhbXBsZSAjMyAgICAqLworLyogICAgICA2ICAgICAgICAgICAgICAgUmlnaHQgU2FtcGxlICMyICAgICAgICAgTW9ubyBTYW1wbGUgIzIgICAgICAgIE1vbm8gU2FtcGxlICM0ICAgICovCisvKiAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgKi8KKy8qICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0xWTV9IX18KKyNkZWZpbmUgX19MVk1fSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTWVtb3J5IHRhYmxlKi8KKyNkZWZpbmUgTFZNX05SX01FTU9SWV9SRUdJT05TICAgICAgICAgICAgICAgICA0ICAgICAvKiBOdW1iZXIgb2YgbWVtb3J5IHJlZ2lvbnMgKi8KKworLyogQ29uY2VydCBTb3VuZCBlZmZlY3QgbGV2ZWwgcHJlc2V0cyAqLworI2RlZmluZSBMVk1fQ1NfRUZGRUNUX05PTkUgICAgICAgICAgICAgICAgICAgIDAgICAgIC8qIDAlIGVmZmVjdCwgbWluaW11bSB2YWx1ZSAqLworI2RlZmluZSBMVk1fQ1NfRUZGRUNUX0xPVyAgICAgICAgICAgICAgICAgMTYzODQgICAgIC8qIDUwJSBlZmZlY3QgKi8KKyNkZWZpbmUgTFZNX0NTX0VGRkVDVF9NRUQgICAgICAgICAgICAgICAgIDI0NTc2ICAgICAvKiA3NSUgZWZmZWN0ICovCisjZGVmaW5lIExWTV9DU19FRkZFQ1RfSElHSCAgICAgICAgICAgICAgICAzMjc2NyAgICAgLyogMTAwJSBlZmZlY3QsIG1heGltdW0gdmFsdWUgKi8KKworLyogVHJlYmxlIGVuaGFuY2VtZW50ICovCisjZGVmaW5lIExWTV9URV9MT1dfTUlQUyAgICAgICAgICAgICAgICAgICAzMjc2NworCisvKiBCYXNzIGVuaGFuY2VtZW50IGVmZmVjdCBsZXZlbCBwcmVzZXRzICovCisjZGVmaW5lIExWTV9CRV8wREIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgLyogMGRCIGJvb3N0LCBubyBlZmZlY3QgKi8KKyNkZWZpbmUgTFZNX0JFXzNEQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAvKiArM2RCIGJvb3N0ICovCisjZGVmaW5lIExWTV9CRV82REIgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiAgICAgLyogKzZkQiBib29zdCAqLworI2RlZmluZSBMVk1fQkVfOURCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkgICAgIC8qICs5ZEIgYm9vc3QgKi8KKyNkZWZpbmUgTFZNX0JFXzEyREIgICAgICAgICAgICAgICAgICAgICAgICAgIDEyICAgICAvKiArMTJkQiBib29zdCAqLworI2RlZmluZSBMVk1fQkVfMTVEQiAgICAgICAgICAgICAgICAgICAgICAgICAgMTUgICAgIC8qICsxNWRCIGJvb3N0ICovCisKKy8qIE4tQmFuZCBFcXVhbGl6ZXIgKi8KKyNkZWZpbmUgTFZNX0VRX05CQU5EUyAgICAgICAgICAgICAgICAgICAgICAgICA1ICAgIC8qIE51bWJlciBvZiBiYW5kcyBmb3IgZXF1YWxpemVyICovCisKKy8qIEhlYWRyb29tIG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgTFZNX0hFQURST09NX01BWF9OQkFORFMgICAgICAgICAgICAgICA1CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluc3RhbmNlIGhhbmRsZSAqLwordHlwZWRlZiB2b2lkICpMVk1fSGFuZGxlX3Q7CisKKworLyogU3RhdHVzIHJldHVybiB2YWx1ZXMgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWTV9TVUNDRVNTICAgICAgICAgICAgPSAwLCAgICAgICAgICAgICAgICAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gYSByb3V0aW5lICovCisgICAgTFZNX0FMSUdOTUVOVEVSUk9SICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAgLyogTWVtb3J5IGFsaWdubWVudCBlcnJvciAqLworICAgIExWTV9OVUxMQUREUkVTUyAgICAgICAgPSAyLCAgICAgICAgICAgICAgICAgICAgIC8qIE5VTEwgYWxsb2NhdGlvbiBhZGRyZXNzICovCisgICAgTFZNX09VVE9GUkFOR0UgICAgICAgICA9IDMsICAgICAgICAgICAgICAgICAgICAgLyogT3V0IG9mIHJhbmdlIGNvbnRyb2wgcGFyYW1ldGVyICovCisgICAgTFZNX0lOVkFMSUROVU1TQU1QTEVTICA9IDQsICAgICAgICAgICAgICAgICAgICAgLyogSW52YWxpZCBudW1iZXIgb2Ygc2FtcGxlcyAqLworICAgIExWTV9XUk9OR0FVRElPVElNRSAgICAgPSA1LCAgICAgICAgICAgICAgICAgICAgIC8qIFdyb25nIHRpbWUgdmFsdWUgZm9yIGF1ZGlvIHRpbWUqLworICAgIExWTV9BTEdPUklUSE1ESVNBQkxFRCAgPSA2LCAgICAgICAgICAgICAgICAgICAgIC8qIEFsZ29yaXRobSBpcyBkaXNhYmxlZCovCisgICAgTFZNX0FMR09SSVRITVBTQSAgICAgICA9IDcsICAgICAgICAgICAgICAgICAgICAgLyogQWxnb3JpdGhtIFBTQSByZXR1cm5zIGFuIGVycm9yICovCisgICAgTFZNX1JFVFVSTlNUQVRVU19EVU1NWSA9IExWTV9NQVhFTlVNCit9IExWTV9SZXR1cm5TdGF0dXNfZW47CisKKworLyogQnVmZmVyIE1hbmFnZW1lbnQgbW9kZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZNX01BTkFHRURfQlVGRkVSUyAgID0gMCwKKyAgICBMVk1fVU5NQU5BR0VEX0JVRkZFUlMgPSAxLAorICAgIExWTV9CVUZGRVJTX0RVTU1ZICAgICA9IExWTV9NQVhFTlVNCit9IExWTV9CdWZmZXJNb2RlX2VuOworCisvKiBPdXRwdXQgZGV2aWNlIHR5cGUgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWTV9IRUFEUEhPTkVTICAgICAgICAgICAgID0gMCwKKyAgICBMVk1fRVhfSEVBRFBIT05FUyAgICAgICAgICA9IDEsCisgICAgTFZNX1NQRUFLRVJUWVBFX01BWCAgICAgICAgPSBMVk1fTUFYRU5VTQorfSBMVk1fT3V0cHV0RGV2aWNlVHlwZV9lbjsKKworLyogVmlydHVhbGl6ZXIgbW9kZSBzZWxlY3Rpb24qLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZNX0NPTkNFUlRTT1VORCAgICAgICA9IDAsCisgICAgTFZNX1ZJUlRVQUxJWkVSVFlQRV9EVU1NWSAgID0gTFZNX01BWEVOVU0KK30gTFZNX1ZpcnR1YWxpemVyVHlwZV9lbjsKKworLyogTi1CYW5kIEVxdWFsaXNlciBvcGVyYXRpbmcgbW9kZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZNX0VRTkJfT0ZGICAgPSAwLAorICAgIExWTV9FUU5CX09OICAgID0gMSwKKyAgICBMVk1fRVFOQl9EVU1NWSA9IExWTV9NQVhFTlVNCit9IExWTV9FUU5CX01vZGVfZW47CisKKy8qIEJhc3MgRW5oYW5jZW1lbnQgb3BlcmF0aW5nIG1vZGUgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWTV9CRV9PRkYgICA9IDAsCisgICAgTFZNX0JFX09OICAgID0gMSwKKyAgICBMVk1fQkVfRFVNTVkgPSBMVk1fTUFYRU5VTQorfSBMVk1fQkVfTW9kZV9lbjsKKworLyogQmFzcyBFbmhhbmNlbWVudCBjZW50cmUgZnJlcXVlbmN5IHNlbGVjdGlvbiBjb250cm9sICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVk1fQkVfQ0VOVFJFXzU1SHogID0gMCwKKyAgICBMVk1fQkVfQ0VOVFJFXzY2SHogID0gMSwKKyAgICBMVk1fQkVfQ0VOVFJFXzc4SHogID0gMiwKKyAgICBMVk1fQkVfQ0VOVFJFXzkwSHogID0gMywKKyAgICBMVk1fQkVfQ0VOVFJFX0RVTU1ZID0gTFZNX01BWEVOVU0KK30gTFZNX0JFX0NlbnRyZUZyZXFfZW47CisKKy8qIEJhc3MgRW5oYW5jZW1lbnQgSFBGIHNlbGVjdGlvbiBjb250cm9sICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVk1fQkVfSFBGX09GRiAgID0gMCwKKyAgICBMVk1fQkVfSFBGX09OICAgID0gMSwKKyAgICBMVk1fQkVfSFBGX0RVTU1ZID0gTFZNX01BWEVOVU0KK30gTFZNX0JFX0ZpbHRlclNlbGVjdF9lbjsKKworLyogVm9sdW1lIENvbnRyb2wgb3BlcmF0aW5nIG1vZGUgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWTV9WQ19PRkYgICA9IDAsCisgICAgTFZNX1ZDX09OICAgID0gMSwKKyAgICBMVk1fVkNfRFVNTVkgPSBMVk1fTUFYRU5VTQorfSBMVk1fVkNfTW9kZV9lbjsKKworLyogVHJlYmxlIEVuaGFuY2VtZW50IG9wZXJhdGluZyBtb2RlICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVk1fVEVfT0ZGICAgPSAwLAorICAgIExWTV9URV9PTiAgICA9IDEsCisgICAgTFZNX1RFX0RVTU1ZID0gTFZNX01BWEVOVU0KK30gTFZNX1RFX01vZGVfZW47CisKKy8qIEhlYWRyb29tIG1hbmFnZW1lbnQgb3BlcmF0aW5nIG1vZGUgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWTV9IRUFEUk9PTV9PRkYgICA9IDAsCisgICAgTFZNX0hFQURST09NX09OICAgID0gMSwKKyAgICBMVk1fSGVhZHJvb21fRFVNTVkgPSBMVk1fTUFYRU5VTQorfSBMVk1fSGVhZHJvb21fTW9kZV9lbjsKKwordHlwZWRlZiBlbnVtCit7CisgICAgTFZNX1BTQV9TUEVFRF9TTE9XLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQZWFrIGRlY2F5aW5nIGF0IHNsb3cgc3BlZWQgKi8KKyAgICBMVk1fUFNBX1NQRUVEX01FRElVTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlYWsgZGVjYXlpbmcgYXQgbWVkaXVtIHNwZWVkICovCisgICAgTFZNX1BTQV9TUEVFRF9GQVNULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQZWFrIGRlY2F5aW5nIGF0IGZhc3Qgc3BlZWQgKi8KKyAgICBMVk1fUFNBX1NQRUVEX0RVTU1ZID0gTFZNX01BWEVOVU0KK30gTFZNX1BTQV9EZWNheVNwZWVkX2VuOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVk1fUFNBX09GRiAgID0gMCwKKyAgICBMVk1fUFNBX09OICAgID0gMSwKKyAgICBMVk1fUFNBX0RVTU1ZID0gTFZNX01BWEVOVU0KK30gTFZNX1BTQV9Nb2RlX2VuOworCisvKiBWZXJzaW9uIGluZm9ybWF0aW9uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9DSEFSICAgICAgICAgICAgICAgICAgICAqcFZlcnNpb25OdW1iZXI7ICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSB2ZXJzaW9uIG51bWJlciBpbiB0aGUgZm9ybWF0IFguWVkuWlogKi8KKyAgICBMVk1fQ0hBUiAgICAgICAgICAgICAgICAgICAgKnBQbGF0Zm9ybTsgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgbGlicmFyeSBwbGF0Zm9ybSB0eXBlICovCit9IExWTV9WZXJzaW9uSW5mb19zdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNZW1vcnkgdGFibGUgY29udGFpbmluZyB0aGUgcmVnaW9uIGRlZmluaXRpb25zICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9NZW1vcnlSZWdpb25fc3QgICAgICAgICBSZWdpb25bTFZNX05SX01FTU9SWV9SRUdJT05TXTsgIC8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAqLworfSBMVk1fTWVtVGFiX3Q7CisKKy8qIE4tQmFuZCBlcXVhbGlzZXIgYmFuZCBkZWZpbml0aW9uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBHYWluOyAgICAgICAgICAgICAgICAgICAvKiBCYW5kIGdhaW4gaW4gZEIgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRnJlcXVlbmN5OyAgICAgICAgICAgICAgLyogQmFuZCBjZW50cmUgZnJlcXVlbmN5IGluIEh6ICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFFGYWN0b3I7ICAgICAgICAgICAgICAgIC8qIEJhbmQgcXVhbGl0eSBmYWN0b3IgKHgxMDApICovCit9IExWTV9FUU5CX0JhbmREZWZfdDsKKworCisvKiBIZWFkcm9vbSBiYW5kIGRlZmluaXRpb24gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIExpbWl0X0xvdzsgICAgICAgICAgICAgIC8qIExvdyBmcmVxdWVuY3kgbGltaXQgb2YgdGhlIGJhbmQgaW4gSGVydHogKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTGltaXRfSGlnaDsgICAgICAgICAgICAgLyogSGlnaCBmcmVxdWVuY3kgbGltaXQgb2YgdGhlIGJhbmQgaW4gSGVydHogKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgSGVhZHJvb21fT2Zmc2V0OyAgICAgICAgLyogSGVhZHJvb20gPSBiaWdnZXN0IGJhbmQgZ2FpbiAtIEhlYWRyb29tX09mZnNldCAqLworfSBMVk1fSGVhZHJvb21CYW5kRGVmX3Q7CisKKworLyogQ29udHJvbCBQYXJhbWV0ZXIgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLworICAgIExWTV9Nb2RlX2VuICAgICAgICAgICAgICAgICBPcGVyYXRpbmdNb2RlOyAgICAgICAgICAvKiBCdW5kbGUgb3BlcmF0aW5nIG1vZGUgT24vQnlwYXNzICovCisgICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7ICAgICAgICAgICAgIC8qIFNhbXBsZSByYXRlICovCisgICAgTFZNX0Zvcm1hdF9lbiAgICAgICAgICAgICAgIFNvdXJjZUZvcm1hdDsgICAgICAgICAgIC8qIElucHV0IGRhdGEgZm9ybWF0ICovCisgICAgTFZNX091dHB1dERldmljZVR5cGVfZW4gICAgIFNwZWFrZXJUeXBlOyAgICAgICAgICAgIC8qIE91dHB1dCBkZXZpY2UgdHlwZSAqLworCisgICAgLyogQ29uY2VydCBTb3VuZCBWaXJ0dWFsaXplciBwYXJhbWV0ZXJzKi8KKyAgICBMVk1fTW9kZV9lbiAgICAgICAgICAgICAgICAgVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlOyAvKiBWaXJ0dWFsaXplciBvcGVyYXRpbmcgbW9kZSBPbi9PZmYgKi8KKyAgICBMVk1fVmlydHVhbGl6ZXJUeXBlX2VuICAgICAgVmlydHVhbGl6ZXJUeXBlOyAgICAgICAgICAvKiBWaXJ0dWFsaXplciB0eXBlOiBDb25jZXJ0U291bmQgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgVmlydHVhbGl6ZXJSZXZlcmJMZXZlbDsgICAvKiBWaXJ0dWFsaXplciByZXZlcmIgbGV2ZWwgaW4gJSAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBDU19FZmZlY3RMZXZlbDsgICAgICAgICAgIC8qIENvbmNlcnQgU291bmQgZWZmZWN0IGxldmVsICovCisKKyAgICAvKiBOLUJhbmQgRXF1YWxpc2VyIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fRVFOQl9Nb2RlX2VuICAgICAgICAgICAgRVFOQl9PcGVyYXRpbmdNb2RlOyAgICAgLyogTi1CYW5kIEVxdWFsaXNlciBvcGVyYXRpbmcgbW9kZSAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBFUU5CX05CYW5kczsgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmFuZHMgKi8KKyAgICBMVk1fRVFOQl9CYW5kRGVmX3QgICAgICAgICAgKnBFUU5CX0JhbmREZWZpbml0aW9uOyAgLyogUG9pbnRlciB0byBlcXVhbGlzZXIgZGVmaW5pdGlvbnMgKi8KKworICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLworICAgIExWTV9CRV9Nb2RlX2VuICAgICAgICAgICAgICBCRV9PcGVyYXRpbmdNb2RlOyAgICAgICAvKiBCYXNzIEVuaGFuY2VtZW50IG9wZXJhdGluZyBtb2RlICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIEJFX0VmZmVjdExldmVsOyAgICAgICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgZWZmZWN0IGxldmVsICovCisgICAgTFZNX0JFX0NlbnRyZUZyZXFfZW4gICAgICAgIEJFX0NlbnRyZUZyZXE7ICAgICAgICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgY2VudHJlIGZyZXF1ZW5jeSAqLworICAgIExWTV9CRV9GaWx0ZXJTZWxlY3RfZW4gICAgICBCRV9IUEY7ICAgICAgICAgICAgICAgICAvKiBCYXNzIEVuaGFuY2VtZW50IGhpZ2ggcGFzcyBmaWx0ZXIgc2VsZWN0b3IgKi8KKworICAgIC8qIFZvbHVtZSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgVkNfRWZmZWN0TGV2ZWw7ICAgICAgICAgLyogVm9sdW1lIENvbnRyb2wgc2V0dGluZyBpbiBkQnMgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgVkNfQmFsYW5jZTsgICAgICAgICAgICAgLyogTGVmdCBSaWdodCBCYWxhbmNlIGNvbnRyb2wgaW4gZEIgKC05NiB0byA5NiBkQiksIC12ZSB2YWx1ZXMgcmVkdWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJpZ2h0IGNoYW5uZWwgd2hpbGUgK3ZlIHZhbHVlIHJlZHVjZXMgTGVmdCBjaGFubmVsKi8KKworICAgIC8qIFRyZWJsZSBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCisgICAgTFZNX1RFX01vZGVfZW4gICAgICAgICAgICAgIFRFX09wZXJhdGluZ01vZGU7ICAgICAgIC8qIFRyZWJsZSBFbmhhbmNlbWVudCBPbi9PZmYgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgVEVfRWZmZWN0TGV2ZWw7ICAgICAgICAgLyogVHJlYmxlIEVuaGFuY2VtZW50IGdhaW4gZEJzICovCisKKyAgICAvKiBTcGVjdHJ1bSBBbmFseXplciBwYXJhbWV0ZXJzIENvbnRyb2wgKi8KKyAgICBMVk1fUFNBX01vZGVfZW4gICAgICAgICAgICAgUFNBX0VuYWJsZTsKKyAgICBMVk1fUFNBX0RlY2F5U3BlZWRfZW4gICAgICAgUFNBX1BlYWtEZWNheVJhdGU7ICAgICAgLyogUGVhayB2YWx1ZSBkZWNheSByYXRlKi8KKworfSBMVk1fQ29udHJvbFBhcmFtc190OworCisKKy8qIEluc3RhbmNlIFBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogR2VuZXJhbCAqLworICAgIExWTV9CdWZmZXJNb2RlX2VuICAgICAgICAgICBCdWZmZXJNb2RlOyAgICAgICAgICAgICAvKiBCdWZmZXIgbWFuYWdlbWVudCBtb2RlICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZTsgICAgICAgICAgIC8qIE1heGltdW0gcHJvY2Vzc2luZyBibG9jayBzaXplICovCisKKyAgICAvKiBOLUJhbmQgRXF1YWxpc2VyICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIEVRTkJfTnVtQmFuZHM7ICAgICAgICAgIC8qIE1heGltdW0gbnVtYmVyIG9mIGVxdWFsaXNlciBiYW5kcyAqLworCisgICAgLyogUFNBICovCisgICAgTFZNX1BTQV9Nb2RlX2VuICAgICAgICAgICAgIFBTQV9JbmNsdWRlZDsgICAgICAgICAgICAvKiBDb250cm9scyB0aGUgaW5zdGFuY2UgbWVtb3J5IGFsbG9jYXRpb24gZm9yIFBTQTogT04vT0ZGICovCit9IExWTV9JbnN0UGFyYW1zX3Q7CisKKy8qIEhlYWRyb29tIG1hbmFnZW1lbnQgcGFyYW1ldGVyIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSGVhZHJvb21fTW9kZV9lbiAgICAgICAgSGVhZHJvb21fT3BlcmF0aW5nTW9kZTsgLyogSGVhZHJvb20gQ29udHJvbCBPbi9PZmYgKi8KKyAgICBMVk1fSGVhZHJvb21CYW5kRGVmX3QgICAgICAgKnBIZWFkcm9vbURlZmluaXRpb247ICAgLyogUG9pbnRlciB0byBoZWFkcm9vbSBiYW5kcyBkZWZpbml0aW9uICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE5IZWFkcm9vbUJhbmRzOyAgICAgICAgIC8qIE51bWJlciBvZiBoZWFkcm9vbSBiYW5kcyAqLworCit9IExWTV9IZWFkcm9vbVBhcmFtc190OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEZ1bmN0aW9uIFByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0dldFZlcnNpb25JbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsaWJyYXJ5J3MgdmVyc2lvbi4gICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFZlcnNpb24gICAgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSB2ZXJzaW9uIGluZm8gc3RydWN0dXJlICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fTlVMTEFERFJFU1MgICAgICAgICB3aGVuIHBWZXJzaW9uIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldFZlcnNpb25JbmZvKExWTV9WZXJzaW9uSW5mb19zdCAgKnBWZXJzaW9uKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9HZXRNZW1vcnlUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICovCisvKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICAgKi8KKy8qICBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICAgKi8KKy8qICB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICovCisvKiAgcEluc3RQYXJhbXMgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fTlVMTEFERFJFU1MgICAgICAgICBXaGVuIG9uZSBvZiBwTWVtb3J5VGFibGUgb3IgcEluc3RQYXJhbXMgaXMgTlVMTCAgICAgICAgICAgICAqLworLyogIExWTV9PVVRPRlJBTkdFICAgICAgICAgIFdoZW4gYW55IG9mIHRoZSBJbnN0YW5jZSBwYXJhbWV0ZXJzIGFyZSBvdXQgb2YgcmFuZ2UgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0TWVtb3J5VGFibGUoTFZNX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01lbVRhYl90ICAgICAgICAgKnBNZW1vcnlUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JbnN0UGFyYW1zX3QgICAgICpwSW5zdFBhcmFtcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0SW5zdGFuY2VIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgYnVuZGxlIGluc3RhbmNlLiBJdCByZXR1cm5zIHRoZSBjcmVhdGVkIGluc3RhbmNlICAqLworLyogIGhhbmRsZSB0aHJvdWdoIHBoSW5zdGFuY2UuIEFsbCBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCwgaW5hY3RpdmUgc3RhdGUuICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdFBhcmFtcyAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIE9uZSBvciBtb3JlIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIEluc3RhbmNlIHBhcmFtZXRlcnMgYXJlIG91dCBvZiByYW5nZSAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRJbnN0YW5jZUhhbmRsZShMVk1fSGFuZGxlX3QgICAgICAgICpwaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01lbVRhYl90ICAgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0luc3RQYXJhbXNfdCAgICAqcEluc3RQYXJhbXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0NsZWFyQXVkaW9CdWZmZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNsZWFyIHRoZSBpbnRlcm5hbCBhdWRpbyBidWZmZXJzIG9mIHRoZSBidW5kbGUuICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fTlVMTEFERFJFU1MgICAgICAgICBJbnN0YW5jZSBtZW1vcnkgaGFzIGEgTlVMTCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0NsZWFyQXVkaW9CdWZmZXJzKExWTV9IYW5kbGVfdCAgaEluc3RhbmNlKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJlcXVlc3QgdGhlIExpZmVWaWJlcyBtb2R1bGUgcGFyYW1ldGVycy4gVGhlIGN1cnJlbnQgcGFyYW1ldGVyIHNldCBpcyByZXR1cm5lZCAgICAgICovCisvKiAgdmlhIHRoZSBwYXJhbWV0ZXIgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIHdoZW4gYW55IG9mIGhJbnN0YW5jZSBvciBwUGFyYW1zIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMoTFZNX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNldHMgb3IgY2hhbmdlcyB0aGUgTGlmZVZpYmVzIG1vZHVsZSBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBhIHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fTlVMTEFERFJFU1MgICAgICAgICBXaGVuIGhJbnN0YW5jZSwgcFBhcmFtcyBvciBhbnkgY29udHJvbCBwb2ludGVycyBhcmUgTlVMTCAgICAqLworLyogIExWTV9PVVRPRlJBTkdFICAgICAgICAgIFdoZW4gYW55IG9mIHRoZSBjb250cm9sIHBhcmFtZXRlcnMgYXJlIG91dCBvZiByYW5nZSAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMoTFZNX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFByb2Nlc3MgZnVuY3Rpb24gZm9yIHRoZSBMaWZlVmliZXMgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluRGF0YSAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwT3V0RGF0YSAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQXVkaW9UaW1lICAgICAgICAgICAgICAgQXVkaW8gVGltZSBvZiB0aGUgY3VycmVudCBpbnB1dCBkYXRhIGluIG1pbGxpLXNlY29uZHMgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fSU5WQUxJRE5VTVNBTVBMRVMgIFdoZW4gdGhlIE51bVNhbXBsZXMgaXMgbm90IGEgdmFsaWVkIG11bHRpcGxlIGluIHVubWFuYWdlZCAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX0FMSUdOTUVOVEVSUk9SICAgICBXaGVuIGVpdGhlciB0aGUgaW5wdXQgb3VyIG91dHB1dCBidWZmZXJzIGFyZSBub3QgMzItYml0ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduZWQgaW4gdW5tYW5hZ2VkIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgV2hlbiBvbmUgb2YgaEluc3RhbmNlLCBwSW5EYXRhIG9yIHBPdXREYXRhIGlzIE5VTEwgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgbXVzdCBiZSAzMi1iaXQgYWxpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMi4gTnVtYmVyIG9mIHNhbXBsZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTU9OTyAgICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGJsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBNT05PSU5TVEVSRU8gICAgICAgIHRoZSBudW1iZXIgb2Ygc2FtcGxlIHBhaXJzIGluIHRoZSBibG9jayAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFNURVJFTyAgICAgICAgICAgICAgdGhlIG51bWJlciBvZiBzYW1wbGUgcGFpcnMgaW4gdGhlIGJsb2NrICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9Qcm9jZXNzKExWTV9IYW5kbGVfdCAgICAgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBBdWRpb1RpbWUpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX1NldEhlYWRyb29tUGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgYXV0b21hdGljIGhlYWRyb29tIG1hbmFnZW1lbnQgcGFyYW1ldGVycy4gICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSGVhZHJvb21QYXJhbXMgICAgICAgICBQb2ludGVyIHRvIGhlYWRyb29tIHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fTlVMTEFERFJFU1MgICAgICAgICBXaGVuIGhJbnN0YW5jZSBvciBwSGVhZHJvb21QYXJhbXMgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TVUNDRVNTICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fU2V0SGVhZHJvb21QYXJhbXMoICBMVk1fSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9IZWFkcm9vbVBhcmFtc190ICAgICpwSGVhZHJvb21QYXJhbXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0dldEhlYWRyb29tUGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCB0aGUgYXV0b21hdGljIGhlYWRyb29tIG1hbmFnZW1lbnQgcGFyYW1ldGVycy4gICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSGVhZHJvb21QYXJhbXMgICAgICAgICBQb2ludGVyIHRvIGhlYWRyb29tIHBhcmFtZXRlciBzdHJ1Y3R1cmUgKG91dHB1dCkgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIFdoZW4gaEluc3RhbmNlIG9yIHBIZWFkcm9vbVBhcmFtcyBhcmUgTlVMTCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0SGVhZHJvb21QYXJhbXMoICBMVk1fSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9IZWFkcm9vbVBhcmFtc190ICAgICpwSGVhZHJvb21QYXJhbXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0dldFNwZWN0cnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmV0cmlldmUgU3BlY3RyYWwgaW5mb3JtYXRpb24gYXQgYSBnaXZlbiBBdWRpbyB0aW1lICAgICAgICAgKi8KKy8qIGZvciBkaXNwbGF5IHVzYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDdXJyZW50UGVha3MgICAgICAgICAgIFBvaW50ZXIgdG8gbG9jYXRpb24gd2hlcmUgY3VycmVudHMgcGVha3MgYXJlIHRvIGJlIHNhdmVkICAgICovCisvKiAgcFBhc3RQZWFrcyAgICAgICAgICAgICAgUG9pbnRlciB0byBsb2NhdGlvbiB3aGVyZSBwYXN0IHBlYWtzIGFyZSB0byBiZSBzYXZlZCAgICAgICAgKi8KKy8qICBwQ2VudHJlRnJlcXMgICAgICAgICAgICBQb2ludGVyIHRvIGxvY2F0aW9uIHdoZXJlIGNlbnRyZSBmcmVxdWVuY3kgb2YgZWFjaCBiYW5kIGlzICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHNhdmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQXVkaW9UaW1lICAgICAgICAgICAgICAgQXVkaW8gdGltZSBhdCB3aGljaCB0aGUgc3BlY3RyYWwgaW5mb3JtYXRpb24gaXMgbmVlZGVkICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fTlVMTEFERFJFU1MgICAgICAgICBJZiBhbnkgb2YgaW5wdXQgYWRkcmVzc2VzIGFyZSBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9XUk9OR0FVRElPVElNRSAgICAgIEZhaWx1cmUgZHVlIHRvIGF1ZGlvIHRpbWUgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0U3BlY3RydW0oIExWTV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAqcEN1cnJlbnRQZWFrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAqcFBhc3RQZWFrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBBdWRpb1RpbWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9TZXRWb2x1bWVOb1Ntb290aGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCBvdXRwdXQgdm9sdW1lIHdpdGhvdXQgYW55IHNtb290aGluZyAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgQ29udHJvbCBQYXJhbWV0ZXJzLCBvbmx5IHZvbHVtZSB2YWx1ZSBpcyB1c2VkIGhlcmUgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fTlVMTEFERFJFU1MgICAgICAgICBJZiBhbnkgb2YgaW5wdXQgYWRkcmVzc2VzIGFyZSBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9PVVRPRlJBTkdFICAgICAgICAgIFdoZW4gYW55IG9mIHRoZSBjb250cm9sIHBhcmFtZXRlcnMgYXJlIG91dCBvZiByYW5nZSAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fU2V0Vm9sdW1lTm9TbW9vdGhpbmcoIExWTV9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAgICAgIC8qIF9fTFZNX0hfXyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQVBJX1NwZWNpYWxzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQVBJX1NwZWNpYWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmY2ZmE0YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9BUElfU3BlY2lhbHMuYwpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkCisgICAgICRSZXZpc2lvbjogMTAwMiAkCisgICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjQwOjA5ICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9UYWJsZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0U3BlY3RydW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXRyaWV2ZSBTcGVjdHJhbCBpbmZvcm1hdGlvbiBhdCBhIGdpdmVuIEF1ZGlvIHRpbWUgICAgICAgICAqLworLyogZm9yIGRpc3BsYXkgdXNhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEN1cnJlbnRQZWFrcyAgICAgICAgICAgUG9pbnRlciB0byBsb2NhdGlvbiB3aGVyZSBjdXJyZW50cyBwZWFrcyBhcmUgdG8gYmUgc2F2ZWQgICAgKi8KKy8qICBwUGFzdFBlYWtzICAgICAgICAgICAgICBQb2ludGVyIHRvIGxvY2F0aW9uIHdoZXJlIHBhc3QgcGVha3MgYXJlIHRvIGJlIHNhdmVkICAgICAgICAqLworLyogIEF1ZGlvVGltZSAgICAgICAgICAgICAgIEF1ZGlvIHRpbWUgYXQgd2hpY2ggdGhlIHNwZWN0cmFsIGluZm9ybWF0aW9uIGlzIG5lZWRlZCAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TVUNDRVNTICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX05VTExBRERSRVNTICAgICAgICAgSWYgYW55IG9mIGlucHV0IGFkZHJlc3NlcyBhcmUgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fV1JPTkdBVURJT1RJTUUgICAgICBGYWlsdXJlIGR1ZSB0byBhdWRpbyB0aW1lIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldFNwZWN0cnVtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgKnBDdXJyZW50UGVha3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAqcFBhc3RQZWFrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEF1ZGlvVGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgICAqcEluc3RhbmNlICAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisgICAgcExWUFNBX0hhbmRsZV90ICAgICAgICAqaFBTQUluc3RhbmNlOworICAgIExWUFNBX1JFVFVSTiAgICAgICAgICAgTFZQU0FfU3RhdHVzOworCisKKyAgICBpZihwSW5zdGFuY2UgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOworICAgIH0KKworICAgIC8qSWYgUFNBIGlzIG5vdCBpbmNsdWRlZCBhdCB0aGUgdGltZSBvZiBpbnN0YW5jZSBjcmVhdGlvbiwgcmV0dXJuIHdpdGhvdXQgYW55IHByb2Nlc3NpbmcqLworICAgIGlmKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQhPUxWTV9QU0FfT04pCisgICAgeworICAgICAgICByZXR1cm4gTFZNX1NVQ0NFU1M7CisgICAgfQorCisgICAgaFBTQUluc3RhbmNlID0gcEluc3RhbmNlLT5oUFNBSW5zdGFuY2U7CisKKyAgICBpZigocEN1cnJlbnRQZWFrcyA9PSBMVk1fTlVMTCkgfHwKKyAgICAgICAgKHBQYXN0UGVha3MgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIG5ldyBwYXJhbWV0ZXJzIGlmIG5lY2Vzc2FyeQorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKQorICAgIHsKKyAgICAgICAgTFZNX0FwcGx5TmV3U2V0dGluZ3MoaEluc3RhbmNlKTsKKyAgICB9CisKKyAgICAvKiBJZiBQU0EgbW9kdWxlIGlzIGRpc2FibGVkLCBkbyBub3RoaW5nICovCisgICAgaWYocEluc3RhbmNlLT5QYXJhbXMuUFNBX0VuYWJsZT09TFZNX1BTQV9PRkYpCisgICAgeworICAgICAgICByZXR1cm4gTFZNX0FMR09SSVRITURJU0FCTEVEOworICAgIH0KKworICAgIExWUFNBX1N0YXR1cyA9IExWUFNBX0dldFNwZWN0cnVtKGhQU0FJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZQU0FfVGltZSkgKEF1ZGlvVGltZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UOCopIHBDdXJyZW50UGVha3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UOCopIHBQYXN0UGVha3MgKTsKKworICAgIGlmKExWUFNBX1N0YXR1cyAhPSBMVlBTQV9PSykKKyAgICB7CisgICAgICAgIGlmKExWUFNBX1N0YXR1cyA9PSBMVlBTQV9FUlJPUl9XUk9OR1RJTUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoTFZNX1JldHVyblN0YXR1c19lbikgTFZNX1dST05HQVVESU9USU1FOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChMVk1fUmV0dXJuU3RhdHVzX2VuKSBMVk1fTlVMTEFERFJFU1M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX1NldFZvbHVtZU5vU21vb3RoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IG91dHB1dCB2b2x1bWUgd2l0aG91dCBhbnkgc21vb3RoaW5nICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICBDb250cm9sIFBhcmFtZXRlcnMsIG9ubHkgdm9sdW1lIHZhbHVlIGlzIHVzZWQgaGVyZSAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIElmIGFueSBvZiBpbnB1dCBhZGRyZXNzZXMgYXJlIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIGNvbnRyb2wgcGFyYW1ldGVycyBhcmUgb3V0IG9mIHJhbmdlICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRWb2x1bWVOb1Ntb290aGluZyggTFZNX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcykKK3sKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX1JldHVyblN0YXR1c19lbiBFcnJvcjsKKworICAgIC8qQXBwbHkgbmV3IGNvbnRyb2xzKi8KKyAgICBFcnJvciA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhoSW5zdGFuY2UscFBhcmFtcyk7CisgICAgcEluc3RhbmNlLT5Ob1Ntb290aFZvbHVtZSA9IExWTV9UUlVFOworICAgIHJldHVybiBFcnJvcjsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDE3ODVhMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMKQEAgLTAsMCArMSw4NzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAkQXV0aG9yOiBueHAwMDc3NTMgJAorICAgICAkUmV2aXNpb246IDEwODIgJAorICAgICAkRGF0ZTogMjAxMC0wNy0wNSAxMjo0NDozOSArMDIwMCAoTW9uLCAwNSBKdWwgMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZNX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWTV9CdWZmZXJNYW5hZ2VkSW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGdWxsIGJ1ZmZlciBtYW5hZ2VtZW50IGFsbG93aW5nIHRoZSB1c2VyIHRvIHByb3ZpZGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG9uICAgKi8KKy8qICBhbnkgYWxpZ25tZW50IGFuZCB3aXRoIGFueSBudW1iZXIgb2Ygc2FtcGxlcy4gVGhlIGFsaWdubWVudCBpcyBjb3JyZWN0ZWQgd2l0aGluICAgICAqLworLyogIHRoZSBidWZmZXIgbWFuYWdlbWVudCBhbmQgdGhlIHNhbXBsZXMgYXJlIGdyb3VwZWQgaW4gdG8gYmxvY2tzIG9mIHRoZSBjb3JyZWN0IHNpemUgICovCisvKiAgYmVmb3JlIHByb2Nlc3NpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBoSW5zdGFuY2UgICAgICAgIC0gICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBJbkRhdGEgICAgICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICpwVG9Qcm9jZXNzICAgICAgICAtICAgIFBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgZGF0YSBwcm9jZXNzaW5nICAgICAgICAgICovCisvKiAgKnBQcm9jZXNzZWQgICAgICAgIC0gICAgUG9pbnRlciB0byBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcHJvY2Vzc2VkIGRhdGEgKi8KKy8qICAgIHBOdW1TYW1wbGVzICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZNX0J1ZmZlck1hbmFnZWRJbihMVk1fSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgKipwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAqKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICpwTnVtU2FtcGxlcykKK3sKKworICAgIExWTV9JTlQxNiAgICAgICAgU2FtcGxlQ291bnQ7ICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBiZSBwcm9jZXNzZWQgdGhpcyBjYWxsICovCisgICAgTFZNX0lOVDE2ICAgICAgICBOdW1TYW1wbGVzOyAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHNjcmF0Y2ggYnVmZmVyICovCisgICAgTFZNX0lOVDE2ICAgICAgICAqcFN0YXJ0OworICAgIExWTV9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0J1ZmZlcl90ICAgICAqcEJ1ZmZlcjsKKyAgICBMVk1fSU5UMTYgICAgICAgICpwRGVzdDsKKyAgICBMVk1fSU5UMTYgICAgICAgIE51bUNoYW5uZWxzID0yOworCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgcHJvY2Vzc2luZyBhZGRyZXNzIHBvaW50ZXJzCisgICAgICovCisgICAgcEJ1ZmZlciAgICAgPSBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50OworICAgIHBEZXN0ICAgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CisgICAgKnBUb1Byb2Nlc3MgPSBwQnVmZmVyLT5wU2NyYXRjaDsKKyAgICAqcFByb2Nlc3NlZCA9IHBCdWZmZXItPnBTY3JhdGNoOworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgY2FsbCBvZiBhIGJsb2NrCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9PSAwKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogRmlyc3QgY2FsbCBmb3IgYSBuZXcgYmxvY2sgb2Ygc2FtcGxlcworICAgICAgICAgKi8KKyAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gKExWTV9JTlQxNikoKnBOdW1TYW1wbGVzICsgcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMpOworICAgICAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgPSAoTFZNX0lOVDE2ICopcEluRGF0YTsKKyAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgICAgICAgID0gTFZNX0ZJUlNUQ0FMTDsKKyAgICB9CisgICAgcFN0YXJ0ID0gcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgc2FtcGxlcyAqLworICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZXMgdG8gb3V0cHV0IGlzIHNhbWUgYXMgbnVtYmVyIHJlYWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyB0aGlzIGNhbGwgYW5kIHVwZGF0ZSB0aGUgYnVmZmVyIHN0YXRlCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA+IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemUpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBQcm9jZXNzIHRoZSBtYXhpbXVtIGJvY2sgc2l6ZSBvZiBzYW1wbGVzLgorICAgICAgICAgKi8KKyAgICAgICAgU2FtcGxlQ291bnQgPSBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOworICAgICAgICBOdW1TYW1wbGVzICA9IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIExhc3QgY2FsbCBmb3IgdGhlIGJsb2NrLCBzbyBjYWxjdWxhdGUgaG93IG1hbnkgZnJhbWVzIGFuZCBzYW1wbGVzIHRvIHByb2Nlc3MKKyAgICAgICAgICAqLworICAgICAgICBMVk1fSU5UMTYgICBOdW1GcmFtZXM7CisKKyAgICAgICAgTnVtU2FtcGxlcyAgPSBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7CisgICAgICAgIE51bUZyYW1lcyAgICA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPj4gTUlOX0lOVEVSTkFMX0JMT0NLU0hJRlQpOworICAgICAgICBTYW1wbGVDb3VudCA9IChMVk1fSU5UMTYpKE51bUZyYW1lcyA8PCBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBidWZmZXIgc3RhdGUKKyAgICAgICAgICovCisgICAgICAgIGlmIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RDQUxMKQorICAgICAgICB7CisgICAgICAgICAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9IExWTV9GSVJTVExBU1RDQUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgPSBMVk1fTEFTVENBTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpU2FtcGxlQ291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzIHRoaXMgY2FsbCAqLworCisKKyAgICAvKgorICAgICAqIENvcHkgc2FtcGxlcyBmcm9tIHRoZSBkZWxheSBidWZmZXIgYXMgcmVxdWlyZWQKKyAgICAgKi8KKyAgICBpZiAoKChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RDQUxMKSB8fAorICAgICAgICAocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUTEFTVENBTEwpKSAmJgorICAgICAgICAocEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMgIT0gMCkpCisgICAgeworICAgICAgICBDb3B5XzE2KCZwQnVmZmVyLT5JbkRlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzKnBCdWZmZXItPkluRGVsYXlTYW1wbGVzKSk7ICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMsIGxlZnQgYW5kIHJpZ2h0ICovCisgICAgICAgIE51bVNhbXBsZXMgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMpOyAvKiBVcGRhdGUgc2FtcGxlIGNvdW50ICovCisgICAgICAgIHBEZXN0ICs9IE51bUNoYW5uZWxzICogcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXM7ICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGRlc3RpbmF0aW9uIHBvaW50ZXIgKi8KKyAgICB9CisKKworICAgIC8qCisgICAgICogQ29weSB0aGUgcmVzdCBvZiB0aGUgc2FtcGxlcyBmb3IgdGhpcyBjYWxsIGZyb20gdGhlIGlucHV0IGJ1ZmZlcgorICAgICAqLworICAgIGlmIChOdW1TYW1wbGVzID4gMCkKKyAgICB7CisgICAgICAgIENvcHlfMTYocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzKk51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLworICAgICAgICBwU3RhcnQgKz0gTnVtQ2hhbm5lbHMgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGlucHV0IHBvaW50ZXIgKi8KKworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgdGhlIGlucHV0IGRhdGEgcG9pbnRlciBhbmQgc2FtcGxlcyB0byBvdXRwdXQKKyAgICAgICAgICovCisgICAgICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCA9IChMVk1fSU5UMTYpKHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCArIE51bVNhbXBsZXMpOyAvKiBVcGRhdGUgc2FtcGxlcyB0byBvdXRwdXQgKi8KKyAgICB9CisKKworICAgIC8qCisgICAgICAqIFVwZGF0ZSB0aGUgc2FtcGxlIGNvdW50IGFuZCBpbnB1dCBwb2ludGVyCisgICAgICovCisgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzICA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAtIFNhbXBsZUNvdW50KTsgICAgICAvKiBVcGRhdGUgdGhlIGNvdW50IG9mIHNhbXBsZXMgKi8KKyAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgID0gcFN0YXJ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBpbnB1dCBzYW1wbGUgcG9pbnRlciAqLworCisKKyAgICAvKgorICAgICAqIFNhdmUgc2FtcGxlcyB0byB0aGUgZGVsYXkgYnVmZmVyIGlmIGFueSBsZWZ0IHVucHJvY2Vzc2VkCisgICAgICovCisgICAgaWYgKChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkgfHwKKyAgICAgICAgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9MQVNUQ0FMTCkpCisgICAgeworICAgICAgICBOdW1TYW1wbGVzID0gcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOworICAgICAgICBwU3RhcnQgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGFydCBvZiB0aGUgYnVmZmVyICovCisgICAgICAgIHBTdGFydCAgICArPSBOdW1DaGFubmVscypTYW1wbGVDb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8qIE9mZnNldCBieSB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisgICAgICAgIGlmIChOdW1TYW1wbGVzICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIENvcHlfMTYocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5JbkRlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzKk51bVNhbXBsZXMpKTsgICAgICAgICAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgZGVsYXkgc2FtcGxlIGNvdW50CisgICAgICAgICAqLworICAgICAgICBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyAgICAgPSBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlIHBhaXJzICovCisgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbCBTYW1wbGVzIHVzZWQgKi8KKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlclVubWFuYWdlZEluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgbW9kZSBpcyBzZWxlY3RlZCBieSB0aGUgdXNlciBjb2RlIGFuZCBkaXNhYmxlcyB0aGUgYnVmZmVyIG1hbmFnZW1lbnQgd2l0aCB0aGUgKi8KKy8qICBleGNlcHRpb24gb2YgdGhlIG1heGltdW0gYmxvY2sgc2l6ZSBwcm9jZXNzaW5nLiBUaGUgdXNlciBtdXN0IGVuc3VyZSB0aGF0IHRoZSAgICAgICAqLworLyogIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgMzItYml0IGFsaWduZWQgYW5kIGFsc28gdGhhdCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gICovCisvKiAgICBwcm9jZXNzIGlzIGEgY29ycmVjdCBtdWx0aXBsZSBvZiBzYW1wbGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBoSW5zdGFuY2UgICAgICAgIC0gICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAqcFRvUHJvY2VzcyAgICAgICAgLSAgICBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBkYXRhIHByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAqLworLyogICpwUHJvY2Vzc2VkICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBwcm9jZXNzZWQgZGF0YSAgICAgICAgICAgICovCisvKiAgICBwTnVtU2FtcGxlcyAgICAgICAgLSAgICBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWTV9CdWZmZXJVbm1hbmFnZWRJbihMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKipwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcykKK3sKKworICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwgb2YgYSBibG9jaworICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPT0gMCkKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IChMVk1fSU5UMTYpKnBOdW1TYW1wbGVzOyAgICAgICAvKiBHZXQgdGhlIG51bWJlciBvZiBzYW1wbGVzIG9uIGZpcnN0IGNhbGwgKi8KKyAgICAgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgID0gKnBUb1Byb2Nlc3M7ICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgSS9PIHBvaW50ZXJzICovCisgICAgICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgICAgPSAqcFByb2Nlc3NlZDsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0ZSBibG9jayBzaXplIHRvIHByb2Nlc3MKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPiBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplKQorICAgICAgICB7CisgICAgICAgICAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIHByb2Nlc3MgcG9pbnRlcnMKKyAgICAgKi8KKyAgICAqcFRvUHJvY2VzcyA9IHBJbnN0YW5jZS0+cElucHV0U2FtcGxlczsKKyAgICAqcFByb2Nlc3NlZCA9IHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXM7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlck9wdGltaXNlZEluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9wdGltaXNlZCBidWZmZXIgbWFuYWdlbWVudCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGRhdGEgaXMgb3V0cGxhY2UgcHJvY2Vzc2luZywgICAqLworLyogICAgdGhlIG91dHB1dCBkYXRhIGlzIDMyLWJpdCBhbGlnbmVkIGFuZCB0aGVyZSBhcmUgc3VmZmljaWVudCBzYW1wbGVzIHRvIGFsbG93IHNvbWUgICovCisvKiAgICBwcm9jZXNzaW5nIGRpcmVjdGx5IGluIHRoZSBvdXRwdXQgYnVmZmVyLiBUaGlzIHNhdmVzIG9uZSBkYXRhIGNvcHkgcGVyIHNhbXBsZSAgICAgKi8KKy8qICAgIGNvbXBhcmVkIHdpdGggdGhlIHVub3B0aW1zZWQgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIGhJbnN0YW5jZSAgICAgICAgLSAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgcEluRGF0YSAgICAgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSBzdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgKnBUb1Byb2Nlc3MgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgZGF0YSBwcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAqcFByb2Nlc3NlZCAgICAgICAgLSAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcHJvY2Vzc2VkIGRhdGEgICAgICAgICAgICAqLworLyogICAgcE51bVNhbXBsZXMgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVk1fQnVmZmVyT3B0aW1pc2VkSW4oTFZNX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAqKnBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAqKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAqcE51bVNhbXBsZXMpCit7CisKKyAgICBMVk1fSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9CdWZmZXJfdCAgICAgKnBCdWZmZXIgICAgPSBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50OworICAgIExWTV9JTlQxNiAgICAgICAgKnBEZXN0OworICAgIExWTV9JTlQxNiAgICAgICAgU2FtcGxlQ291bnQ7CisgICAgTFZNX0lOVDE2ICAgICAgICBOdW1TYW1wbGVzOworICAgIExWTV9JTlQxNiAgICAgICAgTnVtRnJhbWVzOworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgY2FsbCBmb3IgdGhpcyBibG9jaworICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPT0gMCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEZpcnN0IGNhbGwgZm9yIGEgbmV3IGJsb2NrIG9mIHNhbXBsZXMKKyAgICAgICAgICovCisgICAgICAgIHBCdWZmZXItPkJ1ZmZlclN0YXRlID0gTFZNX0ZJUlNUQ0FMTDsKKyAgICAgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgID0gKExWTV9JTlQxNiAqKXBJbkRhdGE7CisgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IChMVk1fSU5UMTYpKnBOdW1TYW1wbGVzOworICAgICAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgICAgPSAoTFZNX0lOVDE2KSpwTnVtU2FtcGxlczsKKyAgICAgICAgcERlc3QgPSAqcFByb2Nlc3NlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgc3RhcnQgb2YgdGhlIG91dHB1dCBidWZmZXIgKi8KKworCisgICAgICAgIC8qCisgICAgICAgICAqIENvcHkgdGhlIGFscmVhZHkgcHJvY2Vzc2VkIHNhbXBsZXMgdG8gdGhlIG91dHB1dCBidWZmZXIKKyAgICAgICAgICovCisgICAgICAgIGlmIChwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29weV8xNigmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKyAgICAgICAgICAgIHBEZXN0ICs9IDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBvdXRwdXQgcG9pbnRlciAqLworICAgICAgICAgICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ID0gKExWTV9JTlQxNikocEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0IC0gcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKTsgLyogVXBkYXRlIHRoZSBudW1iciBvZiBzYW1wbGVzIHRvIG91dHB1dCAqLworICAgICAgICB9CisgICAgICAgICpwVG9Qcm9jZXNzID0gcERlc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBhZGRyZXNzIHRvIHN0YXJ0IHByb2Nlc3NpbmcgKi8KKyAgICAgICAgKnBQcm9jZXNzZWQgPSBwRGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzIGluIHRoZSBvdXRwdXQgYnVmZmVyLCBub3cgaW5wbGFjZSAqLworCisgICAgICAgIC8qCisgICAgICAgICAqIENvcHkgdGhlIGlucHV0IGRlbGF5IGJ1ZmZlciAodW5wcm9jZXNzZWQpIHNhbXBsZXMgdG8gdGhlIG91dHB1dCBidWZmZXIKKyAgICAgICAgICovCisgICAgICAgIGlmIChwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBDb3B5XzE2KCZwQnVmZmVyLT5JbkRlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKnBCdWZmZXItPkluRGVsYXlTYW1wbGVzKSk7ICAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLworICAgICAgICAgICAgcERlc3QgKz0gMiAqIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzOyAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIG91dHB1dCBwb2ludGVyICovCisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIENhbGN1bGF0ZSBob3cgbWFueSBpbnB1dCBzYW1wbGVzIHRvIHByb2Nlc3MgYW5kIGNvcHkKKyAgICAgICAgICovCisgICAgICAgIE51bVNhbXBsZXMgICAgPSAoTFZNX0lOVDE2KSgqcE51bVNhbXBsZXMgLSBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpOyAgLyogTnVtYmVyIHRoYXQgd2lsbCBmaXQgaW4gdGhlIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgaWYgKE51bVNhbXBsZXMgPj0gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgTnVtU2FtcGxlcyA9IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemU7CisgICAgICAgIH0KKyAgICAgICAgTnVtRnJhbWVzICAgICAgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzID4+IE1JTl9JTlRFUk5BTF9CTE9DS1NISUZUKTsKKyAgICAgICAgU2FtcGxlQ291bnQgICA9IChMVk1fSU5UMTYpKE51bUZyYW1lcyA8PCBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7CisgICAgICAgICpwTnVtU2FtcGxlcyAgPSAoTFZNX1VJTlQxNilTYW1wbGVDb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKyAgICAgICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ID0gKExWTV9JTlQxNikocEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0IC0gU2FtcGxlQ291bnQpOyAvKiBVcGRhdGUgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIG91dHB1dCAqLworICAgICAgICBTYW1wbGVDb3VudCAgID0gKExWTV9JTlQxNikoU2FtcGxlQ291bnQgLSBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyk7ICAgICAgICAgICAgIC8qIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBjb3B5IGZyb20gdGhlIGlucHV0ICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBDb3B5IHNhbXBsZXMgZnJvbSB0aGUgaW5wdXQgYnVmZmVyIGFuZCB1cGRhdGUgY291bnRzIGFuZCBwb2ludGVycworICAgICAgICAgKi8KKyAgICAgICAgQ29weV8xNihwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipTYW1wbGVDb3VudCkpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyArPSAyICogU2FtcGxlQ291bnQ7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgaW5wdXQgcG9pbnRlciAqLworICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzID0gcERlc3QgKyAoMiAqIFNhbXBsZUNvdW50KTsgICAgICAvKiBVcGRhdGUgdGhlIG91dHB1dCBwb2ludGVyICovCisgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAtIFNhbXBsZUNvdW50KTsgLyogU2FtcGxlcyBsZWZ0IGluIHRoZSBpbnB1dCBidWZmZXIgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2Vjb25kIG9yIHN1YnNlcXVlbnQgY2FsbCBpbiBvcHRpbWlzZWQgbW9kZQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCA+PSBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogTW9yZSBzYW1wbGVzIGNhbiBiZSBwcm9jZXNzZWQgZGlyZWN0bHkgaW4gdGhlIG91dHB1dCBidWZmZXIKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgKnBUb1Byb2Nlc3MgPSBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzOyAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGFkZHJlc3MgdG8gc3RhcnQgcHJvY2Vzc2luZyAqLworICAgICAgICAgICAgKnBQcm9jZXNzZWQgPSBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzOyAgICAgICAgICAgICAgICAvKiBQcm9jZXNzIGluIHRoZSBvdXRwdXQgYnVmZmVyLCBub3cgaW5wbGFjZSAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyAgPSBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQ7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgdGhhdCB3aWxsIGZpdCBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgaWYgKE51bVNhbXBsZXMgPj0gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOdW1TYW1wbGVzID0gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE51bUZyYW1lcyAgICAgID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyA+PiBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7CisgICAgICAgICAgICBTYW1wbGVDb3VudCAgID0gKExWTV9JTlQxNikoTnVtRnJhbWVzIDw8IE1JTl9JTlRFUk5BTF9CTE9DS1NISUZUKTsKKyAgICAgICAgICAgICpwTnVtU2FtcGxlcyAgPSAoTFZNX1VJTlQxNilTYW1wbGVDb3VudDsgICAgICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAqLworCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDb3B5IHNhbXBsZXMgZnJvbSB0aGUgaW5wdXQgYnVmZmVyIGFuZCB1cGRhdGUgY291bnRzIGFuZCBwb2ludGVycworICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb3B5XzE2KHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcywgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzLCAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKlNhbXBsZUNvdW50KSk7ICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLworICAgICAgICAgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICs9IDIgKiBTYW1wbGVDb3VudDsgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGlucHV0IHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgKz0gMiAqIFNhbXBsZUNvdW50OyAgICAgICAgICAgLyogVXBkYXRlIHRoZSBvdXRwdXQgcG9pbnRlciAqLworICAgICAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gKExWTV9JTlQxNikocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzIC0gU2FtcGxlQ291bnQpOyAgIC8qIFNhbXBsZXMgbGVmdCBpbiB0aGUgaW5wdXQgYnVmZmVyICovCisgICAgICAgICAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgLSBTYW1wbGVDb3VudCk7ICAgICAgICAgLyogTnVtYmVyIHRoYXQgd2lsbCBmaXQgaW4gdGhlIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgcmVtYWluaW5nIHNhbXBsZXMgY2FuIG5vdCBiZSBwcm9jZXNzZWQgaW4gdGhlIG91dHB1dCBidWZmZXIKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgPSBMVk1fTEFTVENBTEw7ICAgICAgICAgICAgICAgICAgICAvKiBJbmRpY2F0ZSB0aGlzIGlzIHRoZSBsYXN0IGJvY2sgdG8gcHJvY2VzcyAqLworICAgICAgICAgICAgKnBUb1Byb2Nlc3MgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGFkZHJlc3MgdG8gc3RhcnQgcHJvY2Vzc2luZyAqLworICAgICAgICAgICAgKnBQcm9jZXNzZWQgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzIGluIHRoZSBvdXRwdXQgYnVmZmVyLCBub3cgaW5wbGFjZSAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyAgID0gcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOyAgICAgICAgICAgICAvKiBOdW1iZXIgbGVmdCB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgIE51bUZyYW1lcyAgICAgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzID4+IE1JTl9JTlRFUk5BTF9CTE9DS1NISUZUKTsKKyAgICAgICAgICAgIFNhbXBsZUNvdW50ICA9IChMVk1fSU5UMTYpKE51bUZyYW1lcyA8PCBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7CisgICAgICAgICAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilTYW1wbGVDb3VudDsgICAgICAgICAgICAgICAgLyogVGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29weSBzYW1wbGVzIGZyb20gdGhlIGlucHV0IGJ1ZmZlciBhbmQgdXBkYXRlIGNvdW50cyBhbmQgcG9pbnRlcnMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV8xNihwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMsICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlci0+cFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipTYW1wbGVDb3VudCkpOyAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KKyAgICAgICAgICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyArPSAyICogU2FtcGxlQ291bnQ7ICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBpbnB1dCBwb2ludGVyICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgLSBTYW1wbGVDb3VudCk7IC8qIFNhbXBsZXMgbGVmdCBpbiB0aGUgaW5wdXQgYnVmZmVyICovCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWTV9CdWZmZXJJbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGlzIGZ1bmN0aW9uIG1hbmFnZXMgdGhlIGRhdGEgaW5wdXQsIGl0IGhhcyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIEFjY2VwdHMgZGF0YSBpbiAxNi1iaXQgYWxpZ25lZCBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gQ29waWVzIHRoZSBkYXRhIHRvIDMyLWJpdCBhbGlnbmVkIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgLSBDb252ZXJ0cyBNb25vIGlucHV0cyB0byBNb25vLWluLVN0ZXJlbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIEFjY2VwdHMgYW55IG51bWJlciBvZiBzYW1wbGVzIGFzIGlucHV0LCBleGNlcHQgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gQnJlYWtzIHRoZSBpbnB1dCBzYW1wbGUgc3RyZWFtIGluIHRvIGJsb2NrcyBvZiB0aGUgY29uZmlndXJlZCBmcmFtZSBzaXplIG9yICovCisvKiAgICAgICAgICBtdWx0aXBsZXMgb2YgdGhlIGZyYW1lIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIExpbWl0cyB0aGUgcHJvY2Vzc2luZyBibG9jayBzaXplIHRvIHRoZSBtYXhpbXVtIGJsb2NrIHNpemUuICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gV29ya3Mgd2l0aCBpbnBsYWNlIG9yIG91dHBsYWNlIHByb2Nlc3NpbmcgYXV0b21hdGljYWxseSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUbyBtYW5hZ2UgdGhlIGRhdGEgdGhlIGZ1bmN0aW9uIGhhcyBhIG51bWJlciBvZiBvcGVyYXRpbmcgc3RhdGVzOiAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIExWTV9GSVJTVENBTEwgICAgICAgIC0gVGhlIGZpcnN0IGNhbGwgZm9yIHRoaXMgYmxvY2sgb2YgaW5wdXQgc2FtcGxlcyAgICAgICAgICovCisvKiAgICAgICAgTFZNX01BWEJMT0NLQ0FMTCAgICAtIFRoZSBjdXJyZW50IGJsb2NrIGlzIHRoZSBtYXhpbXVtIHNpemUuIE9ubHkgdXNlZCBmb3IgdGhlICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZCBhbmQgc3Vic2VxdWVudCBibG9ja3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICBMVk1fTEFTVENBTEwgICAgICAgIC0gVGhlIGxhc3QgY2FsbCBmb3IgdGhpcyBibG9jayBvZiBpbnB1dCBzYW1wbGVzICAgICAgICAgICAqLworLyogICAgICAgIExWTV9GSVJTVExBU1RDQUxMICAgIC0gVGhpcyBpcyB0aGUgZmlyc3QgYW5kIGxhc3QgY2FsbCBmb3IgdGhpcyBibG9jayBvZiBpbnB1dCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsIHRoaXMgb2NjdXJzIHdoZW4gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyBpcyBsZXNzIHRoYW4gdGhlIG1heGltdW0gYmxvY2sgc2l6ZS4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgZnVuY3Rpb24gdXNlcyBhbiBpbnRlcm5hbCBkZWxheSBidWZmZXIgdGhlIHNpemUgb2YgdGhlIG1pbmltdW0gZnJhbWUsIHRoaXMgaXMgKi8KKy8qICB1c2VkIHRvIHRlbXBvcmFyaWx5IGhvbGQgc2FtcGxlcyB3aGVuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzIGlzIG5vdCBhICAgICAqLworLyogIG11bHRpcGxlIG9mIHRoZSBmcmFtZSBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRvIGVuc3VyZSBjb3JyZWN0IG9wZXJhdGlvbiB3aXRoIGlucGxhY2UgYnVmZmVyaW5nIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBvdXRwdXQqLworLyogIHBlciBjYWxsIGlzIGNhbGN1bGF0ZWQgaW4gdGhpcyBmdW5jdGlvbiBhbmQgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyByZWFkICAgICovCisvKiAgZnJvbSB0aGUgaW5wdXQgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhlIHRvdGFsIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgaXMgc3RvcmVkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgICovCisvKiAgdGhlIGZpcnN0IHRpbWUuIFRoZSB2YWx1ZSBpcyBvdmVyd3JpdHRlbiBieSB0aGUgc2l6ZSBvZiB0aGUgYmxvY2sgdG8gYmUgcHJvY2Vzc2VkICAgKi8KKy8qICBpbiBlYWNoIGNhbGwgc28gdGhlIHNpemUgb2YgdGhlIHByb2Nlc3NpbmcgYmxvY2tzIGNhbiBiZSBjb250cm9sbGVkLiBUaGUgbnVtYmVyIG9mICAqLworLyogICAgc2FtcGxlcyBhY3R1YWxseSBwcm9jZXNzZWQgZm9yIGVhY2ggYmxvY2sgb2YgaW5wdXQgc2FtcGxlcyBpcyBhbHdheXMgYSBtdWx0aXBsZSBvZiovCisvKiAgdGhlIGZyYW1lIHNpemUgc28gZm9yIGFueSBwYXJ0aWN1bGFyIGJsb2NrIG9mIGlucHV0IHNhbXBsZXMgdGhlIGFjdHVhbCBudW1iZXIgb2YgICAgKi8KKy8qICBwcm9jZXNzZWQgc2FtcGxlcyBtYXkgbm90IG1hdGNoIHRoZSBudW1iZXIgb2YgaW5wdXQgc2FtcGxlcywgc29tZXRpbWUgaXQgd2lsbCBiZSAgICAqLworLyogIHNvbWV0aW1lcyBsZXNzLiBUaGUgYXZlcmFnZSBpcyB0aGUgc2FtZSBhbmQgdGhlIGRpZmZlcmVuY2UgaXMgbmV2ZXIgbW9yZSB0aGFuIHRoZSAgICovCisvKiAgZnJhbWUgc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBoSW5zdGFuY2UgICAgICAgIC0gICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBJbkRhdGEgICAgICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICpwVG9Qcm9jZXNzICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGRhdGEgcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICovCisvKiAgKnBQcm9jZXNzZWQgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gb2YgdGhlIHByb2Nlc3NlZCBkYXRhICAgICAgICAgICAgKi8KKy8qICAgIHBOdW1TYW1wbGVzICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZNX0J1ZmZlckluKExWTV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgKipwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgKipwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKQoreworCisgICAgTFZNX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgd2hpY2ggbW9kZSwgbWFuYWdlZCBvciB1bm1hbmFnZWQKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5JbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKKyAgICB7CisgICAgICAgIExWTV9CdWZmZXJNYW5hZ2VkSW4oaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1TYW1wbGVzKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTFZNX0J1ZmZlclVubWFuYWdlZEluKGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRPdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBGdWxsIGJ1ZmZlciBtYW5hZ2VtZW50IG91dHB1dC4gVGhpcyB3b3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBtYW5hZ2VkIGlucHV0ICAgICAqLworLyogIHJvdXRpbmUgYW5kIGVuc3VyZXMgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHNhbXBsZXMgYXJlIGFsd2F5cyBvdXRwdXQgdG8gdGhlIG91dHB1dCAgICovCisvKiAgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBoSW5zdGFuY2UgICAgICAgIC0gSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBPdXREYXRhICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhIHN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgcE51bVNhbXBsZXMgICAgICAgIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVk1fQnVmZmVyTWFuYWdlZE91dChMVk1fSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAqcE51bVNhbXBsZXMpCit7CisKKyAgICBMVk1fSW5zdGFuY2VfdCAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9CdWZmZXJfdCAgICAqcEJ1ZmZlciAgICA9IHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQ7CisgICAgTFZNX0lOVDE2ICAgICAgIFNhbXBsZUNvdW50ID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7CisgICAgTFZNX0lOVDE2ICAgICAgIE51bVNhbXBsZXM7CisgICAgTFZNX0lOVDE2ICAgICAgICpwU3RhcnQ7CisgICAgTFZNX0lOVDE2ICAgICAgICpwRGVzdDsKKworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIHBvaW50ZXJzCisgICAgICovCisgICAgTnVtU2FtcGxlcyA9IHBCdWZmZXItPlNhbXBsZXNUb091dHB1dDsKKyAgICBwU3RhcnQgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CisKKworICAgIC8qCisgICAgICogY2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgb2YgYSBibG9jaworICAgICAgKi8KKyAgICBpZiAoKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVENBTEwpIHx8CisgICAgICAgIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkpCisgICAgeworICAgICAgICAvKiBGaXJzdCBjYWxsIGZvciBhIG5ldyBibG9jayAqLworICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzID0gcE91dERhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZGVzdGluYXRpb24gKi8KKyAgICB9CisgICAgcERlc3QgPSBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIG91dHB1dCBhZGRyZXNzICovCisKKworICAgIC8qCisgICAgICogSWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vbi16ZXJvIHRoZW4gdGhlcmUgYXJlIHN0aWxsIHNhbXBsZXMgdG8gc2VuZCB0bworICAgICAqIHRoZSBvdXRwdXQgYnVmZmVyCisgICAgICovCisgICAgaWYgKChOdW1TYW1wbGVzICE9IDApICYmCisgICAgICAgIChwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgIT0gMCkpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDb3B5IHRoZSBkZWxheWVkIG91dHB1dCBidWZmZXIgc2FtcGxlcyB0byB0aGUgb3V0cHV0CisgICAgICAgICAqLworICAgICAgICBpZiAocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzIDw9IE51bVNhbXBsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDb3B5IGFsbCBvdXRwdXQgZGVsYXkgc2FtcGxlcyB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENvcHlfMTYoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldHNpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7ICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcERlc3QgKz0gMipwQnVmZmVyLT5PdXREZWxheVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIE51bVNhbXBsZXMgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKTsgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KKyAgICAgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIG9mIHRoZSBvdXB1dCBkZWxheSBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV8xNigmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cworICAgICAgICAgICAgICovCisgICAgICAgICAgICBwRGVzdCArPSAyKk51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IChMVk1fSU5UMTYpKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyAtIE51bVNhbXBsZXMpOyAgICAgIC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCisKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFJlYWxpZ24gdGhlIGRlbGF5IGJ1ZmZlciBkYXRhIHRvIGF2b2lkIHVzaW5nIGNpcmN1bGFyIGJ1ZmZlciBtYW5hZ2VtZW50CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENvcHlfMTYoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzIqTnVtU2FtcGxlc10sICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7ICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIG1vdmUgKi8KKyAgICAgICAgICAgIE51bVNhbXBsZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSBwcm9jZXNzZWQgcmVzdWx0cyB0byB0aGUgb3V0cHV0CisgICAgICovCisgICAgaWYgKChOdW1TYW1wbGVzICE9IDApICYmCisgICAgICAgIChTYW1wbGVDb3VudCAhPSAwKSkKKyAgICB7CisgICAgICAgIGlmIChTYW1wbGVDb3VudCA8PSBOdW1TYW1wbGVzKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29weSBhbGwgcHJvY2Vzc2VkIHNhbXBsZXMgdG8gdGhlIG91dHB1dAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb3B5XzE2KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRzaW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKlNhbXBsZUNvdW50KSk7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cworICAgICAgICAgICAgICovCisgICAgICAgICAgICBwRGVzdCAgICAgICs9IDIgKiBTYW1wbGVDb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyAgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gU2FtcGxlQ291bnQpOyAgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLworICAgICAgICAgICAgU2FtcGxlQ291bnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIHByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV8xNihwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlcnMgYW5kIHNhbXBsZSBjb3VudHMKKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBwU3RhcnQgICAgICArPSAyICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NlZCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgcERlc3QgICAgICAgICs9IDIgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIFNhbXBsZUNvdW50ICA9IChMVk1fSU5UMTYpKFNhbXBsZUNvdW50IC0gTnVtU2FtcGxlcyk7ICAgLyogUHJvY2Vzc2VkIHNhbXBsZXMgbGVmdCAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgc2FtcGxlIGNvdW50ICovCisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogQ29weSB0aGUgcmVtYWluaW5nIHByb2Nlc3NlZCBkYXRhIHRvIHRoZSBvdXRwdXQgZGVsYXkgYnVmZmVyCisgICAgICovCisgICAgaWYgKFNhbXBsZUNvdW50ICE9IDApCisgICAgeworICAgICAgICBDb3B5XzE2KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzIqcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzXSwgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqU2FtcGxlQ291bnQpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IChMVk1fSU5UMTYpKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyArIFNhbXBsZUNvdW50KTsgLyogVXBkYXRlIHRoZSBidWZmZXIgY291bnQgKi8KKyAgICB9CisKKworICAgIC8qCisgICAgICogcG9pbnRlcnMsIGNvdW50cyBhbmQgc2V0IGRlZmF1bHQgYnVmZmVyIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgID0gTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KKyAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzID0gcERlc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgICAgICA9IExWTV9NQVhCTE9DS0NBTEw7ICAgICAgICAgICAgICAgICAgIC8qIFNldCBmb3IgdGhlIGRlZmF1bHQgY2FsbCBibG9jayBzaXplICovCisgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOyAgICAgICAgIC8qIFRoaXMgd2lsbCB0ZXJtaW5hdGUgdGhlIGxvb3Agd2hlbiBhbGwgc2FtcGxlcyBwcm9jZXNzZWQgKi8KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVk1fQnVmZmVyVW5tYW5hZ2VkT3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgdW5tYW5hZ2VkIGlucHV0IHJvdXRpbmUgYW5kIHVwZGF0ZXMgdGhlIG51bWJlciAgICovCisvKiAgICBvZiBzYW1wbGVzIGxlZnQgdG8gYmUgcHJvY2Vzc2VkICAgIGFuZCBhZGp1c3RzIHRoZSBidWZmZXIgcG9pbnRlcnMuICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBoSW5zdGFuY2UgICAgICAgIC0gSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBOdW1TYW1wbGVzICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZNX0J1ZmZlclVubWFuYWdlZE91dChMVk1fSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICpwTnVtU2FtcGxlcykKK3sKKworICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMgPTI7CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHNhbXBsZSBjb3VudHMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgKz0gKExWTV9JTlQxNikoKnBOdW1TYW1wbGVzICogTnVtQ2hhbm5lbHMpOyAvKiBVcGRhdGUgdGhlIEkvTyBwb2ludGVycyAqLworICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgICArPSAoTFZNX0lOVDE2KSgqcE51bVNhbXBsZXMgKiAyKTsKKyAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgID0gKExWTV9JTlQxNikocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzIC0gKnBOdW1TYW1wbGVzKTsgLyogVXBkYXRlIHRoZSBzYW1wbGUgY291bnQgKi8KKworICAgIC8qCisgICAgICogU2V0IHRlIGJsb2NrIHNpemUgdG8gcHJvY2VzcworICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPiBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplKQorICAgIHsKKyAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVk1fQnVmZmVyT3B0aW1pc2VkT3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgb3B0aW1pc2VkIGlucHV0IHJvdXRpbmUgYW5kIGNvcGllcyB0aGUgbGFzdCBmZXcgICovCisvKiAgcHJvY2Vzc2VkIGFuZCB1bnByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZWlyIHJlc3BlY3RpdmUgYnVmZmVycy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBoSW5zdGFuY2UgICAgICAgIC0gSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBOdW1TYW1wbGVzICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZNX0J1ZmZlck9wdGltaXNlZE91dChMVk1fSGFuZGxlX3QgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICpwTnVtU2FtcGxlcykKK3sKKworICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0J1ZmZlcl90ICAgICAgICAqcEJ1ZmZlciAgID0gcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudDsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgaXQgaXMgdGhlIGxhc3QgYmxvY2sgdG8gcHJvY2VzcworICAgICAqLworICAgIGlmIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fTEFTVENBTEwpCisgICAgeworICAgICAgICBMVk1fSU5UMTYgICAgKnBTcmMgPSBwQnVmZmVyLT5wU2NyYXRjaDsKKworICAgICAgICAvKgorICAgICAgICAgKiBDb3B5IHRoZSB1bnByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZSBpbnB1dCBkZWxheSBidWZmZXIKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29weV8xNihwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMsICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPkluRGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MpKTsgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KKyAgICAgICAgICAgIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzID0gcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOworICAgICAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzID0gMDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogRmlsbCB0aGUgbGFzdCBlbXB0eSBzcGFjZXMgaW4gdGhlIG91dHB1dCBidWZmZXIKKyAgICAgICAgICovCisgICAgICAgIGlmIChwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29weV8xNihwU3JjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcywgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQpKTsgICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KKyAgICAgICAgICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KSgqcE51bVNhbXBsZXMgLSBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQpOworICAgICAgICAgICAgcFNyYyArPSAyICogcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0OyAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBzY3JhdGNoIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBtb3JlIHNhbXBsZXMgaW4gdGhpcyBibG9jayAqLworICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTYXZlIGFueSByZW1haW5pbmcgcHJvY2Vzc2VkIHNhbXBsZXMgaW4gdGhlIG91dHB1dCBkZWxheSBidWZmZXIKKyAgICAgICAgICovCisgICAgICAgIGlmICgqcE51bVNhbXBsZXMgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29weV8xNihwU3JjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMioqcE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KKworICAgICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7CisKKyAgICAgICAgICAgICpwTnVtU2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBtb3JlIHNhbXBsZXMgaW4gdGhpcyBibG9jayAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gMDsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVk1fQnVmZmVyT3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gbWFuYWdlcyB0aGUgZGF0YSBvdXRwdXQsIGl0IGhhcyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgLSBPdXRwdXQgZGF0YSB0byAxNi1iaXQgYWxpZ25lZCBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIFJlYWRzIGRhdGEgZnJvbSAzMi1iaXQgYWxpZ25lZCBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gUmVhZHMgZGF0YSBvbmx5IGluIGJsb2NrcyBvZiBmcmFtZSBzaXplIG9yIG11bHRpcGxlcyBvZiBmcmFtZSBzaXplICAgICAgICAgICovCisvKiAgICAgICAgLSBXcml0ZXMgdGhlIHNhbWUgbnVtYmVyIG9mIHNhbXBsZXMgYXMgdGhlIExWTV9CdWZmZXJJbiBmdW5jdGlvbiByZWFkcyAgICAgICAgKi8KKy8qICAgICAgICAtIFdvcmtzIHdpdGggaW5wbGFjZSBvciBvdXRwbGFjZSBwcm9jZXNzaW5nIGF1dG9tYXRpY2FsbHkgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVG8gbWFuYWdlIHRoZSBkYXRhIHRoZSBmdW5jdGlvbiBoYXMgYSBudW1iZXIgb2Ygb3BlcmF0aW5nIHN0YXRlczogICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICBMVk1fRklSU1RDQUxMICAgICAgICAtIFRoZSBmaXJzdCBjYWxsIGZvciB0aGlzIGJsb2NrIG9mIGlucHV0IHNhbXBsZXMgICAgICAgICAqLworLyogICAgICAgIExWTV9GSVJTVExBU1RDQUxMICAgIC0gVGhpcyBpcyB0aGUgZmlyc3QgYW5kIGxhc3QgY2FsbCBmb3IgdGhpcyBibG9jayBvZiBpbnB1dCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsIHRoaXMgb2NjdXJzIHdoZW4gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyBpcyBsZXNzIHRoYW4gdGhlIG1heGltdW0gYmxvY2sgc2l6ZS4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgZnVuY3Rpb24gdXNlcyBhbiBpbnRlcm5hbCBkZWxheSBidWZmZXIgdGhlIHNpemUgb2YgdGhlIG1pbmltdW0gZnJhbWUsIHRoaXMgaXMgKi8KKy8qICB1c2VkIHRvIHRlbXBvcmFyaWx5IGhvbGQgc2FtcGxlcyB3aGVuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byB3cml0ZSBpcyBub3QgYSAgICAgICAqLworLyogIG11bHRpcGxlIG9mIHRoZSBmcmFtZSBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRvIGVuc3VyZSBjb3JyZWN0IG9wZXJhdGlvbiB3aXRoIGlucGxhY2UgYnVmZmVyaW5nIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBvdXRwdXQqLworLyogIHBlciBjYWxsIGlzIGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcmVhZCBmcm9tIHRoZSBpbnB1dCBidWZmZXIuICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgaEluc3RhbmNlICAgICAgICAtIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBwT3V0RGF0YSAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSBzdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBOdW1TYW1wbGVzICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZNX0J1ZmZlck91dChMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcykKK3sKKworICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKworCisgICAgLyoKKyAgICAgKiBDaGVjayB3aGljaCBtb2RlLCBtYW5hZ2VkIG9yIHVubWFuYWdlZAorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRPdXQoaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBMVk1fQnVmZmVyVW5tYW5hZ2VkT3V0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjU3OGRiOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaApAQCAtMCwwICsxLDU3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0xWTV9DT0VGRlNfSF9fCisjZGVmaW5lIF9fTFZNX0NPRUZGU19IX18KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEhpZ2ggUGFzcyBTaGVsdmluZyBGaWx0ZXIgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUcmVibGVCb29zdENvcm5lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDAwCisjZGVmaW5lIFRyZWJsZUJvb3N0TWluUmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFRyZWJsZUJvb3N0U3RlcHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMjIwNTBIeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzgzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4xNjQyOTEgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY4NTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUxNDQ5MiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMTI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNzAwMzMgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2ODMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjE0MjkyNSAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzU1OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTM1ODU4ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIxMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM3MDAzMyAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzg5OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMTE4OTUzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4MzQ1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NTk4MzAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjNfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDE2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wOTIwNTUgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyMjYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjU4NjcyOCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMTI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNzAwMzMgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjA2MTg3NiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDIxNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjE2OTA3ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIxMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM3MDAzMyAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkxOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDI4MDEzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxMzI0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC42NTA3NzAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjZfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTY0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA1MDAyICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMzExICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNDUxOTkgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtODY0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDI2MzY4ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDEyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNjY1NjUgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNjUwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDUwMzQwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNzk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zOTA1MzcgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjlfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjUzMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjA3NzIzOCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzY3OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDE3NDM1ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIxMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM3MDAzMyAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgLTM1MjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xMDc0MTcgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ2NjcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQ0NzYxNSAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMTI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNzAwMzMgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NjI5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTQxMjc5ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1Nzc3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40ODE0NzcgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjk0NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjA4OTg0OSAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgODUzMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjYwMzUyICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIxMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM3MDAzMyAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgLTM2NDQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xMTEyMTUgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkyMzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI4MTcxOCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMTI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNzAwMzMgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NDMwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTM1MTg3ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDE3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zMDU2OTAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworCisKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMjQwMDBIeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNjI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4xMTA2MjggKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY5NjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUxNzU3OCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4MTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjA4NTgwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzc3NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTQyNDA2ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg5OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDU3OTQzICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4Njg2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NzAyNjMgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODc0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMjY2ODcgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTk3MTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjYwMTUxOSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNzUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDgzODMgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA4NjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjYzNjU4OSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE1NjQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wNDc3MzMgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIxNDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjY3NTkzOCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE1MDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wNDYwNTEgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE4MjYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM2MDg5OSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIzMjMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wNzA4NzggKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI2NDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM4NTcyNyAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMyMzUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wOTg3MzYgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM1NTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQxMzU4NCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC00MjYwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTI5OTkyICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NTc3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40NDQ4NDEgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTQwOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE2NTA2MiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTcyNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDc5OTExICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgLTY2OTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMDQ0MTEgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcwMTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUxOTI2MCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC00MDgyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTI0NTc2ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MjUzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yODIzNzQgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDg5NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE0OTQwNCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDA2NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzA3MjAyICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgLTU4MDggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xNzcyNjEgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA5NzkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjMzNTA1OSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisKKworLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAzMjAwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcyMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUyNTY3NyAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTk5MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAzMDIyNyAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4MzM3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NTk1OTMgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIxMDIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wNjQxNDIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTU4NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTk3NjQ2ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zMzQ5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTAyMTk2ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA5ODMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjY0MDM0MyAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDc0OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE0NDg5MyAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyNTUzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC42ODgyNTAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYzMTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xOTI3OTkgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDMxNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNzQyMDAyICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04MDc5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjQ2NTUxICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMxNzYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQwMjEwOSAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTA0MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE1Mzc5NSAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0Mjg4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40MzYwMjQgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYxNTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xODc3MTEgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTUzNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDc0MDc4ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03Mzk4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjI1NzY0ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2OTM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41MTY3NzQgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTg3OTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjg0NjEgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg1MDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjU2NDY4MSAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDM2NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjMxNjM2OCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDI2NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjE4NDMzICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEyMTI4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzcwMTIwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMTQ3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNDAxNzggKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcwNjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTU3MjYgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIyNTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM3NDA5MyAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtODE4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI0OTY0MiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzUwNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDEyMTQ3ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC05NDI3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjg3Njk1ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisKKworLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA0NDEwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc0NDIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUzMjI5NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDc2MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE0NTI5NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03MTczICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE4ODk0ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4Nzk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NzM2MzMgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYxMTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xODY2MzQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzE3MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIxODg5NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDMxNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjIwMDE2ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03NjM1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjMzMDE3ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcxNzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTg4OTQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwMjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjY3MjA1OSAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOTM0MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI4NTA2MCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03MTczICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE4ODk0ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzOTM1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC43MzA0NTIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTEyNTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zNDM0NTMgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzE3MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIxODg5NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjA4MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNzk1OTcwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEzNDAxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDA4OTcxICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcxNzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTg4OTQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQyNzkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQzNTc3NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzkyNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI0MTgxNSAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03MTczICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE4ODk0ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1NjM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40NzcxMTMgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTkyNzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yODMxNTQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzE3MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIxODg5NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzE1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTIzNDk2ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzk4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzI5NTM3ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcxNzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTg4OTQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4ODU5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NzU1MzkgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMTI1MDQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zODE1ODAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzE3MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIxODg5NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA3NzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjYzMzkzMiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNDQxNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjQzOTk3MyAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC03MTczICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE4ODk0ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjkyMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjk5NDUwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTE2NTY0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNTA1NDkxICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcxNzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTg4OTQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNjk0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zODczOTkgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTk1MDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yOTAxODkgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzE3MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIxODg5NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQwNDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQyODczOCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDg2NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjMzMTUyOCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC03MTczICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE4ODk0ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTU2OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDc1MTIxICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEyMzgzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzc3OTEyICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcxNzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTg4OTQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisKKworLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA0ODAwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc0OTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUzMzc3NyAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTYwNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE3MTA4MiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4OTAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NzY3NzkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcwMTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTQwODUgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjI1MDI5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04NTk2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjYyMzM1ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIyNTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjY3OTE2NyAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDM3MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjMxNjQ3MiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MjQ1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC43Mzk5MTAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTIzNjEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zNzcyMTUgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjQ3OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuODA4MDY1ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE0NTk0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDQ1MzcwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ1MjcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQ0MzMxOCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtODU3MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2MTU0MCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1OTM2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40ODYzMjEgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTk5NzkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zMDQ1NDMgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzUxNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTM0NTcxICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTExNTYwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzUyNzkzICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjkxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41ODg3MDggKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMTMzMzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC40MDY5MzAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEyODEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjY0OTQ1MiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNTMyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjQ2NzY3NCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC04NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzUxNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNzE3NjA3ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTE3NTU4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNTM1ODI5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMDQxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zOTc5ODIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMTAwNTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zMDY4NzcgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0NTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQ0MDk4NCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMTQ2NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjM0OTg4MCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC04NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAzMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDg5MjM0ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEzMDQ2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzk4MTMwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NjY3ZmViCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYwpAQCAtMCwwICsxLDEwMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogbnhwMDA3NzUzICQKKyAgICAgJFJldmlzaW9uOiAxMjU1ICQKKyAgICAgJERhdGU6IDIwMTAtMDctMTYgMTc6MDc6MjkgKzAyMDAgKEZyaSwgMTYgSnVsIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiTFZNX0NvZWZmcy5oIgorI2luY2x1ZGUgIkxWTV9UYWJsZXMuaCIKKyNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNldHMgb3IgY2hhbmdlcyB0aGUgTGlmZVZpYmVzIG1vZHVsZSBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fTlVMTEFERFJFU1MgICAgV2hlbiBoSW5zdGFuY2UsIHBQYXJhbXMgb3IgYW55IGNvbnRyb2wgcG9pbnRlcnMgYXJlIE5VTEwgICAgICAgICAqLworLyogIExWTV9PVVRPRlJBTkdFICAgICBXaGVuIGFueSBvZiB0aGUgY29udHJvbCBwYXJhbWV0ZXJzIGFyZSBvdXQgb2YgcmFuZ2UgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhMVk1fSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpCit7CisgICAgTFZNX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKworCisgICAgaWYgKChwUGFyYW1zID09IExWTV9OVUxMKSB8fCAoaEluc3RhbmNlID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKKyAgICB9CisKKyAgICBwSW5zdGFuY2UtPk5ld1BhcmFtcyA9ICpwUGFyYW1zOworCisgICAgaWYoCisgICAgICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLworICAgICAgICAoKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT0ZGKSAmJiAocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PTikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAoKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAgICAgICAmJgorICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAgICAgICAmJgorICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMzIwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180NDEwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ4MDAwKSkgICAgICB8fAorICAgICAgICAoKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJiAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pKSB8fAorICAgICAgICAocFBhcmFtcy0+U3BlYWtlclR5cGUgPiBMVk1fRVhfSEVBRFBIT05FUykpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENpbmVtYSBTb3VuZCBwYXJhbWV0ZXJzCisgICAgICovCisgICAgaWYoKHBQYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PRkYpICYmIChwUGFyYW1zLT5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT04pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgfQorCisgICAgaWYocFBhcmFtcy0+VmlydHVhbGl6ZXJUeXBlICE9IExWTV9DT05DRVJUU09VTkQpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisKKyAgICBpZihwUGFyYW1zLT5WaXJ0dWFsaXplclJldmVyYkxldmVsID4gTFZNX1ZJUlRVQUxJWkVSX01BWF9SRVZFUkJfTEVWRUwpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisKKyAgICBpZihwUGFyYW1zLT5DU19FZmZlY3RMZXZlbCA8IExWTV9DU19NSU5fRUZGRUNUX0xFVkVMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOLUJhbmQgRXF1YWxpemVyCisgICAgICovCisgICAgaWYocFBhcmFtcy0+RVFOQl9OQmFuZHMgPiBwSW5zdGFuY2UtPkluc3RQYXJhbXMuRVFOQl9OdW1CYW5kcykKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKworICAgIC8qIERlZmluaXRpb24gcG9pbnRlciAqLworICAgIGlmICgocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb24gPT0gTFZNX05VTEwpICYmCisgICAgICAgIChwUGFyYW1zLT5FUU5CX05CYW5kcyAhPSAwKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIGZpbHRlciBkZWZpbml0aW9ucyBmb3IgdGhlIEVxdWFsaXNlcgorICAgICAqLworICAgIHsKKyAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBpOworCisgICAgICAgIGlmIChwUGFyYW1zLT5FUU5CX05CYW5kcyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTxwUGFyYW1zLT5FUU5CX05CYW5kczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cEVRTkJfQmFuZERlZnNbaV0gPSBwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBJbnN0YW5jZS0+TmV3UGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uID0gcEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmczsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiggLyogTi1CYW5kIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCisgICAgICAgICgocFBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlICE9IExWTV9FUU5CX09GRikgJiYgKHBQYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSAhPSBMVk1fRVFOQl9PTikpIHx8CisgICAgICAgIChwUGFyYW1zLT5FUU5CX05CYW5kcyA+IHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5FUU5CX051bUJhbmRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKyAgICAvKiBCYW5kIHBhcmFtZXRlcnMqLworICAgIHsKKyAgICAgICAgTFZNX0lOVDE2IGk7CisgICAgICAgIGZvcihpID0gMDsgaSA8IHBQYXJhbXMtPkVRTkJfTkJhbmRzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCgocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uRnJlcXVlbmN5IDwgTFZNX0VRTkJfTUlOX0JBTkRfRlJFUSkgIHx8CisgICAgICAgICAgICAgICAgKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkZyZXF1ZW5jeSA+IExWTV9FUU5CX01BWF9CQU5EX0ZSRVEpKSB8fAorICAgICAgICAgICAgICAgICgocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uR2FpbiAgICAgPCBMVk1fRVFOQl9NSU5fQkFORF9HQUlOKSAgfHwKKyAgICAgICAgICAgICAgICAocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uR2FpbiAgICAgID4gTFZNX0VRTkJfTUFYX0JBTkRfR0FJTikpIHx8CisgICAgICAgICAgICAgICAgKChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXS5RRmFjdG9yICA8IExWTV9FUU5CX01JTl9RRkFDVE9SKSAgICAgfHwKKyAgICAgICAgICAgICAgICAocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uUUZhY3RvciAgID4gTFZNX0VRTkJfTUFYX1FGQUNUT1IpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzCisgICAgICovCisgICAgaWYoKChwUGFyYW1zLT5CRV9PcGVyYXRpbmdNb2RlICE9IExWTV9CRV9PRkYpICYmIChwUGFyYW1zLT5CRV9PcGVyYXRpbmdNb2RlICE9IExWTV9CRV9PTikpICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICgocFBhcmFtcy0+QkVfRWZmZWN0TGV2ZWwgPCBMVk1fQkVfTUlOX0VGRkVDVExFVkVMICkgfHwgKHBQYXJhbXMtPkJFX0VmZmVjdExldmVsID4gTFZNX0JFX01BWF9FRkZFQ1RMRVZFTCApKXx8CisgICAgICAgICgocFBhcmFtcy0+QkVfQ2VudHJlRnJlcSAhPSBMVk1fQkVfQ0VOVFJFXzU1SHopICYmIChwUGFyYW1zLT5CRV9DZW50cmVGcmVxICE9IExWTV9CRV9DRU5UUkVfNjZIeikgICAgICAgICAgICYmCisgICAgICAgIChwUGFyYW1zLT5CRV9DZW50cmVGcmVxICE9IExWTV9CRV9DRU5UUkVfNzhIeikgJiYgKHBQYXJhbXMtPkJFX0NlbnRyZUZyZXEgIT0gTFZNX0JFX0NFTlRSRV85MEh6KSkgICAgICAgICAgIHx8CisgICAgICAgICgocFBhcmFtcy0+QkVfSFBGICE9IExWTV9CRV9IUEZfT0ZGKSAmJiAocFBhcmFtcy0+QkVfSFBGICE9IExWTV9CRV9IUEZfT04pKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKworICAgIC8qCisgICAgICogVm9sdW1lIENvbnRyb2wgcGFyYW1ldGVycworICAgICAqLworICAgIGlmKChwUGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA8IExWTV9WQ19NSU5fRUZGRUNUTEVWRUwgKSB8fCAocFBhcmFtcy0+VkNfRWZmZWN0TGV2ZWwgPiBMVk1fVkNfTUFYX0VGRkVDVExFVkVMICkpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisgICAgaWYoKHBQYXJhbXMtPlZDX0JhbGFuY2UgPCBMVk1fVkNfQkFMQU5DRV9NSU4gKSB8fCAocFBhcmFtcy0+VkNfQmFsYW5jZSA+IExWTV9WQ19CQUxBTkNFX01BWCApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQU0EgcGFyYW1ldGVycworICAgICAqLworICAgIGlmKCAocFBhcmFtcy0+UFNBX1BlYWtEZWNheVJhdGUgPiBMVlBTQV9TUEVFRF9ISUdIKSB8fAorICAgICAgICAocFBhcmFtcy0+UFNBX0VuYWJsZSA+IExWTV9QU0FfT04pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgfQorCisKKyAgICAvKgorICAgICogU2V0IHRoZSBmbGFnIHRvIGluZGljYXRlIHRoZXJlIGFyZSBuZXcgcGFyYW1ldGVycyB0byB1c2UKKyAgICAqCisgICAgKiBQcm90ZWN0IHRoZSBjb3B5IG9mIHRoZSBuZXcgcGFyYW1ldGVycyBmcm9tIGludGVycnVwdHMgdG8gYXZvaWQgcG9zc2libGUgcHJvYmxlbXMKKyAgICAqIHdpdGggbG9zcyBjb250cm9sIHBhcmFtZXRlcnMuIFRoaXMgcHJvYmxlbSBjYW4gb2NjdXIgaWYgdGhpcyBjb250cm9sIGZ1bmN0aW9uIGlzIGNhbGxlZCBtb3JlCisgICAgKiB0aGFuIG9uY2UgYmVmb3JlIGEgY2FsbCB0byB0aGUgcHJvY2VzcyBmdW5jdGlvbi4gSWYgdGhlIHByb2Nlc3MgZnVuY3Rpb24gaW50ZXJydXB0cworICAgICogdGhlIGNvcHkgdG8gTmV3UGFyYW1zIHRoZW4gb25lIGZyYW1lIG1heSBoYXZlIG1peGVkIHBhcmFtZXRlcnMsIHNvbWUgb2xkIGFuZCBzb21lIG5ldy4KKyAgICAqLworICAgIHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPSBMVk1fVFJVRTsKKyAgICBwSW5zdGFuY2UtPk5vU21vb3RoVm9sdW1lID0gTFZNX0ZBTFNFOworCisgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgIExWTV9HZXRDb250cm9sUGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJlcXVlc3QgdGhlIExpZmVWaWJlcyBtb2R1bGUgcGFyYW1ldGVycy4gVGhlIGN1cnJlbnQgcGFyYW1ldGVyIHNldCBpcyByZXR1cm5lZCAgICAgICovCisvKiAgdmlhIHRoZSBwYXJhbWV0ZXIgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgIHdoZW4gYW55IG9mIGhJbnN0YW5jZSBvciBwUGFyYW1zIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhMVk1fSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpCit7CisgICAgTFZNX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKworCisgICAgLyoKKyAgICAgKiBDaGVjayBwb2ludGVyCisgICAgICovCisgICAgaWYgKChwUGFyYW1zID09IExWTV9OVUxMKSB8fCAoaEluc3RhbmNlID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKKyAgICB9CisgICAgKnBQYXJhbXMgPSBwSW5zdGFuY2UtPk5ld1BhcmFtczsKKworICAgIC8qCisgICAgICogQ29weSB0aGUgZmlsdGVyIGRlZmluaXRpb25zIGZvciB0aGUgRXF1YWxpc2VyCisgICAgICovCisgICAgeworICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIGk7CisKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+TmV3UGFyYW1zLkVRTkJfTkJhbmRzICE9IDApCisgICAgICAgIGZvciAoaT0wOyBpPHBJbnN0YW5jZS0+TmV3UGFyYW1zLkVRTkJfTkJhbmRzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnNbaV0gPSBwSW5zdGFuY2UtPnBFUU5CX0JhbmREZWZzW2ldOworICAgICAgICB9CisgICAgICAgIHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uID0gcEluc3RhbmNlLT5wRVFOQl9Vc2VyRGVmczsKKyAgICB9CisKKyAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX1NldFRyZWJsZUJvb3N0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRW5hYmxlIHRoZSB0cmVibGUgYm9vc3Qgd2hlbiB0aGUgc2V0dGluZ3MgYXJlIGFwcHJvcHJpYXRlLCBpLmUuIG5vbi16ZXJvIGdhaW4gICAgICAgKi8KKy8qICBhbmQgdGhlIHNhbXBsZSByYXRlIGlzIGhpZ2ggZW5vdWdoIGZvciB0aGUgZWZmZWN0IHRvIGJlIGhlYXJkLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2UgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlcnMgdG8gdXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVk1fU2V0VHJlYmxlQm9vc3QoTFZNX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcykKK3sKKyAgICBleHRlcm4gRk9fQzE2X0xTaHhfQ29lZnNfdCAgTFZNX1RyZWJsZUJvb3N0Q29lZnNbXTsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBPZmZzZXQ7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgRWZmZWN0TGV2ZWwgPSAwOworCisgICAgLyoKKyAgICAgKiBMb2FkIHRoZSBjb2VmZmljaWVudHMKKyAgICAgKi8KKyAgICBpZiAoKHBQYXJhbXMtPlRFX09wZXJhdGluZ01vZGUgPT0gTFZNX1RFX09OKSAmJgorICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSA+PSBUcmVibGVCb29zdE1pblJhdGUpICYmCisgICAgICAgIChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKSAmJgorICAgICAgICAocFBhcmFtcy0+VEVfRWZmZWN0TGV2ZWwgPiAwKSkKKyAgICB7CisgICAgICAgIGlmKChwUGFyYW1zLT5URV9FZmZlY3RMZXZlbCA9PSBMVk1fVEVfTE9XX01JUFMpICYmCisgICAgICAgICAgICAoKHBQYXJhbXMtPlNwZWFrZXJUeXBlID09IExWTV9IRUFEUEhPTkVTKXx8CisgICAgICAgICAgICAocFBhcmFtcy0+U3BlYWtlclR5cGUgPT0gTFZNX0VYX0hFQURQSE9ORVMpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlLT5URV9BY3RpdmUgPSBMVk1fRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBFZmZlY3RMZXZlbCA9IHBQYXJhbXMtPlRFX0VmZmVjdExldmVsOworICAgICAgICAgICAgcEluc3RhbmNlLT5URV9BY3RpdmUgPSBMVk1fVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHBJbnN0YW5jZS0+VEVfQWN0aXZlID09IExWTV9UUlVFKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogTG9hZCB0aGUgY29lZmZpY2llbnRzIGFuZCBlbmFibGVkIHRoZSB0cmVibGUgYm9vc3QKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgT2Zmc2V0ID0gKExWTV9JTlQxNikoRWZmZWN0TGV2ZWwgLSAxICsgVHJlYmxlQm9vc3RTdGVwcyAqIChwUGFyYW1zLT5TYW1wbGVSYXRlIC0gVHJlYmxlQm9vc3RNaW5SYXRlKSk7CisgICAgICAgICAgICBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+cFRFX1N0YXRlLT5UcmVibGVCb29zdF9TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cFRFX1RhcHMtPlRyZWJsZUJvb3N0X1RhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZMVk1fVHJlYmxlQm9vc3RDb2Vmc1tPZmZzZXRdKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENsZWFyIHRoZSB0YXBzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIExvYWRDb25zdF8xNigoTFZNX0lOVDE2KTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKSZwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocEluc3RhbmNlLT5wVEVfVGFwcy0+VHJlYmxlQm9vc3RfVGFwcykvc2l6ZW9mKExWTV9JTlQxNikpKTsgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogRGlzYWJsZSB0aGUgdHJlYmxlIGJvb3N0CisgICAgICAgICAqLworICAgICAgICBwSW5zdGFuY2UtPlRFX0FjdGl2ZSA9IExWTV9GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVk1fU2V0Vm9sdW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29udmVydHMgdGhlIGlucHV0IHZvbHVtZSBkZW1hbmQgZnJvbSBkQnMgdG8gbGluZWFyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluc3RhbmNlICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAgICBMVk1fU2V0Vm9sdW1lKExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKQoreworCisgICAgTFZNX1VJTlQxNiAgICAgIGRCU2hpZnRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNmRCIHNoaWZ0cyAqLworICAgIExWTV9VSU5UMTYgICAgICBkQk9mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRhYmxlIG9mZnNldCAqLworICAgIExWTV9JTlQxNiAgICAgICBWb2x1bWUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlcXVpcmVkIHZvbHVtZSBpbiBkQnMgKi8KKworICAgIC8qCisgICAgICogTGltaXQgdGhlIGdhaW4gdG8gdGhlIG1heGltdW0gYWxsb3dlZAorICAgICAqLworICAgICBpZiAgKHBQYXJhbXMtPlZDX0VmZmVjdExldmVsID4gMCkKKyAgICAgeworICAgICAgICAgVm9sdW1lID0gMDsKKyAgICAgfQorICAgICBlbHNlCisgICAgIHsKKyAgICAgICAgIFZvbHVtZSA9IHBQYXJhbXMtPlZDX0VmZmVjdExldmVsOworICAgICB9CisKKyAgICAgLyogQ29tcGVuc2F0ZSB0aGlzIHZvbHVtZSBpbiBQU0EgcGxvdCAqLworICAgICBpZihWb2x1bWUgPiAtNjApICAvKiBMaW1pdCB2b2x1bWUgbG9zcyB0byBQU0EgTGltaXRzKi8KKyAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0dhaW5PZmZzZXQ9KExWTV9JTlQxNikoLVZvbHVtZSk7LyogTG9zcyBpcyBjb21wZW5zYXRlZCBieSBHYWluKi8KKyAgICAgZWxzZQorICAgICAgICAgcEluc3RhbmNlLT5QU0FfR2Fpbk9mZnNldD0oTFZNX0lOVDE2KTYwOy8qIExvc3MgaXMgY29tcGVuc2F0ZWQgYnkgR2FpbiovCisKKyAgICBwSW5zdGFuY2UtPlZDX0FWTEZpeGVkVm9sdW1lID0gMDsKKworICAgIC8qCisgICAgICogU2V0IHZvbHVtZSBjb250cm9sIGFuZCBBVkwgdm9sdW1lcyBhY2NvcmRpbmcgdG8gaGVhZHJvb20gYW5kIHZvbHVtZSB1c2VyIHNldHRpbmcKKyAgICAgKi8KKyAgICBpZihwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKQorICAgIHsKKyAgICAgICAgLyogRGVmYXVsdCBTaXR1YXRpb24gd2l0aCBubyBBVkwgYW5kIG5vIFJTICovCisgICAgICAgIGlmKHBQYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSA9PSBMVk1fRVFOQl9PTikKKyAgICAgICAgeworICAgICAgICAgICAgaWYoVm9sdW1lID4gLXBJbnN0YW5jZS0+SGVhZHJvb20pCisgICAgICAgICAgICAgICAgVm9sdW1lID0gKExWTV9JTlQxNiktcEluc3RhbmNlLT5IZWFkcm9vbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogQWN0aXZhdGUgdm9sdW1lIGNvbnRyb2wgaWYgbmVjZXNzYXJ5CisgICAgICovCisgICAgcEluc3RhbmNlLT5WQ19BY3RpdmUgICA9IExWTV9UUlVFOworICAgIGlmIChWb2x1bWUgIT0gMCkKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lZEIgPSBWb2x1bWU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lZEIgPSAwOworICAgIH0KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSByZXF1aXJlZCBnYWluIGFuZCBzaGlmdHMKKyAgICAgKi8KKyAgICBkQk9mZnNldCA9IChMVk1fVUlOVDE2KSgoLVZvbHVtZSkgJSA2KTsgICAgICAgICAgICAgLyogR2V0IHRoZSBkQnMgMC01ICovCisgICAgZEJTaGlmdHMgPSAoTFZNX1VJTlQxNikoVm9sdW1lIC8gLTYpOyAgICAgICAgICAgICAgIC8qIEdldCB0aGUgNmRCIHNoaWZ0cyAqLworCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgcGFyYW1ldGVycworICAgICAqLworICAgIGlmKGRCU2hpZnRzID09IDApCisgICAgeworICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMilMVk1fVm9sdW1lVGFibGVbZEJPZmZzZXRdKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKExWTV9JTlQzMilMVk1fVm9sdW1lVGFibGVbZEJPZmZzZXRdKT4+ZEJTaGlmdHMpKTsKKyAgICB9CisgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSAxOworICAgIGlmKHBJbnN0YW5jZS0+Tm9TbW9vdGhWb2x1bWUgPT0gTFZNX1RSVUUpCisgICAgeworICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwwLHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsMik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLExWTV9WQ19NSVhFUl9USU1FLHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsMik7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZNX1NldEhlYWRyb29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEZpbmQgc3VpdGFibGUgaGVhZHJvb20gYmFzZWQgb24gRVEgc2V0dGluZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB2b2lkICAgICAgICAgICAgICAgIE5vdGhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAgICBMVk1fU2V0SGVhZHJvb20oTFZNX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcykKK3sKKyAgICBMVk1fSU5UMTYgICBpaSwgamo7CisgICAgTFZNX0lOVDE2ICAgSGVhZHJvb20gPSAwOworICAgIExWTV9JTlQxNiAgIE1heEdhaW4gPSAwOworCisKKyAgICBpZiAoKHBQYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSA9PSBMVkVRTkJfT04pICYmIChwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLkhlYWRyb29tX09wZXJhdGluZ01vZGUgPT0gTFZNX0hFQURST09NX09OKSkKKyAgICB7CisgICAgICAgIC8qIEZpbmQgdHlwaWNhbCBoZWFkcm9vbSB2YWx1ZSAqLworICAgICAgICBmb3IoamogPSAwOyBqaiA8IHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHM7IGpqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIE1heEdhaW4gPSAwOworICAgICAgICAgICAgZm9yKCBpaSA9IDA7IGlpIDwgcFBhcmFtcy0+RVFOQl9OQmFuZHM7IGlpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2lpXS5GcmVxdWVuY3kgPj0gcEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uW2pqXS5MaW1pdF9Mb3cpICYmCisgICAgICAgICAgICAgICAgICAgKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2lpXS5GcmVxdWVuY3kgPD0gcEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uW2pqXS5MaW1pdF9IaWdoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2lpXS5HYWluID4gTWF4R2FpbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTWF4R2FpbiA9IHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2lpXS5HYWluOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZigoTWF4R2FpbiAtIHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbltqal0uSGVhZHJvb21fT2Zmc2V0KSA+IEhlYWRyb29tKXsKKyAgICAgICAgICAgICAgICBIZWFkcm9vbSA9IChMVk1fSU5UMTYpKE1heEdhaW4gLSBwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bampdLkhlYWRyb29tX09mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBTYXR1cmF0ZSAqLworICAgICAgICBpZihIZWFkcm9vbSA8IDApCisgICAgICAgICAgICBIZWFkcm9vbSA9IDA7CisgICAgfQorICAgIHBJbnN0YW5jZS0+SGVhZHJvb20gPSAoTFZNX1VJTlQxNilIZWFkcm9vbSA7CisKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9BcHBseU5ld1NldHRpbmdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFwcGxpZXMgY2hhbmdlcyB0byBwYXJhbWV0cmVzLiBUaGlzIGZ1bmN0aW9uIG1ha2VzIG5vIGFzc3VtcHRpb25zIGFib3V0IHdoYXQgICAgICAgICovCisvKiAgZWFjaCBtb2R1bGUgbmVlZHMgZm9yIGluaXRpYWxpc2F0aW9uIGFuZCBoZW5jZSBwYXNzZXMgYWxsIHBhcmFtZXRlcnMgdG8gYWxsIHRoZSAgICAgKi8KKy8qICB0aGUgbW9kdWxlcyBpbiB0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TdWNjZXNzICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9BcHBseU5ld1NldHRpbmdzKExWTV9IYW5kbGVfdCAgIGhJbnN0YW5jZSkKK3sKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgIExvY2FsUGFyYW1zOworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgQ291bnQgPSA1OworCisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIG5ldyBwYXJhbWV0ZXJzIGJ1dCBtYWtlIHN1cmUgdGhleSBkaWRuJ3QgY2hhbmdlIHdoaWxlIGNvcHlpbmcKKyAgICAgKi8KKyAgICBkbworICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5Db250cm9sUGVuZGluZyA9IExWTV9GQUxTRTsKKyAgICAgICAgTG9jYWxQYXJhbXMgPSBwSW5zdGFuY2UtPk5ld1BhcmFtczsKKyAgICAgICAgcEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcyA9IHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXM7CisgICAgICAgIENvdW50LS07CisgICAgfSB3aGlsZSAoKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgIT0gTFZNX0ZBTFNFKSAmJgorICAgICAgICAgICAgIChDb3VudCA+IDApKTsKKworICAgIC8qIENsZWFyIGFsbCBpbnRlcm5hbCBkYXRhIGlmIGZvcm1hdCBjaGFuZ2UqLworICAgIGlmKExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCAhPSBwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQpCisgICAgeworICAgICAgICBMVk1fQ2xlYXJBdWRpb0J1ZmZlcnMocEluc3RhbmNlKTsKKyAgICAgICAgcEluc3RhbmNlLT5Db250cm9sUGVuZGluZyA9IExWTV9GQUxTRTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgdHJlYmxlIGJvb3N0IGlmIHJlcXVpcmVkCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IExvY2FsUGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5URV9FZmZlY3RMZXZlbCAhPSBMb2NhbFBhcmFtcy5URV9FZmZlY3RMZXZlbCkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlRFX09wZXJhdGluZ01vZGUgIT0gTG9jYWxQYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgIT0gTG9jYWxQYXJhbXMuT3BlcmF0aW5nTW9kZSkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlICE9IExvY2FsUGFyYW1zLlNwZWFrZXJUeXBlKSkKKyAgICB7CisgICAgICAgIExWTV9TZXRUcmVibGVCb29zdChwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmTG9jYWxQYXJhbXMpOworICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBoZWFkcm9vbSBpZiByZXF1aXJlZAorICAgICAqLworICAgICAgICBMVk1fU2V0SGVhZHJvb20ocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAmTG9jYWxQYXJhbXMpOyAgICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzICovCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgdm9sdW1lIGlmIHJlcXVpcmVkCisgICAgICovCisgICAgeworICAgICAgICBMVk1fU2V0Vm9sdW1lKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICZMb2NhbFBhcmFtcyk7ICAgICAgICAgICAgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgKi8KKyAgICB9CisgICAgLyogQXBwbHkgYmFsYW5jZSBjaGFuZ2VzKi8KKyAgICBpZihwSW5zdGFuY2UtPlBhcmFtcy5WQ19CYWxhbmNlICE9IExvY2FsUGFyYW1zLlZDX0JhbGFuY2UpCisgICAgeworICAgICAgICAvKiBDb25maWd1cmUgTWl4ZXIgbW9kdWxlIGZvciBncmFkdWFsIGNoYW5nZXMgdG8gdm9sdW1lKi8KKyAgICAgICAgaWYoTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIExWTV9JTlQzMiBUYXJnZXQ7CisgICAgICAgICAgICAvKiBEcm9wIGluIHJpZ2h0IGNoYW5uZWwgdm9sdW1lKi8KKyAgICAgICAgICAgIFRhcmdldCA9IExWTV9NQVhJTlRfMTY7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sVGFyZ2V0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOworCisgICAgICAgICAgICBUYXJnZXQgPSBkQl90b19MaW4zMigoTFZNX0lOVDE2KShMb2NhbFBhcmFtcy5WQ19CYWxhbmNlPDw0KSk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sVGFyZ2V0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSA+MCkKKyAgICAgICAgeworICAgICAgICAgICAgTFZNX0lOVDMyIFRhcmdldDsKKyAgICAgICAgICAgIC8qIERyb3AgaW4gbGVmdCBjaGFubmVsIHZvbHVtZSovCisgICAgICAgICAgICBUYXJnZXQgPSBkQl90b19MaW4zMigoTFZNX0lOVDE2KSgoLUxvY2FsUGFyYW1zLlZDX0JhbGFuY2UpPDw0KSk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sVGFyZ2V0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOworCisgICAgICAgICAgICBUYXJnZXQgPSBMVk1fTUFYSU5UXzE2OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLFRhcmdldCk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sTFZNX1ZDX01JWEVSX1RJTUUsTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIExWTV9JTlQzMiBUYXJnZXQ7CisgICAgICAgICAgICAvKiBObyBkcm9wKi8KKyAgICAgICAgICAgIFRhcmdldCA9IExWTV9NQVhJTlRfMTY7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sVGFyZ2V0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOworCisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sVGFyZ2V0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOworICAgICAgICB9CisgICAgfQorICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBiYXNzIGVuaGFuY2VtZW50CisgICAgICovCisgICAgeworICAgICAgICBMVkRCRV9SZXR1cm5TdGF0dXNfZW4gICAgICAgREJFX1N0YXR1czsKKyAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICAgICAgICAgIERCRV9QYXJhbXM7CisgICAgICAgIExWREJFX0hhbmRsZV90ICAgICAgICAgICAgICAqaERCRUluc3RhbmNlID0gcEluc3RhbmNlLT5oREJFSW5zdGFuY2U7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIG5ldyBwYXJhbWV0ZXJzCisgICAgICAgICAqLworICAgICAgICBpZihMb2NhbFBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09GRikKKyAgICAgICAgeworICAgICAgICAgICAgREJFX1BhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZEQkVfT0ZGOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgREJFX1BhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gKExWREJFX01vZGVfZW4pTG9jYWxQYXJhbXMuQkVfT3BlcmF0aW5nTW9kZTsKKyAgICAgICAgfQorICAgICAgICBEQkVfUGFyYW1zLlNhbXBsZVJhdGUgICAgICAgPSAoTFZEQkVfRnNfZW4pTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZTsKKyAgICAgICAgREJFX1BhcmFtcy5FZmZlY3RMZXZlbCAgICAgID0gTG9jYWxQYXJhbXMuQkVfRWZmZWN0TGV2ZWw7CisgICAgICAgIERCRV9QYXJhbXMuQ2VudHJlRnJlcXVlbmN5ICA9IChMVkRCRV9DZW50cmVGcmVxX2VuKUxvY2FsUGFyYW1zLkJFX0NlbnRyZUZyZXE7CisgICAgICAgIERCRV9QYXJhbXMuSFBGU2VsZWN0ICAgICAgICA9IChMVkRCRV9GaWx0ZXJTZWxlY3RfZW4pTG9jYWxQYXJhbXMuQkVfSFBGOworICAgICAgICBEQkVfUGFyYW1zLkhlYWRyb29tZEIgICAgICAgPSAwOworICAgICAgICBEQkVfUGFyYW1zLlZvbHVtZUNvbnRyb2wgICAgPSBMVkRCRV9WT0xVTUVfT0ZGOworICAgICAgICBEQkVfUGFyYW1zLlZvbHVtZWRCICAgICAgICAgPSAwOworCisgICAgICAgIC8qCisgICAgICAgICAqIE1ha2UgdGhlIGNoYW5nZXMKKyAgICAgICAgICovCisgICAgICAgIERCRV9TdGF0dXMgPSBMVkRCRV9Db250cm9sKGhEQkVJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRCRV9QYXJhbXMpOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogUXVpdCBpZiB0aGUgY2hhbmdlcyB3ZXJlIG5vdCBhY2NlcHRlZAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKERCRV9TdGF0dXMgIT0gTFZEQkVfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKURCRV9TdGF0dXMpOworICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGNvbnRyb2wgZmxhZworICAgICAgICAgKi8KKyAgICAgICAgcEluc3RhbmNlLT5EQkVfQWN0aXZlID0gTFZNX1RSVUU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIE4tQmFuZCBFcXVhbGlzZXIKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gICAgICBFUU5CX1N0YXR1czsKKyAgICAgICAgTFZFUU5CX1BhcmFtc190ICAgICAgICAgICAgIEVRTkJfUGFyYW1zOworICAgICAgICBMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgICAgKmhFUU5CSW5zdGFuY2UgPSBwSW5zdGFuY2UtPmhFUU5CSW5zdGFuY2U7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIG5ldyBwYXJhbWV0ZXJzCisgICAgICAgICAqLworCisgICAgICAgIGlmKExvY2FsUGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT0ZGKQorICAgICAgICB7CisgICAgICAgICAgICBFUU5CX1BhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZFUU5CX0JZUEFTUzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEVRTkJfUGFyYW1zLk9wZXJhdGluZ01vZGUgICAgPSAoTFZFUU5CX01vZGVfZW4pTG9jYWxQYXJhbXMuRVFOQl9PcGVyYXRpbmdNb2RlOworICAgICAgICB9CisKKyAgICAgICAgRVFOQl9QYXJhbXMuU2FtcGxlUmF0ZSAgICAgICA9IChMVkVRTkJfRnNfZW4pTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZTsKKyAgICAgICAgRVFOQl9QYXJhbXMuTkJhbmRzICAgICAgICAgICA9IExvY2FsUGFyYW1zLkVRTkJfTkJhbmRzOworICAgICAgICBFUU5CX1BhcmFtcy5wQmFuZERlZmluaXRpb24gID0gKExWRVFOQl9CYW5kRGVmX3QgKilMb2NhbFBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbjsKKyAgICAgICAgaWYgKExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fU1RFUkVPKSAgICAvKiBNb25vIGZvcm1hdCBub3Qgc3VwcG9ydGVkICovCisgICAgICAgIHsKKyAgICAgICAgICAgIEVRTkJfUGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWRVFOQl9TVEVSRU87CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBFUU5CX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfTU9OT0lOU1RFUkVPOyAgICAgLyogRm9yY2UgdG8gTW9uby1pbi1TdGVyZW8gbW9kZSAqLworICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGNvbnRyb2wgZmxhZworICAgICAgICAgKi8KKyAgICAgICAgaWYgKChMb2NhbFBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKSAmJgorICAgICAgICAgICAgKExvY2FsUGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZSA9PSBMVk1fRVFOQl9PTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+RVFOQl9BY3RpdmUgPSBMVk1fVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEVRTkJfUGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkVRTkJfQllQQVNTOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFrZSB0aGUgY2hhbmdlcworICAgICAgICAgKi8KKyAgICAgICAgRVFOQl9TdGF0dXMgPSBMVkVRTkJfQ29udHJvbChoRVFOQkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFUU5CX1BhcmFtcyk7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBRdWl0IGlmIHRoZSBjaGFuZ2VzIHdlcmUgbm90IGFjY2VwdGVkCisgICAgICAgICAqLworICAgICAgICBpZiAoRVFOQl9TdGF0dXMgIT0gTFZFUU5CX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbilFUU5CX1N0YXR1cyk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgY29uY2VydCBzb3VuZAorICAgICAqLworICAgIHsKKyAgICAgICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gICAgICAgIENTX1N0YXR1czsKKyAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAgICAgICAgIENTX1BhcmFtczsKKyAgICAgICAgTFZDU19IYW5kbGVfdCAgICAgICAgICAgICAgICpoQ1NJbnN0YW5jZSA9IHBJbnN0YW5jZS0+aENTSW5zdGFuY2U7CisgICAgICAgIExWTV9Nb2RlX2VuICAgICAgICAgICAgICAgICBDb21wcmVzc29yTW9kZT1MVk1fTU9ERV9PTjsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIG5ldyBwYXJhbWV0ZXJzCisgICAgICAgICAqLworICAgICAgICBpZihMb2NhbFBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pCisgICAgICAgIHsKKyAgICAgICAgICAgIENTX1BhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZDU19PTjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIENTX1BhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZDU19PRkY7CisgICAgICAgIH0KKworICAgICAgICBpZigoTG9jYWxQYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSA9PSBMVk1fVEVfT04pICYmIChMb2NhbFBhcmFtcy5URV9FZmZlY3RMZXZlbCA9PSBMVk1fVEVfTE9XX01JUFMpKQorICAgICAgICB7CisgICAgICAgICAgICBDU19QYXJhbXMuU3BlYWtlclR5cGUgID0gTFZDU19FWF9IRUFEUEhPTkVTOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ1NfUGFyYW1zLlNwZWFrZXJUeXBlICA9IExWQ1NfSEVBRFBIT05FUzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX1NURVJFTykgICAgLyogTW9ubyBmb3JtYXQgbm90IHN1cHBvcnRlZCAqLworICAgICAgICB7CisgICAgICAgICAgICBDU19QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZDU19TVEVSRU87CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDU19QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZDU19NT05PSU5TVEVSRU87ICAgICAgICAgIC8qIEZvcmNlIHRvIE1vbm8taW4tU3RlcmVvIG1vZGUgKi8KKyAgICAgICAgfQorICAgICAgICBDU19QYXJhbXMuU2FtcGxlUmF0ZSAgPSBMb2NhbFBhcmFtcy5TYW1wbGVSYXRlOworICAgICAgICBDU19QYXJhbXMuUmV2ZXJiTGV2ZWwgPSBMb2NhbFBhcmFtcy5WaXJ0dWFsaXplclJldmVyYkxldmVsOworICAgICAgICBDU19QYXJhbXMuRWZmZWN0TGV2ZWwgPSBMb2NhbFBhcmFtcy5DU19FZmZlY3RMZXZlbDsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgY29udHJvbCBmbGFnCisgICAgICAgICAqLworICAgICAgICBpZiAoKExvY2FsUGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pICYmCisgICAgICAgICAgICAoTG9jYWxQYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlICE9IExWQ1NfT0ZGKSkKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DU19BY3RpdmUgPSBMVk1fVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIENTX1BhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZDU19PRkY7CisgICAgICAgIH0KKworICAgICAgICBDU19QYXJhbXMuQ29tcHJlc3Nvck1vZGU9Q29tcHJlc3Nvck1vZGU7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFrZSB0aGUgY2hhbmdlcworICAgICAgICAgKi8KKyAgICAgICAgQ1NfU3RhdHVzID0gTFZDU19Db250cm9sKGhDU0luc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNTX1BhcmFtcyk7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBRdWl0IGlmIHRoZSBjaGFuZ2VzIHdlcmUgbm90IGFjY2VwdGVkCisgICAgICAgICAqLworICAgICAgICBpZiAoQ1NfU3RhdHVzICE9IExWQ1NfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKUNTX1N0YXR1cyk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBQb3dlciBTcGVjdHJ1bSBBbmFseXNlcgorICAgICAqLworICAgIHsKKyAgICAgICAgTFZQU0FfUkVUVVJOICAgICAgICAgICAgICAgIFBTQV9TdGF0dXM7CisgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICBQU0FfUGFyYW1zOworICAgICAgICBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICAgKmhQU0FJbnN0YW5jZSA9IHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0IHRoZSBuZXcgcGFyYW1ldGVycworICAgICAgICAgKi8KKyAgICAgICAgUFNBX1BhcmFtcy5GcyA9IExvY2FsUGFyYW1zLlNhbXBsZVJhdGU7CisgICAgICAgIFBTQV9QYXJhbXMuTGV2ZWxEZXRlY3Rpb25TcGVlZCA9IChMVlBTQV9MZXZlbERldGVjdFNwZWVkX2VuKUxvY2FsUGFyYW1zLlBTQV9QZWFrRGVjYXlSYXRlOworCisgICAgICAgIC8qCisgICAgICAgICAqIE1ha2UgdGhlIGNoYW5nZXMKKyAgICAgICAgICovCisgICAgICAgIGlmKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQ9PUxWTV9QU0FfT04pCisgICAgICAgIHsKKyAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9Db250cm9sKGhQU0FJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAmUFNBX1BhcmFtcyk7CisKKyAgICAgICAgICAgIGlmIChQU0FfU3RhdHVzICE9IExWUFNBX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbilQU0FfU3RhdHVzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IG5ldyBzZXR0aW5ncworICAgICAgICAgICAgICovCisgICAgICAgICAgICBQU0FfU3RhdHVzID0gTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyAoKExWUFNBX0luc3RhbmNlUHJfdCopaFBTQUluc3RhbmNlKTsKKyAgICAgICAgICAgIGlmKFBTQV9TdGF0dXMgIT0gTFZQU0FfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKVBTQV9TdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIHBhcmFtZXRlcnMgYW5kIGNsZWFyIHRoZSBmbGFnCisgICAgICovCisgICAgcEluc3RhbmNlLT5QYXJhbXMgPSAgTG9jYWxQYXJhbXM7CisKKworICAgIHJldHVybihMVk1fU1VDQ0VTUyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fU2V0SGVhZHJvb21QYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBhdXRvbWF0aXVjIGhlYWRyb29tIG1hbmFnZW1lbnQgcGFyYW1ldGVycy4gICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBIZWFkcm9vbVBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gaGVhZHJvb20gcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TdWNjZXNzICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRIZWFkcm9vbVBhcmFtcyhMVk1fSGFuZGxlX3QgICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9IZWFkcm9vbVBhcmFtc190ICAgICAgKnBIZWFkcm9vbVBhcmFtcykKK3sKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX1VJTlQxNiAgICAgICAgICBpaSwgTkJhbmRzOworCisgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KKyAgICBpZiAoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBIZWFkcm9vbVBhcmFtcyA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9OVUxMQUREUkVTUyk7CisgICAgfQorICAgIGlmICgocEhlYWRyb29tUGFyYW1zLT5OSGVhZHJvb21CYW5kcyAhPSAwKSAmJiAocEhlYWRyb29tUGFyYW1zLT5wSGVhZHJvb21EZWZpbml0aW9uID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKKyAgICB9CisKKyAgICAvKiBDb25zaWRlciBvbmx5IHRoZSBMVk1fSEVBRFJPT01fTUFYX05CQU5EUyBmaXJzdCBiYW5kcyovCisgICAgaWYgKHBIZWFkcm9vbVBhcmFtcy0+TkhlYWRyb29tQmFuZHMgPiBMVk1fSEVBRFJPT01fTUFYX05CQU5EUykKKyAgICB7CisgICAgICAgIE5CYW5kcyA9IExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBOQmFuZHMgPSBwSGVhZHJvb21QYXJhbXMtPk5IZWFkcm9vbUJhbmRzOworICAgIH0KKyAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLk5IZWFkcm9vbUJhbmRzID0gTkJhbmRzOworCisgICAgLyogQ29weSBzZXR0aW5ncyBpbiBtZW1vcnkgKi8KKyAgICBmb3IoaWkgPSAwOyBpaSA8IE5CYW5kczsgaWkrKykKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+cEhlYWRyb29tX0JhbmREZWZzW2lpXSA9IHBIZWFkcm9vbVBhcmFtcy0+cEhlYWRyb29tRGVmaW5pdGlvbltpaV07CisgICAgfQorCisgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uID0gcEluc3RhbmNlLT5wSGVhZHJvb21fQmFuZERlZnM7CisgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlID0gcEhlYWRyb29tUGFyYW1zLT5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlOworICAgIHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPSBMVk1fVFJVRTsKKworICAgIHJldHVybihMVk1fU1VDQ0VTUyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0dldEhlYWRyb29tUGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCB0aGUgYXV0b21hdGljIGhlYWRyb29tIG1hbmFnZW1lbnQgcGFyYW1ldGVycy4gICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSGVhZHJvb21QYXJhbXMgICAgICAgICBQb2ludGVyIHRvIGhlYWRyb29tIHBhcmFtZXRlciBzdHJ1Y3R1cmUgKG91dHB1dCkgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIFdoZW4gaEluc3RhbmNlIG9yIHBIZWFkcm9vbVBhcmFtcyBhcmUgTlVMTCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRIZWFkcm9vbVBhcmFtcyhMVk1fSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICpwSGVhZHJvb21QYXJhbXMpCit7CisgICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlID0oTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9VSU5UMTYgICAgICAgICAgaWk7CisKKyAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEhlYWRyb29tUGFyYW1zID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKKyAgICB9CisKKyAgICBwSGVhZHJvb21QYXJhbXMtPk5IZWFkcm9vbUJhbmRzID0gcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kczsKKworCisgICAgLyogQ29weSBzZXR0aW5ncyBpbiBtZW1vcnkgKi8KKyAgICBmb3IoaWkgPSAwOyBpaSA8IHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHM7IGlpKyspCisgICAgeworICAgICAgICBwSW5zdGFuY2UtPnBIZWFkcm9vbV9Vc2VyRGVmc1tpaV0gPSBwSW5zdGFuY2UtPnBIZWFkcm9vbV9CYW5kRGVmc1tpaV07CisgICAgfQorCisKKyAgICBwSGVhZHJvb21QYXJhbXMtPnBIZWFkcm9vbURlZmluaXRpb24gPSBwSW5zdGFuY2UtPnBIZWFkcm9vbV9Vc2VyRGVmczsKKyAgICBwSGVhZHJvb21QYXJhbXMtPkhlYWRyb29tX09wZXJhdGluZ01vZGUgPSBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLkhlYWRyb29tX09wZXJhdGluZ01vZGU7CisgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fQWxnb0NhbGxCYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGlzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBvZiB0aGUgYWxnb3JpdGhtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwQnVuZGxlSGFuZGxlICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBEYXRhICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgY2FsbGJhY2tJZCAgICAgICAgICAgICAgSUQgb2YgdGhlIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fSU5UMzIgTFZNX0FsZ29DYWxsQmFjayggdm9pZCAgICAgICAgICAqcEJ1bmRsZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIGNhbGxiYWNrSWQpCit7CisgICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlID0oTFZNX0luc3RhbmNlX3QgICopcEJ1bmRsZUhhbmRsZTsKKworICAgICh2b2lkKSBwRGF0YTsKKworICAgIHN3aXRjaChjYWxsYmFja0lkICYgMHhGRjAwKXsKKyAgICAgICAgY2FzZSBBTEdPUklUSE1fQ1NfSUQ6CisgICAgICAgICAgICBzd2l0Y2goY2FsbGJhY2tJZCAmIDB4MDBGRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIExWQ1NfRVZFTlRfQUxHT0ZGOgorICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkNTX0FjdGl2ZSA9IExWTV9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBTEdPUklUSE1fRVFOQl9JRDoKKyAgICAgICAgICAgIHN3aXRjaChjYWxsYmFja0lkICYgMHgwMEZGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgTFZFUU5CX0VWRU5UX0FMR09GRjoKKyAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5FUU5CX0FjdGl2ZSA9IExWTV9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9WQ0NhbGxCYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIHRoZSBWb2x1bWUgY29udHJvbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBCdW5kbGVIYW5kbGUgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEdlbmVyYWxQdXJwb3NlICAgICAgICAgUG9pbnRlciB0byB0aGUgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDYWxsQmFja1BhcmFtICAgICAgICAgICBJRCBvZiB0aGUgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWTV9JTlQzMiAgICBMVk1fVkNDYWxsQmFjayh2b2lkKiAgIHBCdW5kbGVIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICBwR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgICBDYWxsQmFja1BhcmFtKQoreworICAgIExWTV9JbnN0YW5jZV90ICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKilwQnVuZGxlSGFuZGxlOworICAgIExWTV9JTlQzMiAgICBUYXJnZXQ7CisKKyAgICAodm9pZCkgcEdlbmVyYWxQdXJwb3NlOworICAgICh2b2lkKSBDYWxsQmFja1BhcmFtOworCisgICAgLyogV2hlbiB2b2x1bWUgbWl4ZXIgaGFzIHJlYWNoZWQgMCBkQiB0YXJnZXQgdGhlbiBzdG9wIGl0IHRvIGF2b2lkCisgICAgICAgdW5uZWNlc3NhcnkgcHJvY2Vzc2luZy4gKi8KKyAgICBUYXJnZXQgPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSk7CisKKyAgICBpZihUYXJnZXQgPT0gMHg3RkZGKQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5WQ19BY3RpdmUgPSBMVk1fRkFMU0U7CisgICAgfQorICAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2FjNTY4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMKQEAgLTAsMCArMSwxMDAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogbnhwMDA3NzUzICQKKyAgICAgJFJldmlzaW9uOiAxMjU1ICQKKyAgICAgJERhdGU6IDIwMTAtMDctMTYgMTc6MDc6MjkgKzAyMDAgKEZyaSwgMTYgSnVsIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9UYWJsZXMuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiSW5zdEFsbG9jLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0dldE1lbW9yeVRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KKy8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAqLworLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAqLworLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIFdoZW4gb25lIG9mIHBNZW1vcnlUYWJsZSBvciBwSW5zdFBhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICovCisvKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIEluc3RhbmNlIHBhcmFtZXRlcnMgYXJlIG91dCBvZiByYW5nZSAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAyLiAgVGhlIHNjcmF0Y2ggbWVtb3J5IGlzIHRoZSBsYXJnZXN0IHJlcXVpcmVkIGJ5IGFueSBvZiB0aGUgc3ViLW1vZHVsZXMgcGx1cyBhbnkgICAqLworLyogICAgICBhZGRpdGlvbmFsIHNjcmF0Y2ggcmVxdWlyZW1lbnRzIG9mIHRoZSBidW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRNZW1vcnlUYWJsZShMVk1fSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtVGFiX3QgICAgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0luc3RQYXJhbXNfdCAgICAgKnBJbnN0UGFyYW1zKQoreworCisgICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICopaEluc3RhbmNlOworICAgIExWTV9VSU5UMzIgICAgICAgICAgQWxnU2NyYXRjaFNpemU7CisgICAgTFZNX1VJTlQzMiAgICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIEludGVybmFsQmxvY2tTaXplOworICAgIElOU1RfQUxMT0MgICAgICAgICAgQWxsb2NNZW1bTFZNX05SX01FTU9SWV9SRUdJT05TXTsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIGk7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgcGFyYW1ldGVycworICAgICAqLworICAgIGlmKHBNZW1vcnlUYWJsZSA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFJldHVybiBtZW1vcnkgdGFibGUgaWYgdGhlIGluc3RhbmNlIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZAorICAgICAqLworICAgIGlmIChoSW5zdGFuY2UgIT0gTFZNX05VTEwpCisgICAgeworICAgICAgIC8qIFJlYWQgYmFjayBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLworICAgICAgICAqcE1lbW9yeVRhYmxlID0gcEluc3RhbmNlLT5NZW1vcnlUYWJsZTsKKyAgICAgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKKyAgICB9CisKKyAgICBpZihwSW5zdFBhcmFtcyA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgUG93ZXIgU3BlY3RydW0gQW5hbHlzZXIKKyAgICAgKi8KKyAgICBpZihwSW5zdFBhcmFtcy0+UFNBX0luY2x1ZGVkID4gTFZNX1BTQV9PTikKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2sgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBpZiggKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlICE9IExWTV9NQU5BR0VEX0JVRkZFUlMpICYmIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSAhPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlMpICkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKworICAgIC8qIE4tQmFuZCBFcXVhbGl6ZXIgKi8KKyAgICBpZiggcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgPiAzMiApCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisKKyAgICBpZihwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgaWYoIChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplIDwgTFZNX01JTl9NQVhCTE9DS1NJWkUgKSB8fCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA+IExWTV9NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA8IExWTV9NSU5fTUFYQkxPQ0tTSVpFICkgfHwgKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPiBMVk1fVU5NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUpICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICogSW5pdGlhbGlzZSB0aGUgQWxsb2NNZW0gc3RydWN0dXJlcworICAgICovCisgICAgZm9yIChpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspCisgICAgeworICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW1baV0sIExWTV9OVUxMKTsKKyAgICB9CisgICAgSW50ZXJuYWxCbG9ja1NpemUgPSAoTFZNX1VJTlQxNikoKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUpICYgTUlOX0lOVEVSTkFMX0JMT0NLTUFTSyk7IC8qIEZvcmNlIHRvIGEgbXVsdGlwbGUgb2YgTUlOX0lOVEVSTkFMX0JMT0NLU0laRSAqLworCisgICAgaWYgKEludGVybmFsQmxvY2tTaXplIDwgTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkKKyAgICB7CisgICAgICAgIEludGVybmFsQmxvY2tTaXplID0gTUlOX0lOVEVSTkFMX0JMT0NLU0laRTsKKyAgICB9CisKKyAgICAvKiBNYXhpbXVtIEludGVybmFsIEJsYWNrIFNpemUgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYW4gTUFYX0lOVEVSTkFMX0JMT0NLU0laRSovCisgICAgaWYoSW50ZXJuYWxCbG9ja1NpemUgPiBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFKQorICAgIHsKKyAgICAgICAgSW50ZXJuYWxCbG9ja1NpemUgPSBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFOworICAgIH0KKworICAgIC8qCisgICAgKiBCdW5kbGUgcmVxdWlyZW1lbnRzCisgICAgKi8KKyAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKKyAgICAgICAgc2l6ZW9mKExWTV9JbnN0YW5jZV90KSk7CisKKworICAgIC8qCisgICAgICogU2V0IHRoZSBhbGdvcml0aG0gYW5kIGJ1bmRsZSBzY3JhdGNoIHJlcXVpcmVtZW50cworICAgICAqLworICAgIEFsZ1NjcmF0Y2hTaXplICAgID0gMDsKKyAgICBpZiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKKyAgICB7CisgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplID0gNiAqIChNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICsgSW50ZXJuYWxCbG9ja1NpemUpICogc2l6ZW9mKExWTV9JTlQxNik7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLCAgICAgICAgLyogU2NyYXRjaCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fQnVmZmVyX3QpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRyZWJsZSBFbmhhbmNlbWVudCByZXF1aXJlbWVudHMKKyAgICAgKi8KKyAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fVEVfRGF0YV90KSk7CisgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX1RFX0NvZWZzX3QpKTsKKworICAgIC8qCisgICAgICogTi1CYW5kIEVxdWFsaXplciByZXF1aXJlbWVudHMKKyAgICAgKi8KKyAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwgICAgICAvKiBMb2NhbCBzdG9yYWdlICovCisgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZNX0VRTkJfQmFuZERlZl90KSkpOworICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLCAgICAgIC8qIFVzZXIgc3RvcmFnZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWTV9FUU5CX0JhbmREZWZfdCkpKTsKKworICAgIC8qCisgICAgICogQ29uY2VydCBTb3VuZCByZXF1aXJlbWVudHMKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWQ1NfTWVtVGFiX3QgICAgICAgICAgIENTX01lbVRhYjsKKyAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICAgQ1NfQ2FwYWJpbGl0aWVzOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgY2FwYWJpbGl0aWVzCisgICAgICAgICAqLworICAgICAgICBDU19DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplICAgICA9IEludGVybmFsQmxvY2tTaXplOworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cworICAgICAgICAgKi8KKyAgICAgICAgTFZDU19NZW1vcnkoTFZNX05VTEwsCisgICAgICAgICAgICAgICAgICAgICZDU19NZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICZDU19DYXBhYmlsaXRpZXMpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgbWVtb3J5IGFsbG9jYXRpb24gc3RydWN0dXJlcworICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKKyAgICAgICAgaWYgKENTX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSA+IEFsZ1NjcmF0Y2hTaXplKSBBbGdTY3JhdGNoU2l6ZSA9IENTX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZTsKKworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgcmVxdWlyZW1lbnRzCisgICAgICovCisgICAgeworICAgICAgICBMVkRCRV9NZW1UYWJfdCAgICAgICAgICBEQkVfTWVtVGFiOworICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICBEQkVfQ2FwYWJpbGl0aWVzOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgY2FwYWJpbGl0aWVzCisgICAgICAgICAqLworICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwOworICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLkNlbnRyZUZyZXF1ZW5jeSA9IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNjZIeiB8IExWREJFX0NBUF9DRU5UUkVfNzhIeiB8IExWREJFX0NBUF9DRU5UUkVfOTBIejsKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgICAgPSBJbnRlcm5hbEJsb2NrU2l6ZTsKKworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMKKyAgICAgICAgICovCisgICAgICAgIExWREJFX01lbW9yeShMVk1fTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgJkRCRV9NZW1UYWIsCisKKyAgICAgICAgICAgICAgICAgICAgJkRCRV9DYXBhYmlsaXRpZXMpOworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgdGhlIGJ1bmRsZSB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJFX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpOworICAgICAgICBpZiAoREJFX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSA+IEFsZ1NjcmF0Y2hTaXplKSBBbGdTY3JhdGNoU2l6ZSA9IERCRV9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemU7CisKKyAgICB9CisKKworICAgIC8qCisgICAgICogTi1CYW5kIGVxdWFsaXNlciByZXF1aXJlbWVudHMKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWRVFOQl9NZW1UYWJfdCAgICAgICAgIEVRTkJfTWVtVGFiOyAgICAgICAgICAgIC8qIEZvciBOLUJhbmQgRXF1YWxpc2VyICovCisgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgIEVRTkJfQ2FwYWJpbGl0aWVzOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgY2FwYWJpbGl0aWVzCisgICAgICAgICAqLworICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8IExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwgTFZFUU5CX0NBUF9GU180ODAwMDsKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU291cmNlRm9ybWF0ID0gTFZFUU5CX0NBUF9TVEVSRU8gfCBMVkVRTkJfQ0FQX01PTk9JTlNURVJFTzsKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplID0gSW50ZXJuYWxCbG9ja1NpemU7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLk1heEJhbmRzICAgICA9IHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzOworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cworICAgICAgICAgKi8KKyAgICAgICAgTFZFUU5CX01lbW9yeShMVk1fTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9NZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgJkVRTkJfQ2FwYWJpbGl0aWVzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgdGhlIGJ1bmRsZSB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSk7CisgICAgICAgIGlmIChFUU5CX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSA+IEFsZ1NjcmF0Y2hTaXplKSBBbGdTY3JhdGNoU2l6ZSA9IEVRTkJfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplOworCisgICAgfQorCisgICAgLyoKKyAgICAgKiBIZWFkcm9vbSBtYW5hZ2VtZW50IG1lbW9yeSBhbGxvY2F0aW9uCisgICAgICovCisgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAqIHNpemVvZihMVk1fSGVhZHJvb21CYW5kRGVmX3QpKSk7CisgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAqIHNpemVvZihMVk1fSGVhZHJvb21CYW5kRGVmX3QpKSk7CisKKworICAgIC8qCisgICAgICogU3BlY3RydW0gQW5hbHl6ZXIgbWVtb3J5IHJlcXVpcmVtZW50cworICAgICAqLworICAgIHsKKyAgICAgICAgcExWUFNBX0hhbmRsZV90ICAgICBoUFNBSW5zdCA9IExWTV9OVUxMOworICAgICAgICBMVlBTQV9NZW1UYWJfdCAgICAgIFBTQV9NZW1UYWI7CisgICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgUFNBX0luaXRQYXJhbXM7CisgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgRmlsdGVyc1BhcmFtc1s5XTsKKyAgICAgICAgTFZQU0FfUkVUVVJOICAgICAgICBQU0FfU3RhdHVzOworCisgICAgICAgIGlmKHBJbnN0UGFyYW1zLT5QU0FfSW5jbHVkZWQgPT0gTFZNX1BTQV9PTikKKyAgICAgICAgeworICAgICAgICAgICAgUFNBX0luaXRQYXJhbXMuU3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gICA9IChMVk1fVUlOVDE2KSA1MDA7CisgICAgICAgICAgICBQU0FfSW5pdFBhcmFtcy5NYXhJbnB1dEJsb2NrU2l6ZSAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDEwMDA7CisgICAgICAgICAgICBQU0FfSW5pdFBhcmFtcy5uQmFuZHMgICAgICAgICAgICAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDk7CisKKyAgICAgICAgICAgIFBTQV9Jbml0UGFyYW1zLnBGaWx0ZXJzUGFyYW1zID0gJkZpbHRlcnNQYXJhbXNbMF07CisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBQU0FfSW5pdFBhcmFtcy5uQmFuZHM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWx0ZXJzUGFyYW1zW2ldLkNlbnRlckZyZXF1ZW5jeSAgICA9IChMVk1fVUlOVDE2KSAxMDAwOworICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uUUZhY3RvciAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDI1OworICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uUG9zdEdhaW4gICAgICAgICAgID0gKExWTV9JTlQxNikgIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cworICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9NZW1vcnkgKGhQU0FJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfSW5pdFBhcmFtcyk7CisKKyAgICAgICAgICAgIGlmIChQU0FfU3RhdHVzICE9IExWUFNBX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbikgTFZNX0FMR09SSVRITVBTQSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgYnVuZGxlIHRhYmxlCisgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogU2xvdyBEYXRhICovCisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKKyAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpOworCisgICAgICAgICAgICAvKiBGYXN0IERhdGEgKi8KKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7CisKKyAgICAgICAgICAgIC8qIEZhc3QgQ29lZiAqLworICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCisgICAgICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKKworICAgICAgICAgICAgLyogRmFzdCBUZW1wb3JhcnkgKi8KKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9URU1QT1JBUllfRkFTVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgKiBzaXplb2YoTFZNX0lOVDE2KSk7CisKKyAgICAgICAgICAgIGlmIChQU0FfTWVtVGFiLlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlNpemUgPiBBbGdTY3JhdGNoU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBbGdTY3JhdGNoU2l6ZSA9IFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogUmV0dXJuIHRoZSBtZW1vcnkgdGFibGUKKyAgICAgKi8KKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdKTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEE7CisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdKTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEE7CisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUgPCA0KQorICAgIHsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSA9IDA7CisgICAgfQorCisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSk7CisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplIDwgNCkKKyAgICB7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUgPSAwOworICAgIH0KKworICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLAorICAgICAgICAgICAgICAgICAgICAgICAgQWxnU2NyYXRjaFNpemUpOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgICAgICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdKTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5UeXBlICAgICAgICAgICAgID0gTFZNX1RFTVBPUkFSWV9GQVNUOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgPSBMVk1fTlVMTDsKKyAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSA8IDQpCisgICAgeworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOworCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0SW5zdGFuY2VIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgYnVuZGxlIGluc3RhbmNlLiBJdCByZXR1cm5zIHRoZSBjcmVhdGVkIGluc3RhbmNlICAqLworLyogIGhhbmRsZSB0aHJvdWdoIHBoSW5zdGFuY2UuIEFsbCBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCwgaW5hY3RpdmUgc3RhdGUuICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdFBhcmFtcyAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9PVVRPRlJBTkdFICAgICAgICAgIFdoZW4gYW55IG9mIHRoZSBJbnN0YW5jZSBwYXJhbWV0ZXJzIGFyZSBvdXQgb2YgcmFuZ2UgICAgICAgICovCisvKiAgTFZNX05VTExBRERSRVNTICAgICAgICAgV2hlbiBvbmUgb2YgcGhJbnN0YW5jZSwgcE1lbW9yeVRhYmxlIG9yIHBJbnN0UGFyYW1zIGFyZSBOVUxMKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldEluc3RhbmNlSGFuZGxlKExWTV9IYW5kbGVfdCAgICAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtVGFiX3QgICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSW5zdFBhcmFtc190ICAgICAgICpwSW5zdFBhcmFtcykKK3sKKworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIFN0YXR1cyA9IExWTV9TVUNDRVNTOworICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgICpwSW5zdGFuY2U7CisgICAgSU5TVF9BTExPQyAgICAgICAgICAgICAgQWxsb2NNZW1bTFZNX05SX01FTU9SWV9SRUdJT05TXTsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBpOworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIEludGVybmFsQmxvY2tTaXplOworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplOworCisKKyAgICAvKgorICAgICAqIENoZWNrIHZhbGlkIHBvaW50cyBoYXZlIGJlZW4gZ2l2ZW4KKyAgICAgKi8KKyAgICBpZiAoKHBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpIHx8IChwSW5zdFBhcmFtcyA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9OVUxMQUREUkVTUyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayB0aGUgbWVtb3J5IHRhYmxlIGZvciBOVUxMIHBvaW50ZXJzCisgICAgICovCisgICAgZm9yIChpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspCisgICAgeworICAgICAgICBpZiAoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLlNpemUgIT0gMCkgJiYKKyAgICAgICAgICAgIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3M9PUxWTV9OVUxMKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKExWTV9OVUxMQUREUkVTUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzCisgICAgICovCisgICAgaWYoIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSAhPSBMVk1fTUFOQUdFRF9CVUZGRVJTKSAmJiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgIT0gTFZNX1VOTUFOQUdFRF9CVUZGRVJTKSApCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisKKyAgICBpZiggcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgPiAzMiApCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisKKyAgICBpZihwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgaWYoIChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplIDwgTFZNX01JTl9NQVhCTE9DS1NJWkUgKSB8fCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA+IExWTV9NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA8IExWTV9NSU5fTUFYQkxPQ0tTSVpFICkgfHwgKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPiBMVk1fVU5NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUpICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihwSW5zdFBhcmFtcy0+UFNBX0luY2x1ZGVkID4gTFZNX1BTQV9PTikKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgQWxsb2NNZW0gc3RydWN0dXJlcworICAgICAqLworICAgIGZvciAoaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKQorICAgIHsKKyAgICAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtW2ldLAorICAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIGluc3RhbmNlIGhhbmRsZQorICAgICAqLworICAgICpwaEluc3RhbmNlICA9IChMVk1fSGFuZGxlX3QpSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fSW5zdGFuY2VfdCkpOworICAgIHBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKSpwaEluc3RhbmNlOworCisKKyAgICAvKgorICAgICAqIFNhdmUgdGhlIG1lbW9yeSB0YWJsZSwgcGFyYW1ldGVycyBhbmQgY2FwYWJpbGl0aWVzCisgICAgICovCisgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZSAgICA9ICpwTWVtb3J5VGFibGU7CisgICAgcEluc3RhbmNlLT5JbnN0UGFyYW1zICAgICA9ICpwSW5zdFBhcmFtczsKKworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIGJ1bmRsZSBzY3JhdGNoIG1lbW9yeSBhbmQgaW5pdGlhbHNlIHRoZSBidWZmZXIgbWFuYWdlbWVudAorICAgICAqLworICAgIEludGVybmFsQmxvY2tTaXplID0gKExWTV9VSU5UMTYpKChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplKSAmIE1JTl9JTlRFUk5BTF9CTE9DS01BU0spOyAvKiBGb3JjZSB0byBhIG11bHRpcGxlIG9mIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKi8KKyAgICBpZiAoSW50ZXJuYWxCbG9ja1NpemUgPCBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFKQorICAgIHsKKyAgICAgICAgSW50ZXJuYWxCbG9ja1NpemUgPSBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFOworICAgIH0KKworICAgIC8qIE1heGltdW0gSW50ZXJuYWwgQmxhY2sgU2l6ZSBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFKi8KKyAgICBpZihJbnRlcm5hbEJsb2NrU2l6ZSA+IE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUpCisgICAgeworICAgICAgICBJbnRlcm5hbEJsb2NrU2l6ZSA9IE1BWF9JTlRFUk5BTF9CTE9DS1NJWkU7CisgICAgfQorICAgIHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemUgPSAoTFZNX0lOVDE2KUludGVybmFsQmxvY2tTaXplOworCisKKyAgICAvKgorICAgICAqIENvbW1vbiBzZXR0aW5ncyBmb3IgbWFuYWdlZCBhbmQgdW5tYW5hZ2VkIGJ1ZmZlcnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAwOyAgICAgICAgICAgICAgICAvKiBObyBzYW1wbGVzIGxlZnQgdG8gcHJvY2VzcyAqLworICAgIGlmIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFuYWdlZCBidWZmZXJzIHJlcXVpcmVkCisgICAgICAgICAqLworICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50ID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fQnVmZmVyX3QpKTsKKyAgICAgICAgQnVuZGxlU2NyYXRjaFNpemUgPSAoTFZNX0lOVDMyKSg2ICogKE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKyBJbnRlcm5hbEJsb2NrU2l6ZSkgKiBzaXplb2YoTFZNX0lOVDE2KSk7CisgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPnBTY3JhdGNoID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sICAgLyogU2NyYXRjaCAxIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMzIpQnVuZGxlU2NyYXRjaFNpemUpOworCisgICAgICAgIExvYWRDb25zdF8xNigwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGlucHV0IGRlbGF5IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKSZwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5JbkRlbGF5QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUpKTsKKyAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+SW5EZWxheVNhbXBsZXMgPSBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFOyAvKiBTZXQgdGhlIG51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCisgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPk91dERlbGF5U2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogTm8gc2FtcGxlcyBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5CdWZmZXJTdGF0ZSA9IExWTV9GSVJTVENBTEw7ICAgICAgICAgICAgIC8qIFNldCB0aGUgc3RhdGUgcmVhZHkgZm9yIHRoZSBmaXJzdCBjYWxsICovCisgICAgfQorCisKKyAgICAvKgorICAgICAqIFNldCBkZWZhdWx0IHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZNX01PREVfT0ZGOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgICAgICAgPSBMVk1fRlNfODAwMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgICAgID0gTFZNX01PTk87CisgICAgcEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgICAgICA9IExWTV9IRUFEUEhPTkVTOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZDX0VmZmVjdExldmVsICAgPSAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZDX0JhbGFuY2UgICAgICAgPSAwOworCisgICAgLyoKKyAgICAgKiBTZXQgY2FsbGJhY2sKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPkNhbGxCYWNrID0gTFZNX0FsZ29DYWxsQmFjazsKKworCisgICAgLyoKKyAgICAgKiBEQyByZW1vdmFsIGZpbHRlcgorICAgICAqLworICAgIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlKTsKKworCisgICAgLyoKKyAgICAgKiBUcmVibGUgRW5oYW5jZW1lbnQKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPnBURV9UYXBzICA9IChMVk1fVEVfRGF0YV90ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9URV9EYXRhX3QpKTsKKworICAgIHBJbnN0YW5jZS0+cFRFX1N0YXRlID0gKExWTV9URV9Db2Vmc190ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fVEVfQ29lZnNfdCkpOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlRFX09wZXJhdGluZ01vZGUgPSBMVk1fVEVfT0ZGOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlRFX0VmZmVjdExldmVsICAgPSAwOworICAgIHBJbnN0YW5jZS0+VEVfQWN0aXZlICAgICAgICAgICAgICAgPSBMVk1fRkFMU0U7CisKKworICAgIC8qCisgICAgICogU2V0IHRoZSB2b2x1bWUgY29udHJvbCBhbmQgaW5pdGlhbGlzZSBDdXJyZW50IHRvIFRhcmdldAorICAgICAqLworICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7CisgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSBwSW5zdGFuY2U7CisgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICAgICAgICAgID0gTFZNX1ZDQ2FsbEJhY2s7CisKKyAgICAvKiBJbiBtYW5hZ2VkIGJ1ZmZlcmluZywgc3RhcnQgd2l0aCBsb3cgc2lnbmFsIGxldmVsIGFzIGRlbGF5IGluIGJ1ZmZlciBtYW5hZ2VtZW50IGNhdXNlcyBhIGNsaWNrKi8KKyAgICBpZiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKKyAgICB7CisgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwwLDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sTFZNX01BWElOVF8xNixMVk1fTUFYSU5UXzE2KTsKKyAgICB9CisKKyAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwwLExWTV9GU184MDAwLDIpOworCisgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWVkQiAgICAgICAgICAgICAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX0FWTEZpeGVkVm9sdW1lICAgICAgICAgICAgPSAwOworICAgIHBJbnN0YW5jZS0+VkNfQWN0aXZlICAgICAgICAgICAgICAgICAgICA9IExWTV9GQUxTRTsKKworICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICAgICAgPSAwOworICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAwOworICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSBwSW5zdGFuY2U7CisgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAgICAgICAgICA9IExWTV9WQ0NhbGxCYWNrOworICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sTFZNX01BWElOVF8xNixMVk1fTUFYSU5UXzE2KTsKKyAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sTFZNX1ZDX01JWEVSX1RJTUUsTFZNX0ZTXzgwMDAsMik7CisKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlICAgID0gcEluc3RhbmNlOworICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVk1fVkNDYWxsQmFjazsKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLExWTV9NQVhJTlRfMTYsTFZNX01BWElOVF8xNik7CisgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLExWTV9WQ19NSVhFUl9USU1FLExWTV9GU184MDAwLDIpOworICAgIC8qCisgICAgICogU2V0IHRoZSBkZWZhdWx0IEVRTkIgcHJlLWdhaW4gYW5kIHBvaW50ZXIgdG8gdGhlIGJhbmQgZGVmaW5pdGlvbnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPnBFUU5CX0JhbmREZWZzID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWTV9FUU5CX0JhbmREZWZfdCkpKTsKKyAgICBwSW5zdGFuY2UtPnBFUU5CX1VzZXJEZWZzID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZNX0VRTkJfQmFuZERlZl90KSkpOworCisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIENvbmNlcnQgU291bmQgbW9kdWxlCisgICAgICovCisgICAgeworICAgICAgICBMVkNTX0hhbmRsZV90ICAgICAgICAgICBoQ1NJbnN0YW5jZTsgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgIExWQ1NfTWVtVGFiX3QgICAgICAgICAgIENTX01lbVRhYjsgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KKyAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICAgQ1NfQ2FwYWJpbGl0aWVzOyAgICAgICAgICAgIC8qIEluaXRpYWwgY2FwYWJpbGl0aWVzICovCisgICAgICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuICAgIExWQ1NfU3RhdHVzOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCBkZWZhdWx0IHBhcmFtZXRlcnMKKyAgICAgICAgICovCisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgICAgPSAxMDA7CisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZpcnR1YWxpemVyVHlwZSAgICAgICAgICAgPSBMVk1fQ09OQ0VSVFNPVU5EOworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgID0gTFZNX01PREVfT0ZGOworICAgICAgICBwSW5zdGFuY2UtPkNTX0FjdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgID0gTFZNX0ZBTFNFOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzCisgICAgICAgICAqLworICAgICAgICBDU19DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplICAgID0gKExWTV9VSU5UMTYpSW50ZXJuYWxCbG9ja1NpemU7CisgICAgICAgIENTX0NhcGFiaWxpdGllcy5DYWxsQmFjayA9IHBJbnN0YW5jZS0+Q2FsbEJhY2s7CisgICAgICAgIENTX0NhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UgPSAodm9pZCopcEluc3RhbmNlOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCB0aGVuIHNldCB0aGUgYWRkcmVzcyBwb2ludGVycywgZm9yY2luZyBhbGlnbm1lbnQKKyAgICAgICAgICovCisgICAgICAgIExWQ1NfU3RhdHVzID0gTFZDU19NZW1vcnkoTFZNX05VTEwsICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDU19NZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNTX0NhcGFiaWxpdGllcyk7CisgICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcyA9ICZwSW5zdGFuY2UtPkNTX0luc3RhbmNlOworICAgICAgICBDU19NZW1UYWIuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7CisgICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcyA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU19NZW1UYWIuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKKyAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzICAgICAgID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisgICAgICAgIC8qCisgICAgICAgICAqIEluaXRpYWxpc2UgdGhlIENvbmNlcnQgU291bmQgaW5zdGFuY2UgYW5kIHNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZQorICAgICAgICAgKi8KKyAgICAgICAgaENTSW5zdGFuY2UgPSBMVk1fTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRvIE5VTEwgdG8gcmV0dXJuIGhhbmRsZSAqLworICAgICAgICBMVkNTX1N0YXR1cyA9IExWQ1NfSW5pdCgmaENTSW5zdGFuY2UsICAgICAgICAgICAgICAvKiBJbml0aWFpbHNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDU19NZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDU19DYXBhYmlsaXRpZXMpOworICAgICAgICBpZiAoTFZDU19TdGF0dXMgIT0gTFZDU19TVUNDRVNTKSByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pTFZDU19TdGF0dXMpOworICAgICAgICBwSW5zdGFuY2UtPmhDU0luc3RhbmNlID0gaENTSW5zdGFuY2U7ICAgICAgICAgICAgICAvKiBTYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KKworICAgIH0KKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgQmFzcyBFbmhhbmNlbWVudCBtb2R1bGUKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWREJFX0hhbmRsZV90ICAgICAgICAgIGhEQkVJbnN0YW5jZTsgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgTFZEQkVfTWVtVGFiX3QgICAgICAgICAgREJFX01lbVRhYjsgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSB0YWJsZSAqLworICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICBEQkVfQ2FwYWJpbGl0aWVzOyAgICAgICAgICAgLyogSW5pdGlhbCBjYXBhYmlsaXRpZXMgKi8KKyAgICAgICAgTFZEQkVfUmV0dXJuU3RhdHVzX2VuICAgTFZEQkVfU3RhdHVzOyAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMKKyAgICAgICAgICovCisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkJFX09wZXJhdGluZ01vZGUgPSBMVk1fQkVfT0ZGOworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5CRV9DZW50cmVGcmVxICAgID0gTFZNX0JFX0NFTlRSRV81NUh6OworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5CRV9FZmZlY3RMZXZlbCAgID0gMDsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuQkVfSFBGICAgICAgICAgICA9IExWTV9CRV9IUEZfT0ZGOworCisgICAgICAgIHBJbnN0YW5jZS0+REJFX0FjdGl2ZSAgICAgICAgICAgICAgPSBMVk1fRkFMU0U7CisKKworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzCisgICAgICAgICAqLworICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwOworICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLkNlbnRyZUZyZXF1ZW5jeSA9IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNjZIeiB8IExWREJFX0NBUF9DRU5UUkVfNzhIeiB8IExWREJFX0NBUF9DRU5UUkVfOTBIejsKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgICAgPSAoTFZNX1VJTlQxNilJbnRlcm5hbEJsb2NrU2l6ZTsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgdGhlbiBzZXQgdGhlIGFkZHJlc3MgcG9pbnRlcnMKKyAgICAgICAgICovCisgICAgICAgIExWREJFX1N0YXR1cyA9IExWREJFX01lbW9yeShMVk1fTlVMTCwgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEQkVfTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRCRV9DYXBhYmlsaXRpZXMpOworICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0VdLnBCYXNlQWRkcmVzcyAgICAgICAgPSAmcEluc3RhbmNlLT5EQkVfSW5zdGFuY2U7CisgICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplKTsKKyAgICAgICAgREJFX01lbVRhYi5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUpOworICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzICAgICAgICAgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBJbml0aWFsaXNlIHRoZSBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgaW5zdGFuY2UgYW5kIHNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZQorICAgICAgICAgKi8KKyAgICAgICAgaERCRUluc3RhbmNlID0gTFZNX05VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0byBOVUxMIHRvIHJldHVybiBoYW5kbGUgKi8KKyAgICAgICAgTFZEQkVfU3RhdHVzID0gTFZEQkVfSW5pdCgmaERCRUluc3RhbmNlLCAgICAgICAgICAgIC8qIEluaXRpYWlsc2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmREJFX01lbVRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmREJFX0NhcGFiaWxpdGllcyk7CisgICAgICAgIGlmIChMVkRCRV9TdGF0dXMgIT0gTFZEQkVfU1VDQ0VTUykgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWREJFX1N0YXR1cyk7CisgICAgICAgIHBJbnN0YW5jZS0+aERCRUluc3RhbmNlID0gaERCRUluc3RhbmNlOyAgICAgICAgICAgICAvKiBTYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICB9CisKKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgTi1CYW5kIEVxdWFsaXNlciBtb2R1bGUKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWRVFOQl9IYW5kbGVfdCAgICAgICAgICBoRVFOQkluc3RhbmNlOyAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgIEVRTkJfTWVtVGFiOyAgICAgICAgICAgICAgIC8qIE1lbW9yeSB0YWJsZSAqLworICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgRVFOQl9DYXBhYmlsaXRpZXM7ICAgICAgICAgLyogSW5pdGlhbCBjYXBhYmlsaXRpZXMgKi8KKyAgICAgICAgTFZFUU5CX1JldHVyblN0YXR1c19lbiAgIExWRVFOQl9TdGF0dXM7ICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMKKyAgICAgICAgICovCisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZSAgID0gTFZNX0VRTkJfT0ZGOworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5FUU5CX05CYW5kcyAgICAgICAgICA9IDA7CisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uID0gTFZNX05VTEw7CisgICAgICAgIHBJbnN0YW5jZS0+RVFOQl9BY3RpdmUgICAgICAgICAgICAgICAgID0gTFZNX0ZBTFNFOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0IHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMKKyAgICAgICAgICovCisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwOworICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgICAgPSAoTFZNX1VJTlQxNilJbnRlcm5hbEJsb2NrU2l6ZTsKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmFuZHMgICAgICAgID0gcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHM7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNvdXJjZUZvcm1hdCAgICA9IExWRVFOQl9DQVBfU1RFUkVPIHwgTFZFUU5CX0NBUF9NT05PSU5TVEVSRU87CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLkNhbGxCYWNrICAgICAgICA9IHBJbnN0YW5jZS0+Q2FsbEJhY2s7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLnBCdW5kbGVJbnN0YW5jZSAgPSAodm9pZCopcEluc3RhbmNlOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCB0aGVuIHNldCB0aGUgYWRkcmVzcyBwb2ludGVycywgZm9yY2luZyBhbGlnbm1lbnQKKyAgICAgICAgICovCisgICAgICAgIExWRVFOQl9TdGF0dXMgPSBMVkVRTkJfTWVtb3J5KExWTV9OVUxMLCAgICAgICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkVRTkJfTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9DYXBhYmlsaXRpZXMpOworICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzICAgICAgICA9ICZwSW5zdGFuY2UtPkVRTkJfSW5zdGFuY2U7CisgICAgICAgIEVRTkJfTWVtVGFiLlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplKTsKKyAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUpOworICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgICAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogSW5pdGlhbGlzZSB0aGUgRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGluc3RhbmNlIGFuZCBzYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUKKyAgICAgICAgICovCisgICAgICAgIGhFUU5CSW5zdGFuY2UgPSBMVk1fTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdG8gTlVMTCB0byByZXR1cm4gaGFuZGxlICovCisgICAgICAgIExWRVFOQl9TdGF0dXMgPSBMVkVRTkJfSW5pdCgmaEVRTkJJbnN0YW5jZSwgICAgICAgICAvKiBJbml0aWFpbHNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9NZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9DYXBhYmlsaXRpZXMpOworICAgICAgICBpZiAoTFZFUU5CX1N0YXR1cyAhPSBMVkVRTkJfU1VDQ0VTUykgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWRVFOQl9TdGF0dXMpOworICAgICAgICBwSW5zdGFuY2UtPmhFUU5CSW5zdGFuY2UgPSBoRVFOQkluc3RhbmNlOyAgICAgICAgICAgLyogU2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlICovCisgICAgfQorCisgICAgLyoKKyAgICAgKiBIZWFkcm9vbSBtYW5hZ2VtZW50IG1lbW9yeSBhbGxvY2F0aW9uCisgICAgICovCisgICAgeworICAgICAgICBwSW5zdGFuY2UtPnBIZWFkcm9vbV9CYW5kRGVmcyA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0hFQURST09NX01BWF9OQkFORFMgKiBzaXplb2YoTFZNX0hlYWRyb29tQmFuZERlZl90KSkpOworICAgICAgICBwSW5zdGFuY2UtPnBIZWFkcm9vbV9Vc2VyRGVmcyA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAqIHNpemVvZihMVk1fSGVhZHJvb21CYW5kRGVmX3QpKSk7CisKKyAgICAgICAgLyogSGVhZHJvb20gbWFuYWdlbWVudCBwYXJhbWV0ZXJzIGluaXRpYWxpc2F0aW9uICovCisgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHMgPSAyOworICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb24gPSBwSW5zdGFuY2UtPnBIZWFkcm9vbV9CYW5kRGVmczsKKyAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uWzBdLkxpbWl0X0xvdyAgICAgICAgICA9IDIwOworICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMF0uTGltaXRfSGlnaCAgICAgICAgID0gNDk5OTsKKyAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uWzBdLkhlYWRyb29tX09mZnNldCAgICA9IDM7CisgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblsxXS5MaW1pdF9Mb3cgICAgICAgICAgPSA1MDAwOworICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMV0uTGltaXRfSGlnaCAgICAgICAgID0gMjQwMDA7CisgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblsxXS5IZWFkcm9vbV9PZmZzZXQgICAgPSA0OworICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLkhlYWRyb29tX09wZXJhdGluZ01vZGUgPSBMVk1fSEVBRFJPT01fT047CisKKyAgICAgICAgcEluc3RhbmNlLT5IZWFkcm9vbSA9MDsKKyAgICB9CisKKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgUFNBIG1vZHVsZQorICAgICAqLworICAgIHsKKyAgICAgICAgcExWUFNBX0hhbmRsZV90ICAgICBoUFNBSW5zdGFuY2UgPSBMVk1fTlVMTDsgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgTFZQU0FfTWVtVGFiX3QgICAgICBQU0FfTWVtVGFiOworICAgICAgICBMVlBTQV9SRVRVUk4gICAgICAgIFBTQV9TdGF0dXM7ICAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90IEZpbHRlcnNQYXJhbXNbOV07CisKKyAgICAgICAgaWYocEluc3RQYXJhbXMtPlBTQV9JbmNsdWRlZD09TFZNX1BTQV9PTikKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcy5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiAgID0gKExWTV9VSU5UMTYpIDUwMDsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMuTWF4SW5wdXRCbG9ja1NpemUgICAgICAgICAgICA9IChMVk1fVUlOVDE2KSAyMDQ4OworICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcy5uQmFuZHMgICAgICAgICAgICAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDk7CisgICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Jbml0UGFyYW1zLnBGaWx0ZXJzUGFyYW1zICAgICAgICAgICAgICAgPSAmRmlsdGVyc1BhcmFtc1swXTsKKyAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IHBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMubkJhbmRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsdGVyc1BhcmFtc1tpXS5DZW50ZXJGcmVxdWVuY3kgICAgPSAoTFZNX1VJTlQxNikgMTAwMDsKKyAgICAgICAgICAgICAgICBGaWx0ZXJzUGFyYW1zW2ldLlFGYWN0b3IgICAgICAgICAgICA9IChMVk1fVUlOVDE2KSAxMDA7CisgICAgICAgICAgICAgICAgRmlsdGVyc1BhcmFtc1tpXS5Qb3N0R2FpbiAgICAgICAgICAgPSAoTFZNX0lOVDE2KSAgMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLypHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kIHRoZW4gc2V0IHRoZSBhZGRyZXNzIHBvaW50ZXJzKi8KKyAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9NZW1vcnkgKGhQU0FJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMpOworCisgICAgICAgICAgICBpZiAoUFNBX1N0YXR1cyAhPSBMVlBTQV9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pIExWTV9BTEdPUklUSE1QU0EpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTbG93IERhdGEgKi8KKyAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKKyAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpOworCisKKyAgICAgICAgICAgIC8qIEZhc3QgRGF0YSAqLworICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7CisKKworICAgICAgICAgICAgLyogRmFzdCBDb2VmICovCisgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcyA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCisgICAgICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKKworICAgICAgICAgICAgLyogRmFzdCBUZW1wb3JhcnkgKi8KKyAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0ID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX1RFTVBPUkFSWV9GQVNUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKSBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICogc2l6ZW9mKExWTV9JTlQxNikpOworCisgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sMCk7CisKKworICAgICAgICAgICAgLypJbml0aWFsaXNlIFBTQSBpbnN0YW5jZSBhbmQgc2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlKi8KKyAgICAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0NvbnRyb2xQYXJhbXMuRnMgPSBMVk1fRlNfNDgwMDA7CisgICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Db250cm9sUGFyYW1zLkxldmVsRGV0ZWN0aW9uU3BlZWQgID0gTFZQU0FfU1BFRURfTUVESVVNOworICAgICAgICAgICAgUFNBX1N0YXR1cyA9IExWUFNBX0luaXQgKCZoUFNBSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlBTQV9Db250cm9sUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlBTQV9NZW1UYWIpOworCisgICAgICAgICAgICBpZiAoUFNBX1N0YXR1cyAhPSBMVlBTQV9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pIExWTV9BTEdPUklUSE1QU0EpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSA9IGhQU0FJbnN0YW5jZTsgICAgICAgLyogU2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9HYWluT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlID0gTFZNX05VTEw7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgICAqLworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5QU0FfUGVha0RlY2F5UmF0ZSAgID0gTFZNX1BTQV9TUEVFRF9NRURJVU07CisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlBTQV9FbmFibGUgICAgICAgICAgPSBMVk1fUFNBX09GRjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIGluaXRpYWwgcGFyYW1ldGVycyB0byB0aGUgbmV3IHBhcmFtZXRlcnMgZm9yIGNvcnJlY3QgcmVhZGJhY2sgb2YKKyAgICAgKiB0aGUgc2V0dGluZ3MuCisgICAgICovCisgICAgcEluc3RhbmNlLT5OZXdQYXJhbXMgPSBwSW5zdGFuY2UtPlBhcmFtczsKKworCisgICAgLyoKKyAgICAgKiBDcmVhdGUgY29uZmlndXJhdGlvbiBudW1iZXIKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgPSAweDAwMDAwMDAwOworICAgIHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciArPSBMVk1fQ1NfTUFTSzsKKyAgICBwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgKz0gTFZNX0VRTkJfTUFTSzsKKyAgICBwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgKz0gTFZNX0RCRV9NQVNLOworICAgIHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciArPSBMVk1fVkNfTUFTSzsKKyAgICBwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgKz0gTFZNX1BTQV9NQVNLOworCisgICAgaWYoKChwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgICYgTFZNX0NTX01BU0spIT0wKSAgfHwKKyAgICAgICAgKChwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgJiBMVk1fREJFX01BU0spIT0wKSB8fAorICAgICAgICAoKHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciAmIExWTV9FUU5CX01BU0spIT0wKXx8CisgICAgICAgICgocEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICYgTFZNX1RFX01BU0spIT0wKSAgfHwKKyAgICAgICAgKChwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgJiBMVk1fVkNfTUFTSykhPTApKQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5CbGlja1NpemVNdWx0aXBsZSAgICA9IDQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+QmxpY2tTaXplTXVsdGlwbGUgICAgPSAxOworICAgIH0KKworICAgIHJldHVybihTdGF0dXMpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0NsZWFyQXVkaW9CdWZmZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNsZWFyIHRoZSBpbnRlcm5hbCBhdWRpbyBidWZmZXJzIG9mIHRoZSBidW5kbGUuICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fTlVMTEFERFJFU1MgICAgICAgICBJbnN0YW5jZSBvciBzY3JhdGNoIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fQ2xlYXJBdWRpb0J1ZmZlcnMoTFZNX0hhbmRsZV90ICBoSW5zdGFuY2UpCit7CisgICAgTFZNX01lbVRhYl90ICAgICAgICAgICAgTWVtVGFiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KKyAgICBMVk1fSW5zdFBhcmFtc190ICAgICAgICBJbnN0UGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsgLyogUG9pbnRlciB0byBJbnN0YW5jZSAqLworCisKKyAgICBpZihoSW5zdGFuY2UgPT0gTFZNX05VTEwpeworICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOworICAgIH0KKworICAgIC8qIFNhdmUgdGhlIGNvbnRyb2wgcGFyYW1ldGVycyAqLyAvKiBjb3Zlcml0eVt1bmNoZWNrZWRfdmFsdWVdICovIC8qIERvIG5vdCBjaGVjayByZXR1cm4gdmFsdWUgaW50ZXJuYWwgZnVuY3Rpb24gY2FsbHMgKi8KKyAgICBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMoaEluc3RhbmNlLCAmUGFyYW1zKTsKKworICAgIC8qICBSZXRyaWV2ZSBhbGxvY2F0ZWQgYnVmZmVycyBpbiBtZW10YWIgKi8KKyAgICBMVk1fR2V0TWVtb3J5VGFibGUoaEluc3RhbmNlLCAmTWVtVGFiLCAgTFZNX05VTEwpOworCisgICAgLyogIFNhdmUgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBJbnN0UGFyYW1zID0gcEluc3RhbmNlLT5JbnN0UGFyYW1zOworCisgICAgLyogIENhbGwgIExWTV9HZXRJbnN0YW5jZUhhbmRsZSB0byByZS1pbml0aWFsaXNlIHRoZSBidW5kbGUgKi8KKyAgICBMVk1fR2V0SW5zdGFuY2VIYW5kbGUoICZoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJkluc3RQYXJhbXMpOworCisgICAgLyogUmVzdG9yZSBjb250cm9sIHBhcmFtZXRlcnMgKi8gLyogY292ZXJpdHlbdW5jaGVja2VkX3ZhbHVlXSAqLyAvKiBEbyBub3QgY2hlY2sgcmV0dXJuIHZhbHVlIGludGVybmFsIGZ1bmN0aW9uIGNhbGxzICovCisgICAgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKGhJbnN0YW5jZSwgJlBhcmFtcyk7CisKKyAgICAvKiBEQyByZW1vdmFsIGZpbHRlciAqLworICAgIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlKTsKKworCisgICAgcmV0dXJuIExWTV9TVUNDRVNTOworfQorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjcwZTQ3MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKQEAgLTAsMCArMSwyOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogbnhwMDA3NzUzICQKKyAgICAgJFJldmlzaW9uOiAxMDgyICQKKyAgICAgJERhdGU6IDIwMTAtMDctMDUgMTI6NDQ6MzkgKzAyMDAgKE1vbiwgMDUgSnVsIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEhlYWRlciBmaWxlIGZvciB0aGUgcHJpdmF0ZSBsYXllciBpbnRlcmZhY2Ugb2YgY29uY2VydCBzb3VuZCBidW5kbGUgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlcyBpbmNsdWRlcyBhbGwgZGVmaW5pdGlvbnMsIHR5cGVzLCBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiAgICAgICAgICAgICAqLworLyogIHByb3RvdHlwZXMgcmVxdWlyZWQgYnkgdGhlIGV4ZWN1dGlvbiBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fTFZNX1BSSVZBVEVfSF9fCisjZGVmaW5lIF9fTFZNX1BSSVZBVEVfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTS5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGlmZVZpYmVzICovCisjaW5jbHVkZSAiTFZNX0NvbW1vbi5oIiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMaWZlVmliZXMgY29tbW9uICovCisjaW5jbHVkZSAiQklRVUFELmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXF1YWQgbGlicmFyeSAqLworI2luY2x1ZGUgIkxWQ19NaXhlci5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWl4ZXIgbGlicmFyeSAqLworI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIiAgICAgICAgICAgICAgICAgICAgICAgLyogQ29uY2VydCBTb3VuZCAqLworI2luY2x1ZGUgIkxWREJFX1ByaXZhdGUuaCIgICAgICAgICAgICAgICAgICAgICAgLyogRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50ICovCisjaW5jbHVkZSAiTFZFUU5CX1ByaXZhdGUuaCIgICAgICAgICAgICAgICAgICAgICAvKiBOLUJhbmQgZXF1YWxpc2VyICovCisjaW5jbHVkZSAiTFZQU0FfUHJpdmF0ZS5oIiAgICAgICAgICAgICAgICAgICAgICAvKiBQYXJhbWV0cmljIFNwZWN0cnVtIEFuYWx5emVyICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVmaW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEdlbmVyYWwgKi8KKyNkZWZpbmUgTFZNX0lOVkFMSUQgICAgICAgICAgICAgICAgICAgICAweEZGRkYgICAgLyogSW52YWxpZCBpbml0IHBhcmFtZXRlciAqLworCisvKiBNZW1vcnkgKi8KKyNkZWZpbmUgTFZNX0lOU1RBTkNFX0FMSUdOICAgICAgICAgICAgICA0ICAgICAgICAgLyogMzItYml0IGZvciBzdHJ1Y3R1cmVzICovCisjZGVmaW5lIExWTV9GSVJTVENBTEwgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZpcnN0IGNhbGwgdG8gdGhlIGJ1ZmZlciAqLworI2RlZmluZSBMVk1fTUFYQkxPQ0tDQUxMICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgY2FsbHMgdG8gdGhlIGJ1ZmZlciAqLworI2RlZmluZSBMVk1fTEFTVENBTEwgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBMYXN0IGNhbGwgdG8gdGhlIGJ1ZmZlciAqLworI2RlZmluZSBMVk1fRklSU1RMQVNUQ0FMTCAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaW5nbGUgY2FsbCBmb3Igc21hbGwgbnVtYmVyIG9mIHNhbXBsZXMgKi8KKworLyogQmxvY2sgU2l6ZSAqLworI2RlZmluZSBMVk1fTUlOX01BWEJMT0NLU0laRSAgICAgICAgICAgIDE2ICAgICAgICAvKiBNaW5pbXVtIE1heEJsb2NrU2l6ZSBMaW1pdCovCisjZGVmaW5lIExWTV9NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUgICAgODE5MSAgICAgIC8qIE1heGltdW0gTWF4QmxvY2tTemllIExpbWl0IGZvciBNYW5hZ2VkIEJ1ZmZlciBNb2RlKi8KKyNkZWZpbmUgTFZNX1VOTUFOQUdFRF9NQVhfTUFYQkxPQ0tTSVpFICA0MDk2ICAgICAgLyogTWF4aW11bSBNYXhCbG9ja1N6aWUgTGltaXQgZm9yIFVubWFuYWdlZCBCdWZmZXIgTW9kZSAqLworCisjZGVmaW5lIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgICAgICAgICAgODEyOCAgICAgIC8qIE1heGltdW0gbXVsdGlwbGUgb2YgNjQgIGJlbG93IDgxOTEqLworCisjZGVmaW5lIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgICAgICAgICAgMTYgICAgICAgIC8qIE1pbmltdW0gaW50ZXJuYWwgYmxvY2sgc2l6ZSAqLworI2RlZmluZSBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCAgICAgICAgIDQgICAgICAgICAvKiBNaW5pbXVtIGludGVybmFsIGJsb2NrIHNpemUgYXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIE1JTl9JTlRFUk5BTF9CTE9DS01BU0sgICAgICAgICAgMHhGRkYwICAgIC8qIE1pbmltdW0gaW50ZXJuYWwgYmxvY2sgc2l6ZSBtYXNrICovCisKKyNkZWZpbmUgTFZNX1BTQV9EWU5BTUlDUkFOR0UgICAgICAgICAgICA2MCAgICAgICAgLyogU3BlY3RyYWwgRHluYW1pYyByYW5nZTogdXNlZCBmb3Igb2Zmc2V0aW5nIG91dHB1dCovCisjZGVmaW5lIExWTV9QU0FfQkFSSEVJR0hUICAgICAgICAgICAgICAgMTI3ICAgICAgIC8qIFNwZWN0cmFsIEJhciBIZWlnaHQqLworCisjZGVmaW5lIExWTV9URV9NSU5fRUZGRUNUTEVWRUwgICAgICAgICAgMCAgICAgICAgIC8qVEUgTWluaW11bSBFZmZlY3RMZXZlbCovCisjZGVmaW5lIExWTV9URV9NQVhfRUZGRUNUTEVWRUwgICAgICAgICAgMTUgICAgICAgIC8qVEUgTWF4aW11bSBFZmZlY3QgbGV2ZWwqLworCisjZGVmaW5lIExWTV9WQ19NSU5fRUZGRUNUTEVWRUwgICAgICAgICAgLTk2ICAgICAgIC8qVkMgTWluaW11bSBFZmZlY3RMZXZlbCovCisjZGVmaW5lIExWTV9WQ19NQVhfRUZGRUNUTEVWRUwgICAgICAgICAgMCAgICAgICAgIC8qVkMgTWF4aW11bSBFZmZlY3QgbGV2ZWwqLworCisjZGVmaW5lIExWTV9CRV9NSU5fRUZGRUNUTEVWRUwgICAgICAgICAgMCAgICAgICAgIC8qQkUgTWluaW11bSBFZmZlY3RMZXZlbCovCisjZGVmaW5lIExWTV9CRV9NQVhfRUZGRUNUTEVWRUwgICAgICAgICAgMTUgICAgICAgIC8qQkUgTWF4aW11bSBFZmZlY3QgbGV2ZWwqLworCisjZGVmaW5lIExWTV9FUU5CX01JTl9CQU5EX0ZSRVEgICAgICAgICAgMjAgICAgICAgIC8qRVFOQiBNaW5pbXVtIEJhbmQgRnJlcXVlbmN5Ki8KKyNkZWZpbmUgTFZNX0VRTkJfTUFYX0JBTkRfRlJFUSAgICAgICAgICAyNDAwMCAgICAgLypFUU5CIE1heGltdW0gQmFuZCBGcmVxdWVuY3kqLworI2RlZmluZSBMVk1fRVFOQl9NSU5fQkFORF9HQUlOICAgICAgICAgIC0xNSAgICAgICAvKkVRTkIgTWluaW11bSBCYW5kIEZyZXF1ZW5jeSovCisjZGVmaW5lIExWTV9FUU5CX01BWF9CQU5EX0dBSU4gICAgICAgICAgMTUgICAgICAgIC8qRVFOQiBNYXhpbXVtIEJhbmQgRnJlcXVlbmN5Ki8KKyNkZWZpbmUgTFZNX0VRTkJfTUlOX1FGQUNUT1IgICAgICAgICAgICAyNSAgICAgICAgLypFUU5CIE1pbmltdW0gUSBGYWN0b3IqLworI2RlZmluZSBMVk1fRVFOQl9NQVhfUUZBQ1RPUiAgICAgICAgICAgIDEyMDAgICAgICAvKkVRTkIgTWF4aW11bSBRIEZhY3RvciovCisjZGVmaW5lIExWTV9FUU5CX01JTl9MUEZfRlJFUSAgICAgICAgICAgMTAwMCAgICAgIC8qRVFOQiBNaW5pbXVtIExvdyBQYXNzIENvcm5lciBmcmVxdWVuY3kqLworI2RlZmluZSBMVk1fRVFOQl9NSU5fSFBGX0ZSRVEgICAgICAgICAgIDIwICAgICAgICAvKkVRTkIgTWluaW11bSBIaWdoIFBhc3MgQ29ybmVyIGZyZXF1ZW5jeSovCisjZGVmaW5lIExWTV9FUU5CX01BWF9IUEZfRlJFUSAgICAgICAgICAgMTAwMCAgICAgIC8qRVFOQiBNYXhpbXVtIEhpZ2ggUGFzcyBDb3JuZXIgZnJlcXVlbmN5Ki8KKworI2RlZmluZSBMVk1fQ1NfTUlOX0VGRkVDVF9MRVZFTCAgICAgICAgIDAgICAgICAgICAvKkNTIE1pbmltdW0gRWZmZWN0IExldmVsKi8KKyNkZWZpbmUgTFZNX0NTX01BWF9SRVZFUkJfTEVWRUwgICAgICAgICAxMDAgICAgICAgLypDUyBNYXhpbXVtIFJldmVyYiBMZXZlbCovCisjZGVmaW5lIExWTV9WSVJUVUFMSVpFUl9NQVhfUkVWRVJCX0xFVkVMIDEwMCAgICAgIC8qVml0cnVhbGl6ZXIgTWF4aW11bSBSZXZlcmIgTGV2ZWwqLworCisjZGVmaW5lIExWTV9WQ19NSVhFUl9USU1FICAgICAgICAgICAgICAxMDAgICAgICAgLypWQyBtaXhlciB0aW1lKi8KKyNkZWZpbmUgTFZNX1ZDX0JBTEFOQ0VfTUFYICAgICAgICAgICAgIDk2ICAgICAgICAvKlZDIGJhbGFuY2UgbWF4IHZhbHVlKi8KKyNkZWZpbmUgTFZNX1ZDX0JBTEFOQ0VfTUlOICAgICAgICAgICAgIC05NiAgICAgICAvKlZDIGJhbGFuY2UgbWluIHZhbHVlKi8KKworLyogQWxnb3JpdGhtIG1hc2tzICovCisjZGVmaW5lIExWTV9DU19NQVNLICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBMVk1fRVFOQl9NQVNLICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTFZNX0RCRV9NQVNLICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIExWTV9WQ19NQVNLICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgTFZNX1RFX01BU0sgICAgICAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBMVk1fUFNBX01BU0sgICAgICAgICAgICAgICAgICAgIDIwNDgKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgIFNpemU7ICAgICAgICAgICAgICAgLyogUmVnaW9uIHNpemUgaW4gYnl0ZXMgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBBbGlnbm1lbnQ7ICAgICAgICAgIC8qIEJ5dGUgYWxpZ25tZW50ICovCisgICAgTFZNX01lbW9yeVR5cGVzX2VuICAgICAgVHlwZTsgICAgICAgICAgICAgICAvKiBSZWdpb24gdHlwZSAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpwQmFzZUFkZHJlc3M7ICAgICAgLyogUG9pbnRlciB0byB0aGUgcmVnaW9uIGJhc2UgYWRkcmVzcyAqLworfSBMVk1fSW50TWVtb3J5UmVnaW9uX3Q7CisKKworLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSW50TWVtb3J5UmVnaW9uX3QgICBSZWdpb25bTFZNX05SX01FTU9SWV9SRUdJT05TXTsgIC8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAqLworfSBMVk1fSW50TWVtVGFiX3Q7CisKKworLyogQnVmZmVyIE1hbmFnZW1lbnQgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBTY3JhdGNoOyAgICAgICAgICAvKiBCdW5kbGUgc2NyYXRjaCBidWZmZXIgKi8KKworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJ1ZmZlclN0YXRlOyAgICAgICAgLyogQnVmZmVyIHN0YXR1cyAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEluRGVsYXlCdWZmZXJbNipNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsgLyogSW5wdXQgYnVmZmVyIGRlbGF5IGxpbmUsIGxlZnQgYW5kIHJpZ2h0ICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSW5EZWxheVNhbXBsZXM7ICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCisKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBPdXREZWxheUJ1ZmZlclsyKk1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOyAvKiBPdXRwdXQgYnVmZmVyIGRlbGF5IGxpbmUgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBPdXREZWxheVNhbXBsZXM7ICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBvdXRwdXQgZGVsYXkgYnVmZmVyLCBsZWZ0IGFuZCByaWdodCAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFNhbXBsZXNUb091dHB1dDsgICAgLyogU2FtcGxlcyB0byB3cml0ZSB0byB0aGUgb3V0cHV0ICovCit9IExWTV9CdWZmZXJfdDsKKworCisvKiBGaWx0ZXIgdGFwcyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCaXF1YWRfMklfT3JkZXIxX1RhcHNfdCBUcmVibGVCb29zdF9UYXBzOyAgIC8qIFRyZWJsZSBib29zdCBUYXBzICovCit9IExWTV9URV9EYXRhX3Q7CisKKworLyogQ29lZmZpY2llbnRzICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgIFRyZWJsZUJvb3N0X1N0YXRlOyAgLyogU3RhdGUgZm9yIHRoZSB0cmVibGUgYm9vc3QgZmlsdGVyICovCit9IExWTV9URV9Db2Vmc190OworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogUHVibGljIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fTWVtVGFiX3QgICAgICAgICAgICBNZW1vcnlUYWJsZTsgICAgICAgIC8qIEluc3RhbmNlIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgUGFyYW1zOyAgICAgICAgICAgICAvKiBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fSW5zdFBhcmFtc190ICAgICAgICBJbnN0UGFyYW1zOyAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKworICAgIC8qIFByaXZhdGUgcGFyYW1ldGVycyAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIENvbnRyb2xQZW5kaW5nOyAgICAgLyogQ29udHJvbCBmbGFnIHRvIGluZGljYXRlIHVwZGF0ZSBwZW5kaW5nICovCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgTmV3UGFyYW1zOyAgICAgICAgICAvKiBOZXcgY29udHJvbCBwYXJhbWV0ZXJzIHBlbmRpbmcgdXBkYXRlICovCisKKyAgICAvKiBCdWZmZXIgY29udHJvbCAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEludGVybmFsQmxvY2tTaXplOyAgLyogTWF4aW11bSBpbnRlcm5hbCBibG9jayBzaXplICovCisgICAgTFZNX0J1ZmZlcl90ICAgICAgICAgICAgKnBCdWZmZXJNYW5hZ2VtZW50OyAvKiBCdWZmZXIgbWFuYWdlbWVudCB2YXJpYWJsZXMgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBTYW1wbGVzVG9Qcm9jZXNzOyAgIC8qIElucHV0IHNhbXBsZXMgbGVmdCB0byBwcm9jZXNzICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBJbnB1dFNhbXBsZXM7ICAgICAvKiBFeHRlcm5hbCBpbnB1dCBzYW1wbGUgcG9pbnRlciAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwT3V0cHV0U2FtcGxlczsgICAgLyogRXh0ZXJuYWwgb3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisKKyAgICAvKiBDb25maWd1cmF0aW9uIG51bWJlciAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25OdW1iZXI7CisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQmxpY2tTaXplTXVsdGlwbGU7CisKKyAgICAvKiBEQyByZW1vdmFsICovCisgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgRENfUmVtb3ZhbEluc3RhbmNlOyAvKiBEQyByZW1vdmFsIGZpbHRlciBpbnN0YW5jZSAqLworCisgICAgLyogQ29uY2VydCBTb3VuZCAqLworICAgIExWQ1NfSGFuZGxlX3QgICAgICAgICAgIGhDU0luc3RhbmNlOyAgICAgICAgLyogQ29uY2VydCBTb3VuZCBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICBDU19JbnN0YW5jZTsgICAgICAgIC8qIENvbmNlcnQgU291bmQgaW5zdGFuY2UgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBDU19BY3RpdmU7ICAgICAgICAgIC8qIENvbnRyb2wgZmxhZyAqLworCisgICAgLyogRXF1YWxpemVyICovCisgICAgTFZFUU5CX0hhbmRsZV90ICAgICAgICAgaEVRTkJJbnN0YW5jZTsgICAgICAvKiBOLUJhbmQgRXF1YWxpc2VyIGluc3RhbmNlIGhhbmRsZSAqLworICAgIExWRVFOQl9JbnN0YW5jZV90ICAgICAgIEVRTkJfSW5zdGFuY2U7ICAgICAgLyogTi1CYW5kIEVxdWFsaXNlciBpbnN0YW5jZSAqLworICAgIExWTV9FUU5CX0JhbmREZWZfdCAgICAgICpwRVFOQl9CYW5kRGVmczsgICAgLyogTG9jYWwgc3RvcmFnZSBmb3IgbmV3IGRlZmluaXRpb25zICovCisgICAgTFZNX0VRTkJfQmFuZERlZl90ICAgICAgKnBFUU5CX1VzZXJEZWZzOyAgICAvKiBMb2NhbCBzdG9yYWdlIGZvciB0aGUgdXNlcidzIGRlZmluaXRpb25zICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgRVFOQl9BY3RpdmU7ICAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KKworICAgIC8qIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCAqLworICAgIExWREJFX0hhbmRsZV90ICAgICAgICAgIGhEQkVJbnN0YW5jZTsgICAgICAgLyogRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGluc3RhbmNlIGhhbmRsZSAqLworICAgIExWREJFX0luc3RhbmNlX3QgICAgICAgIERCRV9JbnN0YW5jZTsgICAgICAgLyogRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGluc3RhbmNlICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgREJFX0FjdGl2ZTsgICAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KKworICAgIC8qIFZvbHVtZSBDb250cm9sICovCisgICAgTFZNaXhlcjNfMVN0X3N0ICAgICAgICAgVkNfVm9sdW1lOyAgICAgICAgICAvKiBWb2x1bWUgc2NhbGVyICovCisgICAgTFZNaXhlcjNfMlN0X3N0ICAgICAgICAgVkNfQmFsYW5jZU1peDsgICAgICAvKiBWQyBiYWxhbmNlIG1peGVyICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVkNfVm9sdW1lZEI7ICAgICAgICAvKiBHYWluIGluIGRCICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVkNfQWN0aXZlOyAgICAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBWQ19BVkxGaXhlZFZvbHVtZTsgIC8qIEFWTCBmaXhlZCB2b2x1bWUgKi8KKworICAgIC8qIFRyZWJsZSBFbmhhbmNlbWVudCAqLworICAgIExWTV9URV9EYXRhX3QgICAgICAgICAgICpwVEVfVGFwczsgICAgICAgICAgLyogVHJlYmxlIGJvb3N0IFRhcHMgKi8KKyAgICBMVk1fVEVfQ29lZnNfdCAgICAgICAgICAqcFRFX1N0YXRlOyAgICAgICAgIC8qIFN0YXRlIGZvciB0aGUgdHJlYmxlIGJvb3N0IGZpbHRlciAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFRFX0FjdGl2ZTsgICAgICAgICAgLyogQ29udHJvbCBmbGFnICovCisKKyAgICAvKiBIZWFkcm9vbSAqLworICAgIExWTV9IZWFkcm9vbVBhcmFtc190ICAgIE5ld0hlYWRyb29tUGFyYW1zOyAgIC8qIE5ldyBoZWFkcm9vbSBwYXJhbWV0ZXJzIHBlbmRpbmcgdXBkYXRlICovCisgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgSGVhZHJvb21QYXJhbXM7ICAgICAgLyogSGVhZHJvb20gcGFyYW1ldGVycyAqLworICAgIExWTV9IZWFkcm9vbUJhbmREZWZfdCAgICpwSGVhZHJvb21fQmFuZERlZnM7IC8qIExvY2FsIHN0b3JhZ2UgZm9yIG5ldyBkZWZpbml0aW9ucyAqLworICAgIExWTV9IZWFkcm9vbUJhbmREZWZfdCAgICpwSGVhZHJvb21fVXNlckRlZnM7IC8qIExvY2FsIHN0b3JhZ2UgZm9yIHRoZSB1c2VyJ3MgZGVmaW5pdGlvbnMgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBIZWFkcm9vbTsgICAgICAgICAgICAvKiBWYWx1ZSBvZiB0aGUgY3VycmVudCBoZWFkcm9vbSAqLworCisgICAgLyogU3BlY3RydW0gQW5hbHl6ZXIgKi8KKyAgICBwTFZQU0FfSGFuZGxlX3QgICAgICAgICBoUFNBSW5zdGFuY2U7ICAgICAgIC8qIFNwZWN0cnVtIEFuYWx5emVyIGluc3RhbmNlIGhhbmRsZSAqLworICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgIFBTQV9JbnN0YW5jZTsgICAgICAgLyogU3BlY3RydW0gQW5hbHl6ZXIgaW5zdGFuY2UgKi8KKyAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICBQU0FfSW5pdFBhcmFtczsgICAgIC8qIFNwZWN0cnVtIEFuYWx5emVyIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgKi8KKyAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICBQU0FfQ29udHJvbFBhcmFtczsgIC8qIFNwZWN0cnVtIEFuYWx5emVyIGNvbnRyb2wgcGFyYW1ldGVycyAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFBTQV9HYWluT2Zmc2V0OyAgICAgLyogVG9uZSBjb250cm9sIGZsYWcgKi8KKyAgICBMVk1fQ2FsbGJhY2sgICAgICAgICAgICBDYWxsQmFjazsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcFBTQUlucHV0OyAgICAgICAgIC8qIFBTQSBpbnB1dCBwb2ludGVyICovCisKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgIE5vU21vb3RoVm9sdW1lOyAgICAgIC8qIEVuYWJsZSBvciBkaXNhYmxlIHNtb290aCB2b2x1bWUgY2hhbmdlcyovCisKK30gTFZNX0luc3RhbmNlX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0FwcGx5TmV3U2V0dGluZ3MoTFZNX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSk7CisKK3ZvaWQgICAgTFZNX1NldFRyZWJsZUJvb3N0KCBMVk1fSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcyk7CisKK3ZvaWQgICAgTFZNX1NldFZvbHVtZSggIExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpOworCitMVk1fSU5UMzIgICAgTFZNX1ZDQ2FsbEJhY2sodm9pZCogICBwQnVuZGxlSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgcEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICAgQ2FsbEJhY2tQYXJhbSk7CisKK3ZvaWQgICAgTFZNX1NldEhlYWRyb29tKCAgICBMVk1fSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcyk7CisKK3ZvaWQgICAgTFZNX0J1ZmZlckluKCAgIExWTV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgKipwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgKipwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKTsKKwordm9pZCAgICBMVk1fQnVmZmVyT3V0KCAgTFZNX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgKnBOdW1TYW1wbGVzKTsKKworTFZNX0lOVDMyIExWTV9BbGdvQ2FsbEJhY2soICAgICB2b2lkICAgICAgICAgICpwQnVuZGxlSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBjYWxsYmFja0lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAgICAgLyogX19MVk1fUFJJVkFURV9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmFkOTQ1MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogYmVxMDc3MTYgJAorICAgICAkUmV2aXNpb246IDEwMDIgJAorICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzo0MDowOSArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZNX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiTFZNX0NvZWZmcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFByb2Nlc3MgZnVuY3Rpb24gZm9yIHRoZSBMaWZlVmliZXMgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluRGF0YSAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwT3V0RGF0YSAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQXVkaW9UaW1lICAgICAgICAgICAgICAgQXVkaW8gVGltZSBvZiB0aGUgY3VycmVudCBpbnB1dCBidWZmZXIgaW4gbXMgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fSU5WQUxJRE5VTVNBTVBMRVMgIFdoZW4gdGhlIE51bVNhbXBsZXMgaXMgbm90IGEgdmFsaWVkIG11bHRpcGxlIGluIHVubWFuYWdlZCAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX0FMSUdOTUVOVEVSUk9SICAgICBXaGVuIGVpdGhlciB0aGUgaW5wdXQgb3VyIG91dHB1dCBidWZmZXJzIGFyZSBub3QgMzItYml0ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduZWQgaW4gdW5tYW5hZ2VkIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgV2hlbiBvbmUgb2YgaEluc3RhbmNlLCBwSW5EYXRhIG9yIHBPdXREYXRhIGlzIE5VTEwgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fUHJvY2VzcyhMVk1fSGFuZGxlX3QgICAgICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lKQoreworCisgICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlICA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX1VJTlQxNiAgICAgICAgICBTYW1wbGVDb3VudCA9IE51bVNhbXBsZXM7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAqcElucHV0ICAgICA9IChMVk1fSU5UMTYgKilwSW5EYXRhOworICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBUb1Byb2Nlc3MgPSAoTFZNX0lOVDE2ICopcEluRGF0YTsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICpwUHJvY2Vzc2VkID0gcE91dERhdGE7CisgICAgTFZNX1JldHVyblN0YXR1c19lbiAgU3RhdHVzOworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgemVybworICAgICAqLworICAgIGlmIChOdW1TYW1wbGVzID09IDApCisgICAgeworICAgICAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDaGVjayB2YWxpZCBwb2ludHMgaGF2ZSBiZWVuIGdpdmVuCisgICAgICovCisgICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5EYXRhID09IExWTV9OVUxMKSB8fCAocE91dERhdGEgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fTlVMTEFERFJFU1MpOworICAgIH0KKworICAgIC8qCisgICAgICogRm9yIHVubWFuYWdlZCBtb2RlIG9ubHkKKyAgICAgKi8KKyAgICBpZihwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fVU5NQU5BR0VEX0JVRkZFUlMpCisgICAgeworICAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgaWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIGEgZ29vZCBtdWx0aXBsZSAodW5tYW5hZ2VkIG1vZGUgb25seSkKKyAgICAgICAgICovCisgICAgICAgIGlmKChOdW1TYW1wbGVzICUgcEluc3RhbmNlLT5CbGlja1NpemVNdWx0aXBsZSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKExWTV9JTlZBTElETlVNU0FNUExFUyk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBDaGVjayB0aGUgYnVmZmVyIGFsaWdubWVudAorICAgICAgICAgKi8KKyAgICAgICAgaWYoKCgoTFZNX1VJTlQzMilwSW5EYXRhICUgNCkgIT0gMCkgfHwgKCgoTFZNX1VJTlQzMilwT3V0RGF0YSAlIDQpICE9IDApKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4oTFZNX0FMSUdOTUVOVEVSUk9SKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgbmV3IHBhcmFtZXRlcnMgaWYgbmVjZXNzYXJ5CisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpCisgICAgeworICAgICAgICBTdGF0dXMgPSBMVk1fQXBwbHlOZXdTZXR0aW5ncyhoSW5zdGFuY2UpOworCisgICAgICAgIGlmKFN0YXR1cyAhPSBMVk1fU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDb252ZXJ0IGZyb20gTW9ubyBpZiBuZWNlc3NhcnkKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKQorICAgIHsKKyAgICAgICAgTW9ub1RvMklfMTYocEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgICAgIHBJbnB1dCAgICAgPSBwT3V0RGF0YTsKKyAgICAgICAgcFRvUHJvY2VzcyA9IHBPdXREYXRhOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBQcm9jZXNzIHRoZSBkYXRhIHdpdGggbWFuYWdlZCBidWZmZXJzCisgICAgICovCisgICAgd2hpbGUgKFNhbXBsZUNvdW50ICE9IDApCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBNYW5hZ2UgdGhlIGlucHV0IGJ1ZmZlciBhbmQgZnJhbWUgcHJvY2Vzc2luZworICAgICAgICAgKi8KKyAgICAgICAgTFZNX0J1ZmZlckluKGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgIHBJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICZwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgJnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAmU2FtcGxlQ291bnQpOworCisgICAgICAgIC8qCisgICAgICAgICAqIE9ubHkgcHJvY2VzcyBkYXRhIHdoZW4gU2FtcGxlQ291bnQgaXMgbm9uZSB6ZXJvLCBhIHplcm8gY291bnQgY2FuIG9jY3VyIHdoZW4KKyAgICAgICAgICogdGhlIEJ1ZmZlckluIHJvdXRpbmUgaXMgd29ya2luZyBpbiBtYW5hZ2VkIG1vZGUuCisgICAgICAgICAqLworICAgICAgICBpZiAoU2FtcGxlQ291bnQgIT0gMCkKKyAgICAgICAgeworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwbHkgQ29uY2VydFNvdW5kIGlmIHJlcXVpcmVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPkNTX0FjdGl2ZSA9PSBMVk1fVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAodm9pZClMVkNTX1Byb2Nlc3MocEluc3RhbmNlLT5oQ1NJbnN0YW5jZSwgICAgICAgICAgLyogQ29uY2VydCBTb3VuZCBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQpOworICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwbHkgdm9sdW1lIGlmIHJlcXVpcmVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPlZDX0FjdGl2ZSE9MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqU2FtcGxlQ291bnQpKTsgICAgIC8qIExlZnQgYW5kIHJpZ2h0Ki8KKyAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENhbGwgTi1CYW5kIGVxdWFsaXNlciBpZiBlbmFibGVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPkVRTkJfQWN0aXZlID09IExWTV9UUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExWRVFOQl9Qcm9jZXNzKHBJbnN0YW5jZS0+aEVRTkJJbnN0YW5jZSwgICAgICAgIC8qIE4tQmFuZCBlcXVhbGlzZXIgaW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENhbGwgYmFzcyBlbmhhbmNlbWVudCBpZiBlbmFibGVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPkRCRV9BY3RpdmUgPT0gTFZNX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTFZEQkVfUHJvY2VzcyhwSW5zdGFuY2UtPmhEQkVJbnN0YW5jZSwgICAgICAgICAgLyogRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisgICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBCeXBhc3MgbW9kZSBvciBldmVyeXRoaW5nIG9mZiwgc28gY29weSB0aGUgaW5wdXQgdG8gdGhlIG91dHB1dAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocFRvUHJvY2VzcyAhPSBwUHJvY2Vzc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvcHlfMTYocFRvUHJvY2VzcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKlNhbXBsZUNvdW50KSk7ICAgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IHRyZWJsZSBib29zdCBpZiByZXF1aXJlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5URV9BY3RpdmUgPT0gTFZNX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgZmlsdGVyCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wVEVfU3RhdGUtPlRyZWJsZUJvb3N0X1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KVNhbXBsZUNvdW50KTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVm9sdW1lIGJhbGFuY2UKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogUGVyZm9ybSBQYXJhbWV0cmljIFNwZWN0dW0gQW5hbHlzaXMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5QU0FfRW5hYmxlID09IExWTV9QU0FfT04pJiYocEluc3RhbmNlLT5JbnN0UGFyYW1zLlBTQV9JbmNsdWRlZD09TFZNX1BTQV9PTikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZyb20yaVRvTW9ub18xNihwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSAoU2FtcGxlQ291bnQpKTsKKworICAgICAgICAgICAgICAgICAgICBMVlBTQV9Qcm9jZXNzKHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KSAoU2FtcGxlQ291bnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSk7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIERDIHJlbW92YWwKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgRENfMklfRDE2X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KVNhbXBsZUNvdW50KTsKKworCisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBNYW5hZ2UgdGhlIG91dHB1dCBidWZmZXIKKyAgICAgICAgICovCisgICAgICAgIExWTV9CdWZmZXJPdXQoaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICZTYW1wbGVDb3VudCk7CisKKyAgICB9CisKKyAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNiMzM1NDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMKQEAgLTAsMCArMSwzOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkCisgICAgICRSZXZpc2lvbjogMTAwMiAkCisgICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjQwOjA5ICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZNX1RhYmxlcy5oIgorI2luY2x1ZGUgIkxWTV9Db2VmZnMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUcmVibGUgQm9vc3QgRmlsdGVyIENvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0ZPX0MxNl9MU2h4X0NvZWZzX3QgICAgTFZNX1RyZWJsZUJvb3N0Q29lZnNbXSA9IHsKKworICAgICAgICAgICAgICAgICAgICAvKiAyMmtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xX0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMV9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4yX0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMl9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4zX0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluM19TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW40X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW40X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNF9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW41X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNV9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW42X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNl9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW43X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW43X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluN19TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW44X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluOF9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW45X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluOV9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjEwX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xMF9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjEwX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjExX0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTFfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTJfQjEsCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMl9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjEzX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xM19CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjEzX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjE0X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTRfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTVfQjEsCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xNV9TaGlmdH0sCisKKyAgICAgICAgICAgICAgICAgICAgLyogMjRrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMV9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjJfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMl9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4zX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjNfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluNF9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW40X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjVfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluNV9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW42X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjZfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluN19CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW43X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjhfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluOF9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW45X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjlfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTBfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTBfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTFfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTFfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTJfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTJfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTNfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTNfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTRfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTRfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTVfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTVfU2hpZnR9LAorCisgICAgICAgICAgICAgICAgICAgIC8qIDMya0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjFfQjEsCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjJfQjEsCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4yX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjNfQjEsCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4zX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjRfQjEsCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW40X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjVfQjEsCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW41X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjZfQjEsCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW42X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjdfQjEsCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW43X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjhfQjEsCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW44X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjlfQjEsCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW45X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjEwX0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTBfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMTFfQjEsCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xMV9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjEyX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xMl9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjEyX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjEzX0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTNfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMTRfQjEsCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xNF9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjE1X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xNV9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjE1X1NoaWZ0fSwKKworICAgICAgICAgICAgICAgICAgICAvKiA0NGtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjFfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMl9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4yX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjNfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluM19TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW40X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW40X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjRfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluNV9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW41X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjZfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluNl9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW43X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW43X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjdfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluOF9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW44X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjlfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluOV9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjEwX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xMF9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMF9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xMV9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMV9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjEyX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xMl9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMl9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjEzX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xM19CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xM19TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xNF9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xNF9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjE1X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xNV9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xNV9TaGlmdH0sCisKKyAgICAgICAgICAgICAgICAgICAgLyogNDhrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMV9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjJfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMl9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4zX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjNfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluNF9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW40X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjVfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluNV9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW42X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjZfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluN19CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW43X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjhfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluOF9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW45X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjlfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTBfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTBfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTFfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTFfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTJfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTJfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTNfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTNfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTRfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTRfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTVfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTVfU2hpZnR9fTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVm9sdW1lIGNvbnRyb2wgZ2FpbiBhbmQgdGltZSBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZEIgdG8gbGluZWFyIGNvbnZlcnNpb24gdGFibGUgKi8KK2NvbnN0IExWTV9JTlQxNiBMVk1fVm9sdW1lVGFibGVbXSA9IHsKKyAgICAweDdGRkYsICAgICAgICAgICAgIC8qICAwZEIgKi8KKyAgICAweDcyMTUsICAgICAgICAgICAgIC8qIC0xZEIgKi8KKyAgICAweDY1QUQsICAgICAgICAgICAgIC8qIC0yZEIgKi8KKyAgICAweDVBOUUsICAgICAgICAgICAgIC8qIC0zZEIgKi8KKyAgICAweDUwQzMsICAgICAgICAgICAgIC8qIC00ZEIgKi8KKyAgICAweDQ3RkIsICAgICAgICAgICAgIC8qIC01ZEIgKi8KKyAgICAweDQwMDB9OyAgICAgICAgICAgIC8qIC02ZEIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVm9sdW1lIG1peGVyIHRpbWUgY29uc3RhbnRzICgxMDBtcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTFZNX01JWF9UQ19GczgwMDAgICAgICAzMjU4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk0MjYyNjk1ICovCisjZGVmaW5lIExWTV9NSVhfVENfRnMxMTAyNSAgICAgMzI2MzIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NTg0OTYwOSAqLworI2RlZmluZSBMVk1fTUlYX1RDX0ZzMTIwMDAgICAgIDMyNjQzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTYxODUzMDMgKi8KKyNkZWZpbmUgTFZNX01JWF9UQ19GczE2MDAwICAgICAzMjY3NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk3MTMxMzQ4ICovCisjZGVmaW5lIExWTV9NSVhfVENfRnMyMjA1MCAgICAgMzI3MDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzkyNDgwNSAqLworI2RlZmluZSBMVk1fTUlYX1RDX0ZzMjQwMDAgICAgIDMyNzA1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTgwNzczOTMgKi8KKyNkZWZpbmUgTFZNX01JWF9UQ19GczMyMDAwICAgICAzMjcyMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4NTY1Njc0ICovCisjZGVmaW5lIExWTV9NSVhfVENfRnM0NDEwMCAgICAgMzI3MzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODk2MjQwMiAqLworI2RlZmluZSBMVk1fTUlYX1RDX0ZzNDgwMDAgICAgIDMyNzM3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTkwNTM5NTUgKi8KKworCitjb25zdCBMVk1fSU5UMTYgTFZNX01peGVyVENUYWJsZVtdID0geworICAgIExWTV9NSVhfVENfRnM4MDAwLAorICAgIExWTV9NSVhfVENfRnMxMTAyNSwKKyAgICBMVk1fTUlYX1RDX0ZzMTIwMDAsCisgICAgTFZNX01JWF9UQ19GczE2MDAwLAorICAgIExWTV9NSVhfVENfRnMyMjA1MCwKKyAgICBMVk1fTUlYX1RDX0ZzMjQwMDAsCisgICAgTFZNX01JWF9UQ19GczMyMDAwLAorICAgIExWTV9NSVhfVENfRnM0NDEwMCwKKyAgICBMVk1fTUlYX1RDX0ZzNDgwMDB9OworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTc0ZjY0MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogYmVxMDc3MTYgJAorICAgICAkUmV2aXNpb246IDEwMDIgJAorICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzo0MDowOSArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fTFZNX1RBQkxFU19IX18KKyNkZWZpbmUgX19MVk1fVEFCTEVTX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVHJlYmxlIEJvb3N0IEZpbHRlciBDb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitleHRlcm4gRk9fQzE2X0xTaHhfQ29lZnNfdCAgICAgTFZNX1RyZWJsZUJvb3N0Q29lZnNbXTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFZvbHVtZSBjb250cm9sIGdhaW4gYW5kIHRpbWUgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVk1fVm9sdW1lVGFibGVbXTsKK2V4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZNX01peGVyVENUYWJsZVtdOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBfX0xWTV9UQUJMRVNfSF9fICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ODBhOGUzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkCisgICAgICRSZXZpc2lvbjogMTAwMCAkCisgICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fQUdDX0hfXworI2RlZmluZSBfX0FHQ19IX18KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQzMiAgQUdDX0dhaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KKyAgICBMVk1fSU5UMzIgIEFHQ19NYXhHYWluOyAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBtYXhpbXVtIEFHQyBnYWluICovCisgICAgTFZNX0lOVDMyICBWb2x1bWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgY3VycmVudCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9JTlQzMiAgVGFyZ2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIHRhcmdldCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9JTlQzMiAgQUdDX1RhcmdldDsgICAgICAgICAgICAgICAgICAgICAgLyogQUdDIHRhcmdldCBsZXZlbCAqLworICAgIExWTV9JTlQxNiAgQUdDX0F0dGFjazsgICAgICAgICAgICAgICAgICAgICAgLyogQUdDIGF0dGFjayBzY2FsZXIgKi8KKyAgICBMVk1fSU5UMTYgIEFHQ19EZWNheTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEFHQyBkZWNheSBzY2FsZXIgKi8KKyAgICBMVk1fSU5UMTYgIEFHQ19HYWluU2hpZnQ7ICAgICAgICAgICAgICAgICAgIC8qIFRoZSBnYWluIHNoaWZ0ICovCisgICAgTFZNX0lOVDE2ICBWb2x1bWVTaGlmdDsgICAgICAgICAgICAgICAgICAgICAvKiBWb2x1bWUgc2hpZnQgc2NhbGluZyAqLworICAgIExWTV9JTlQxNiAgVm9sdW1lVEM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVm9sdW1lIHVwZGF0ZSB0aW1lIGNvbnN0YW50ICovCisKK30gQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX3QgICpwSW5zdGFuY2UsICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgICAqcFN0U3JjLCAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAgICAgICAgKnBNb25vU3JjLCAgICAgIC8qIE1vbm8gc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAqcERzdCwgICAgICAgICAgLyogU3RlcmVvIGRlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBuKTsgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisjZW5kaWYgIC8qIF9fQUdDX0hfXyAqLworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA4ZTVhNmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaApAQCAtMCwwICsxLDM0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkCisgICAgICRSZXZpc2lvbjogNzIyICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMTAgMTU6MTI6MzQgKzAyMDAgKFRodSwgMTAgSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0JJUVVBRF9IXworI2RlZmluZSBfQklRVUFEX0hfCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5TVEFOQ0UgTUVNT1JZIFRZUEUgREVGSU5JVElPTgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDMyIFN0b3JhZ2VbNl07CisKK30gQmlxdWFkX0luc3RhbmNlX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIENPRUZGSUNJRU5UIFRZUEUgREVGSU5JVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqIEJpcXVhZCBjb2VmZmljaWVudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDE2IEEyOyAgIC8qICBhMiAgKi8KKyAgICBMVk1fSU5UMTYgQTE7ICAgLyogIGExICAqLworICAgIExWTV9JTlQxNiBBMDsgICAvKiAgYTAgICovCisgICAgTFZNX0lOVDE2IEIyOyAgIC8qIC1iMiEgKi8KKyAgICBMVk1fSU5UMTYgQjE7ICAgLyogLWIxISAqLworfSBCUV9DMTZfQ29lZnNfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSU5UMzIgIEEyOyAgIC8qICBhMiAgKi8KKyAgICBMVk1fSU5UMzIgIEExOyAgIC8qICBhMSAgKi8KKyAgICBMVk1fSU5UMzIgIEEwOyAgIC8qICBhMCAgKi8KKyAgICBMVk1fSU5UMzIgIEIyOyAgIC8qIC1iMiEgKi8KKyAgICBMVk1fSU5UMzIgIEIxOyAgIC8qIC1iMSEgKi8KK30gQlFfQzMyX0NvZWZzX3Q7CisKKy8qKiogRmlyc3Qgb3JkZXIgY29lZmZpY2llbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSU5UMTYgQTE7ICAgLyogIGExICAqLworICAgIExWTV9JTlQxNiBBMDsgICAvKiAgYTAgICovCisgICAgTFZNX0lOVDE2IEIxOyAgIC8qIC1iMSEgKi8KK30gRk9fQzE2X0NvZWZzX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDMyICBBMTsgICAvKiAgYTEgICovCisgICAgTFZNX0lOVDMyICBBMDsgICAvKiAgYTAgICovCisgICAgTFZNX0lOVDMyICBCMTsgICAvKiAtYjEhICovCit9IEZPX0MzMl9Db2Vmc190OworCisvKioqIEZpcnN0IG9yZGVyIGNvZWZmaWNpZW50cyB3aXRoIFNoaWZ0KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQxNiBBMTsgICAgLyogIGExICAqLworICAgIExWTV9JTlQxNiBBMDsgICAgLyogIGEwICAqLworICAgIExWTV9JTlQxNiBCMTsgICAgLyogLWIxISAqLworICAgIExWTV9JTlQxNiBTaGlmdDsgLyogU2hpZnQgKi8KK30gRk9fQzE2X0xTaHhfQ29lZnNfdDsKKworLyoqKiBCYW5kIHBhc3MgY29lZmZpY2llbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQxNiBBMDsgICAvKiAgYTAgICovCisgICAgTFZNX0lOVDE2IEIyOyAgIC8qIC1iMiEgKi8KKyAgICBMVk1fSU5UMTYgQjE7ICAgLyogLWIxISAqLworfSBCUF9DMTZfQ29lZnNfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSU5UMzIgIEEwOyAgIC8qICBhMCAgKi8KKyAgICBMVk1fSU5UMzIgIEIyOyAgIC8qIC1iMiEgKi8KKyAgICBMVk1fSU5UMzIgIEIxOyAgIC8qIC1iMSEgKi8KK30gQlBfQzMyX0NvZWZzX3Q7CisKKy8qKiogUGVha2luZyBjb2VmZmljaWVudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSU5UMTYgQTA7ICAgLyogIGEwICAqLworICAgIExWTV9JTlQxNiBCMjsgICAvKiAtYjIhICovCisgICAgTFZNX0lOVDE2IEIxOyAgIC8qIC1iMSEgKi8KKyAgICBMVk1fSU5UMTYgIEc7ICAgLyogR2FpbiAqLworfSBQS19DMTZfQ29lZnNfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSU5UMzIgIEEwOyAgIC8qICBhMCAgKi8KKyAgICBMVk1fSU5UMzIgIEIyOyAgIC8qIC1iMiEgKi8KKyAgICBMVk1fSU5UMzIgIEIxOyAgIC8qIC1iMSEgKi8KKyAgICBMVk1fSU5UMTYgIEc7ICAgLyogR2FpbiAqLworfSBQS19DMzJfQ29lZnNfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgVEFQUyBUWVBFIERFRklOSVRJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKiBUeXBlcyB1c2VkIGZvciBmaXJzdCBvcmRlciBhbmQgc2hlbHZpbmcgZmlsdGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDMyIFN0b3JhZ2VbICgxKjIpIF07ICAvKiBPbmUgY2hhbm5lbCwgdHdvIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KK30gQmlxdWFkXzFJX09yZGVyMV9UYXBzX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDMyIFN0b3JhZ2VbICgyKjIpIF07ICAvKiBUd28gY2hhbm5lbHMsIHR3byB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCit9IEJpcXVhZF8ySV9PcmRlcjFfVGFwc190OworCisKKy8qKiogVHlwZXMgdXNlZCBmb3IgYmlxdWFkLCBiYW5kIHBhc3MgYW5kIHBlYWtpbmcgZmlsdGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQzMiBTdG9yYWdlWyAoMSo0KSBdOyAgLyogT25lIGNoYW5uZWwsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworfSBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSU5UMzIgU3RvcmFnZVsgKDIqNCkgXTsgIC8qIFR3byBjaGFubmVscywgZm91ciB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCit9IEJpcXVhZF8ySV9PcmRlcjJfVGFwc190OworCisvKiBUaGUgbmFtZXMgb2YgdGhlIGZ1bmN0aW9ucyBhcmUgY2hhbmdlZCB0byBzYXRpc2Z5IFFBQyBydWxlczogTmFtZSBzaG91bGQgYmUgVW5pcXVlIHdpdGhpbmcgMTYgY2hhcmFjdGVycyovCisjZGVmaW5lIEJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgIEluaXRfQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDEKKyNkZWZpbmUgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIgICAgICAgVFdPX0JQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBQUk9UT1RZUEVTOiBCSVFVQUQgRklMVEVSUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiogMTYgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKKwordm9pZCBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworCit2b2lkIEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisKK3ZvaWQgQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKwordm9pZCBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CisKK3ZvaWQgQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEoICAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKwordm9pZCBCUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMSggICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworCit2b2lkIEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKKwordm9pZCBCUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSggICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworCit2b2lkIEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKKwordm9pZCBCUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworCisvKioqIDMyIGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MzMl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CisKK3ZvaWQgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIFBST1RPVFlQRVM6IEZJUlNUIE9SREVSIEZJTFRFUlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqIDE2IGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CisKK3ZvaWQgRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEoICAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKwordm9pZCBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjFfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MxNl9MU2h4X0NvZWZzX3QgICAgICpwQ29lZik7CisKK3ZvaWQgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworCisvKioqIDMyIGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MzMl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CisKK3ZvaWQgRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEoICAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIFBST1RPVFlQRVM6IEJBTkQgUEFTUyBGSUxURVJTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKiAxNiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMTZfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOworCit2b2lkIEJQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisKK3ZvaWQgQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOworCit2b2lkIEJQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisKKworLyoqKiAzMiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOworCit2b2lkIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyKCAgICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisKKworLyoqKiAzMiBiaXQgZGF0YSBwYXRoIFNURVJFTyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOworCit2b2lkIFBLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxICggICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisKK3ZvaWQgUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMTZfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOworCit2b2lkIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxICggICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIFBST1RPVFlQRVM6IERDIFJFTU9WQUwgRklMVEVSUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiogMTYgYml0IGRhdGEgcGF0aCBTVEVSRU8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQgICAgICggICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UpOworCit2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxICAgICAgICAgICggICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNlbmRpZiAgLyoqIF9CSVFVQURfSF8gKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0NvbXBMaW0uaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0NvbXBMaW0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZjliNTgzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQ29tcExpbS5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogbnhwMjcwNzggJAorICAgICAkUmV2aXNpb246IDY3MiAkCisgICAgICREYXRlOiAyMDEwLTA2LTA4IDE5OjM5OjM4ICswMjAwIChUdWUsIDA4IEp1biAyMDEwKSAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9DT01QX0xJTV9ICisjZGVmaW5lIF9DT01QX0xJTV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCAvKiBDb21wcmVzc29yIHN0YXRlICovCit7CisgICAgLyogTm9ybWFsaXNlciAqLworICAgIExWTV9JTlQxNiAgIE5vcm1fQXR0YWNrOyAgICAgICAgLyogQXR0YWNrIHRpbWUgY29uc3RhbnQgb2YgdGhlIE5vcm1hbGlzZXIgaW50ZWdyYXRvciAqLworICAgIExWTV9JTlQxNiAgIE5vcm1fRGVjYXk7ICAgICAgICAgLyogRGVjYXkgdGltZSBjb25zdGFudCBvZiB0aGUgTm9ybWFsaXNlciBpbnRlZ3JhdG9yICovCisgICAgTFZNX0lOVDMyICAgTm9ybUludDsgICAgICAgICAgICAvKiBOb3JtYWxpc2VyIGludGVncmF0b3IgY3VycmVudCB2YWx1ZSAqLworICAgIExWTV9JTlQxNiAgIFNoaWZ0OyAgICAgICAgICAgICAgLyogU2hpZnQgZ2FpbiAqLworICAgIExWTV9JTlQxNiAgIFRocmVzaG9sZDsgICAgICAgICAgLyogVGFyZ2V0IHRocmVzaG9sZCAqLworCisgICAgLyogQ29tcHJlc3NvciAqLworICAgIExWTV9JTlQxNiAgIENvbXBfQXR0ZW47ICAgICAgICAgLyogQXR0ZW51YXRpb24gYXBwbGllZCBiZWZvcmUgc29mdCBrbmVlIGNvbXByZXNzb3IgKi8KKyAgICBMVk1fSU5UMTYgICBDb21wX0F0dGFja19TOyAgICAgIC8qIEF0dGFjayB0aW1lIGNvbnN0YW50IG9mIHRoZSBzbG93IGludGVncmF0b3IgKi8KKyAgICBMVk1fSU5UMTYgICBDb21wX0RlY2F5X1M7ICAgICAgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQgb2Ygc2xvdyB0aGUgaW50ZWdyYXRvciAqLworICAgIExWTV9JTlQxNiAgIENvbXBfQXR0YWNrX0Y7ICAgICAgLyogQXR0YWNrIHRpbWUgY29uc3RhbnQgb2YgZmFzdCB0aGUgaW50ZWdyYXRvciAqLworICAgIExWTV9JTlQxNiAgIENvbXBfRGVjYXlfRjsgICAgICAgLyogRGVjYXkgdGltZSBjb25zdGFudCBvZiBmYXN0IHRoZSBpbnRlZ3JhdG9yICovCisgICAgTFZNX0lOVDE2ICAgU29mdENsaXBHYWluOyAgICAgICAvKiBTb2Z0IGNsaXAgZ2FpbiBjb250cm9sICovCisgICAgTFZNX0lOVDMyICAgQ29tcEludFNsb3c7ICAgICAgICAvKiBDb21wcmVzc29yIHNsb3cgaW50ZWdyYXRvciBjdXJyZW50IHZhbHVlICovCisgICAgTFZNX0lOVDMyICAgQ29tcEludEZhc3Q7ICAgICAgICAvKiBDb21wcmVzc29yIGZhc3QgaW50ZWdyYXRvciBjdXJyZW50IHZhbHVlICovCisKKworfSBDb21wTGltX0luc3RhbmNlX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTm9uTGluQ29tcF9EMTYoTFZNX0lOVDE2ICAgICAgICBHYWluLAorICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwU3RlckJmSW4sCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBTdGVyQmZPdXQsCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgQmxvY2tMZW5ndGgpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiAjaWZuZGVmIF9DT01QX0xJTV9IICovCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9GaWx0ZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0ZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkzY2NiY2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9GaWx0ZXIuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiA3NzEgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMTQgMTA6NDE6MzYgKzAyMDAgKE1vbiwgMTQgSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0ZJTFRFUl9IXworI2RlZmluZSBfRklMVEVSX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKyNpbmNsdWRlICJCSVFVQUQuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgREVGSU5FUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEZJTFRFUl9MT1NTICAgICAzMjczMCAgICAgICAvKiAtMC4wMWRCIGxvc3MgdG8gYXZvaWQgd3JhcHBpbmcgZHVlIHRvIGJhbmQgcmlwcGxlICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBQUk9UT1RZUEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX0lOVDMyIExWTV9Qb2x5bm9taWFsKExWTV9VSU5UMTYgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpwQ29lZmZpY2llbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgWCk7CisKK0xWTV9JTlQzMiBMVk1fUG93ZXIxMCggICBMVk1fSU5UMzIgIFgpOworCitMVk1fSU5UMzIgTFZNX0ZPX0xQRiggICAgTFZNX0lOVDMyICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MzMl9Db2Vmc190ICAqcENvZWZmcyk7CisKK0xWTV9JTlQzMiBMVk1fRk9fSFBGKCAgICBMVk1fSU5UMzIgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzMyX0NvZWZzX3QgICpwQ29lZmZzKTsKKworTFZNX0lOVDMyICAgTFZNX0dldE9tZWdhKExWTV9VSU5UMTYgIEZjLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgIFNhbXBsZVJhdGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAgLyoqIF9GSUxURVJfSF8gKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0luc3RBbGxvYy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvSW5zdEFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzE0MDliZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0luc3RBbGxvYy5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX19JTlNUQUxMT0NfSF9fCisjZGVmaW5lIF9fSU5TVEFMTE9DX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworLyogIFR5cGUgZGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgVG90YWxTaXplOyAgICAgIC8qICBBY2N1bXVsYXRpdmUgdG90YWwgbWVtb3J5IHNpemUgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICBwTmV4dE1lbWJlcjsgICAgLyogIFBvaW50ZXIgdG8gdGhlIG5leHQgaW5zdGFuY2UgbWVtYmVyIHRvIGJlIGFsbG9jYXRlZCAqLworfSAgIElOU1RfQUxMT0M7CisKKworLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisvKiAgRnVuY3Rpb24gcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgTmFtZSAgICAgICAgOiBJbnN0QWxsb2NfSW5pdCgpCisgKiAgSW5wdXQgICAgICAgOiBwbXMgIC0gUG9pbnRlciB0byB0aGUgSU5TVF9BTExPQyBpbnN0YW5jZQorICAgICAgICAgICAgICAgICAgU3RhcnRBZGRyIC0gQmFzZSBhZGRyZXNzIG9mIHRoZSBpbnN0YW5jZSBtZW1vcnkKKyAqICBSZXR1cm5zICAgICA6IEVycm9yIGNvZGUKKyAqICBEZXNjcmlwdGlvbiA6IEluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSBkaXN0cmlidXRpb24gYW5kIG1lbW9yeSBzaXplIGNhbGN1bGF0aW9uIGZ1bmN0aW9uCisgKiAgUmVtYXJrcyAgICAgOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgICBJbnN0QWxsb2NfSW5pdCggSU5TVF9BTExPQyAqcG1zLCB2b2lkICpTdGFydEFkZHIgKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5hbWUgICAgICAgIDogSW5zdEFsbG9jX0FkZE1lbWJlcigpCisgKiAgSW5wdXQgICAgICAgOiBwbXMgIC0gUG9pbnRlciB0byB0aGUgSU5TVF9BTExPQyBpbnN0YW5jZQorICAgICAgICAgICAgICAgICAgU2l6ZSAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBuZXcgYWRkZWQgbWVtYmVyCisgKiAgUmV0dXJucyAgICAgOiBBIHBvaW50ZXIgdG8gdGhlIG5ldyBhZGRlZCBtZW1iZXIKKyAqICBEZXNjcmlwdGlvbiA6IEFsbG9jYXRlcyBzcGFjZSBmb3IgYSBuZXcgbWVtYmVyIGluIHRoZSBpbnN0YW5jZSBtZW1vcnkgYW5kIHJldHVybnMKKyAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciB0byB0aGlzIG5ldyBtZW1iZXIuICBUaGUgc3RhcnQgYWRkcmVzcyBvZiBhbGwgbWVtYmVycyB3aWxsCisgICAgICAgICAgICAgICAgICBiZSAzMiBiaXQgYWxsaWduZWQuCisgKiAgUmVtYXJrcyAgICAgOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQqIEluc3RBbGxvY19BZGRNZW1iZXIoIElOU1RfQUxMT0MgKnBtcywgTFZNX1VJTlQzMiBTaXplICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgTmFtZSAgICAgICAgOiBJbnN0QWxsb2NfR2V0VG90YWwoKQorICogIElucHV0ICAgICAgIDogcG1zICAtIFBvaW50ZXIgdG8gdGhlIElOU1RfQUxMT0MgaW5zdGFuY2UKKyAqICBSZXR1cm5zICAgICA6IFRoZSBpbnN0YW5jZSBtZW1vcnkgc2l6ZQorICogIERlc2NyaXB0aW9uIDogVGhpcyBmdW5jdGlvbnMgcmV0dXJucyB0aGUgY2FsY3VsYXRlZCBpbnN0YW5jZSBtZW1vcnkgc2l6ZQorICogIFJlbWFya3MgICAgIDoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fVUlOVDMyIEluc3RBbGxvY19HZXRUb3RhbCggSU5TVF9BTExPQyAqcG1zKTsKKwordm9pZCogICBJbnN0QWxsb2NfQWRkTWVtYmVyQWxsUmV0KCAgICAgSU5TVF9BTExPQyAgICAgICAgICAgICAgICAgKnBtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgU2l6ZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICoqcHRyKTsKKwordm9pZCogICBJbnN0QWxsb2NfQWRkTWVtYmVyQWxsKCBJTlNUX0FMTE9DICAgICAgICAgICAgICAgICAgICAgKnBtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICAgU2l6ZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01lbW9yeVRhYmxlX3N0ICAgICAgICAgICAqcE1lbW9yeVRhYmxlKTsKKwordm9pZCAgICBJbnN0QWxsb2NfSW5pdEFsbCggSU5TVF9BTExPQyAgICAgICAgICAgICAgICAgICAgICAqcG1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01lbW9yeVRhYmxlX3N0ICAgICAgICAgICAgICpwTWVtb3J5VGFibGUpOworCit2b2lkICAgIEluc3RBbGxvY19Jbml0QWxsX05VTEwoIElOU1RfQUxMT0MgICAgICAgICAgICAgICpwbXMpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX19KQlNfSU5TVEFMTE9DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX0NvbW1vbi5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX0NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYwZjg5M2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fQ29tbW9uLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogbnhwMjcwNzggJAorICAgICAkUmV2aXNpb246IDY3MiAkCisgICAgICREYXRlOiAyMDEwLTA2LTA4IDE5OjM5OjM4ICswMjAwIChUdWUsIDA4IEp1biAyMDEwKSAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEhlYWRlciBmaWxlIGZvciB0aGUgY29tbW9uIGRlZmluaXRpb25zIHVzZWQgd2l0aGluIHRoZSBidW5kbGUgYW5kIGl0cyBhbGdvcml0aG1zLiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGVzIGluY2x1ZGVzIGFsbCBkZWZpbml0aW9ucywgdHlwZXMsIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9uIHByb3RvdHlwZXMuICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fTFZNX0NPTU1PTl9IX18KKyNkZWZpbmUgX19MVk1fQ09NTU9OX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQWxnb3JpdGhtIGlkZW50aWZpY2F0aW9uICovCisjZGVmaW5lIEFMR09SSVRITV9OT05FX0lEICAgICAgMHgwMDAwCisjZGVmaW5lIEFMR09SSVRITV9DU19JRCAgICAgICAgMHgwMTAwCisjZGVmaW5lIEFMR09SSVRITV9FUU5CX0lEICAgICAgMHgwMjAwCisjZGVmaW5lIEFMR09SSVRITV9EQkVfSUQgICAgICAgMHgwMzAwCisjZGVmaW5lIEFMR09SSVRITV9WQ19JRCAgICAgICAgMHgwNTAwCisjZGVmaW5lIEFMR09SSVRITV9URV9JRCAgICAgICAgMHgwNjAwCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAgICAgIC8qIF9fTFZNX0NPTU1PTl9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX01hY3Jvcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX01hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhiZDM2M2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fTWFjcm9zLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogYmVxMDc3MTYgJAorICAgICAkUmV2aXNpb246IDEwMDAgJAorICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfTFZNX01BQ1JPU19IXworI2RlZmluZSBfTFZNX01BQ1JPU19IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBNVUwzMngzMklOVE8zMihBLEIsQyxTaGlmdFIpCisgICAgICAgIEMgPSAoQSAqIEIpID4+IFNoaWZ0UgorCisgICAgICAgIEEsIEIgYW5kIEMgYXJlIGFsbCAzMiBiaXQgU0lHTkVEIG51bWJlcnMgYW5kIFNoaWZ0UiBjYW4gdmFyeSBmcm9tIDAgdG8gNjQKKworICAgICAgICBUaGUgdXNlciBoYXMgdG8gdGFrZSBjYXJlIHRoYXQgQyBkb2VzIG5vdCBvdmVyZmxvdy4gIFRoZSByZXN1bHQgaW4gY2FzZQorICAgICAgICBvZiBvdmVyZmxvdyBpcyB1bmRlZmluZWQuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBNVUwzMngzMklOVE8zMgorI2RlZmluZSBNVUwzMngzMklOVE8zMihBLEIsQyxTaGlmdFIpICAgXAorICAgICAgICB7TFZNX0lOVDMyIE1VTDMyeDMySU5UTzMyX3RlbXAsTVVMMzJ4MzJJTlRPMzJfdGVtcDIsTVVMMzJ4MzJJTlRPMzJfbWFzayxNVUwzMngzMklOVE8zMl9ISCxNVUwzMngzMklOVE8zMl9ITCxNVUwzMngzMklOVE8zMl9MSCxNVUwzMngzMklOVE8zMl9MTDtcCisgICAgICAgICBMVk1fSU5UMzIgIHNoaWZ0VmFsdWU7XAorICAgICAgICBzaGlmdFZhbHVlID0gKFNoaWZ0Uik7XAorICAgICAgICBNVUwzMngzMklOVE8zMl9tYXNrPTB4MDAwMEZGRkY7XAorICAgICAgICBNVUwzMngzMklOVE8zMl9ISD0gKChMVk1fSU5UMzIpKChMVk1fSU5UMTYpKChBKT4+MTYpKSooKExWTV9JTlQxNikoKEIpPj4xNikpICk7XAorICAgICAgICBNVUwzMngzMklOVE8zMl9ITD0gKChMVk1fSU5UMzIpKChCKSZNVUwzMngzMklOVE8zMl9tYXNrKSooKExWTV9JTlQxNikoKEEpPj4xNikpKSA7XAorICAgICAgICBNVUwzMngzMklOVE8zMl9MSD0gKChMVk1fSU5UMzIpKChBKSZNVUwzMngzMklOVE8zMl9tYXNrKSooKExWTV9JTlQxNikoKEIpPj4xNikpKTtcCisgICAgICAgIE1VTDMyeDMySU5UTzMyX0xMPSAoTFZNX0lOVDMyKSgoQSkmTVVMMzJ4MzJJTlRPMzJfbWFzaykqKExWTV9JTlQzMikoKEIpJk1VTDMyeDMySU5UTzMyX21hc2spO1wKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzJfdGVtcD0gKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfSEwmTVVMMzJ4MzJJTlRPMzJfbWFzaykrKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfTEgmTVVMMzJ4MzJJTlRPMzJfbWFzaykrKExWTV9JTlQzMikoKE1VTDMyeDMySU5UTzMyX0xMPj4xNikmTVVMMzJ4MzJJTlRPMzJfbWFzayk7XAorICAgICAgICBNVUwzMngzMklOVE8zMl9ISD0gTVVMMzJ4MzJJTlRPMzJfSEgrKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfSEw+PjE2KSsoTFZNX0lOVDMyKShNVUwzMngzMklOVE8zMl9MSD4+MTYpKyhMVk1fSU5UMzIpKE1VTDMyeDMySU5UTzMyX3RlbXA+PjE2KTtcCisgICAgICAgIE1VTDMyeDMySU5UTzMyX0xMPU1VTDMyeDMySU5UTzMyX0xMKyhMVk1fSU5UMzIpKE1VTDMyeDMySU5UTzMyX0hMPDwxNikrKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfTEg8PDE2KTtcCisgICAgICAgIGlmKHNoaWZ0VmFsdWU8MzIpXAorICAgICAgICB7XAorICAgICAgICBNVUwzMngzMklOVE8zMl9ISD1NVUwzMngzMklOVE8zMl9ISDw8KDMyLXNoaWZ0VmFsdWUpO1wKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzJfbWFzaz0oKExWTV9JTlQzMikxPDwoMzItc2hpZnRWYWx1ZSkpLTE7XAorICAgICAgICBNVUwzMngzMklOVE8zMl9MTD0oTVVMMzJ4MzJJTlRPMzJfTEw+PnNoaWZ0VmFsdWUpJk1VTDMyeDMySU5UTzMyX21hc2s7XAorICAgICAgICBNVUwzMngzMklOVE8zMl90ZW1wMj1NVUwzMngzMklOVE8zMl9ISHxNVUwzMngzMklOVE8zMl9MTDtcCisgICAgICAgIH1cCisgICAgICAgIGVsc2VcCisgICAgICAge1wKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzJfdGVtcDI9KExWTV9JTlQzMilNVUwzMngzMklOVE8zMl9ISD4+KHNoaWZ0VmFsdWUtMzIpO1wKKyAgICAgICB9XAorICAgICAgIChDKSA9IE1VTDMyeDMySU5UTzMyX3RlbXAyO1wKKyAgICAgICB9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIE1VTDMyeDE2SU5UTzMyKEEsQixDLFNoaWZ0UikKKyAgICAgICAgQyA9IChBICogQikgPj4gU2hpZnRSCisKKyAgICAgICAgQSBhbmQgQyBhcmUgMzIgYml0IFNJR05FRCBudW1iZXJzLiAgQiBpcyBhIDE2IGJpdCBTSUdORUQgbnVtYmVyLgorICAgICAgICBTaGlmdFIgY2FuIHZhcnkgZnJvbSAwIHRvIDQ4CisKKyAgICAgICAgVGhlIHVzZXIgaGFzIHRvIHRha2UgY2FyZSB0aGF0IEMgZG9lcyBub3Qgb3ZlcmZsb3cuICBUaGUgcmVzdWx0IGluIGNhc2UKKyAgICAgICAgb2Ygb3ZlcmZsb3cgaXMgdW5kZWZpbmVkLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgTVVMMzJ4MTZJTlRPMzIKKyNkZWZpbmUgTVVMMzJ4MTZJTlRPMzIoQSxCLEMsU2hpZnRSKSAgIFwKKyAgICAgICAge0xWTV9JTlQzMiBNVUwzMngxNklOVE8zMl9tYXNrLE1VTDMyeDE2SU5UTzMyX0hILE1VTDMyeDE2SU5UTzMyX0xMO1wKKyAgICAgICAgIExWTV9JTlQzMiAgc2hpZnRWYWx1ZTtcCisgICAgICAgIHNoaWZ0VmFsdWUgPSAoU2hpZnRSKTtcCisgICAgICAgIE1VTDMyeDE2SU5UTzMyX21hc2s9MHgwMDAwRkZGRjtcCisgICAgICAgIE1VTDMyeDE2SU5UTzMyX0hIPSAoKExWTV9JTlQzMikoQikqKChMVk1fSU5UMTYpKChBKT4+MTYpKSk7XAorICAgICAgICBNVUwzMngxNklOVE8zMl9MTD0gKChMVk1fSU5UMzIpKChBKSZNVUwzMngxNklOVE8zMl9tYXNrKSooQikpO1wKKyAgICAgICAgaWYoc2hpZnRWYWx1ZTwxNilcCisgICAgICAgIHtcCisgICAgICAgIE1VTDMyeDE2SU5UTzMyX0hIPShMVk1fSU5UMzIpKChMVk1fVUlOVDMyKU1VTDMyeDE2SU5UTzMyX0hIPDwoMTYtc2hpZnRWYWx1ZSkpO1wKKyAgICAgICAgKEMpPU1VTDMyeDE2SU5UTzMyX0hIKyhMVk1fSU5UMzIpKE1VTDMyeDE2SU5UTzMyX0xMPj5zaGlmdFZhbHVlKTtcCisgICAgICAgIH1cCisgICAgICAgIGVsc2UgaWYoc2hpZnRWYWx1ZTwzMikge1wKKyAgICAgICAgTVVMMzJ4MTZJTlRPMzJfSEg9KExWTV9JTlQzMikoTVVMMzJ4MTZJTlRPMzJfSEg+PihzaGlmdFZhbHVlLTE2KSk7XAorICAgICAgICAoQyk9TVVMMzJ4MTZJTlRPMzJfSEgrKExWTV9JTlQzMikoTVVMMzJ4MTZJTlRPMzJfTEw+PnNoaWZ0VmFsdWUpO1wKKyAgICAgICAgfVwKKyAgICAgICAgZWxzZSB7XAorICAgICAgICAoQyk9TVVMMzJ4MTZJTlRPMzJfSEg+PihzaGlmdFZhbHVlLTE2KTt9XAorICAgICAgICB9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEFERDJfU0FUXzMyeDMyKEEsQixDKQorICAgICAgICBDID0gU0FUKEEgKyBCKQorCisgICAgICAgIEEsQiBhbmQgQyBhcmUgMzIgYml0IFNJR05FRCBudW1iZXJzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEFERDJfU0FUXzMyeDMyCisjZGVmaW5lIEFERDJfU0FUXzMyeDMyKEEsQixDKSAgIFwKKyAgICAgICAgeyhDKT0oQSkrKEIpO1wKKyAgICAgICAgIGlmICgoKChDKSBeIChBKSkgJiAoKEMpIF4gKEIpKSkgPj4gMzEpXAorICAgICAgICAgICAge1wKKyAgICAgICAgICAgICAgICBpZigoQSk8MClcCisgICAgICAgICAgICAgICAgICAgIChDKT0weDgwMDAwMDAwbDtcCisgICAgICAgICAgICAgICAgZWxzZVwKKyAgICAgICAgICAgICAgICAgICAgKEMpPTB4N0ZGRkZGRkZsO1wKKyAgICAgICAgICAgIH1cCisgICAgICAgIH0KKyNlbmRpZgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBfTFZNX01BQ1JPU19IXyAqLworCisvKioqIEVuZCBvZiBmaWxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UaW1lci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1RpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjJhMTZkNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UaW1lci5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19MVk1fVElNRVJfSF9fCisjZGVmaW5lIF9fTFZNX1RJTUVSX0hfXworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgTXkgUHJvamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBIZWFkZXIgZmlsZSBmb3IgdGhlIExWTV9UaW1lciBsaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnVuY3Rpb25hbGl0eTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgdGltZXIgd2lsbCBjb3VudCBkb3duIGEgbnVtYmVyIG9mIG1zLCBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXQgICAgICAgICAqLworLyogIHNlZXMgYW5kIHRoZSBjdXJlbnQgc2FtcGxpbmcgcmF0ZS4gIFdoZW4gdGhlIHRpbWVyIGV4cGlyZXMsIGEgcmVnaXN0ZXJlZCAgICAgICAgICAgICovCisvKiAgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgbWF4aW1hbCBudW1iZXIgb2Ygc2FtcGxlc3MgdGhhdCBjYW4gYmUgY2FsbGVkIGJ5IHRoZSB0aW1lciBpcyAyXjMyLCB3aGljaCAgICAgICAqLworLyogIGNvcnJlc3BvbmRzIHRvIDI0LjggaG91cnMgYXQgYSBzYW1wbGluZyByYXRlIG9mIDQ4IGtIeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIHRpbWVyIGN1cnJlbnRseSBkb2VzIG5vdCBzdXBvcnQgY2hhbmdlcyBpbiBzYW1wbGluZyByYXRlIHdoaWxlIHRpbWluZy4gICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgVFlQRSBERUZJTklUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQzMiBTdG9yYWdlWzZdOworCit9IExWTV9UaW1lcl9JbnN0YW5jZV90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQzMiAgU2FtcGxpbmdSYXRlOworICAgIExWTV9JTlQxNiAgVGltZUluTXM7CisgICAgTFZNX0lOVDMyICBDYWxsQmFja1BhcmFtOworICAgIHZvaWQgICAgICAgKnBDYWxsQmFja1BhcmFtczsKKyAgICB2b2lkICAgICAgICpwQ2FsbGJhY2tJbnN0YW5jZTsKKyAgICB2b2lkICAgICAgICgqcENhbGxCYWNrKSh2b2lkKix2b2lkKixMVk1fSU5UMzIpOworCit9IExWTV9UaW1lcl9QYXJhbXNfdDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgRlVOQ1RJT04gUFJPVE9UWVBFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWTV9UaW1lcl9Jbml0ICggICBMVk1fVGltZXJfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1RpbWVyX1BhcmFtc190ICAgICAgICAgKnBQYXJhbXMgICAgICk7CisKKwordm9pZCBMVk1fVGltZXIgICAgICAoICAgTFZNX1RpbWVyX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tTaXplICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgRU5EIE9GIEhFQURFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgIC8qIF9fTFZNX1RJTUVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNDY0OWJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogYmVxMDc3MTYgJAorICAgICAkUmV2aXNpb246IDEwMDAgJAorICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBIZWFkZXIgZmlsZSBkZWZpbmluZyB0aGUgc3RhbmRhcmQgTGlmZVZpYmVzIHR5cGVzIGZvciB1c2UgaW4gdGhlIGFwcGxpY2F0aW9uIGxheWVyICAqLworLyogIGludGVyZmFjZSBvZiBhbGwgTGlmZVZpYmVzIG1vZHVsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIExWTV9UWVBFU19ICisjZGVmaW5lIExWTV9UWVBFU19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExWTV9OVUxMICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgLyogTlVMTCBwb2ludGVyICovCisKKyNkZWZpbmUgTFZNX1RSVUUgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAvKiBCb29sZWFucyAqLworI2RlZmluZSBMVk1fRkFMU0UgICAgICAgICAgICAgICAwCisKKyNkZWZpbmUgTFZNX01BWElOVF84ICAgICAgICAgICAgMTI3ICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIHBvc2l0aXZlIGludGVnZXIgc2l6ZSAqLworI2RlZmluZSBMVk1fTUFYSU5UXzE2ICAgICAgICAgICAzMjc2NworI2RlZmluZSBMVk1fTUFYSU5UXzMyICAgICAgICAgICAyMTQ3NDgzNjQ3CisjZGVmaW5lIExWTV9NQVhFTlVNICAgICAgICAgICAgIDIxNDc0ODM2NDcKKworI2RlZmluZSBMVk1fTU9EVUxFSURfTUFTSyAgICAgICAweEZGMDAgICAgICAgICAgICAgIC8qIE1hc2sgdG8gZXh0cmFjdCB0aGUgY2FsbGluZyBtb2R1bGUgSUQgZnJvbSBjYWxsYmFja0lkICovCisjZGVmaW5lIExWTV9FVkVOVElEX01BU0sgICAgICAgIDB4MDBGRiAgICAgICAgICAgICAgLyogTWFzayB0byBleHRyYWN0IHRoZSBjYWxsYmFjayBldmVudCBmcm9tIGNhbGxiYWNrSWQgKi8KKworLyogTWVtb3J5IHRhYmxlKi8KKyNkZWZpbmUgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQSAgICAgIDAgICAvKiBPZmZzZXQgdG8gdGhlIGluc3RhbmNlIG1lbW9yeSByZWdpb24gKi8KKyNkZWZpbmUgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQSAgICAgIDEgICAvKiBPZmZzZXQgdG8gdGhlIHBlcnNpc3RlbnQgZGF0YSBtZW1vcnkgcmVnaW9uICovCisjZGVmaW5lIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUYgICAgICAyICAgLyogT2Zmc2V0IHRvIHRoZSBwZXJzaXN0ZW50IGNvZWZmaWNpZW50IG1lbW9yeSByZWdpb24gKi8KKyNkZWZpbmUgTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVCAgICAgICAgICAgIDMgICAvKiBPZmZzZXQgdG8gdGVtcG9yYXJ5IG1lbW9yeSByZWdpb24gKi8KKworI2RlZmluZSBMVk1fTlJfTUVNT1JZX1JFR0lPTlMgICAgICAgICAgICAgICAgICAgNCAgIC8qIE51bWJlciBvZiBtZW1vcnkgcmVnaW9ucyAqLworCisvKiBNZW1vcnkgcGFydGl0aW9uIHR5cGUgKi8KKyNkZWZpbmUgTFZNX01FTV9QQVJUSVRJT04wICAgICAgMCAgICAgICAgICAgICAgICAgICAvKiAxc3QgbWVtb3J5IHBhcnRpdGlvbiAqLworI2RlZmluZSBMVk1fTUVNX1BBUlRJVElPTjEgICAgICAxICAgICAgICAgICAgICAgICAgIC8qIDJuZCBtZW1vcnkgcGFydGl0aW9uICovCisjZGVmaW5lIExWTV9NRU1fUEFSVElUSU9OMiAgICAgIDIgICAgICAgICAgICAgICAgICAgLyogM3JkIG1lbW9yeSBwYXJ0aXRpb24gKi8KKyNkZWZpbmUgTFZNX01FTV9QQVJUSVRJT04zICAgICAgMyAgICAgICAgICAgICAgICAgICAvKiA0dGggbWVtb3J5IHBhcnRpdGlvbiAqLworCisvKiBVc2UgdHlwZSAqLworI2RlZmluZSBMVk1fTUVNX1BFUlNJU1RFTlQgICAgICAwICAgICAgICAgICAgICAgICAgIC8qIFBlcnNpc3RlbnQgbWVtb3J5IHR5cGUgKi8KKyNkZWZpbmUgTFZNX01FTV9TQ1JBVENIICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiBTY3JhdGNoICBtZW1vcnkgdHlwZSAqLworCisvKiBBY2Nlc3MgdHlwZSAqLworI2RlZmluZSBMVk1fTUVNX0lOVEVSTkFMICAgICAgICAwICAgICAgICAgICAgICAgICAgIC8qIEludGVybmFsIChmYXN0KSBhY2Nlc3MgbWVtb3J5ICovCisjZGVmaW5lIExWTV9NRU1fRVhURVJOQUwgICAgICAgIDggICAgICAgICAgICAgICAgICAgLyogRXh0ZXJuYWwgKHNsb3cpIGFjY2VzcyBtZW1vcnkgKi8KKworLyogUGxhdGZvcm0gc3BlY2lmaWMgKi8KKyNkZWZpbmUgTFZNX1BFUlNJU1RFTlQgICAgICAgICAgTFZNX01FTV9QQVJUSVRJT04wK0xWTV9NRU1fUEVSU0lTVEVOVCtMVk1fTUVNX0lOVEVSTkFMCisjZGVmaW5lIExWTV9QRVJTSVNURU5UX0RBVEEgICAgIExWTV9NRU1fUEFSVElUSU9OMStMVk1fTUVNX1BFUlNJU1RFTlQrTFZNX01FTV9JTlRFUk5BTAorI2RlZmluZSBMVk1fUEVSU0lTVEVOVF9DT0VGICAgICBMVk1fTUVNX1BBUlRJVElPTjIrTFZNX01FTV9QRVJTSVNURU5UK0xWTV9NRU1fSU5URVJOQUwKKyNkZWZpbmUgTFZNX1NDUkFUQ0ggICAgICAgICAgICAgTFZNX01FTV9QQVJUSVRJT04zK0xWTV9NRU1fU0NSQVRDSCtMVk1fTUVNX0lOVEVSTkFMCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQmFzaWMgdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgICAgIGNoYXIgICAgICAgICAgICAgICAgTFZNX0NIQVI7ICAgICAgICAgICAvKiBBU0NJSSBjaGFyYWN0ZXIgKi8KKwordHlwZWRlZiAgICAgY2hhciAgICAgICAgICAgICAgICBMVk1fSU5UODsgICAgICAgICAgIC8qIFNpZ25lZCA4LWJpdCB3b3JkICovCit0eXBlZGVmICAgICB1bnNpZ25lZCBjaGFyICAgICAgIExWTV9VSU5UODsgICAgICAgICAgLyogVW5zaWduZWQgOC1iaXQgd29yZCAqLworCit0eXBlZGVmICAgICBzaG9ydCAgICAgICAgICAgICAgIExWTV9JTlQxNjsgICAgICAgICAgLyogU2lnbmVkIDE2LWJpdCB3b3JkICovCit0eXBlZGVmICAgICB1bnNpZ25lZCBzaG9ydCAgICAgIExWTV9VSU5UMTY7ICAgICAgICAgLyogVW5zaWduZWQgMTYtYml0IHdvcmQgKi8KKwordHlwZWRlZiAgICAgbG9uZyAgICAgICAgICAgICAgICBMVk1fSU5UMzI7ICAgICAgICAgIC8qIFNpZ25lZCAzMi1iaXQgd29yZCAqLwordHlwZWRlZiAgICAgdW5zaWduZWQgbG9uZyAgICAgICBMVk1fVUlOVDMyOyAgICAgICAgIC8qIFVuc2lnbmVkIDMyLWJpdCB3b3JkICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTdGFuZGFyZCBFbnVtZXJhdGVkIHR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogT3BlcmF0aW5nIG1vZGUgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWTV9NT0RFX09GRiAgICA9IDAsCisgICAgTFZNX01PREVfT04gICAgID0gMSwKKyAgICBMVk1fTU9ERV9EVU1NWSAgPSBMVk1fTUFYRU5VTQorfSBMVk1fTW9kZV9lbjsKKworCisvKiBGb3JtYXQgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWTV9TVEVSRU8gICAgICAgICAgPSAwLAorICAgIExWTV9NT05PSU5TVEVSRU8gICAgPSAxLAorICAgIExWTV9NT05PICAgICAgICAgICAgPSAyLAorICAgIExWTV9TT1VSQ0VfRFVNTVkgICAgPSBMVk1fTUFYRU5VTQorfSBMVk1fRm9ybWF0X2VuOworCisKKy8qIExWTSBzYW1wbGluZyByYXRlcyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZNX0ZTXzgwMDAgID0gMCwKKyAgICBMVk1fRlNfMTEwMjUgPSAxLAorICAgIExWTV9GU18xMjAwMCA9IDIsCisgICAgTFZNX0ZTXzE2MDAwID0gMywKKyAgICBMVk1fRlNfMjIwNTAgPSA0LAorICAgIExWTV9GU18yNDAwMCA9IDUsCisgICAgTFZNX0ZTXzMyMDAwID0gNiwKKyAgICBMVk1fRlNfNDQxMDAgPSA3LAorICAgIExWTV9GU180ODAwMCA9IDgsCisgICAgTFZNX0ZTX0lOVkFMSUQgPSBMVk1fTUFYRU5VTS0xLAorICAgIExWTV9GU19EVU1NWSA9IExWTV9NQVhFTlVNCit9IExWTV9Gc19lbjsKKworCisvKiBNZW1vcnkgVHlwZXMgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWTV9QRVJTSVNURU5UX1NMT1dfREFUQSAgICA9IExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEEsCisgICAgTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBICAgID0gTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQSwKKyAgICBMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUYgICAgPSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGLAorICAgIExWTV9URU1QT1JBUllfRkFTVCAgICAgICAgICA9IExWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QsCisgICAgTFZNX01FTU9SWVRZUEVfRFVNTVkgICAgICAgID0gTFZNX01BWEVOVU0KK30gTFZNX01lbW9yeVR5cGVzX2VuOworCisKKy8qIE1lbW9yeSByZWdpb24gZGVmaW5pdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgU2l6ZTsgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHNpemUgaW4gYnl0ZXMgKi8KKyAgICBMVk1fTWVtb3J5VHlwZXNfZW4gICAgICAgICAgVHlwZTsgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHR5cGUgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnBCYXNlQWRkcmVzczsgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgcmVnaW9uIGJhc2UgYWRkcmVzcyAqLworfSBMVk1fTWVtb3J5UmVnaW9uX3N0OworCisKKy8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX01lbW9yeVJlZ2lvbl9zdCAgICAgICAgIFJlZ2lvbltMVk1fTlJfTUVNT1JZX1JFR0lPTlNdOyAgLyogT25lIGRlZmluaXRpb24gZm9yIGVhY2ggcmVnaW9uICovCit9IExWTV9NZW1vcnlUYWJsZV9zdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFN0YW5kYXJkIEZ1bmN0aW9uIFByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBMVk1fSU5UMzIgKCpMVk1fQ2FsbGJhY2spKHZvaWQgICAgICAgICAgKnBDYWxsYmFja0RhdGEsICAgICAvKiBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayBkYXRhIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBHZW5lcmFsUHVycG9zZSwgICAvKiBHZW5lcmFsIHB1cnBvc2UgcG9pbnRlciAoZS5nLiB0byBhIGRhdGEgc3RydWN0dXJlIG5lZWRlZCBpbiB0aGUgY2FsbGJhY2spICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBHZW5lcmFsUHVycG9zZSApOyAgIC8qIEdlbmVyYWwgcHVycG9zZSB2YXJpYWJsZSAoZS5nLiB0byBiZSB1c2VkIGFzIGNhbGxiYWNrIElEKSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRW5kIG9mIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAgLyogTFZNX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL01peGVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9NaXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ3NDE5ODAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9NaXhlci5oCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDAwICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19NSVhFUl9IX18KKyNkZWZpbmUgX19NSVhFUl9IX18KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5TVEFOQ0UgTUVNT1JZIFRZUEUgREVGSU5JVElPTgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDMyICAgQWxwaGE7ICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIGNvbnN0YW50LiBTZXQgYnkgY2FsbGluZyBhcHBsaWNhdGlvbi4gIENhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lICovCisgICAgTFZNX0lOVDMyICAgVGFyZ2V0OyAgICAgICAgICAgICAgICAgICAvKiBUYXJnZXQgdmFsdWUuICBTZXQgYnkgY2FsbGluZyBhcHBsaWNhdGlvbi4gIENhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lICovCisgICAgTFZNX0lOVDMyICAgQ3VycmVudDsgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IHZhbHVlLiAgU2V0IGJ5IHRoZSBtaXhlciBmdW5jdGlvbi4gKi8KKyAgICBMVk1fSU5UMTYgICBDYWxsYmFja1NldDsgICAgICAgICAgICAgIC8qIEJvb2xlYW4uICBTaG91bGQgYmUgc2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24gZWFjaCB0aW1lIHRoZSB0YXJnZXQgdmFsdWUgaXMgdXBkYXRlZCAqLworICAgIExWTV9JTlQxNiAgIENhbGxiYWNrUGFyYW07ICAgICAgICAgICAgLyogUGFyYW1ldGVyIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBjYWxiYWNrIGZ1bmN0aW9uICovCisgICAgdm9pZCAgICAgICAgKnBDYWxsYmFja0hhbmRsZTsgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKyAgICB2b2lkICAgICAgICAqcEdlbmVyYWxQdXJwb3NlOyAgICAgICAgIC8qIFBvaW50ZXIgZm9yIGdlbmVyYWwgcHVycG9zZSB1c2FnZSAqLworICAgIExWTV9DYWxsYmFjayBwQ2FsbEJhY2s7ICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK30gTWl4XzFTdF9DbGxfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSU5UMzIgICBBbHBoYTE7CisgICAgTFZNX0lOVDMyICAgVGFyZ2V0MTsKKyAgICBMVk1fSU5UMzIgICBDdXJyZW50MTsKKyAgICBMVk1fSU5UMTYgICBDYWxsYmFja1NldDE7CisgICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tQYXJhbTE7CisgICAgdm9pZCAgICAgICAgKnBDYWxsYmFja0hhbmRsZTE7CisgICAgdm9pZCAgICAgICAgKnBHZW5lcmFsUHVycG9zZTE7CisgICAgTFZNX0NhbGxiYWNrIHBDYWxsQmFjazE7CisKKyAgICBMVk1fSU5UMzIgICBBbHBoYTI7ICAgICAgICAgICAgICAgICAgIC8qIFdhcm5pbmcgdGhlIGFkZHJlc3Mgb2YgdGhpcyBsb2NhdGlvbiBpcyBwYXNzZWQgYXMgYSBwb2ludGVyIHRvIE1peF8xU3RfQ2xsX3QgaW4gc29tZSBmdW5jdGlvbnMgKi8KKyAgICBMVk1fSU5UMzIgICBUYXJnZXQyOworICAgIExWTV9JTlQzMiAgIEN1cnJlbnQyOworICAgIExWTV9JTlQxNiAgIENhbGxiYWNrU2V0MjsKKyAgICBMVk1fSU5UMTYgICBDYWxsYmFja1BhcmFtMjsKKyAgICB2b2lkICAgICAgICAqcENhbGxiYWNrSGFuZGxlMjsKKyAgICB2b2lkICAgICAgICAqcEdlbmVyYWxQdXJwb3NlMjsKKyAgICBMVk1fQ2FsbGJhY2sgcENhbGxCYWNrMjsKKworfSBNaXhfMlN0X0NsbF90OworCisKKy8qKiogR2VuZXJhbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fVUlOVDMyIExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZNX1VJTlQzMiAgIHRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgTnVtQ2hhbm5lbHMpOworCisKK3ZvaWQgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICAgTWl4XzFTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKwordm9pZCBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCAgICBNaXhfMlN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKwordm9pZCBNaXhJblNvZnRfRDMyQzMxX1NBVCggICAgICBNaXhfMVN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gUFJPVE9UWVBFUyAoTE9XIExFVkVMIFNVQkZVTkNUSU9OUykKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICBNaXhfMVN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworCit2b2lkIENvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVCggICBNaXhfMlN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisKK3ZvaWQgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVCggICAgIE1peF8xU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYgLyogX19NSVhFUl9IX18gKi8KKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvU2NhbGFyQXJpdGhtZXRpYy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvU2NhbGFyQXJpdGhtZXRpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM2NmUyMDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9TY2FsYXJBcml0aG1ldGljLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fU0NBTEFSQVJJVEhNRVRJQ19IX18KKyNkZWZpbmUgX19TQ0FMQVJBUklUSE1FVElDX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisvKiAgSW5jbHVkZSBmaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisKKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworLyogIEV4dGVybiBmdW5jdGlvbiBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKworLyogQWJzb2x1dGUgdmFsdWUgaW5jbHVkaW5nIHRoZSBjb3JuZXIgY2FzZSBmb3IgdGhlIGV4dHJlbWUgbmVnYXRpdmUgdmFsdWUgKi8KK0xWTV9JTlQzMiAgIEFic18zMihMVk1fSU5UMzIgICAgIGlucHV0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBOYW1lICAgICAgICA6IGRCX3RvX0xpbjMyKCkKKyAqICBJbnB1dCAgICAgICA6IFNpZ25lZCAxNi1iaXQgaW50ZWdlcgorICogICAgICAgICAgICAgICAgICBNU0IgKDE2KSA9IHNpZ24gYml0CisgKiAgICAgICAgICAgICAgICAgICgxNS0+MDUpID0gaW50ZWdlciBwYXJ0CisgKiAgICAgICAgICAgICAgICAgICgwNC0+MDEpID0gZGVjaW1hbCBwYXJ0CisgKiAgT3V0cHV0ICAgICAgOiBTaWduZWQgMzItYml0IGludGVnZXIKKyAqICAgICAgICAgICAgICAgICAgTVNCICgzMikgPSBzaWduIGJpdAorICogICAgICAgICAgICAgICAgICAoMzEtPjE2KSA9IGludGVnZXIgcGFydAorICogICAgICAgICAgICAgICAgICAoMTUtPjAxKSA9IGRlY2ltYWwgcGFydAorICogIFJldHVybnMgICAgIDogTGluIHZhbHVlIGZvcm1hdCAxLjE2LjE1CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX0lOVDMyIGRCX3RvX0xpbjMyKExWTV9JTlQxNiAgZGJfZml4KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAvKiBfX1NDQUxBUkFSSVRITUVUSUNfSF9fICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI5MGE5OTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmgKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogYmVxMDc3MTYgJAorICAgICAkUmV2aXNpb246IDg1MyAkCisgICAgICREYXRlOiAyMDEwLTA2LTE2IDE1OjEwOjI4ICswMjAwIChXZWQsIDE2IEp1biAyMDEwKSAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9WRUNUT1JfQVJJVEhNRVRJQ19IXworI2RlZmluZSBfVkVDVE9SX0FSSVRITUVUSUNfSF8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBWQVJJT1VTIEZVTkNUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTG9hZENvbnN0XzE2KCAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisKK3ZvaWQgTG9hZENvbnN0XzMyKCAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisKK3ZvaWQgQ29weV8xNiggICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBub3RlOiBJbiBNdWx0M3NfMTZ4MTYoKSBzYXR1cmF0aW9uIG9mIHJlc3VsdCBpcyBub3QgdGFrZW4gY2FyZSB3aGVuICAgICAgICAgICAqCisgKiAgICAgICBvdmVyZmxvdyBvY2N1cnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICBGb3IgZXhhbXBsZSB3aGVuICpzcmMgPSAweDgwMDAsIHZhbCA9ICoweDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICBUaGUgZnVuY3Rpb24gZ2l2ZXMgdGhlIG91dHB1dCBhcyAweDgwMDAgaW5zdGVhZCBvZiAweDdmZmYgICAgICAgICAgICAgICAqCisgKiAgICAgICBUaGlzIGlzIHRoZSBvbmx5IGNhc2Ugd2hpY2ggd2lsbCBnaXZlIHdyb25nIHJlc3VsdC4gICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWZlciB0byBWZWN0b3JfQXJpdGhtZXRpYy5kb2MgaW4gL2RvYyBmb2xkZXIgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBNdWx0M3NfMTZ4MTYoICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG5vdGU6IEluIE11bHQzc18zMngxNigpIHNhdHVyYXRpb24gb2YgcmVzdWx0IGlzIG5vdCB0YWtlbiBjYXJlIHdoZW4gICAgICAgICAgICoKKyAqICAgICAgIG92ZXJmbG93IG9jY3Vycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgIEZvciBleGFtcGxlIHdoZW4gKnNyYyA9IDB4ODAwMDAwMCwgdmFsID0gKjB4ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgIFRoZSBmdW5jdGlvbiBnaXZlcyB0aGUgb3V0cHV0IGFzIDB4ODAwMDAwMCBpbnN0ZWFkIG9mIDB4N2ZmZmZmZmYgICAgICAgICoKKyAqICAgICAgIFRoaXMgaXMgdGhlIG9ubHkgZXh0cmVtZSBjb25kaXRpb24gd2hpY2ggaXMgZ2l2aW5nIHVuZXhwZWN0ZWQgcmVzdWx0ICAgICoKKyAqICAgICAgIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZmVyIHRvIFZlY3Rvcl9Bcml0aG1ldGljLmRvYyBpbiAvZG9jIGZvbGRlciAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIE11bHQzc18zMngxNiggICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworCit2b2lkIERlbGF5TWl4XzE2eDE2KCAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpwT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworCit2b2lkIERlbGF5V3JpdGVfMzIoICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsICAgICAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRlbGF5LCAgICAgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgc2l6ZSwgICAgICAgICAgICAgICAvKiBEZWxheSBzaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICpwT2Zmc2V0LCAgICAgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisKK3ZvaWQgQWRkMl9TYXRfMTZ4MTYoICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworCit2b2lkIEFkZDJfU2F0XzMyeDMyKCAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworCit2b2lkIE1hYzNzX1NhdF8xNngxNiggICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKwordm9pZCBNYWMzc19TYXRfMzJ4MTYoICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKwordm9pZCBEZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMiggICAgTFZNX0lOVDMyICAqZGVsYXksICAgICAgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgc2l6ZSwgICAgICAgICAgICAgICAgLyogRGVsYXkgc2l6ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IGNvZWZmLCAgICAgICAgICAgICAgICAvKiBBbGwgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgRGVsYXlPZmZzZXQsICAgICAgICAgLyogU2ltcGxlIGRlbGF5IG9mZnNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAqcEFsbFBhc3NPZmZzZXQsICAgICAvKiBBbGwgcGFzcyBmaWx0ZXIgZGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsICAgICAgICAgICAgICAgIC8qIFNvdXJjZS9kZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIFNISUZUIEZVTkNUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgU2hpZnRfU2F0X3YxNnh2MTYgKCAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworCit2b2lkIFNoaWZ0X1NhdF92MzJ4djMyICggICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBBVURJTyBGT1JNQVQgQ09OVkVSU0lPTiBGVU5DVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIE1vbm9UbzJJXzE2KCAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworCit2b2lkIE1vbm9UbzJJXzMyKCAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisKK3ZvaWQgRnJvbTJpVG9Nb25vXzMyKCAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKwordm9pZCBNU1RvMmlfU2F0XzE2eDE2KCAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmNNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworCit2b2lkIEZyb20yaVRvTVNfMTZ4MTYoICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0TSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0UywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisKK3ZvaWQgRnJvbTJpVG9Nb25vXzE2KCAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisKK3ZvaWQgSm9pblRvMmlfMzJ4MzIoICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgKnNyY0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmNSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBEQVRBIFRZUEUgQ09OVkVSU0lPTiBGVU5DVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEludDE2TFNoaWZ0VG9JbnQzMl8xNngzMihjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNoaWZ0ICk7CisKK3ZvaWQgSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNihjb25zdCAgTFZNX0lOVDMyICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBzaGlmdCApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYgIC8qIF9WRUNUT1JfQVJJVEhNRVRJQ19IXyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDBlMGRiZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDcwICQKKyAgICAgJERhdGU6IDIwMTAtMDctMDIgMTE6MjI6MTggKzAyMDAgKEZyaSwgMDIgSnVsIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJBR0MuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIERlZmluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBWT0xfVENfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEgICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIERFQ0FZX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwICAgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQXBwbHkgQUdDIGFuZCBtaXggc2lnbmFscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFN0U3JjICAgLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICBfX19fX18gICAgICAgX3xfICAgICAgICBfX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgfCAgICAgIHwgICAgIHwgICB8ICAgICAgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9ub1NyYyAtLT58IEFHQyAgfC0tLS0+fCArIHwtLS0tLT58IFZvbHVtZSB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLT4gICAgKi8KKy8qICAgICAgICAgICAgIHwgR2FpbiB8ICAgICB8X19ffCAgICAgIHwgR2FpbiAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAqLworLyogICAgICAgICAgICAgfF9fX19fX3wgICAgICAgICAgICAgICAgfF9fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAvfFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fX19fXyAgICAgX19fX19fX18gICAgfCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgIHwgICAgICAgIHwgICB8ICAgICAgICAqLworLyogICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCBBR0MgR2FpbiB8PC0tfCBQZWFrICAgfDwtLXwgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVwZGF0ZSAgIHwgICB8IERldGVjdCB8ICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX19fX19ffCAgIHxfX19fX19fX3wgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFN0ZXJlb0luICAgICAgICAgICAgICAgU3RlcmVvIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTW9ub0luICAgICAgICAgICAgICAgICBNb25vIGJhbmQgcGFzcyBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBTdGVyZW9PdXQgICAgICAgICAgICAgIFN0ZXJlbyBkZXN0aW5hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfdCAgKnBJbnN0YW5jZSwgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgICAgICAgICpwU3RTcmMsICAgICAgICAvKiBTdGVyZW8gc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgICAqcE1vbm9TcmMsICAgICAgLyogTW9ubyBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICpwRHN0LCAgICAgICAgICAvKiBTdGVyZW8gZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLworeworCisgICAgLyoKKyAgICAgKiBHZW5lcmFsIHZhcmlhYmxlcworICAgICAqLworICAgIExWTV9VSU5UMTYgICAgICBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZSBpbmRleCAqLworICAgIExWTV9JTlQzMiAgICAgICBMZWZ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgc2FtcGxlICovCisgICAgTFZNX0lOVDMyICAgICAgIFJpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmlnaHQgc2FtcGxlICovCisgICAgTFZNX0lOVDMyICAgICAgIE1vbm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9ubyBzYW1wbGUgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgQWJzUGVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBYnNvbHV0ZSBwZWFrIHNpZ25hbCAqLworICAgIExWTV9JTlQzMiAgICAgICBIaWdoV29yZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggd29yZCBpbiBpbnRlcm1lZGlhdGUgY2FsY3VsYXRpb25zICovCisgICAgTFZNX0lOVDMyICAgICAgIExvd1dvcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHdvcmQgaW4gaW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucyAqLworICAgIExWTV9JTlQxNiAgICAgICBBR0NfTXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IEFHQyBnYWluICovCisgICAgTFZNX0lOVDE2ICAgICAgIFZvbF9NdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvcnQgdm9sdW1lICovCisKKworICAgIC8qCisgICAgICogSW5zdGFuY2UgY29udHJvbCB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBMVk1fSU5UMzIgICAgICBBR0NfR2FpbiAgICAgID0gcEluc3RhbmNlLT5BR0NfR2FpbjsgICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KKyAgICBMVk1fSU5UMzIgICAgICBBR0NfTWF4R2FpbiAgID0gcEluc3RhbmNlLT5BR0NfTWF4R2FpbjsgICAgICAvKiBHZXQgbWF4aW11bSBBR0MgZ2FpbiAqLworICAgIExWTV9JTlQxNiAgICAgIEFHQ19HYWluU2hpZnQgPSBwSW5zdGFuY2UtPkFHQ19HYWluU2hpZnQ7ICAgIC8qIEdldCB0aGUgQUdDIHNoaWZ0ICovCisgICAgTFZNX0lOVDE2ICAgICAgQUdDX0F0dGFjayAgICA9IHBJbnN0YW5jZS0+QUdDX0F0dGFjazsgICAgICAgLyogQXR0YWNrIHNjYWxlciAqLworICAgIExWTV9JTlQxNiAgICAgIEFHQ19EZWNheSAgICAgPSBwSW5zdGFuY2UtPkFHQ19EZWNheTsgICAgICAgIC8qIERlY2F5IHNjYWxlciAqLworICAgIExWTV9JTlQzMiAgICAgIEFHQ19UYXJnZXQgICAgPSBwSW5zdGFuY2UtPkFHQ19UYXJnZXQ7ICAgICAgIC8qIEdldCB0aGUgdGFyZ2V0IGxldmVsICovCisgICAgTFZNX0lOVDMyICAgICAgVm9sX0N1cnJlbnQgICA9IHBJbnN0YW5jZS0+Vm9sdW1lOyAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0lOVDMyICAgICAgVm9sX1RhcmdldCAgICA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAgICAgICAgICAgLyogVGFyZ2V0IHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0lOVDE2ICAgICAgVm9sX1NoaWZ0ICAgICA9IHBJbnN0YW5jZS0+Vm9sdW1lU2hpZnQ7ICAgICAgLyogVm9sdW1lIHNoaWZ0IHNjYWxpbmcgKi8KKyAgICBMVk1fSU5UMTYgICAgICBWb2xfVEMgICAgICAgID0gcEluc3RhbmNlLT5Wb2x1bWVUQzsgICAgICAgICAvKiBUaW1lIGNvbnN0YW50ICovCisKKworICAgIC8qCisgICAgICogUHJvY2VzcyBvbiBhIHNhbXBsZSBieSBzYW1wbGUgYmFzaXMKKyAgICAgKi8KKyAgICBmb3IgKGk9MDtpPE51bVNhbXBsZXM7aSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgZWFjaCBzYW1wbGUgKi8KKyAgICB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBzaG9ydCBzY2FsZXJzCisgICAgICAgICAqLworICAgICAgICBBR0NfTXVsdCAgICA9IChMVk1fSU5UMTYpKEFHQ19HYWluID4+IDE2KTsgICAgICAgICAgICAgIC8qIEdldCB0aGUgc2hvcnQgQUdDIGdhaW4gKi8KKyAgICAgICAgVm9sX011bHQgICAgPSAoTFZNX0lOVDE2KShWb2xfQ3VycmVudCA+PiAxNik7ICAgICAgICAgICAvKiBHZXQgdGhlIHNob3J0IHZvbHVtZSBnYWluICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIGlucHV0IHNhbXBsZXMKKyAgICAgICAgICovCisgICAgICAgIExlZnQgID0gKnBTdFNyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBsZWZ0IHNhbXBsZSAqLworICAgICAgICBSaWdodCA9ICpwU3RTcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgcmlnaHQgc2FtcGxlICovCisgICAgICAgIE1vbm8gID0gKnBNb25vU3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBtb25vIHNhbXBsZSAqLworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgdGhlIEFHQyBnYWluIHRvIHRoZSBtb25vIGlucHV0IGFuZCBtaXggd2l0aCB0aGUgc3RlcmVvIHNpZ25hbAorICAgICAgICAgKi8KKyAgICAgICAgSGlnaFdvcmQgPSAoQUdDX011bHQgKiAoTW9ubyA+PiAxNikpOyAgICAgICAgICAgICAgICAgICAvKiBzaWduZWQgbG9uZyAoTW9ubykgYnkgdW5zaWduZWQgc2hvcnQgKEFHQ19NdWx0KSBtdWx0aXBseSAqLworICAgICAgICBMb3dXb3JkID0gKEFHQ19NdWx0ICogKE1vbm8gJiAweGZmZmYpKTsKKyAgICAgICAgTW9ubyA9IChIaWdoV29yZCArIChMb3dXb3JkID4+IDE2KSkgPDwgKEFHQ19HYWluU2hpZnQpOworICAgICAgICBMZWZ0ICArPSBNb25vOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1peCBpbiB0aGUgbW9ubyBzaWduYWwgKi8KKyAgICAgICAgUmlnaHQgKz0gTW9ubzsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSB2b2x1bWUgYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICAgICAqLworICAgICAgICBIaWdoV29yZCA9IChWb2xfTXVsdCAqIChMZWZ0ID4+IDE2KSk7ICAgICAgICAgICAgICAgICAgIC8qIHNpZ25lZCBsb25nIChMZWZ0KSBieSB1bnNpZ25lZCBzaG9ydCAoVm9sX011bHQpIG11bHRpcGx5ICovCisgICAgICAgIExvd1dvcmQgPSAoVm9sX011bHQgKiAoTGVmdCAmIDB4ZmZmZikpOworICAgICAgICBMZWZ0ID0gKEhpZ2hXb3JkICsgKExvd1dvcmQgPj4gMTYpKSA8PCAoVm9sX1NoaWZ0KTsKKyAgICAgICAgSGlnaFdvcmQgPSAoVm9sX011bHQgKiAoUmlnaHQgPj4gMTYpKTsgICAgICAgICAgICAgICAgICAvKiBzaWduZWQgbG9uZyAoUmlnaHQpIGJ5IHVuc2lnbmVkIHNob3J0IChWb2xfTXVsdCkgbXVsdGlwbHkgKi8KKyAgICAgICAgTG93V29yZCA9IChWb2xfTXVsdCAqIChSaWdodCAmIDB4ZmZmZikpOworICAgICAgICBSaWdodCA9IChIaWdoV29yZCArIChMb3dXb3JkID4+IDE2KSkgPDwgKFZvbF9TaGlmdCk7CisgICAgICAgICpwRHN0KysgPSBMZWZ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSB0aGUgcmVzdWx0cyAqLworICAgICAgICAqcERzdCsrID0gUmlnaHQ7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgdGhlIEFHQyBnYWluCisgICAgICAgICAqLworICAgICAgICBBYnNQZWFrID0gKEFic18zMihMZWZ0KT5BYnNfMzIoUmlnaHQpKSA/IEFic18zMihMZWZ0KSA6IEFic18zMihSaWdodCk7ICAvKiBHZXQgdGhlIGFic29sdXRlIHBlYWsgKi8KKyAgICAgICAgaWYgKEFic1BlYWsgPiBBR0NfVGFyZ2V0KQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIHNpZ25hbCBpcyB0b28gbGFyZ2Ugc28gZGVjcmVhc2UgdGhlIGdhaW4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgSGlnaFdvcmQgPSAoQUdDX0F0dGFjayAqIChBR0NfR2FpbiA+PiAxNikpOyAgICAgICAgIC8qIHNpZ25lZCBsb25nIChBR0NfR2FpbikgYnkgdW5zaWduZWQgc2hvcnQgKEFHQ19BdHRhY2spIG11bHRpcGx5ICovCisgICAgICAgICAgICBMb3dXb3JkID0gKEFHQ19BdHRhY2sgKiAoQUdDX0dhaW4gJiAweGZmZmYpKTsKKyAgICAgICAgICAgIEFHQ19HYWluID0gKEhpZ2hXb3JkICsgKExvd1dvcmQgPj4gMTYpKSA8PCAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIHNtYWxsIHNvIGluY3JlYXNlIHRoZSBnYWluCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChBR0NfR2FpbiA+IEFHQ19NYXhHYWluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFHQ19HYWluIC09IChBR0NfRGVjYXkgPDwgREVDQVlfU0hJRlQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFHQ19HYWluICs9IChBR0NfRGVjYXkgPDwgREVDQVlfU0hJRlQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBnYWluCisgICAgICAgICAqLworICAgICAgICBWb2xfQ3VycmVudCArPSBWb2xfVEMgKiAoKFZvbF9UYXJnZXQgLSBWb2xfQ3VycmVudCkgPj4gVk9MX1RDX1NISUZUKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcEluc3RhbmNlLT5Wb2x1bWUgPSBWb2xfQ3VycmVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCisgICAgcEluc3RhbmNlLT5BR0NfR2FpbiA9IEFHQ19HYWluOworCisgICAgcmV0dXJuOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BYnNfMzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Fic18zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzNTMxNWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BYnNfMzIuYwpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDAgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworLyogIEluY2x1ZGUgZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKworI2luY2x1ZGUgICAgIlNjYWxhckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBOYW1lICAgICAgICA6IEFic18zMigpCisgKiAgSW5wdXQgICAgICAgOiBTaWduZWQgMzItYml0IGludGVnZXIKKyAqICBPdXRwdXQgICAgICA6CisgKiAgUmV0dXJucyAgICAgOiBBYnNvbHV0ZSB2YWx1ZQorICogIERlc2NyaXB0aW9uIDogQWJzb2x1dGUgdmFsdWUgd2l0aCBtYXhpbXVtIG5lZ2F0aXZlIHZhbHVlIGNvcm5lciBjYXNlCisgKiAgUmVtYXJrcyAgICAgOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWTV9JTlQzMiAgICBBYnNfMzIoTFZNX0lOVDMyICAgIGlucHV0KQoreworICAgIGlmKGlucHV0IDwgIDApCisgICAgeworICAgICAgICBpZiAoaW5wdXQgPT0gKExWTV9JTlQzMikoMHg4MDAwMDAwMFUpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgY29ybmVyIGNhc2UsIHNvIHNldCB0byB0aGUgbWF4aW11bSBwb3NpdGl2ZSB2YWx1ZSAqLworICAgICAgICAgICAgaW5wdXQ9KExWTV9JTlQzMikgMHg3ZmZmZmZmZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE5lZ2F0aXZlIGlucHV0LCBzbyBpbnZlcnQgKi8KKyAgICAgICAgICAgIGlucHV0ID0gKExWTV9JTlQzMikoLWlucHV0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW5wdXQ7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzE2eDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BZGQyX1NhdF8xNngxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE4MDI2YzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BZGQyX1NhdF8xNngxNi5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogYmVxMDc3MTYgJAorICAgICAkUmV2aXNpb246IDEwMDAgJAorICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gQUREMl9TQVRfMTZYMTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEFkZDJfU2F0XzE2eDE2KCBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuICkKK3sKKyAgICBMVk1fSU5UMzIgVGVtcDsKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBUZW1wID0gKChMVk1fSU5UMzIpICpzcmMpICsgKChMVk1fSU5UMzIpICpkc3QpOworICAgICAgICBzcmMrKzsKKworICAgICAgICBpZiAoVGVtcCA+IDB4MDAwMDdGRkYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAweDdGRkY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gLSAweDgwMDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKExWTV9JTlQxNilUZW1wOworICAgICAgICB9CisgICAgICAgIGRzdCsrOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTZmYzdlNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBBREQyX1NBVF8zMlgzMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQWRkMl9TYXRfMzJ4MzIoIGNvbnN0IExWTV9JTlQzMiAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCit7CisgICAgTFZNX0lOVDMyIGEsYixjOworICAgIExWTV9JTlQxNiBpaTsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIGE9KnNyYzsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgYj0qZHN0OworICAgICAgICBjPWErYjsKKyAgICAgICAgaWYgKCgoKGMgXiBhKSAmIChjIF4gYikpID4+IDMxKSE9MCkgICAgIC8qIG92ZXJmbG93IC8gdW5kZXJmbG93ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGE8MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjPTB4ODAwMDAwMDBsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGM9MHg3RkZGRkZGRmw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAqZHN0ID0gYzsKKyAgICAgICAgZHN0Kys7CisgICAgfQorICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NmQ4ZTQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYwpAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEwLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgLUIyLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE0IGZvcm1hdAorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEJQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorCisKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiB5bkw7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPSAoQTAgKFExNCkgKiAoeChuKUwgKFEwKSAtIHgobi0yKUwgKFEwKSApICkgIGluIFExNAorICAgICAgICAgICAgeW5MPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSogKCgqcERhdGFJbiktcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdKTsKKworICAgICAgICAgICAgLy8geW5MKz0gKCgtQjIgKFExNCkgKiB5KG4tMilMIChRMCkgKSApIGluIFExNAorICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvLyB5bkwrPSAoKC1CMSAoUTMwKSAqIHkobi0xKUwgKFEwKSApICkgaW4gUTE0CisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIHluTD0oTFZNX0lOVDE2KSh5bkw+PjE0KTsgLy8geW5MIGluIFEwCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM109cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOyAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdPXluTDsgLy8gVXBkYXRlIHkobi0xKUwgaW4gUTAKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMIGluIFEwCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0Kys9KExWTV9JTlQxNil5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCisKKyAgICAgICAgfQorCisgICAgfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTMzOGViMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLworLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCisvKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCisvKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9KExWTV9JTlQzMiAqKSBwVGFwczsKKworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdPXBDb2VmLT5BMDsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXT1wQ29lZi0+QjI7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl09cENvZWYtPkIxOworICB9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRW5kIE9mIEZpbGU6IEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYTBkN2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9CUF8xSV9EMTZGMTZDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisjZGVmaW5lIF9CUF8xSV9EMTZGMTZDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCisvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXworeworICBMVk1fSU5UMzIgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgTFZNX0lOVDMyICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGU7CisKK3R5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CisKKyNlbmRpZiAvKl9CUF8xSV9EMTZGMTZDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY1MmQzZGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFByb2plY3Q6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDAgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEFTU1VNUFRJT05TOgorIENPRUZTLQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTAsCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyAtQjIsCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMzAgZm9ybWF0CisKKyBERUxBWVMtCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTE2IGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBCUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKworCisgICAgeworICAgICAgICBMVk1fSU5UMzIgeW5MLHRlbXBsOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluTD0gKEEwIChRMzApICogKHgobilMIChRMCkgLSB4KG4tMilMIChRMCkgKSA+PjE0KSAgaW4gUTE2CisgICAgICAgICAgICB0ZW1wbD0gKExWTV9JTlQzMikgKnBEYXRhSW4tcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1swXSx0ZW1wbCx5bkwsMTQpCisKKyAgICAgICAgICAgIC8vIHluTCs9ICgoLUIyIChRMzApICogeShuLTIpTCAoUTE2KSApID4+MzApIGluIFExNgorICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSxwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10sdGVtcGwsMzApCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvLyB5bkwrPSAoKC1CMSAoUTMwKSAqIHkobi0xKUwgKFExNikgKSA+PjMwKSBpbiBRMTYKKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0scEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdLHRlbXBsLDMwKQorICAgICAgICAgICAgeW5MKz10ZW1wbDsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT15bkw7IC8vIFVwZGF0ZSB5KG4tMSlMIGluIFExNgorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdPSgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwgaW4gUTAKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKz0oTFZNX0lOVDE2KSh5bkw+PjE2KTsgLy8gV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAKKworICAgICAgICB9CisKKyAgICB9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNTYwMDg1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDAgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJhbmQgcGFzcyBmaWx0ZXIgKEJJUVVBRCkgICAgICAgICAgICAgICAqLworLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCisvKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCisvKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICBUaGUgY29lZmZpY2llbnRzIGFyZSBtb2RpZmllZCBpbiB0aGUgaW5pdCgpIGZ1bmN0aW9uIHN1Y2ggdGhhdCBsb3dlciAgICAgICAgICAgICAgICovCisvKiAgICAgICAgaGFsZiB3b3JkIGlzIHJpZ2h0IHNoaWZ0ZWQgYnkgb25lIGFuZCBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgbG93ZXIgICAgICAgICAgICAqLworLyogICAgICAgIHdvcmQgaXMgbWFkZSB0byBiZSB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBSZWFzb246IEZvciBNSVBTIGVmZmNpZW5jeSx3ZSBhcmUgdXNpbmcgRFNQIDMyKjE2IG11bHRpcGxpY2F0aW9uICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgaW5zdHJ1Y3Rpb24uIEJ1dCB3ZSBoYXZlIDMyKjMyIG11bHRpcGxpY2F0aW9uLiBUaGlzIGNhbiBiZSByZWFsaXplZCBieSB0d28gMzIqMTYgICAgKi8KKy8qICAgICAgIG11bHRpcGxpY2F0aW9uLiBCdXQgMTZ0aCBiaXQgaW4gdGhlIDMyIGJpdCB3b3JkIGlzIG5vdCBhIHNpZ24gYml0LiBTbyB0aGlzIGlzIGRvbmUgICovCisvKiAgICAgICBieSBwdXR0aW5nIDE2dGggYml0IHRvIHplcm8gYW5kIGxvc3Npbmcgb25lIGJpdCBwcmVjaXNpb24gYnkgZGl2aXNpb24gb2YgbG93ZXIgICAgICAqLworLyogICAgICAgaGFsZiB3b3JkIGJ5IDIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzMyX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKyAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgID0oTFZNX0lOVDMyICopIHBUYXBzOworCisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSAgcENvZWYtPkEwOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gIHBDb2VmLT5CMjsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9ICBwQ29lZi0+QjE7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRW5kIE9mIEZpbGU6IEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43Njc3N2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9CUF8xSV9EMTZGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisjZGVmaW5lIF9CUF8xSV9EMTZGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCisvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXworeworICBMVk1fSU5UMzIgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgTFZNX0lOVDMyICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGU7CisKK3R5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CisKKyNlbmRpZiAvKl9CUF8xSV9EMTZGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJiMzU1NWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFByb2plY3Q6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDAgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEFTU1VNUFRJT05TOgorIENPRUZTLQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTAsCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyAtQjIsCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMzAgZm9ybWF0CisKKyBERUxBWVMtCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fSU5UMzIgeW5MLHRlbXBsOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKworICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9IChBMCAoUTMwKSAqICh4KG4pTCAoUTApIC0geChuLTIpTCAoUTApICkgPj4zMCkgIGluIFEwCisgICAgICAgICAgICB0ZW1wbD0oKnBEYXRhSW4pLXBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0sdGVtcGwseW5MLDMwKQorCisgICAgICAgICAgICAvLyB5bkwrPSAoKC1CMiAoUTMwKSAqIHkobi0yKUwgKFEwKSApID4+MzApIGluIFEwCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzFdLHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSx0ZW1wbCwzMCkKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICgoLUIxIChRMzApICogeShuLTEpTCAoUTApICkgPj4zMCkgaW4gUTAKKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0scEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdLHRlbXBsLDMwKQorICAgICAgICAgICAgeW5MKz10ZW1wbDsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT15bkw7IC8vIFVwZGF0ZSB5KG4tMSlMIGluIFEwCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF09KCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTCBpbiBRMAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrPXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAKKworICAgICAgICB9CisKKyAgICB9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mM2Y0NTcxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLworLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCisvKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCisvKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPShMVk1fSU5UMzIgKikgcFRhcHM7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXT1wQ29lZi0+QTA7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXT1wQ29lZi0+QjI7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT1wQ29lZi0+QjE7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRW5kIE9mIEZpbGU6IEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ODg0NTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfUHJpdmF0ZS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9CUF8xSV9EMzJGMzJDTExfVFJDX1dSQV8wMl9QUklWQVRFX0hfCisjZGVmaW5lIF9CUF8xSV9EMzJGMzJDTExfVFJDX1dSQV8wMl9QUklWQVRFX0hfCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCisvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXworeworICBMVk1fSU5UMzIgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgTFZNX0lOVDMyICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGU7CisKK3R5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CisKKyNlbmRpZiAvKl9CUF8xSV9EMzJGMzJDTExfVFJDX1dSQV8wMl9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAwZTNiNTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFByb2plY3Q6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDAgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExNSBmb3JtYXQKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBCUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiAgeW5MOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluTD1BMiAoUTE1KSAqIHgobi0yKUwgKFEwKSBpbiBRMTUKKyAgICAgICAgICAgIHluTD0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0qIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMSAoUTE1KSAqIHgobi0xKUwgKFEwKSBpbiBRMTUKKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTAgKFExNSkgKiB4KG4pTCAoUTApIGluIFExNQorICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0qICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICAoLUIyIChRMTUpICogeShuLTIpTCAoUTApICkgaW4gUTE1CisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8vIHluTCs9ICgtQjEgKFExNSkgKiB5KG4tMSlMIChRMCkgKSBpbiBRMTUKKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzRdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworICAgICAgICAgICAgeW5MPXluTD4+MTU7IC8vIHluTCBpbiBRMCBmb3JtYXQKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07IC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl09eW5MOyAvLyBVcGRhdGUgeShuLTEpTCBpbiBRMAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdPSgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwgaW4gUTAKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKz0oTFZNX0lOVDE2KXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAKKworCisgICAgICAgIH0KKworICAgIH0KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNmZWRjNDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDAgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhlc2UgZnVuY3Rpb25zIGluaXRpYWxpemVzIGEgQklRVUFEIGZpbHRlciBkZWZpbmVkIGFzIGEgY2FzY2FkZSBvZiAgICovCisvKiAgIGJpcXVhZHJhdGljIEZpbHRlciBTZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBJbnN0YW5jZSAgICAtIG91dHB1dCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgU3RhdGUgVmFyaWFibGUgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgVGhpcyBzdGF0ZSBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIGFueSBzdWJzZXF1ZW50ICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIGNhbGwgdG8gIkJpcXVhZCIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBUYXBzICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgdGFwcyBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwQ29lZiAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHN0cnVjdHVyZSAgICAgICAgICAgKi8KKy8qICAgTiAgICAgICAgICAgICAtIE0gY29lZmZpY2llbnQgZmFjdG9yIG9mIFFNLk4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICBMVk1fSU5UMTYgdGVtcDsKKyAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9KExWTV9JTlQzMiAqKSBwVGFwcyAgICAgICAgICAgIDsKKworICB0ZW1wPXBDb2VmLT5BMjsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXT10ZW1wOworICB0ZW1wPXBDb2VmLT5BMTsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXT10ZW1wOworICB0ZW1wPXBDb2VmLT5BMDsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT10ZW1wOworICB0ZW1wPXBDb2VmLT5CMjsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXT10ZW1wOworICB0ZW1wPXBDb2VmLT5CMTsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XT10ZW1wOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEVuZCBPZiBGaWxlOiBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMThkYWNkMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBfQlFfMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXworI2RlZmluZSBfQlFfMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLworLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KK3sKKyAgTFZNX0lOVDMyICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgIExWTV9JTlQxNiAgICAgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOworCisjZW5kaWYgLypfQlFfMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2RmZjFkOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEFTU1VNUFRJT05TOgorIENPRUZTLQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTIsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTEKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIEEwLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIC1CMgorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE0IGZvcm1hdAorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFExNiBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fSU5UMzIgIHluTCx0ZW1wbDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTIgKFExNCkgKiB4KG4tMilMIChRMCkgaW4gUTE0CisgICAgICAgICAgICB5bkw9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzBdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTEgKFExNCkgKiB4KG4tMSlMIChRMCkgaW4gUTE0CisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvLyB5bkwrPUEwIChRMTQpICogeChuKUwgKFEwKSBpbiBRMTQKKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzJdKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvLyB5bkwrPSAoICgtQjIgKFExNCkgKiB5KG4tMilMIChRMTYpICk+PjE2KSBpbiBRMTQKKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSxwQmlxdWFkU3RhdGUtPmNvZWZzWzNdLHRlbXBsLDE2KQorICAgICAgICAgICAgeW5MKz10ZW1wbDsKKworICAgICAgICAgICAgLy8geW5MKz0gKCAoLUIxIChRMTQpICogeShuLTEpTCAoUTE2KSApPj4xNikgaW4gUTE0CisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0scEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSx0ZW1wbCwxNikKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07ICAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT15bkw8PDI7ICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpTCBpbiBRMTYKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpTCBpbiBRMAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrPShMVk1fSU5UMTYpKHluTD4+MTQpOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAorCisgICAgICAgIH0KKyAgICB9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYzg4ODQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9CUV8xSV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisjZGVmaW5lIF9CUV8xSV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCisvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXworeworICBMVk1fSU5UMzIgKiAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICBMVk1fSU5UMTYgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOworCisjZW5kaWYgLypfQlFfMUlfRDE2RjMyQ1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTIwYzk2OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYwpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLworLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCisvKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCisvKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgTFZNX0lOVDE2IHRlbXA7CisgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKyAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPShMVk1fSU5UMzIgKikgcFRhcHMgICAgICAgICAgICA7CisKKyAgdGVtcD1wQ29lZi0+QTI7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QTE7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QTA7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QjI7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM109dGVtcDsKKyAgdGVtcD1wQ29lZi0+QjE7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF09dGVtcDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMyNjdhOTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExNCBmb3JtYXQKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gaXMgeShuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBCUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiAgeW5MLHluUjsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUEyIChRMTQpICogeChuLTIpTCAoUTApIGluIFExNAorICAgICAgICAgICAgeW5MPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvLyB5bkwrPUExIChRMTQpICogeChuLTEpTCAoUTApIGluIFExNAorICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0qIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMCAoUTE0KSAqIHgobilMIChRMCkgaW4gUTE0CisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLy8geW5MKz0gKCAtQjIgKFExNCkgKiB5KG4tMilMIChRMCkgKSBpbiBRMTQKKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzNdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XTsKKworICAgICAgICAgICAgLy8geW5MKz0oIC1CMSAoUTE0KSAqIHkobi0xKUwgKFEwKSApIGluIFExNAorICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOworCisgICAgICAgICAgICB5bkw9eW5MPj4xNDsgLy8geW5MIGluIFEwIGZvcm1hdAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5blI9QTIgKFExNCkgKiB4KG4tMilSIChRMCkgaW4gUTE0CisgICAgICAgICAgICB5blI9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzBdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKworICAgICAgICAgICAgLy8geW5SKz1BMSAoUTE0KSAqIHgobi0xKVIgKFEwKSBpbiBRMTQKKyAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLy8geW5SKz1BMCAoUTE0KSAqIHgobilSIChRMCkgaW4gUTE0CisgICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSooKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLy8geW5SKz0gKCAtQjIgKFExNCkgKiB5KG4tMilSIChRMCkgKSBpbiBRMTQKKyAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzNdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XTsKKworICAgICAgICAgICAgLy8geW5SKz0oIC1CMSAoUTE0KSAqIHkobi0xKVIgKFEwKSApIGluIFExNAorICAgICAgICAgICAgeW5SKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOworCisgICAgICAgICAgICB5blI9eW5SPj4xNDsgLy8geW5MIGluIFEwIGZvcm1hdAorICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgIC8vIHkobi0yKVI9eShuLTEpUgorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgIC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgIC8vIHgobi0yKVI9eChuLTEpUgorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdPXluUjsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlSIGluIFEwCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF09eW5MOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKUwgaW4gUTAKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpTCBpbiBRMAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdPSgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlSIGluIFEwCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0Kys9KExWTV9JTlQxNil5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCisgICAgICAgICAgICAqcERhdGFPdXQrKz0oTFZNX0lOVDE2KXluUjsgLy8gV3JpdGUgUmlnaHQgb3VwdXQgaW4gUTAKKworCisgICAgICAgIH0KKworICAgIH0KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGVkMmJiMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFByb2plY3Q6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDAgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEFTU1VNUFRJT05TOgorIENPRUZTLQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTIsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTEKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIEEwLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIC1CMgorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE1IGZvcm1hdAorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMSlSIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB4KG4tMilSIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSBpcyB5KG4tMSlSIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFEwIGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEJRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyICB5bkwseW5SOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluTD1BMiAoUTE1KSAqIHgobi0yKUwgKFEwKSBpbiBRMTUKKyAgICAgICAgICAgIHluTD0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0qIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMSAoUTE1KSAqIHgobi0xKUwgKFEwKSBpbiBRMTUKKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTAgKFExNSkgKiB4KG4pTCAoUTApIGluIFExNQorICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0qICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICggLUIyIChRMTUpICogeShuLTIpTCAoUTApICkgaW4gUTE1CisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl07CisKKyAgICAgICAgICAgIC8vIHluTCs9KCAtQjEgKFExNSkgKiB5KG4tMSlMIChRMCkgKSBpbiBRMTUKKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzRdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsKKworICAgICAgICAgICAgeW5MPXluTD4+MTU7IC8vIHluTCBpbiBRMCBmb3JtYXQKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5SPUEyIChRMTUpICogeChuLTIpUiAoUTApIGluIFExNQorICAgICAgICAgICAgeW5SPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8vIHluUis9QTEgKFExNSkgKiB4KG4tMSlSIChRMCkgaW4gUTE1CisgICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8vIHluUis9QTAgKFExNSkgKiB4KG4pUiAoUTApIGluIFExNQorICAgICAgICAgICAgeW5SKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0qKCoocERhdGFJbisxKSk7CisKKyAgICAgICAgICAgIC8vIHluUis9ICggLUIyIChRMTUpICogeShuLTIpUiAoUTApICkgaW4gUTE1CisgICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbN107CisKKyAgICAgICAgICAgIC8vIHluUis9KCAtQjEgKFExNSkgKiB5KG4tMSlSIChRMCkgKSBpbiBRMTUKKyAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzRdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsKKworICAgICAgICAgICAgeW5SPXluUj4+MTU7IC8vIHluTCBpbiBRMCBmb3JtYXQKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07ICAvLyB5KG4tMilSPXkobi0xKVIKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvLyB4KG4tMilSPXgobi0xKVIKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XT15blI7ICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpUiBpbiBRMAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdPXluTDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlMIGluIFEwCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF09KCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKUwgaW4gUTAKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT0oKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpUiBpbiBRMAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrPShMVk1fSU5UMTYpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAorICAgICAgICAgICAgKnBEYXRhT3V0Kys9KExWTV9JTlQxNil5blI7IC8vIFdyaXRlIFJpZ2h0IG91cHV0IGluIFEwCisKKyAgICAgICAgfQorCisgICAgfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjBjZDFiOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLworLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCisvKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCisvKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgTFZNX0lOVDE2IHRlbXA7CisgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKyAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPShMVk1fSU5UMzIgKikgcFRhcHMgICAgICAgICAgICA7CisKKyAgdGVtcD1wQ29lZi0+QTI7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QTE7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QTA7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QjI7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM109dGVtcDsKKyAgdGVtcD1wQ29lZi0+QjE7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF09dGVtcDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJjYjAwOTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfQlFfMklfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXworI2RlZmluZSBfQlFfMklfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCisvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXworeworICBMVk1fSU5UMzIgKiAgIHBEZWxheXM7ICAgICAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICovCisgIExWTV9JTlQxNiAgICAgY29lZnNbNV07ICAgICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOworCisjZW5kaWYgLyogX0JRXzJJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFlNzQzZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExMyBmb3JtYXQKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMTYgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTE2IGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMTYgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyICB5bkwseW5SLHRlbXBsOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluTD1BMiAoUTEzKSAqIHgobi0yKUwgKFEwKSBpbiBRMTMqLworICAgICAgICAgICAgeW5MPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvKiB5bkwrPUExIChRMTMpICogeChuLTEpTCAoUTApIGluIFExMyovCisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvKiB5bkwrPUEwIChRMTMpICogeChuKUwgKFEwKSBpbiBRMTMqLworICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0qICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICggKC1CMiAoUTEzKSAqIHkobi0yKUwgKFExNikgKT4+MTYpIGluIFExMyAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10sdGVtcGwsMTYpCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvKiB5bkwrPSggKC1CMSAoUTEzKSAqIHkobi0xKUwgKFExNikgKT4+MTYpIGluIFExMyAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0sdGVtcGwsMTYpCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5blI9QTIgKFExMykgKiB4KG4tMilSIChRMCkgaW4gUTEzKi8KKyAgICAgICAgICAgIHluUj0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvKiB5blIrPUExIChRMTMpICogeChuLTEpUiAoUTApIGluIFExMyovCisgICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8qIHluUis9QTAgKFExMykgKiB4KG4pUiAoUTApIGluIFExMyovCisgICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSooKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLyogeW5SKz0gKCAoLUIyIChRMTMpICogeShuLTIpUiAoUTE2KSApPj4xNikgaW4gUTEzKi8KKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSxwQmlxdWFkU3RhdGUtPmNvZWZzWzNdLHRlbXBsLDE2KQorICAgICAgICAgICAgeW5SKz10ZW1wbDsKKworICAgICAgICAgICAgLyogeW5SKz0oICgtQjEgKFExMykgKiB5KG4tMSlSIChRMTYpICk+PjE2KSBpbiBRMTMgKi8KKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSxwQmlxdWFkU3RhdGUtPmNvZWZzWzRdLHRlbXBsLDE2KQorICAgICAgICAgICAgeW5SKz10ZW1wbDsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgIC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAgLyogeShuLTIpTD15KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvKiB4KG4tMilSPXgobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV09eW5SPDwzOyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKVIgaW4gUTE2Ki8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XT15bkw8PDM7ICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpTCBpbiBRMTYqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdPSgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlMIGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT0oKnBEYXRhSW4pOyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeChuLTEpUiBpbiBRMCovCisgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0PShMVk1fSU5UMTYpKHluTD4+MTMpOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMCovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgKnBEYXRhT3V0PShMVk1fSU5UMTYpKHluUj4+MTMpOyAvKiBXcml0ZSBSaWdodCBvdXB1dCBpbiBRMCovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICB9CisKKyAgICB9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEwY2EyY2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMTQgZm9ybWF0CisKKyBERUxBWVMtCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0xKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHgobi0yKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdIGlzIHkobi0xKUwgaW4gUTE2IGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSBpcyB5KG4tMSlSIGluIFExNiBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTE2IGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiAgeW5MLHluUix0ZW1wbDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5MPUEyIChRMTQpICogeChuLTIpTCAoUTApIGluIFExNCovCisgICAgICAgICAgICB5bkw9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzBdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8qIHluTCs9QTEgKFExNCkgKiB4KG4tMSlMIChRMCkgaW4gUTE0Ki8KKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8qIHluTCs9QTAgKFExNCkgKiB4KG4pTCAoUTApIGluIFExNCovCisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLyogeW5MKz0gKCAoLUIyIChRMTQpICogeShuLTIpTCAoUTE2KSApPj4xNikgaW4gUTE0ICovCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0scEJpcXVhZFN0YXRlLT5jb2Vmc1szXSx0ZW1wbCwxNikKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluTCs9KCAoLUIxIChRMTQpICogeShuLTEpTCAoUTE2KSApPj4xNikgaW4gUTE0ICovCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0scEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSx0ZW1wbCwxNikKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluUj1BMiAoUTE0KSAqIHgobi0yKVIgKFEwKSBpbiBRMTQqLworICAgICAgICAgICAgeW5SPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8qIHluUis9QTEgKFExNCkgKiB4KG4tMSlSIChRMCkgaW4gUTE0Ki8KKyAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLyogeW5SKz1BMCAoUTE0KSAqIHgobilSIChRMCkgaW4gUTE0Ki8KKyAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzJdKigqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvKiB5blIrPSAoICgtQjIgKFExNCkgKiB5KG4tMilSIChRMTYpICk+PjE2KSBpbiBRMTQqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddLHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10sdGVtcGwsMTYpCisgICAgICAgICAgICB5blIrPXRlbXBsOworCisgICAgICAgICAgICAvKiB5blIrPSggKC1CMSAoUTE0KSAqIHkobi0xKVIgKFExNikgKT4+MTYpIGluIFExNCAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0sdGVtcGwsMTYpCisgICAgICAgICAgICB5blIrPXRlbXBsOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN109cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLyogeShuLTIpUj15KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgIC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLyogeChuLTIpTD14KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XT15blI8PDI7ICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpUiBpbiBRMTYqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdPXluTDw8MjsgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB5KG4tMSlMIGluIFExNiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF09KCpwRGF0YUluKTsgICAgICAgICAgICAgICAgLyogVXBkYXRlIHgobi0xKUwgaW4gUTAqLworICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdPSgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlSIGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQ9KExWTV9JTlQxNikoeW5MPj4xNCk7IC8qIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgICAgICAqcERhdGFPdXQ9KExWTV9JTlQxNikoeW5SPj4xNCk7IC8qIFdyaXRlIFJpZ2h0IG91cHV0IGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgIH0KKworICAgIH0KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjFhYjgxNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFByb2plY3Q6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDAgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExNSBmb3JtYXQKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMTYgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTE2IGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMTYgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyICB5bkwseW5SLHRlbXBsOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluTD1BMiAoUTE1KSAqIHgobi0yKUwgKFEwKSBpbiBRMTUqLworICAgICAgICAgICAgeW5MPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvKiB5bkwrPUExIChRMTUpICogeChuLTEpTCAoUTApIGluIFExNSovCisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvKiB5bkwrPUEwIChRMTUpICogeChuKUwgKFEwKSBpbiBRMTUqLworICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0qICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICggKC1CMiAoUTE1KSAqIHkobi0yKUwgKFExNikgKT4+MTYpIGluIFExNSAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10sdGVtcGwsMTYpCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvKiB5bkwrPSggKC1CMSAoUTE1KSAqIHkobi0xKUwgKFExNikgKT4+MTYpIGluIFExNSAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0sdGVtcGwsMTYpCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5blI9QTIgKFExNSkgKiB4KG4tMilSIChRMCkgaW4gUTE1Ki8KKyAgICAgICAgICAgIHluUj0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvKiB5blIrPUExIChRMTUpICogeChuLTEpUiAoUTApIGluIFExNSovCisgICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8qIHluUis9QTAgKFExNSkgKiB4KG4pUiAoUTApIGluIFExNSovCisgICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSooKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLyogeW5SKz0gKCAoLUIyIChRMTUpICogeShuLTIpUiAoUTE2KSApPj4xNikgaW4gUTE1ICovCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10scEJpcXVhZFN0YXRlLT5jb2Vmc1szXSx0ZW1wbCwxNikKKyAgICAgICAgICAgIHluUis9dGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluUis9KCAoLUIxIChRMTUpICogeShuLTEpUiAoUTE2KSApPj4xNikgaW4gUTE1ICovCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0scEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSx0ZW1wbCwxNikKKyAgICAgICAgICAgIHluUis9dGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgLyogeChuLTIpUj14KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV09eW5SPDwxOyAvKiBVcGRhdGUgeShuLTEpUiBpbiBRMTYqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdPXluTDw8MTsgLyogVXBkYXRlIHkobi0xKUwgaW4gUTE2Ki8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpTCBpbiBRMCovCisgICAgICAgICAgICBwRGF0YUluKys7CisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV09KCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKVIgaW4gUTAqLworICAgICAgICAgICAgcERhdGFJbisrOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dD0oTFZNX0lOVDE2KSh5bkw+PjE1KTsgLyogV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgICpwRGF0YU91dD0oTFZNX0lOVDE2KSh5blI+PjE1KTsgLyogV3JpdGUgUmlnaHQgb3VwdXQgaW4gUTAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgfQorCisgICAgfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2NiYjU4YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9CUV8ySV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisjZGVmaW5lIF9CUV8ySV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFByb2plY3Q6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDAgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KKy8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiAgICAgICAgKi8KK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCit7CisgIExWTV9JTlQzMiAqICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZnNbNV07ICAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9TdGF0ZTsKKwordHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKKworI2VuZGlmIC8qIF9CUV8ySV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGM2YjMzZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYwpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLworLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCisvKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCisvKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgTFZNX0lOVDE2IHRlbXA7CisgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKyAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPShMVk1fSU5UMzIgKikgcFRhcHMgICAgICAgICAgICA7CisKKyAgdGVtcD1wQ29lZi0+QTI7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QTE7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QTA7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QjI7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM109dGVtcDsKKyAgdGVtcD1wQ29lZi0+QjE7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF09dGVtcDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUxMjc4Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMzAgZm9ybWF0CisKKyBERUxBWVMtCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0xKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHgobi0yKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorCisKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiB5bkwseW5SLHRlbXBsLHRlbXBkOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluTD0gKCBBMiAoUTMwKSAqIHgobi0yKUwgKFEwKSApID4+MzAgaW4gUTAqLworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1swXSxwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0seW5MLDMwKQorCisgICAgICAgICAgICAvKiB5bkwrPSAoIEExIChRMzApICogeChuLTEpTCAoUTApICkgPj4gMzAgaW4gUTAqLworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSxwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0sdGVtcGwsMzApCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvKiB5bkwrPSAoIEEwIChRMzApICogeChuKUwgKFEwKSApID4+IDMwIGluIFEwKi8KKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0sKnBEYXRhSW4sdGVtcGwsMzApCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAgLyogeW5MKz0gKC1CMiAoUTMwKSAqIHkobi0yKUwgKFEwKSApID4+IDMwIGluIFEwKi8KKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10scEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdLHRlbXBsLDMwKQorICAgICAgICAgICAgeW5MKz10ZW1wbDsKKworICAgICAgICAgICAgLyogeW5MKz0gKC1CMSAoUTMwKSAqIHkobi0xKUwgKFEwKSApID4+IDMwIGluIFEwICovCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzRdLHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSx0ZW1wbCwzMCkKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluUj0gKCBBMiAoUTMwKSAqIHgobi0yKVIgKFEwKSApID4+IDMwIGluIFEwKi8KKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0scEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdLHluUiwzMCkKKworICAgICAgICAgICAgLyogeW5SKz0gKCBBMSAoUTMwKSAqIHgobi0xKVIgKFEwKSApID4+IDMwICBpbiBRMCovCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzFdLHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSx0ZW1wbCwzMCkKKyAgICAgICAgICAgIHluUis9dGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluUis9ICggQTAgKFEzMCkgKiB4KG4pUiAoUTApICkgPj4gMzAgaW4gUTAqLworICAgICAgICAgICAgdGVtcGQ9KihwRGF0YUluKzEpOworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1syXSx0ZW1wZCx0ZW1wbCwzMCkKKyAgICAgICAgICAgIHluUis9dGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluUis9ICgtQjIgKFEzMCkgKiB5KG4tMilSIChRMCkgKSA+PiAzMCBpbiBRMCovCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzNdLHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSx0ZW1wbCwzMCkKKyAgICAgICAgICAgIHluUis9dGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluUis9ICgtQjEgKFEzMCkgKiB5KG4tMSlSIChRMCkgKSA+PiAzMCBpbiBRMCAqLworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSxwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0sdGVtcGwsMzApCisgICAgICAgICAgICB5blIrPXRlbXBsOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN109cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAvKiB5KG4tMilSPXkobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgLyogeShuLTIpTD15KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvKiB4KG4tMilMPXgobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdPShMVk1fSU5UMzIpeW5SOyAvKiBVcGRhdGUgeShuLTEpUiBpbiBRMCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF09KExWTV9JTlQzMil5bkw7IC8qIFVwZGF0ZSB5KG4tMSlMIGluIFEwKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpTCBpbiBRMCovCisgICAgICAgICAgICBwRGF0YUluKys7CisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV09KCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKVIgaW4gUTAqLworICAgICAgICAgICAgcERhdGFJbisrOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dD0oTFZNX0lOVDMyKXluTDsgLyogV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgICpwRGF0YU91dD0oTFZNX0lOVDMyKXluUjsgLyogV3JpdGUgUmlnaHQgb3VwdXQgaW4gUTAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKworCisgICAgICAgIH0KKworICAgIH0KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdjNDYwZDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDAgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhlc2UgZnVuY3Rpb25zIGluaXRpYWxpemVzIGEgQklRVUFEIGZpbHRlciBkZWZpbmVkIGFzIGEgY2FzY2FkZSBvZiAgICovCisvKiAgIGJpcXVhZHJhdGljIEZpbHRlciBTZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBJbnN0YW5jZSAgICAtIG91dHB1dCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgU3RhdGUgVmFyaWFibGUgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgVGhpcyBzdGF0ZSBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIGFueSBzdWJzZXF1ZW50ICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIGNhbGwgdG8gIkJpcXVhZCIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBUYXBzICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgdGFwcyBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwQ29lZiAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHN0cnVjdHVyZSAgICAgICAgICAgKi8KKy8qICAgTiAgICAgICAgICAgICAtIE0gY29lZmZpY2llbnQgZmFjdG9yIG9mIFFNLk4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MzMl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICBMVk1fSU5UMzIgdGVtcDsKKyAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9KExWTV9JTlQzMiAqKSBwVGFwcyAgICAgICAgICAgIDsKKworICB0ZW1wPXBDb2VmLT5BMjsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXT10ZW1wOworICB0ZW1wPXBDb2VmLT5BMTsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXT10ZW1wOworICB0ZW1wPXBDb2VmLT5BMDsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT10ZW1wOworICB0ZW1wPXBDb2VmLT5CMjsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXT10ZW1wOworICB0ZW1wPXBDb2VmLT5CMTsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XT10ZW1wOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEVuZCBPZiBGaWxlOiBCUV8ySV9EMzJGMzJDMzJfVFJDX1dSQV8wMV9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmI0ZjJkZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9CUV8ySV9EMzJGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisjZGVmaW5lIF9CUV8ySV9EMzJGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLworLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KK3sKKyAgTFZNX0lOVDMyICogICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGU7CisKK3R5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CisKKyNlbmRpZiAvKiBfQlFfMklfRDMyRjMyQ0xMX1RSQ19XUkFfMDFfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db21wTGltX3ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvbXBMaW1fcHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA3YTg4MzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db21wTGltX3ByaXZhdGUuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDAwICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0NPTVBfTElNX1BSSVZBVEVfCisjZGVmaW5lIF9DT01QX0xJTV9QUklWQVRFXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJDb21wTGltLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBERUZJTklUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRlNfNDhLICAgICAgNDgwMDAKKworI2RlZmluZSBJTlRFR0VSXzE2ICAweEZGRkYgLyogICA2NTUzNSovCisjZGVmaW5lIElOVEVHRVJfMTUgIDB4N0ZGRiAvKiAgIDMyNzY3Ki8KKworI2RlZmluZSBHQUlOXzZEQiAgICAxCisjZGVmaW5lIEdBSU5fMTJEQiAgIDIKKyNkZWZpbmUgR0FJTl8xOERCICAgMworI2RlZmluZSBHQUlOXzI0REIgICA0CisKKyNlbmRpZiAvKiAjaWZuZGVmIF9DT01QX0xJTV9QUklWQVRFXyAqLworCisvKioqIEVuZCBvZiBmaWxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZlZTFmZjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkCisgICAgICRSZXZpc2lvbjogMTAwMCAkCisgICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBDT1BZXzE2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBDb3B5XzE2KCBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCit7CisgICAgTFZNX0lOVDE2IGlpOworCisgICAgaWYgKHNyYyA+IGRzdCkKKyAgICB7CisgICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICAgICAgIGRzdCsrOworICAgICAgICAgICAgc3JjKys7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3JjICs9IG4gLSAxOworICAgICAgICBkc3QgKz0gbiAtIDE7CisgICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICAgICAgIGRzdC0tOworICAgICAgICAgICAgc3JjLS07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZGFjMjRmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmMKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIENPUkVfTUlYSEFSRF8yU1RfRDMyQzMxX1NBVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKCAgIE1peF8yU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQoreworICAgIExWTV9JTlQzMiAgVGVtcDEsVGVtcDIsVGVtcDM7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9JTlQxNiBDdXJyZW50MVNob3J0OworICAgIExWTV9JTlQxNiBDdXJyZW50MlNob3J0OworCisgICAgQ3VycmVudDFTaG9ydCA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+Q3VycmVudDEgPj4gMTYpOworICAgIEN1cnJlbnQyU2hvcnQgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPkN1cnJlbnQyID4+IDE2KTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgVGVtcDE9KnNyYzErKzsKKyAgICAgICAgTVVMMzJ4MTZJTlRPMzIoVGVtcDEsQ3VycmVudDFTaG9ydCxUZW1wMywxNSkKKyAgICAgICAgVGVtcDI9KnNyYzIrKzsKKyAgICAgICAgTVVMMzJ4MTZJTlRPMzIoVGVtcDIsQ3VycmVudDJTaG9ydCxUZW1wMSwxNSkKKyAgICAgICAgVGVtcDI9KFRlbXAxPj4xKSsoVGVtcDM+PjEpOworICAgICAgICBpZiAoVGVtcDIgPiAweDNGRkZGRkZGKQorICAgICAgICAgICAgVGVtcDIgPSAweDdGRkZGRkZGOworICAgICAgICBlbHNlIGlmIChUZW1wMiA8IC0gMHg0MDAwMDAwMCkKKyAgICAgICAgICAgIFRlbXAyID0gIDB4ODAwMDAwMDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFRlbXAyPShUZW1wMjw8MSk7CisgICAgICAgICAgICAqZHN0KysgPSBUZW1wMjsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEluU29mdF9EMzJDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEluU29mdF9EMzJDMzFfU0FULmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDU1N2Y2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYwpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIENPUkVfTUlYU09GVF8xU1RfRDMyQzMxX1dSQQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVCggICAgIE1peF8xU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBMVk1fSU5UMzIgICAgVGVtcDEsVGVtcDIsVGVtcDM7CisgICAgTFZNX0lOVDE2ICAgICBPdXRMb29wOworICAgIExWTV9JTlQxNiAgICAgSW5Mb29wOworICAgIExWTV9JTlQzMiAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhOworICAgIExWTV9JTlQzMiAgICBDdXJyZW50VGltZXNBbHBoYTsKKyAgICBMVk1fSU5UMTYgICAgIGlpLGpqOworICAgIExWTV9JTlQxNiAgIEN1cnJlbnRTaG9ydDsKKworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CisKKyAgICBNVUwzMngzMklOVE8zMigoMHg3RkZGRkZGRi1wSW5zdGFuY2UtPkFscGhhKSxwSW5zdGFuY2UtPlRhcmdldCxUYXJnZXRUaW1lc09uZU1pbkFscGhhLDMxKTsgLyogUTMxICogUTAgaW4gUTAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPj0gcEluc3RhbmNlLT5DdXJyZW50KXsKKyAgICAgICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGEgKz0yOyAvKiBDZWlsKi8KKyAgICB9CisKKyAgICBpZiAoT3V0TG9vcCl7CisgICAgICAgIE1VTDMyeDMySU5UTzMyKHBJbnN0YW5jZS0+Q3VycmVudCxwSW5zdGFuY2UtPkFscGhhLEN1cnJlbnRUaW1lc0FscGhhLDMxKTsgICAgICAgLyogUTAgKiBRMzEgaW4gUTAgKi8KKyAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOyAgICAgICAgICAgICAgICAvKiBRMCArIFEwIGludG8gUTAqLworICAgICAgICBDdXJyZW50U2hvcnQgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPkN1cnJlbnQ+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb20gUTMxIHRvIFExNSovCisKKyAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICBUZW1wMT0qc3JjKys7CisgICAgICAgIFRlbXAyPSpkc3Q7CisgICAgICAgIE1VTDMyeDE2SU5UTzMyKFRlbXAxLEN1cnJlbnRTaG9ydCxUZW1wMywxNSkKKyAgICAgICAgVGVtcDE9KFRlbXAyPj4xKSsoVGVtcDM+PjEpOworCisgICAgICAgIGlmIChUZW1wMSA+IDB4M0ZGRkZGRkYpCisgICAgICAgICAgICBUZW1wMSA9IDB4N0ZGRkZGRkY7CisgICAgICAgIGVsc2UgaWYgKFRlbXAxIDwgLSAweDQwMDAwMDAwKQorICAgICAgICAgICAgVGVtcDEgPSAgMHg4MDAwMDAwMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgVGVtcDE9KFRlbXAxPDwxKTsKKyAgICAgICAgICAgICpkc3QrKyA9IFRlbXAxOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgIE1VTDMyeDMySU5UTzMyKHBJbnN0YW5jZS0+Q3VycmVudCxwSW5zdGFuY2UtPkFscGhhLEN1cnJlbnRUaW1lc0FscGhhLDMxKTsgICAgICAgLyogUTAgKiBRMzEgaW4gUTAgKi8KKyAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOyAgICAgICAgICAgICAgICAvKiBRMCArIFEwIGludG8gUTAqLworICAgICAgICBDdXJyZW50U2hvcnQgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPkN1cnJlbnQ+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb20gUTMxIHRvIFExNSovCisKKyAgICAgICAgZm9yIChqaiA9IDQ7IGpqIT0wIDsgamotLSl7CisgICAgICAgIFRlbXAxPSpzcmMrKzsKKyAgICAgICAgVGVtcDI9KmRzdDsKKyAgICAgICAgTVVMMzJ4MTZJTlRPMzIoVGVtcDEsQ3VycmVudFNob3J0LFRlbXAzLDE1KQorICAgICAgICBUZW1wMT0oVGVtcDI+PjEpKyhUZW1wMz4+MSk7CisKKyAgICAgICAgaWYgKFRlbXAxID4gMHgzRkZGRkZGRikKKyAgICAgICAgICAgIFRlbXAxID0gMHg3RkZGRkZGRjsKKyAgICAgICAgZWxzZSBpZiAoVGVtcDEgPCAtIDB4NDAwMDAwMDApCisgICAgICAgICAgICBUZW1wMSA9ICAweDgwMDAwMDAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBUZW1wMT0oVGVtcDE8PDEpOworICAgICAgICAgICAgKmRzdCsrID0gVGVtcDE7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdiNGU2NmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYwpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIENPUkVfTUlYU09GVF8xU1RfRDMyQzMxX1dSQQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAgIE1peF8xU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBMVk1fSU5UMzIgIFRlbXAxLFRlbXAyOworICAgIExWTV9JTlQxNiBPdXRMb29wOworICAgIExWTV9JTlQxNiBJbkxvb3A7CisgICAgTFZNX0lOVDMyICBUYXJnZXRUaW1lc09uZU1pbkFscGhhOworICAgIExWTV9JTlQzMiAgQ3VycmVudFRpbWVzQWxwaGE7CisgICAgTFZNX0lOVDE2IEN1cnJlbnRTaG9ydDsKKyAgICBMVk1fSU5UMTYgaWk7CisKKyAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShuID4+IDIpOyAvKiBQcm9jZXNzIHBlciA0IHNhbXBsZXMgKi8KKyAgICBPdXRMb29wID0gKExWTV9JTlQxNikobiAtIChJbkxvb3AgPDwgMikpOworCisgICAgTVVMMzJ4MzJJTlRPMzIoKDB4N0ZGRkZGRkYtcEluc3RhbmNlLT5BbHBoYSkscEluc3RhbmNlLT5UYXJnZXQsVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSwzMSkgLyogUTMxICogUTMxIGluIFEzMSAqLworICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA+PSBwSW5zdGFuY2UtPkN1cnJlbnQpCisgICAgeworICAgICAgICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArPTI7IC8qIENlaWwqLworICAgIH0KKworICAgIGlmIChPdXRMb29wIT0wKQorICAgIHsKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEluc3RhbmNlLT5DdXJyZW50LHBJbnN0YW5jZS0+QWxwaGEsQ3VycmVudFRpbWVzQWxwaGEsMzEpICAvKiBRMzEgKiBRMzEgaW4gUTMxICovCisgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IFRhcmdldFRpbWVzT25lTWluQWxwaGEgKyBDdXJyZW50VGltZXNBbHBoYTsgICAgICAgICAgLyogUTMxICsgUTMxIGludG8gUTMxKi8KKyAgICAgICAgQ3VycmVudFNob3J0ID0gKExWTV9JTlQxNikocEluc3RhbmNlLT5DdXJyZW50Pj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLworCisgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICBUZW1wMT0qc3JjOworICAgICAgICAgICAgc3JjKys7CisKKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKFRlbXAxLEN1cnJlbnRTaG9ydCxUZW1wMiwxNSkKKyAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKKyAgICAgICAgICAgIGRzdCsrOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIE1VTDMyeDMySU5UTzMyKHBJbnN0YW5jZS0+Q3VycmVudCxwSW5zdGFuY2UtPkFscGhhLEN1cnJlbnRUaW1lc0FscGhhLDMxKSAgLyogUTMxICogUTMxIGluIFEzMSAqLworICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBUYXJnZXRUaW1lc09uZU1pbkFscGhhICsgQ3VycmVudFRpbWVzQWxwaGE7ICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCisgICAgICAgIEN1cnJlbnRTaG9ydCA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+Q3VycmVudD4+MTYpOyAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KKyAgICAgICAgICAgIFRlbXAxPSpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIoVGVtcDEsQ3VycmVudFNob3J0LFRlbXAyLDE1KQorICAgICAgICAgICAgKmRzdCA9IFRlbXAyOworICAgICAgICAgICAgZHN0Kys7CisKKyAgICAgICAgICAgIFRlbXAxPSpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIoVGVtcDEsQ3VycmVudFNob3J0LFRlbXAyLDE1KQorICAgICAgICAgICAgKmRzdCA9IFRlbXAyOworICAgICAgICAgICAgZHN0Kys7CisKKyAgICAgICAgICAgIFRlbXAxPSpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIoVGVtcDEsQ3VycmVudFNob3J0LFRlbXAyLDE1KQorICAgICAgICAgICAgKmRzdCA9IFRlbXAyOworICAgICAgICAgICAgZHN0Kys7CisKKyAgICAgICAgICAgIFRlbXAxPSpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKFRlbXAxLEN1cnJlbnRTaG9ydCxUZW1wMiwxNSkKKyAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKKyAgICAgICAgICAgIGRzdCsrOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE4N2ZlNjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFByb2plY3Q6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDAgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJEQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCit2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fSU5UMzIgTGVmdERDLFJpZ2h0REM7CisgICAgICAgIExWTV9JTlQzMiBEaWZmOworICAgICAgICBMVk1fSU5UMzIgajsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworCisgICAgICAgIExlZnREQyAgPSAgIHBCaXF1YWRTdGF0ZS0+TGVmdERDOworICAgICAgICBSaWdodERDID0gICBwQmlxdWFkU3RhdGUtPlJpZ2h0REM7CisgICAgICAgIGZvcihqPU5yU2FtcGxlcy0xO2o+PTA7ai0tKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTdWJ0cmFjdCBEQyBhbiBzYXR1cmF0ZSAqLworICAgICAgICAgICAgRGlmZj0qKHBEYXRhSW4rKyktKExlZnREQz4+MTYpOworICAgICAgICAgICAgaWYgKERpZmYgPiAzMjc2NykgeworICAgICAgICAgICAgICAgIERpZmYgPSAzMjc2NzsgfQorICAgICAgICAgICAgZWxzZSBpZiAoRGlmZiA8IC0zMjc2OCkgeworICAgICAgICAgICAgICAgIERpZmYgPSAtMzI3Njg7IH0KKyAgICAgICAgICAgICoocERhdGFPdXQrKyk9KExWTV9JTlQxNilEaWZmOworICAgICAgICAgICAgaWYgKERpZmYgPCAwKSB7CisgICAgICAgICAgICAgICAgTGVmdERDIC09IERDX0QxNl9TVEVQOyB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBMZWZ0REMgKz0gRENfRDE2X1NURVA7IH0KKworCisgICAgICAgICAgICAvKiBTdWJ0cmFjdCBEQyBhbiBzYXR1cmF0ZSAqLworICAgICAgICAgICAgRGlmZj0qKHBEYXRhSW4rKyktKFJpZ2h0REM+PjE2KTsKKyAgICAgICAgICAgIGlmIChEaWZmID4gMzI3NjcpIHsKKyAgICAgICAgICAgICAgICBEaWZmID0gMzI3Njc7IH0KKyAgICAgICAgICAgIGVsc2UgaWYgKERpZmYgPCAtMzI3NjgpIHsKKyAgICAgICAgICAgICAgICBEaWZmID0gLTMyNzY4OyB9CisgICAgICAgICAgICAqKHBEYXRhT3V0KyspPShMVk1fSU5UMTYpRGlmZjsKKyAgICAgICAgICAgIGlmIChEaWZmIDwgMCkgeworICAgICAgICAgICAgICAgIFJpZ2h0REMgLT0gRENfRDE2X1NURVA7IH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFJpZ2h0REMgKz0gRENfRDE2X1NURVA7IH0KKworICAgICAgICB9CisgICAgICAgIHBCaXF1YWRTdGF0ZS0+TGVmdERDICAgID0gICBMZWZ0REM7CisgICAgICAgIHBCaXF1YWRTdGF0ZS0+UmlnaHREQyAgID0gICBSaWdodERDOworCisKKyAgICB9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOTI2NDFiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFByb2plY3Q6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDAgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJEQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisKK3ZvaWQgIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0luc3RhbmNlX3QgICAqcEluc3RhbmNlKQoreworICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlICA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5MZWZ0REMgICAgICAgID0gMDsKKyAgICBwQmlxdWFkU3RhdGUtPlJpZ2h0REMgICAgICAgPSAwOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjUxNGE3NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9EQ18ySV9EMTZfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisjZGVmaW5lIF9EQ18ySV9EMTZfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisKKyNkZWZpbmUgRENfRDE2X1NURVAgICAgIDB4MjAwOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KKy8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiovCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXworeworICBMVk1fSU5UMzIgIExlZnREQzsgICAgIC8qIExlZnREQyAgKi8KKyAgTFZNX0lOVDMyICBSaWdodERDOyAgICAvKiBSaWdodERDICAqLworfUZpbHRlcl9TdGF0ZTsKKwordHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKKworI2VuZGlmIC8qIF9EQ18ySV9EMTZfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlBbGxQYXNzX1NhdF8zMngxNlRvMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZGE3MmFjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlBbGxQYXNzX1NhdF8zMngxNlRvMzIuYwpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIERlbGF5QWxsUGFzc18zMngzMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgRGVsYXlBbGxQYXNzX1NhdF8zMngxNlRvMzIoICBMVk1fSU5UMzIgICpkZWxheSwgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgc2l6ZSwgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgc2l6ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBjb2VmZiwgICAgICAgICAgICAgICAgICAgICAgLyogQWxsIHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBEZWxheU9mZnNldCwgICAgICAgICAgICAgICAvKiBTaW1wbGUgZGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAqcEFsbFBhc3NPZmZzZXQsICAgICAgICAgICAvKiBBbGwgcGFzcyBmaWx0ZXIgZGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LCAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UvZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiAgc2FtcGxlcyAqLworeworICAgIExWTV9JTlQxNiAgIGk7CisgICAgTFZNX1VJTlQxNiAgIEFsbFBhc3NPZmZzZXQgPSAqcEFsbFBhc3NPZmZzZXQ7CisgICAgTFZNX0lOVDMyICAgIHRlbXA7CisgICAgTFZNX0lOVDMyICAgIGEsYixjOworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICB7CisKKyAgICAgICAgTVVMMzJ4MTZJTlRPMzIoZGVsYXlbQWxsUGFzc09mZnNldF0sIGNvZWZmLCB0ZW1wLCAxNSkKKyAgICAgICAgYSA9IHRlbXA7CisgICAgICAgIGIgPSBkZWxheVtEZWxheU9mZnNldF07CisgICAgICAgIERlbGF5T2Zmc2V0Kys7CisKKyAgICAgICAgYyA9IGEgKyBiOworICAgICAgICBpZiAoKCgoYyBeIGEpICYgKGMgXiBiKSkgPj4gMzEpICE9IDApICAvKiBvdmVyZmxvdyAvIHVuZGVyZmxvdyAqLworICAgICAgICB7CisgICAgICAgICAgICBpZihhIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjID0gMHg4MDAwMDAwMGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYyA9IDB4N0ZGRkZGRkZsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICpkc3QgPSBjOworICAgICAgICBkc3QrKzsKKworCisgICAgICAgIE1VTDMyeDE2SU5UTzMyKGMsIC1jb2VmZiwgdGVtcCwgMTUpCisgICAgICAgIGEgPSB0ZW1wOworICAgICAgICBiID0gZGVsYXlbQWxsUGFzc09mZnNldF07CisgICAgICAgIGMgPSBhICsgYjsKKyAgICAgICAgaWYgKCgoKGMgXiBhKSAmIChjIF4gYikpID4+IDMxKSE9MCkgIC8qIG92ZXJmbG93IC8gdW5kZXJmbG93ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGEgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGMgPSAweDgwMDAwMDAwbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjID0gMHg3RkZGRkZGRmw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVsYXlbQWxsUGFzc09mZnNldF0gPSBjOworICAgICAgICBBbGxQYXNzT2Zmc2V0Kys7CisKKyAgICAgICAgLyogTWFrZSB0aGUgZGVsYXkgYnVmZmVyIGEgY2lyY3VsYXIgYnVmZmVyICovCisgICAgICAgIGlmIChEZWxheU9mZnNldCA+PSBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICBEZWxheU9mZnNldCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoQWxsUGFzc09mZnNldCA+PSBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICBBbGxQYXNzT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFVwZGF0ZSB0aGUgb2Zmc2V0ICovCisgICAgKnBBbGxQYXNzT2Zmc2V0ID0gQWxsUGFzc09mZnNldDsKKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheU1peF8xNngxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVlNDE3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheU1peF8xNngxNi5jCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogYmVxMDc3MTYgJAorICAgICAkUmV2aXNpb246IDEwMDAgJAorICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gRGVsYXlNaXhfMTZ4MTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIERlbGF5TWl4XzE2eDE2KGNvbnN0IExWTV9JTlQxNiAqc3JjLCAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkZWxheSwgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNpemUsICAgICAgICAgICAvKiBEZWxheSBzaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LCAgICAgICAgICAgLyogU291cmNlL2Rlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqcE9mZnNldCwgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCit7CisgICAgTFZNX0lOVDE2ICAgaTsKKyAgICBMVk1fSU5UMTYgICBPZmZzZXQgID0gKnBPZmZzZXQ7CisgICAgTFZNX0lOVDE2ICAgdGVtcDsKKworICAgIGZvciAoaT0wOyBpPG47IGkrKykKKyAgICB7CisgICAgICAgIC8qIExlZnQgY2hhbm5lbCAqLworICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0lOVDE2KSgoTFZNX1VJTlQzMikoKExWTV9JTlQzMikoKmRzdCkgKyAoTFZNX0lOVDMyKWRlbGF5W09mZnNldF0pID4+IDEpOworICAgICAgICAqZHN0ICAgICAgICAgICAgPSB0ZW1wOworICAgICAgICBkc3QrKzsKKworICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKKyAgICAgICAgT2Zmc2V0Kys7CisgICAgICAgIHNyYysrOworCisKKyAgICAgICAgLyogUmlnaHQgY2hhbm5lbCAqLworICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0lOVDE2KSgoTFZNX1VJTlQzMikoKExWTV9JTlQzMikoKmRzdCkgLSAoTFZNX0lOVDMyKWRlbGF5W09mZnNldF0pID4+IDEpOworICAgICAgICAqZHN0ICAgICAgICAgICAgPSB0ZW1wOworICAgICAgICBkc3QrKzsKKworICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKKyAgICAgICAgT2Zmc2V0Kys7CisgICAgICAgIHNyYysrOworCisgICAgICAgIC8qIE1ha2UgdGhlIHJldmVyYiBkZWxheSBidWZmZXIgYSBjaXJjdWxhciBidWZmZXIgKi8KKyAgICAgICAgaWYgKE9mZnNldCA+PSBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICBPZmZzZXQgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVXBkYXRlIHRoZSBvZmZzZXQgKi8KKyAgICAqcE9mZnNldCA9IE9mZnNldDsKKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheVdyaXRlXzMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheVdyaXRlXzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGFlNGM0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5V3JpdGVfMzIuYwpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBEZWxheU1peF8xNngxNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgRGVsYXlXcml0ZV8zMihjb25zdCBMVk1fSU5UMzIgICpzcmMsICAgICAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkZWxheSwgICAgICAgICAgICAgLyogRGVsYXkgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBzaXplLCAgICAgICAgICAgICAgIC8qIERlbGF5IHNpemUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICpwT2Zmc2V0LCAgICAgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuKSAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCit7CisgICAgTFZNX0lOVDE2ICAgaTsKKyAgICBMVk1fSU5UMTYgICBPZmZzZXQgID0gKExWTV9JTlQxNikqcE9mZnNldDsKKworICAgIGZvciAoaT0wOyBpPG47IGkrKykKKyAgICB7CisgICAgICAgIGRlbGF5W09mZnNldF0gPSAqc3JjOworICAgICAgICBPZmZzZXQrKzsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgLyogTWFrZSB0aGUgZGVsYXkgYnVmZmVyIGEgY2lyY3VsYXIgYnVmZmVyICovCisgICAgICAgIGlmIChPZmZzZXQgPj0gc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFVwZGF0ZSB0aGUgb2Zmc2V0ICovCisgICAgKnBPZmZzZXQgPSAoTFZNX1VJTlQxNilPZmZzZXQ7CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MzFhMTE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYwpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMSwKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEEwLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE1IGZvcm1hdAorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fSU5UMzIgIHluTDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUExIChRMTUpICogeChuLTEpTCAoUTApIGluIFExNQorICAgICAgICAgICAgeW5MPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvLyB5bkwrPUEwIChRMTUpICogeChuKUwgKFEwKSBpbiBRMTUKKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvLyB5bkwrPSAgKC1CMSAoUTE1KSAqIHkobi0xKUwgKFEwKSApIGluIFExNQorICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisKKyAgICAgICAgICAgIHluTD0oTFZNX0lOVDE2KSh5bkw+PjE1KTsgLy8geW5MIGluIFEwIGZvcm1hdAorICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdPXluTDsgLy8gVXBkYXRlIHkobi0xKUwgaW4gUTAKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMIGluIFEwCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0Kys9KExWTV9JTlQxNil5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCisKKyAgICAgICAgfQorCisgICAgfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDY3NTA4NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLworLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCisvKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCisvKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgTFZNX0lOVDE2IHRlbXA7CisgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpICBwSW5zdGFuY2U7CisgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0oTFZNX0lOVDMyICopICAgICBwVGFwczsKKworICB0ZW1wPXBDb2VmLT5BMTsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXT10ZW1wOworICB0ZW1wPXBDb2VmLT5BMDsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXT10ZW1wOworICB0ZW1wPXBDb2VmLT5CMTsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT10ZW1wOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRW5kIE9mIEZpbGU6IEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTFhODE4YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9GT18xSV9EMTZGMTZDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisjZGVmaW5lIF9GT18xSV9EMTZGMTZDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFByb2plY3Q6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDAgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCisvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXworeworICBMVk1fSU5UMzIqICAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgTFZNX0lOVDE2ICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGU7CisKK3R5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CisKKyNlbmRpZiAvKiBfRk9fMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWJkYzViNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxLmMKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMSwKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEEwLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTMxIGZvcm1hdAorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fSU5UMzIgIHluTCx0ZW1wbDsKKyAgICAgICAgTFZNX0lOVDE2ICBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworCisgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTEgKFEzMSkgKiB4KG4tMSlMIChRMCkgPj4zMSBpbiBRMAorICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1swXSxwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0seW5MLDMxKQorCisgICAgICAgICAgICAvLyB5bkwrPUEwIChRMzEpICogeChuKUwgKFEwKSA+PiAzMSBpbiBRMAorICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSwqcERhdGFJbix0ZW1wbCwzMSkKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICAoLUIxIChRMzEpICogeShuLTEpTCAoUTApICkgPj4gMzEgaW4gUTAKKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0scEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdLHRlbXBsLDMxKQorICAgICAgICAgICAgeW5MKz10ZW1wbDsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdPXluTDsgLy8gVXBkYXRlIHkobi0xKUwgaW4gUTAKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMIGluIFEwCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0Kys9KExWTV9JTlQzMil5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCisgICAgICAgIH0KKworICAgIH0KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVlYTBiNjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhlc2UgZnVuY3Rpb25zIGluaXRpYWxpemVzIGEgQklRVUFEIGZpbHRlciBkZWZpbmVkIGFzIGEgY2FzY2FkZSBvZiAgICovCisvKiAgIGJpcXVhZHJhdGljIEZpbHRlciBTZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBJbnN0YW5jZSAgICAtIG91dHB1dCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgU3RhdGUgVmFyaWFibGUgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgVGhpcyBzdGF0ZSBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIGFueSBzdWJzZXF1ZW50ICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIGNhbGwgdG8gIkJpcXVhZCIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBUYXBzICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgdGFwcyBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwQ29lZiAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHN0cnVjdHVyZSAgICAgICAgICAgKi8KKy8qICAgTiAgICAgICAgICAgICAtIE0gY29lZmZpY2llbnQgZmFjdG9yIG9mIFFNLk4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MzMl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICBMVk1fSU5UMzIgdGVtcDsKKyAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgIHBJbnN0YW5jZTsKKyAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0lOVDMyICopICAgIHBUYXBzOworCisgIHRlbXA9cENvZWYtPkExOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdPXRlbXA7CisgIHRlbXA9cENvZWYtPkEwOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdPXRlbXA7CisgIHRlbXA9cENvZWYtPkIxOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXRlbXA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MzI5MTUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFByb2plY3Q6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDAgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0ZPXzFJX0QzMkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKyNkZWZpbmUgX0ZPXzFJX0QzMkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKworCisvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCisvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXworeworICBMVk1fSU5UMzIgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgTFZNX0lOVDMyICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGU7CisKK3R5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CisKKyNlbmRpZiAvKiBfRk9fMUlfRDMyRjMyQ0xMX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRiMjE5YTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFByb2plY3Q6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDAgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQVNTVU1QVElPTlM6CitDT0VGUy0KK3BCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTEsCitwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEEwLAorcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMTUgZm9ybWF0CitwQmlxdWFkU3RhdGUtPlNoaWZ0ICAgIGlzIFNoaWZ0IHZhbHVlCitERUxBWVMtCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMTUgZm9ybWF0CitwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeShuLTEpTCBpbiBRMzAgZm9ybWF0CitwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTEpUiBpbiBRMTUgZm9ybWF0CitwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTEpUiBpbiBRMzAgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fSU5UMzIgICB5bkwseW5SOworICAgICAgICBMVk1fSU5UMzIgICBUZW1wOworICAgICAgICBMVk1fSU5UMzIgICBOZWdTYXRWYWx1ZTsKKyAgICAgICAgTFZNX0lOVDE2ICAgaWk7CisgICAgICAgIExWTV9JTlQxNiAgIFNoaWZ0OworICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgTmVnU2F0VmFsdWUgPSBMVk1fTUFYSU5UXzE2ICsxOworICAgICAgICBOZWdTYXRWYWx1ZSA9IC1OZWdTYXRWYWx1ZTsKKworICAgICAgICBTaGlmdCA9IHBCaXF1YWRTdGF0ZS0+U2hpZnQ7CisKKworICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICAvLyB5bkwgPUExIChRMTUpICogeChuLTEpTCAoUTE1KSBpbiBRMzAKKyAgICAgICAgICAgIHluTD0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0qIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKyAgICAgICAgICAgIC8vIHluUiA9QTEgKFExNSkgKiB4KG4tMSlSIChRMTUpIGluIFEzMAorICAgICAgICAgICAgeW5SPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisKKyAgICAgICAgICAgIC8vIHluTCs9QTAgKFExNSkgKiB4KG4pTCAoUTE1KSBpbiBRMzAKKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKiAoKnBEYXRhSW4pOworICAgICAgICAgICAgLy8geW5SKz1BMCAoUTE1KSAqIHgobilMIChRMTUpIGluIFEzMAorICAgICAgICAgICAgeW5SKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0qICgqKHBEYXRhSW4rMSkpOworCisKKyAgICAgICAgICAgIC8vIHluTCArPSAgKC1CMSAoUTE1KSAqIHkobi0xKUwgKFEzMCkgKSBpbiBRMzAKKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSxwQmlxdWFkU3RhdGUtPmNvZWZzWzJdLFRlbXAsMTUpOworICAgICAgICAgICAgeW5MICs9VGVtcDsKKyAgICAgICAgICAgIC8vIHluUiArPSAgKC1CMSAoUTE1KSAqIHkobi0xKVIgKFEzMCkgKSBpbiBRMzAKKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSxwQmlxdWFkU3RhdGUtPmNvZWZzWzJdLFRlbXAsMTUpOworICAgICAgICAgICAgeW5SICs9VGVtcDsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV09eW5MOyAvLyBVcGRhdGUgeShuLTEpTCBpbiBRMzAKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMIGluIFExNQorCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM109eW5SOyAvLyBVcGRhdGUgeShuLTEpUiBpbiBRMzAKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT0oKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlSIGluIFExNQorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qQXBwbHkgc2hpZnQ6IEluc3RlYWQgb2YgbGVmdCBzaGlmdCBvbiAxNi1iaXQgcmVzdWx0LCByaWdodCBzaGlmdCBvZiAoMTUtc2hpZnQpIGlzIGFwcGxpZWQKKyAgICAgICAgICAgICAgZm9yIGJldHRlciBTTlIqLworICAgICAgICAgICAgeW5MID0geW5MPj4oMTUtU2hpZnQpOworICAgICAgICAgICAgeW5SID0geW5SPj4oMTUtU2hpZnQpOworCisgICAgICAgICAgICAvKlNhdHVyYXRlIHJlc3VsdHMqLworICAgICAgICAgICAgaWYoeW5MID4gTFZNX01BWElOVF8xNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB5bkwgPSBMVk1fTUFYSU5UXzE2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHluTCA8IE5lZ1NhdFZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeW5MID0gTmVnU2F0VmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZih5blIgPiBMVk1fTUFYSU5UXzE2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHluUiA9IExWTV9NQVhJTlRfMTY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoeW5SIDwgTmVnU2F0VmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB5blIgPSBOZWdTYXRWYWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICpwRGF0YU91dCsrPShMVk1fSU5UMTYpeW5MOworICAgICAgICAgICAgKnBEYXRhT3V0Kys9KExWTV9JTlQxNil5blI7CisgICAgICAgIH0KKworICAgIH0KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZjIxMmY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDAgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KKy8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLworLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLworLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjFfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzE2X0xTaHhfQ29lZnNfdCAgICAgICAgKnBDb2VmKQoreworICBMVk1fSU5UMTYgdGVtcDsKKyAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9KExWTV9JTlQzMiAqKSBwVGFwcyAgICAgICAgICAgIDsKKworICB0ZW1wPXBDb2VmLT5BMTsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXT10ZW1wOworICB0ZW1wPXBDb2VmLT5BMDsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXT10ZW1wOworICB0ZW1wPXBDb2VmLT5CMTsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT10ZW1wOworCisgIHRlbXA9cENvZWYtPlNoaWZ0OworICBwQmlxdWFkU3RhdGUtPlNoaWZ0ID0gdGVtcDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZhNDU2NGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9GT18ySV9EMTZGMzJDU1NfTFNIWF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKyNkZWZpbmUgX0ZPXzJJX0QxNkYzMkNTU19MU0hYX1RSQ19XUkFfMDFfUFJJVkFURV9IXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCisvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXworeworICBMVk1fSU5UMzIgICAgICpwRGVsYXlzOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICBMVk1fSU5UMTYgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCisgIExWTV9JTlQxNiAgICAgU2hpZnQ7ICAgICAgICAgIC8qIFNoaWZ0IHZhbHVlKi8KK31GaWx0ZXJfU3RhdGU7CisKK3R5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CisKKyNlbmRpZiAvKiBfRk9fMklfRDE2RjMyQ1NTX0xTSFhfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GaWx0ZXJzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GaWx0ZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTI3NGYzMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZpbHRlcnMuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogYmVxMDc3MTYgJAorICAgICAkUmV2aXNpb246IDEwMDEgJAorICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzoyMzowMiArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEZJTFRFUlNfSAorI2RlZmluZSBGSUxURVJTX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgU3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQmlxdWFkIHdpdGggY29lZmZpY2llbnRzIEEwLCBBMSwgQTIsIEIxIGFuZCBCMiBjb2VmZmljaWVudHMKKyAqLworLyogU2luZ2xlIHByZWNpc2lvbiAoMTYtYml0KSBCaXF1YWQgc2VjdGlvbiBjb2VmZmljaWVudHMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgICAgIExWTV9JTlQxNiAgIEEwOworICAgICAgICBMVk1fSU5UMTYgICBBMTsKKyAgICAgICAgTFZNX0lOVDE2ICAgQTI7CisgICAgICAgIExWTV9JTlQxNiAgIEIxOworICAgICAgICBMVk1fSU5UMTYgICBCMjsKKyAgICAgICAgTFZNX1VJTlQxNiAgU2NhbGU7Cit9IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3Q7CisKKworLyoKKyAqIEJpcXVhZCB3aXRoIGNvZWZmaWNpZW50cyBBMCwgQTEgYW5kIEIxIGNvZWZmaWNpZW50cworICovCisvKiBTaW5nbGUgcHJlY2lzaW9uICgxNi1iaXQpIEJpcXVhZCBzZWN0aW9uIGNvZWZmaWNpZW50cyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAgICAgTFZNX0lOVDE2ICAgQTA7CisgICAgICAgIExWTV9JTlQxNiAgIEExOworICAgICAgICBMVk1fSU5UMTYgICBCMTsKKyAgICAgICAgTFZNX1VJTlQxNiAgU2NhbGU7Cit9IEJpcXVhZEEwMUIxQ29lZnNTUF90OworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAgICAgIC8qIEZJTFRFUlNfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmIwMDc2OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTVNfMTZ4MTYuYwpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDAwICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OICBGcm9tMmlUb01TXzE2eDE2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBGcm9tMmlUb01TXzE2eDE2KCBjb25zdCBMVk1fSU5UMTYgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgKmRzdE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgKmRzdFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCit7CisgICAgTFZNX0lOVDMyIHRlbXAxLGxlZnQscmlnaHQ7CisgICAgTFZNX0lOVDE2IGlpOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgbGVmdCA9IChMVk1fSU5UMzIpKnNyYzsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgcmlnaHQgPSAoTFZNX0lOVDMyKSpzcmM7CisgICAgICAgIHNyYysrOworCisgICAgICAgIC8qIENvbXB1dGUgTSBzaWduYWwqLworICAgICAgICB0ZW1wMSA9ICAobGVmdCtyaWdodCk+PjE7CisgICAgICAgICpkc3RNID0gKExWTV9JTlQxNil0ZW1wMTsKKyAgICAgICAgZHN0TSsrOworCisgICAgICAgIC8qIENvbXB1dGUgUyBzaWduYWwqLworICAgICAgICB0ZW1wMSA9ICAobGVmdC1yaWdodCk+PjE7CisgICAgICAgICpkc3RTID0gKExWTV9JTlQxNil0ZW1wMTsKKyAgICAgICAgZHN0UysrOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18xNi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBlYmI0YWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMTYuYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDAwICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIEZyb20yaVRvTW9ub18xNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgRnJvbTJpVG9Nb25vXzE2KCBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgTFZNX0lOVDMyIFRlbXA7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBUZW1wID0gKExWTV9JTlQzMikqc3JjOworICAgICAgICBzcmMrKzsKKworICAgICAgICBUZW1wICs9IChMVk1fSU5UMzIpKnNyYzsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgKmRzdCAgPSAoTFZNX0lOVDE2KShUZW1wID4+MSk7CisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUxODEzNjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYwpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDAwICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIEZyb20yaVRvTW9ub18zMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgRnJvbTJpVG9Nb25vXzMyKCBjb25zdCBMVk1fSU5UMzIgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgTFZNX0lOVDMyIFRlbXA7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIFRlbXAgPSAoKnNyYz4+MSk7CisgICAgICAgIHNyYysrOworCisgICAgICAgIFRlbXAgKz0oKnNyYz4+MSk7CisgICAgICAgIHNyYysrOworCisgICAgICAgICpkc3QgPSBUZW1wOworICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW5zdEFsbG9jLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnN0QWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZjkwMGUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW5zdEFsbG9jLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkluc3RBbGxvYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5hbWUgICAgICAgIDogSW5zdEFsbG9jX0luaXQoKQorICogIElucHV0ICAgICAgIDogcG1zICAtIFBvaW50ZXIgdG8gdGhlIElOU1RfQUxMT0MgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgIFN0YXJ0QWRkciAtIEJhc2UgYWRkcmVzcyBvZiB0aGUgaW5zdGFuY2UgbWVtb3J5CisgKiAgUmV0dXJucyAgICAgOiBFcnJvciBjb2RlCisgKiAgRGVzY3JpcHRpb24gOiBJbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgZGlzdHJpYnV0aW9uIGFuZCBtZW1vcnkgc2l6ZSBjYWxjdWxhdGlvbiBmdW5jdGlvbgorICogIFJlbWFya3MgICAgIDoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkICAgIEluc3RBbGxvY19Jbml0KCBJTlNUX0FMTE9DICAgICAgKnBtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqU3RhcnRBZGRyICkKK3sKKyAgICBwbXMtPlRvdGFsU2l6ZSA9IDM7CisgICAgcG1zLT5wTmV4dE1lbWJlciA9IChMVk1fVUlOVDMyKSgoKExWTV9VSU5UMzIpU3RhcnRBZGRyICsgMykgJiAweEZGRkZGRkZDKTsvKiBUaGlzIGNvZGUgd2lsbCBmYWlsIGlmIHRoZSBwbGF0Zm9ybSBhZGRyZXNzIHNwYWNlIGlzIG1vcmUgdGhhbiAzMi1iaXRzKi8KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5hbWUgICAgICAgIDogSW5zdEFsbG9jX0FkZE1lbWJlcigpCisgKiAgSW5wdXQgICAgICAgOiBwbXMgIC0gUG9pbnRlciB0byB0aGUgSU5TVF9BTExPQyBpbnN0YW5jZQorICAgICAgICAgICAgICAgICAgU2l6ZSAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBuZXcgYWRkZWQgbWVtYmVyCisgKiAgUmV0dXJucyAgICAgOiBBIHBvaW50ZXIgdG8gdGhlIG5ldyBhZGRlZCBtZW1iZXIKKyAqICBEZXNjcmlwdGlvbiA6IEFsbG9jYXRlcyBzcGFjZSBmb3IgYSBuZXcgbWVtYmVyIGluIHRoZSBpbnN0YW5jZSBtZW1vcnkgYW5kIHJldHVybnMKKyAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciB0byB0aGlzIG5ldyBtZW1iZXIuICBUaGUgc3RhcnQgYWRkcmVzcyBvZiBhbGwgbWVtYmVycyB3aWxsCisgICAgICAgICAgICAgICAgICBiZSAzMiBiaXQgYWxsaWduZWQuCisgKiAgUmVtYXJrcyAgICAgOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQqICAgSW5zdEFsbG9jX0FkZE1lbWJlciggSU5TVF9BTExPQyAgICAgICAgICpwbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgIFNpemUgKQoreworICAgIHZvaWQgKk5ld01lbWJlckFkZHJlc3M7IC8qIFZhcmlhYmxlIHRvIHRlbXBvcmFyaWx5IHN0b3JlIHRoZSByZXR1cm4gdmFsdWUgKi8KKyAgICBOZXdNZW1iZXJBZGRyZXNzID0gKHZvaWQqKXBtcy0+cE5leHRNZW1iZXI7CisKKyAgICBTaXplID0gKChTaXplICsgMykgJiAweEZGRkZGRkZDKTsgLyogQ2VpbCB0aGUgc2l6ZSB0byBhIG11bHRpcGxlIG9mIGZvdXIgKi8KKworICAgIHBtcy0+VG90YWxTaXplICs9IFNpemU7CisgICAgcG1zLT5wTmV4dE1lbWJlciArPSBTaXplOworCisgICAgcmV0dXJuKE5ld01lbWJlckFkZHJlc3MpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgTmFtZSAgICAgICAgOiBJbnN0QWxsb2NfR2V0VG90YWwoKQorICogIElucHV0ICAgICAgIDogcG1zICAtIFBvaW50ZXIgdG8gdGhlIElOU1RfQUxMT0MgaW5zdGFuY2UKKyAqICBSZXR1cm5zICAgICA6IFRoZSBpbnN0YW5jZSBtZW1vcnkgc2l6ZQorICogIERlc2NyaXB0aW9uIDogVGhpcyBmdW5jdGlvbnMgcmV0dXJucyB0aGUgY2FsY3VsYXRlZCBpbnN0YW5jZSBtZW1vcnkgc2l6ZQorICogIFJlbWFya3MgICAgIDoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fVUlOVDMyIEluc3RBbGxvY19HZXRUb3RhbCggSU5TVF9BTExPQyAqcG1zKQoreworICAgIGlmIChwbXMtPlRvdGFsU2l6ZSA+IDMpCisgICAgeworICAgICAgICByZXR1cm4ocG1zLT5Ub3RhbFNpemUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gMDsgICAgICAgICAgIC8qIE5vIG1lbW9yeSBhZGRlZCAqLworICAgIH0KK30KKworCit2b2lkICAgIEluc3RBbGxvY19Jbml0QWxsKCBJTlNUX0FMTE9DICAgICAgICAgICAgICAgICAgICAgICpwbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtb3J5VGFibGVfc3QgICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSkKK3sKKyAgICBMVk1fVUlOVDMyIFN0YXJ0QWRkcjsKKworICAgIFN0YXJ0QWRkciA9IChMVk1fVUlOVDMyKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzOworCisgICAgcG1zWzBdLlRvdGFsU2l6ZSA9IDM7CisgICAgcG1zWzBdLnBOZXh0TWVtYmVyID0gKExWTV9VSU5UMzIpKCgoTFZNX1VJTlQzMilTdGFydEFkZHIgKyAzKSAmIDB4RkZGRkZGRkMpOworCisKKyAgICBTdGFydEFkZHIgPSAoTFZNX1VJTlQzMilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzczsKKworICAgIHBtc1sxXS5Ub3RhbFNpemUgPSAzOworICAgIHBtc1sxXS5wTmV4dE1lbWJlciA9IChMVk1fVUlOVDMyKSgoKExWTV9VSU5UMzIpU3RhcnRBZGRyICsgMykgJiAweEZGRkZGRkZDKTsKKworCisgICAgU3RhcnRBZGRyID0gKExWTV9VSU5UMzIpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisKKyAgICBwbXNbMl0uVG90YWxTaXplID0gMzsKKyAgICBwbXNbMl0ucE5leHRNZW1iZXIgPSAoTFZNX1VJTlQzMikoKChMVk1fVUlOVDMyKVN0YXJ0QWRkciArIDMpICYgMHhGRkZGRkZGQyk7CisKKworICAgIFN0YXJ0QWRkciA9IChMVk1fVUlOVDMyKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOworCisgICAgcG1zWzNdLlRvdGFsU2l6ZSA9IDM7CisgICAgcG1zWzNdLnBOZXh0TWVtYmVyID0gKExWTV9VSU5UMzIpKCgoTFZNX1VJTlQzMilTdGFydEFkZHIgKyAzKSAmIDB4RkZGRkZGRkMpOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgTmFtZSAgICAgICAgOiBJbnN0QWxsb2NfSW5pdEFsbF9OVUxMKCkKKyAqICBJbnB1dCAgICAgICA6IHBtcyAgLSBQb2ludGVyIHRvIGFycmF5IG9mIGZvdXIgSU5TVF9BTExPQyBpbnN0YW5jZXMKKyAqICBSZXR1cm5zICAgICA6IE5vdGhpbmcKKyAqICBEZXNjcmlwdGlvbiA6IFRoaXMgZnVuY3Rpb24gcmVzZXJ2ZXMgU2l6ZSBvZiAzIGJ5dGVzIGZvciBhbGwgbWVtb3J5IHJlZ2lvbnMgYW5kCisgKiAgICAgICAgICAgICAgICBpbnRpYWxpemVzIHBOZXh0TWVtYmVyIGZvciBhbGwgcmVnaW9ucyB0byAwCisgKiAgUmVtYXJrcyAgICAgOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgICAgSW5zdEFsbG9jX0luaXRBbGxfTlVMTCggSU5TVF9BTExPQyAgKnBtcykKK3sKKyAgICBwbXNbMF0uVG90YWxTaXplID0gMzsKKyAgICBwbXNbMF0ucE5leHRNZW1iZXIgPSAwOworCisKKyAgICBwbXNbMV0uVG90YWxTaXplID0gMzsKKyAgICBwbXNbMV0ucE5leHRNZW1iZXIgPSAwOworCisgICAgcG1zWzJdLlRvdGFsU2l6ZSA9IDM7CisgICAgcG1zWzJdLnBOZXh0TWVtYmVyID0gMDsKKworICAgIHBtc1szXS5Ub3RhbFNpemUgPSAzOworICAgIHBtc1szXS5wTmV4dE1lbWJlciA9IDA7CisKK30KKworCit2b2lkKiAgIEluc3RBbGxvY19BZGRNZW1iZXJBbGwoIElOU1RfQUxMT0MgICAgICAgICAgICAgICAgICAgICAqcG1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgICBTaXplW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtb3J5VGFibGVfc3QgICAgICAgICAgICpwTWVtb3J5VGFibGUpCit7CisgICAgdm9pZCAqTmV3TWVtYmVyQWRkcmVzczsgLyogVmFyaWFibGUgdG8gdGVtcG9yYXJpbHkgc3RvcmUgdGhlIHJldHVybiB2YWx1ZSAqLworCisgICAgLyogY292ZXJpdHlbcmV0dXJuZWRfcG9pbnRlcl0gSWdub3JlIGNvdmVyaXR5IHdhcm5pbmcgdGhhdCBwdHIgaXMgbm90IHVzZWQgKi8KKyAgICBOZXdNZW1iZXJBZGRyZXNzID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmcG1zW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0sIFNpemVbTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXSk7CisKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmcG1zW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0pOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICBOZXdNZW1iZXJBZGRyZXNzID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmcG1zW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0sIFNpemVbTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSk7CisKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmcG1zW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0pOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICBOZXdNZW1iZXJBZGRyZXNzID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmcG1zW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sIFNpemVbTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSk7CisKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmcG1zW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0pOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICBOZXdNZW1iZXJBZGRyZXNzID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmcG1zW0xWTV9URU1QT1JBUllfRkFTVF0sIFNpemVbTFZNX1RFTVBPUkFSWV9GQVNUXSk7CisKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlNpemUgICAgICAgICAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZwbXNbTFZNX1RFTVBPUkFSWV9GQVNUXSk7CisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5UeXBlICAgICAgICAgICAgICAgICA9IExWTV9URU1QT1JBUllfRkFTVDsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgICAgID0gTFZNX05VTEw7CisKKyAgICByZXR1cm4oTmV3TWVtYmVyQWRkcmVzcyk7Cit9CisKKwordm9pZCogICBJbnN0QWxsb2NfQWRkTWVtYmVyQWxsUmV0KCAgICAgSU5TVF9BTExPQyAgICAgICAgICAgICAgICAgKnBtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgU2l6ZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICoqcHRyKQoreworICAgIHB0clswXSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLCBTaXplW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0pOworICAgIHB0clsxXSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLCBTaXplW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0pOworICAgIHB0clsyXSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLCBTaXplW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0pOworICAgIHB0clszXSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fVEVNUE9SQVJZX0ZBU1RdLCBTaXplW0xWTV9URU1QT1JBUllfRkFTVF0pOworCisgICAgcmV0dXJuIChwdHJbMF0pOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnQxNkxTaGlmdFRvSW50MzJfMTZ4MzIuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNmJlNzU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyLmMKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkCisgICAgICRSZXZpc2lvbjogMTAwMCAkCisgICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBJTlQxNkxTSElGVFRPSU5UMzJfMTZYMzIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEludDE2TFNoaWZ0VG9JbnQzMl8xNngzMihjb25zdCBMVk1fSU5UMTYgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICBzaGlmdCApCit7CisgICAgTFZNX0lOVDE2IGlpOworCisgICAgc3JjICs9IG4tMTsKKyAgICBkc3QgKz0gbi0xOworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICAqZHN0ID0gKCAoKExWTV9JTlQzMikqc3JjKSA8PCBzaGlmdCk7CisgICAgICAgIHNyYy0tOworICAgICAgICBkc3QtLTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIyMWVlZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnQzMlJTaGlmdFRvSW50MTZfU2F0XzMyeDE2LmMKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkCisgICAgICRSZXZpc2lvbjogMTAwMCAkCisgICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBJTlQzMlJTSElGVFRPSU5UMTZfU0FUXzMyWDE2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBJbnQzMlJTaGlmdFRvSW50MTZfU2F0XzMyeDE2KGNvbnN0IExWTV9JTlQzMiAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgc2hpZnQgKQoreworICAgIExWTV9JTlQzMiB0ZW1wOworICAgIExWTV9JTlQxNiBpaTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgdGVtcCA9ICpzcmMgPj4gc2hpZnQ7CisgICAgICAgIHNyYysrOworCisgICAgICAgIGlmICh0ZW1wID4gMHgwMDAwN0ZGRikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IDB4N0ZGRjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0ZW1wIDwgLTB4MDAwMDgwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAtIDB4ODAwMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0lOVDE2KXRlbXA7CisgICAgICAgIH0KKworICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0pvaW5UbzJpXzMyeDMyLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTA0ZjFjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0pvaW5UbzJpXzMyeDMyLmMKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gSm9pblRvMmlfMzJ4MzIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEpvaW5UbzJpXzMyeDMyKCBjb25zdCBMVk1fSU5UMzIgICAgKnNyY0wsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgKnNyY1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICBuICkKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisKKyAgICBzcmNMICs9IG4tMTsKKyAgICBzcmNSICs9IG4tMTsKKyAgICBkc3QgICs9ICgoMipuKS0xKTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgKmRzdCA9ICpzcmNSOworICAgICAgICBkc3QtLTsKKyAgICAgICAgc3JjUi0tOworCisgICAgICAgICpkc3QgPSAqc3JjTDsKKyAgICAgICAgZHN0LS07CisgICAgICAgIHNyY0wtLTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzFkMmIyYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuYwpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDAwICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWQ19NaXhlcl9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKQoreworICAgIExWTV9JTlQzMiAgVGVtcDsKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgTFZNX0lOVDE2IEN1cnJlbnQxU2hvcnQ7CisgICAgTFZNX0lOVDE2IEN1cnJlbnQyU2hvcnQ7CisgICAgTWl4X1ByaXZhdGVfc3QgICpwSW5zdGFuY2UxPShNaXhfUHJpdmF0ZV9zdCAqKShwdHJJbnN0YW5jZTEtPlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlMj0oTWl4X1ByaXZhdGVfc3QgKikocHRySW5zdGFuY2UyLT5Qcml2YXRlUGFyYW1zKTsKKworCisgICAgQ3VycmVudDFTaG9ydCA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZTEtPkN1cnJlbnQgPj4gMTYpOworICAgIEN1cnJlbnQyU2hvcnQgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UyLT5DdXJyZW50ID4+IDE2KTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgVGVtcCA9ICgoTFZNX0lOVDMyKSooc3JjKyspICogKExWTV9JTlQzMilDdXJyZW50MVNob3J0KT4+MTU7CisgICAgICAgIGlmIChUZW1wID4gMHgwMDAwN0ZGRikKKyAgICAgICAgICAgICpkc3QrKyA9IDB4N0ZGRjsKKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICAgICAgKmRzdCsrID0gLSAweDgwMDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpkc3QrKyA9IChMVk1fSU5UMTYpVGVtcDsKKworICAgICAgICBUZW1wID0gKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnQyU2hvcnQpPj4xNTsKKyAgICAgICAgaWYgKFRlbXAgPiAweDAwMDA3RkZGKQorICAgICAgICAgICAgKmRzdCsrID0gMHg3RkZGOworICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTB4MDAwMDgwMDApCisgICAgICAgICAgICAqZHN0KysgPSAtIDB4ODAwMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKmRzdCsrID0gKExWTV9JTlQxNilUZW1wOworICAgIH0KKworCit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYmIyMTJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogYmVxMDc3MTYgJAorICAgICAkUmV2aXNpb246IDEwMDAgJAorICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIExWQ29yZV9NSVhIQVJEXzJTVF9EMTZDMzFfU0FUCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAqcHRySW5zdGFuY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICAqcHRySW5zdGFuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit7CisgICAgTFZNX0lOVDMyICBUZW1wOworICAgIExWTV9JTlQxNiBpaTsKKyAgICBMVk1fSU5UMTYgQ3VycmVudDFTaG9ydDsKKyAgICBMVk1fSU5UMTYgQ3VycmVudDJTaG9ydDsKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZTE9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlMS0+UHJpdmF0ZVBhcmFtcyk7CisgICAgTWl4X1ByaXZhdGVfc3QgICpwSW5zdGFuY2UyPShNaXhfUHJpdmF0ZV9zdCAqKShwdHJJbnN0YW5jZTItPlByaXZhdGVQYXJhbXMpOworCisKKyAgICBDdXJyZW50MVNob3J0ID0gKExWTV9JTlQxNikocEluc3RhbmNlMS0+Q3VycmVudCA+PiAxNik7CisgICAgQ3VycmVudDJTaG9ydCA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZTItPkN1cnJlbnQgPj4gMTYpOworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0peworICAgICAgICBUZW1wID0gKCgoTFZNX0lOVDMyKSooc3JjMSsrKSAqIChMVk1fSU5UMzIpQ3VycmVudDFTaG9ydCk+PjE1KSArCisgICAgICAgICAgICAgICAoKChMVk1fSU5UMzIpKihzcmMyKyspICogKExWTV9JTlQzMilDdXJyZW50MlNob3J0KT4+MTUpOworICAgICAgICBpZiAoVGVtcCA+IDB4MDAwMDdGRkYpCisgICAgICAgICAgICAqZHN0KysgPSAweDdGRkY7CisgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMHgwMDAwODAwMCkKKyAgICAgICAgICAgICpkc3QrKyA9IC0gMHg4MDAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0lOVDE2KVRlbXA7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDQwOGY0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmMKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogYmVxMDc3MTYgJAorICAgICAkUmV2aXNpb246IDEwMDAgJAorICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBMVkNvcmVfTUlYU09GVF8xU1RfRDE2QzMxX1dSQQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKworICAgIExWTV9JTlQxNiAgIE91dExvb3A7CisgICAgTFZNX0lOVDE2ICAgSW5Mb29wOworICAgIExWTV9JTlQxNiAgIEN1cnJlbnRTaG9ydDsKKyAgICBMVk1fSU5UMzIgICBpaSxqajsKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZT0oTWl4X1ByaXZhdGVfc3QgKikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOworICAgIExWTV9JTlQzMiAgIERlbHRhPXBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0lOVDMyICAgQ3VycmVudD1wSW5zdGFuY2UtPkN1cnJlbnQ7CisgICAgTFZNX0lOVDMyICAgVGFyZ2V0PXBJbnN0YW5jZS0+VGFyZ2V0OworICAgIExWTV9JTlQzMiAgIFRlbXA7CisKKyAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShuID4+IDIpOyAvKiBQcm9jZXNzIHBlciA0IHNhbXBsZXMgKi8KKyAgICBPdXRMb29wID0gKExWTV9JTlQxNikobiAtIChJbkxvb3AgPDwgMikpOworCisgICAgaWYoQ3VycmVudDxUYXJnZXQpeworICAgICAgICBpZiAoT3V0TG9vcCl7CisgICAgICAgICAgICBBREQyX1NBVF8zMngzMihDdXJyZW50LERlbHRhLFRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUTMxICsgUTMxIGludG8gUTMxKi8KKyAgICAgICAgICAgIEN1cnJlbnQ9VGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIEN1cnJlbnRTaG9ydCA9IChMVk1fSU5UMTYpKEN1cnJlbnQ+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLworCisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0lOVDMyKSpkc3QpICsgKCgoTFZNX0lOVDMyKSooc3JjKyspICogQ3VycmVudFNob3J0KT4+MTUpOyAgICAgIC8qIFExNSArIFExNSpRMTU+PjE1IGludG8gUTE1ICovCisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAweDAwMDA3RkZGKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAweDdGRkY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtIDB4ODAwMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fSU5UMTYpVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgQUREMl9TQVRfMzJ4MzIoQ3VycmVudCxEZWx0YSxUZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCisgICAgICAgICAgICBDdXJyZW50PVRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBDdXJyZW50U2hvcnQgPSAoTFZNX0lOVDE2KShDdXJyZW50Pj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KKworICAgICAgICAgICAgZm9yIChqaiA9IDQ7IGpqIT0wIDsgamotLSl7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0lOVDMyKSpkc3QpICsgKCgoTFZNX0lOVDMyKSooc3JjKyspICogQ3VycmVudFNob3J0KT4+MTUpOyAgICAgIC8qIFExNSArIFExNSpRMTU+PjE1IGludG8gUTE1ICovCisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAweDAwMDA3RkZGKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAweDdGRkY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtIDB4ODAwMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fSU5UMTYpVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNleworICAgICAgICBpZiAoT3V0TG9vcCl7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUTMxICsgUTMxIGludG8gUTMxKi8KKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIEN1cnJlbnRTaG9ydCA9IChMVk1fSU5UMTYpKEN1cnJlbnQ+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLworCisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0lOVDMyKSpkc3QpICsgKCgoTFZNX0lOVDMyKSooc3JjKyspICogQ3VycmVudFNob3J0KT4+MTUpOyAgICAgIC8qIFExNSArIFExNSpRMTU+PjE1IGludG8gUTE1ICovCisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAweDAwMDA3RkZGKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAweDdGRkY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtIDB4ODAwMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fSU5UMTYpVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBDdXJyZW50U2hvcnQgPSAoTFZNX0lOVDE2KShDdXJyZW50Pj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KKworICAgICAgICAgICAgZm9yIChqaiA9IDQ7IGpqIT0wIDsgamotLSl7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0lOVDMyKSpkc3QpICsgKCgoTFZNX0lOVDMyKSooc3JjKyspICogQ3VycmVudFNob3J0KT4+MTUpOyAgICAgIC8qIFExNSArIFExNSpRMTU+PjE1IGludG8gUTE1ICovCisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAweDAwMDA3RkZGKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAweDdGRkY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtIDB4ODAwMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fSU5UMTYpVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yODQ3ZDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQS5jCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDAwICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWQ19NaXhlcl9Qcml2YXRlLmgiCisjaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbikKK3sKKyAgICBMVk1fSU5UMTYgICBPdXRMb29wOworICAgIExWTV9JTlQxNiAgIEluTG9vcDsKKyAgICBMVk1fSU5UMTYgICBDdXJyZW50U2hvcnRMOworICAgIExWTV9JTlQxNiAgIEN1cnJlbnRTaG9ydFI7CisgICAgTFZNX0lOVDMyICAgaWk7CisgICAgTWl4X1ByaXZhdGVfc3QgICpwSW5zdGFuY2VMPShNaXhfUHJpdmF0ZV9zdCAqKShwdHJJbnN0YW5jZTEtPlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlUj0oTWl4X1ByaXZhdGVfc3QgKikocHRySW5zdGFuY2UyLT5Qcml2YXRlUGFyYW1zKTsKKworICAgIExWTV9JTlQzMiAgIERlbHRhTD1wSW5zdGFuY2VMLT5EZWx0YTsKKyAgICBMVk1fSU5UMzIgICBDdXJyZW50TD1wSW5zdGFuY2VMLT5DdXJyZW50OworICAgIExWTV9JTlQzMiAgIFRhcmdldEw9cEluc3RhbmNlTC0+VGFyZ2V0OworCisgICAgTFZNX0lOVDMyICAgRGVsdGFSPXBJbnN0YW5jZVItPkRlbHRhOworICAgIExWTV9JTlQzMiAgIEN1cnJlbnRSPXBJbnN0YW5jZVItPkN1cnJlbnQ7CisgICAgTFZNX0lOVDMyICAgVGFyZ2V0Uj1wSW5zdGFuY2VSLT5UYXJnZXQ7CisKKyAgICBMVk1fSU5UMzIgICBUZW1wOworCisgICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCisgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKKworICAgIGlmIChPdXRMb29wKQorICAgIHsKKyAgICAgICAgaWYoQ3VycmVudEw8VGFyZ2V0TCkKKyAgICAgICAgeworICAgICAgICAgICAgQUREMl9TQVRfMzJ4MzIoQ3VycmVudEwsRGVsdGFMLFRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUTMxICsgUTMxIGludG8gUTMxKi8KKyAgICAgICAgICAgIEN1cnJlbnRMPVRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudEwgPiBUYXJnZXRMKQorICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEN1cnJlbnRMIC09IERlbHRhTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCisgICAgICAgICAgICBpZiAoQ3VycmVudEwgPCBUYXJnZXRMKQorICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKEN1cnJlbnRSPFRhcmdldFIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFERDJfU0FUXzMyeDMyKEN1cnJlbnRSLERlbHRhUixUZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCisgICAgICAgICAgICBDdXJyZW50Uj1UZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnRSID4gVGFyZ2V0UikKKyAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdXJyZW50UiAtPSBEZWx0YVI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLworICAgICAgICAgICAgaWYgKEN1cnJlbnRSIDwgVGFyZ2V0UikKKyAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7CisgICAgICAgIH0KKworICAgICAgICBDdXJyZW50U2hvcnRMID0gKExWTV9JTlQxNikoQ3VycmVudEw+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLworICAgICAgICBDdXJyZW50U2hvcnRSID0gKExWTV9JTlQxNikoQ3VycmVudFI+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLworCisgICAgICAgIGZvciAoaWkgPSBPdXRMb29wKjI7IGlpICE9IDA7IGlpLT0yKQorICAgICAgICB7CisgICAgICAgICAgICAqKGRzdCsrKSA9IChMVk1fSU5UMTYpKCgoTFZNX0lOVDMyKSooc3JjKyspICogKExWTV9JTlQzMilDdXJyZW50U2hvcnRMKT4+MTUpOyAgICAvKiBRMTUqUTE1Pj4xNSBpbnRvIFExNSAqLworICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0Uik+PjE1KTsgICAgLyogUTE1KlExNT4+MTUgaW50byBRMTUgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaWkgPSBJbkxvb3AqMjsgaWkgIT0gMDsgaWktPTIpCisgICAgeworICAgICAgICBpZihDdXJyZW50TDxUYXJnZXRMKQorICAgICAgICB7CisgICAgICAgICAgICBBREQyX1NBVF8zMngzMihDdXJyZW50TCxEZWx0YUwsVGVtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLworICAgICAgICAgICAgQ3VycmVudEw9VGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50TCA+IFRhcmdldEwpCisgICAgICAgICAgICAgICAgQ3VycmVudEwgPSBUYXJnZXRMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3VycmVudEwgLT0gRGVsdGFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUTMxICsgUTMxIGludG8gUTMxKi8KKyAgICAgICAgICAgIGlmIChDdXJyZW50TCA8IFRhcmdldEwpCisgICAgICAgICAgICAgICAgQ3VycmVudEwgPSBUYXJnZXRMOworICAgICAgICB9CisKKyAgICAgICAgaWYoQ3VycmVudFI8VGFyZ2V0UikKKyAgICAgICAgeworICAgICAgICAgICAgQUREMl9TQVRfMzJ4MzIoQ3VycmVudFIsRGVsdGFSLFRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUTMxICsgUTMxIGludG8gUTMxKi8KKyAgICAgICAgICAgIEN1cnJlbnRSPVRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudFIgPiBUYXJnZXRSKQorICAgICAgICAgICAgICAgIEN1cnJlbnRSID0gVGFyZ2V0UjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEN1cnJlbnRSIC09IERlbHRhUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCisgICAgICAgICAgICBpZiAoQ3VycmVudFIgPCBUYXJnZXRSKQorICAgICAgICAgICAgICAgIEN1cnJlbnRSID0gVGFyZ2V0UjsKKyAgICAgICAgfQorCisgICAgICAgIEN1cnJlbnRTaG9ydEwgPSAoTFZNX0lOVDE2KShDdXJyZW50TD4+MTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb20gUTMxIHRvIFExNSovCisgICAgICAgIEN1cnJlbnRTaG9ydFIgPSAoTFZNX0lOVDE2KShDdXJyZW50Uj4+MTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb20gUTMxIHRvIFExNSovCisKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0TCk+PjE1KTsgICAgLyogUTE1KlExNT4+MTUgaW50byBRMTUgKi8KKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0Uik+PjE1KTsgICAgLyogUTE1KlExNT4+MTUgaW50byBRMTUgKi8KKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0TCk+PjE1KTsKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0Uik+PjE1KTsKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0TCk+PjE1KTsKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0Uik+PjE1KTsKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0TCk+PjE1KTsKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0Uik+PjE1KTsKKyAgICB9CisgICAgcEluc3RhbmNlTC0+Q3VycmVudD1DdXJyZW50TDsKKyAgICBwSW5zdGFuY2VSLT5DdXJyZW50PUN1cnJlbnRSOworCit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43OGYwMTIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDAwICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWQ19NaXhlcl9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIExWQ29yZV9NSVhTT0ZUXzFTVF9EMTZDMzFfV1JBCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCBMVk1peGVyM19zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit7CisgICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgICBJbkxvb3A7CisgICAgTFZNX0lOVDE2ICAgQ3VycmVudFNob3J0OworICAgIExWTV9JTlQzMiAgIGlpOworICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9zdCAqKShwdHJJbnN0YW5jZS0+UHJpdmF0ZVBhcmFtcyk7CisgICAgTFZNX0lOVDMyICAgRGVsdGE9cEluc3RhbmNlLT5EZWx0YTsKKyAgICBMVk1fSU5UMzIgICBDdXJyZW50PXBJbnN0YW5jZS0+Q3VycmVudDsKKyAgICBMVk1fSU5UMzIgICBUYXJnZXQ9cEluc3RhbmNlLT5UYXJnZXQ7CisgICAgTFZNX0lOVDMyICAgVGVtcDsKKworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CisKKyAgICBpZihDdXJyZW50PFRhcmdldCl7CisgICAgICAgIGlmIChPdXRMb29wKXsKKyAgICAgICAgICAgIEFERDJfU0FUXzMyeDMyKEN1cnJlbnQsRGVsdGEsVGVtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLworICAgICAgICAgICAgQ3VycmVudD1UZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgQ3VycmVudFNob3J0ID0gKExWTV9JTlQxNikoQ3VycmVudD4+MTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb20gUTMxIHRvIFExNSovCisKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9IChMVk1fSU5UMTYpKCgoTFZNX0lOVDMyKSooc3JjKyspICogKExWTV9JTlQzMilDdXJyZW50U2hvcnQpPj4xNSk7ICAgIC8qIFExNSpRMTU+PjE1IGludG8gUTE1ICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgIEFERDJfU0FUXzMyeDMyKEN1cnJlbnQsRGVsdGEsVGVtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLworICAgICAgICAgICAgQ3VycmVudD1UZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgQ3VycmVudFNob3J0ID0gKExWTV9JTlQxNikoQ3VycmVudD4+MTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb20gUTMxIHRvIFExNSovCisKKyAgICAgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydCk+PjE1KTsgICAgLyogUTE1KlExNT4+MTUgaW50byBRMTUgKi8KKyAgICAgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydCk+PjE1KTsKKyAgICAgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydCk+PjE1KTsKKyAgICAgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydCk+PjE1KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNleworICAgICAgICBpZiAoT3V0TG9vcCl7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUTMxICsgUTMxIGludG8gUTMxKi8KKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIEN1cnJlbnRTaG9ydCA9IChMVk1fSU5UMTYpKEN1cnJlbnQ+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLworCisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0KT4+MTUpOyAgICAvKiBRMTUqUTE1Pj4xNSBpbnRvIFExNSAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUTMxICsgUTMxIGludG8gUTMxKi8KKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIEN1cnJlbnRTaG9ydCA9IChMVk1fSU5UMTYpKEN1cnJlbnQ+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLworCisgICAgICAgICAgICAqKGRzdCsrKSA9IChMVk1fSU5UMTYpKCgoTFZNX0lOVDMyKSooc3JjKyspICogKExWTV9JTlQzMilDdXJyZW50U2hvcnQpPj4xNSk7ICAgIC8qIFExNSpRMTU+PjE1IGludG8gUTE1ICovCisgICAgICAgICAgICAqKGRzdCsrKSA9IChMVk1fSU5UMTYpKCgoTFZNX0lOVDMyKSooc3JjKyspICogKExWTV9JTlQzMilDdXJyZW50U2hvcnQpPj4xNSk7CisgICAgICAgICAgICAqKGRzdCsrKSA9IChMVk1fSU5UMTYpKCgoTFZNX0lOVDMyKSooc3JjKyspICogKExWTV9JTlQzMilDdXJyZW50U2hvcnQpPj4xNSk7CisgICAgICAgICAgICAqKGRzdCsrKSA9IChMVk1fSU5UMTYpKCgoTFZNX0lOVDMyKSooc3JjKyspICogKExWTV9JTlQzMilDdXJyZW50U2hvcnQpPj4xNSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcEluc3RhbmNlLT5DdXJyZW50PUN1cnJlbnQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUyYmUxMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkCisgICAgICRSZXZpc2lvbjogMTAwMCAkCisgICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBERUZJTklUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVFJVRSAgICAgICAgICAxCisjZGVmaW5lIEZBTFNFICAgICAgICAgMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTUlYSU5TT0ZUX0QxNkMzMV9TQVQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbikKK3sKKyAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKKyAgICBMVk1fSU5UMzIgICBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CisKKyAgICBpZihuPD0wKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UtPkRlbHRhID09IDB4N0ZGRkZGRkYpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluPXBJbnN0YW5jZS0+VGFyZ2V0Pj4oMTYtcEluc3RhbmNlLT5TaGlmdCk7ICAvLyBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLFRhcmdldEdhaW4pOworICAgICAgICB9ZWxzZSBpZiAoQWJzXzMyKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2Fpbj1wSW5zdGFuY2UtPlRhcmdldD4+KDE2LXBJbnN0YW5jZS0+U2hpZnQpOyAgLy8gVGFyZ2V0R2FpbiBpbiBRMTYuMTUgZm9ybWF0CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSxUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgaWYocEluc3RhbmNlLT5TaGlmdCE9MCl7CisgICAgICAgICAgICAgICAgU2hpZnRfU2F0X3YxNnh2MTYgKChMVk1fSU5UMTYpcEluc3RhbmNlLT5TaGlmdCxzcmMsc3JjLG4pOworICAgICAgICAgICAgICAgIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCAmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYywgZHN0LCBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgIT0gMCl7IC8qIE5vdGhpbmcgdG8gZG8gaW4gY2FzZSBUYXJnZXQgPSAwICovCisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0Pj4xNikgPT0gMHg3RkZGKXsKKyAgICAgICAgICAgICAgICBpZihwSW5zdGFuY2UtPlNoaWZ0IT0wKQorICAgICAgICAgICAgICAgICAgICBTaGlmdF9TYXRfdjE2eHYxNiAoKExWTV9JTlQxNilwSW5zdGFuY2UtPlNoaWZ0LHNyYyxzcmMsbik7CisgICAgICAgICAgICAgICAgQWRkMl9TYXRfMTZ4MTYoIHNyYywgZHN0LCBuICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgIGlmKHBJbnN0YW5jZS0+U2hpZnQhPTApCisgICAgICAgICAgICAgICAgICAgIFNoaWZ0X1NhdF92MTZ4djE2ICgoTFZNX0lOVDE2KXBJbnN0YW5jZS0+U2hpZnQsc3JjLHNyYyxuKTsKKyAgICAgICAgICAgICAgICBNYWMzc19TYXRfMTZ4MTYoc3JjLChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+VGFyZ2V0Pj4xNiksZHN0LG4pOworICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBJbiBjYXNlIHRoZSBMVkNvcmUgZnVuY3Rpb24gd291bGQgaGF2ZSBjaGFuZ2VkIHRoZSBDdXJyZW50IHZhbHVlICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCl7CisgICAgICAgIGlmIChBYnNfMzIocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluPXBJbnN0YW5jZS0+VGFyZ2V0Pj4oMTYtcEluc3RhbmNlLT5TaGlmdCk7ICAvLyBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtLFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKXsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spICggcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSxwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDgzMmUwNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogYmVxMDc3MTYgJAorICAgICAkUmV2aXNpb246IDEwMDAgJAorICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgREVGSU5JVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFRSVUUgICAgICAgICAgMQorI2RlZmluZSBGQUxTRSAgICAgICAgIDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbikKK3sKKyAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKKyAgICBMVk1fSU5UMzIgICBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlMT0oTWl4X1ByaXZhdGVfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlMj0oTWl4X1ByaXZhdGVfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLlByaXZhdGVQYXJhbXMpOworCisgICAgaWYobjw9MCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgIT0gcEluc3RhbmNlMS0+VGFyZ2V0KXx8KHBJbnN0YW5jZTItPkN1cnJlbnQgIT0gcEluc3RhbmNlMi0+VGFyZ2V0KSkKKyAgICB7CisgICAgICAgIGlmKHBJbnN0YW5jZTEtPkRlbHRhID09IDB4N0ZGRkZGRkYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluPXBJbnN0YW5jZTEtPlRhcmdldD4+MTY7ICAvLyBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQsIG5vIGludGVnZXIgcGFydAorICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksVGFyZ2V0R2Fpbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoQWJzXzMyKHBJbnN0YW5jZTEtPkN1cnJlbnQtcEluc3RhbmNlMS0+VGFyZ2V0KSA8IHBJbnN0YW5jZTEtPkRlbHRhKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UxLT5DdXJyZW50ID0gcEluc3RhbmNlMS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2Fpbj1wSW5zdGFuY2UxLT5UYXJnZXQ+PjE2OyAgLy8gVGFyZ2V0R2FpbiBpbiBRMTYuMTUgZm9ybWF0LCBubyBpbnRlZ2VyIHBhcnQKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLFRhcmdldEdhaW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKEhhcmRNaXhpbmcgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocEluc3RhbmNlMi0+RGVsdGEgPT0gMHg3RkZGRkZGRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UyLT5DdXJyZW50ID0gcEluc3RhbmNlMi0+VGFyZ2V0OworICAgICAgICAgICAgICAgIFRhcmdldEdhaW49cEluc3RhbmNlMi0+VGFyZ2V0Pj4xNjsgIC8vIFRhcmdldEdhaW4gaW4gUTE2LjE1IGZvcm1hdCwgbm8gaW50ZWdlciBwYXJ0CisgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChBYnNfMzIocEluc3RhbmNlMi0+Q3VycmVudC1wSW5zdGFuY2UyLT5UYXJnZXQpIDwgcEluc3RhbmNlMi0+RGVsdGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlMi0+Q3VycmVudCA9IHBJbnN0YW5jZTItPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgICAgICBUYXJnZXRHYWluPXBJbnN0YW5jZTItPlRhcmdldD4+MTY7ICAvLyBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQsIG5vIGludGVnZXIgcGFydAorICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLFRhcmdldEdhaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCisgICAgICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoSGFyZE1peGluZyA9PSBGQUxTRSkKKyAgICAgICAgeworICAgICAgICAgICAgIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEoICYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZykKKyAgICB7CisgICAgICAgIGlmICgoKHBJbnN0YW5jZTEtPlRhcmdldD4+MTYpID09IDB4N0ZGRikmJigocEluc3RhbmNlMi0+VGFyZ2V0Pj4xNikgPT0gMHg3RkZGKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoc3JjIT1kc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29weV8xNihzcmMsIGRzdCwgbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCkKKyAgICB7CisgICAgICAgIGlmIChBYnNfMzIocEluc3RhbmNlMS0+Q3VycmVudC1wSW5zdGFuY2UxLT5UYXJnZXQpIDwgcEluc3RhbmNlMS0+RGVsdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluPXBJbnN0YW5jZTEtPlRhcmdldD4+KDE2LXBJbnN0YW5jZTEtPlNoaWZ0KTsgIC8vIFRhcmdldEdhaW4gaW4gUTE2LjE1IGZvcm1hdAorICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKCBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLCBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCkKKyAgICB7CisgICAgICAgIGlmIChBYnNfMzIocEluc3RhbmNlMi0+Q3VycmVudC1wSW5zdGFuY2UyLT5UYXJnZXQpIDwgcEluc3RhbmNlMi0+RGVsdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZTItPkN1cnJlbnQgPSBwSW5zdGFuY2UyLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluPXBJbnN0YW5jZTItPlRhcmdldD4+KDE2LXBJbnN0YW5jZTItPlNoaWZ0KTsgIC8vIFRhcmdldEdhaW4gaW4gUTE2LjE1IGZvcm1hdAorICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjaykgKCBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlLCBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucEdlbmVyYWxQdXJwb3NlLHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2ZiMTIzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogYmVxMDc3MTYgJAorICAgICAkUmV2aXNpb246IDEwMDAgJAorICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgREVGSU5JVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFRSVUUgICAgICAgICAgMQorI2RlZmluZSBGQUxTRSAgICAgICAgIDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIExWTWl4ZXIzX01JWFNPRlRfMVNUX0QxNkMzMV9TQVQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKQoreworICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOworICAgIExWTV9JTlQzMiAgIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfc3QgICpwSW5zdGFuY2U9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKworICAgIGlmKG48PTApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkKKyAgICB7CisgICAgICAgIGlmKHBJbnN0YW5jZS0+RGVsdGEgPT0gMHg3RkZGRkZGRil7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIFRhcmdldEdhaW49cEluc3RhbmNlLT5UYXJnZXQ+PigxNi1wSW5zdGFuY2UtPlNoaWZ0KTsgIC8vIFRhcmdldEdhaW4gaW4gUTE2LjE1IGZvcm1hdAorICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNlIGlmIChBYnNfMzIocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluPXBJbnN0YW5jZS0+VGFyZ2V0Pj4oMTYtcEluc3RhbmNlLT5TaGlmdCk7ICAvLyBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLFRhcmdldEdhaW4pOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCisgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CisgICAgICAgICAgICBpZihwSW5zdGFuY2UtPlNoaWZ0IT0wKXsKKyAgICAgICAgICAgICAgICBTaGlmdF9TYXRfdjE2eHYxNiAoKExWTV9JTlQxNilwSW5zdGFuY2UtPlNoaWZ0LHNyYyxkc3Qsbik7CisgICAgICAgICAgICAgICAgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSggJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBkc3QsIGRzdCwgbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSggJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPT0gMCkKKyAgICAgICAgICAgIExvYWRDb25zdF8xNigwLCBkc3QsIG4pOworICAgICAgICBlbHNlIGlmKHBJbnN0YW5jZS0+U2hpZnQhPTApeworICAgICAgICAgICAgU2hpZnRfU2F0X3YxNnh2MTYgKChMVk1fSU5UMTYpcEluc3RhbmNlLT5TaGlmdCxzcmMsZHN0LG4pOworICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldD4+MTYpICE9IDB4N0ZGRikKKyAgICAgICAgICAgICAgICBNdWx0M3NfMTZ4MTYoIGRzdCwgKExWTV9JTlQxNikocEluc3RhbmNlLT5UYXJnZXQ+PjE2KSwgZHN0LCBuICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0Pj4xNikgIT0gMHg3RkZGKQorICAgICAgICAgICAgICAgIE11bHQzc18xNngxNiggc3JjLCAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPlRhcmdldD4+MTYpLCBkc3QsIG4gKTsKKyAgICAgICAgICAgIGVsc2UgaWYoc3JjIT1kc3QpCisgICAgICAgICAgICAgICAgQ29weV8xNihzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCl7CisgICAgICAgIGlmIChBYnNfMzIocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluPXBJbnN0YW5jZS0+VGFyZ2V0Pj4oMTYtcEluc3RhbmNlLT5TaGlmdCk7ICAvLyBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtLFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKXsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spICggcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSxwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYxODQ3MzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogYmVxMDc3MTYgJAorICAgICAkUmV2aXNpb246IDEwMDAgJAorICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDE2ICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgbikKK3sKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZTE9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZTI9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5Qcml2YXRlUGFyYW1zKTsKKworICAgIGlmKG48PTApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ID09IHBJbnN0YW5jZTEtPlRhcmdldCkmJihwSW5zdGFuY2UxLT5DdXJyZW50ID09IDApKXsKKyAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIChMVk1peGVyM18xU3Rfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIHNyYzIsIGRzdCwgbik7CisgICAgfQorICAgIGVsc2UgaWYgKChwSW5zdGFuY2UyLT5DdXJyZW50ID09IHBJbnN0YW5jZTItPlRhcmdldCkmJihwSW5zdGFuY2UyLT5DdXJyZW50ID09IDApKXsKKyAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIChMVk1peGVyM18xU3Rfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYzEsIGRzdCwgbik7CisgICAgfQorICAgIGVsc2UgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ICE9IHBJbnN0YW5jZTEtPlRhcmdldCkgfHwgKHBJbnN0YW5jZTItPkN1cnJlbnQgIT0gcEluc3RhbmNlMi0+VGFyZ2V0KSkKKyAgICB7CisgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKChMVk1peGVyM18xU3Rfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYzEsIGRzdCwgbik7CisgICAgICAgIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggKExWTWl4ZXIzXzFTdF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwgc3JjMiwgZHN0LCBuKTsKKyAgICB9CisgICAgZWxzZXsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICBIQVJEIE1JWElORworICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBpZihwSW5zdGFuY2UyLT5TaGlmdCE9MCkKKyAgICAgICAgICAgIFNoaWZ0X1NhdF92MTZ4djE2ICgoTFZNX0lOVDE2KXBJbnN0YW5jZTItPlNoaWZ0LHNyYzIsc3JjMixuKTsKKyAgICAgICAgaWYocEluc3RhbmNlMS0+U2hpZnQhPTApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNoaWZ0X1NhdF92MTZ4djE2ICgoTFZNX0lOVDE2KXBJbnN0YW5jZTEtPlNoaWZ0LHNyYzEsZHN0LG4pOworICAgICAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwgJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwgZHN0LCBzcmMyLCBkc3QsIG4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sIHNyYzEsIHNyYzIsIGRzdCwgbik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2IzMmUyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlci5oCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDAwICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19MVkNfTUlYRVJfSF9fCisjZGVmaW5lIF9fTFZDX01JWEVSX0hfXworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTlNUQU5DRSBNRU1PUlkgVFlQRSBERUZJTklUSU9OCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTFZNaXhlcjNfc3Qgc3RydWN0dXJlIHN0b3JlcyBJbnN0YW5jZSBwYXJhbWV0ZXJzIGZvciBvbmUgYXVkaW8gc3RyZWFtICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQzMiAgICAgICBQcml2YXRlUGFyYW1zWzRdOyAgIC8qIFByaXZhdGUgSW5zdGFuY2UgcGFyYW1zIGZvciBBdWRpbyBTdHJlYW0gKi8KKyAgICBMVk1fSU5UMTYgICAgICAgQ2FsbGJhY2tTZXQ7ICAgICAgICAvKiBCb29sZWFuLiAgU2hvdWxkIGJlIHNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uIGVhY2ggdGltZSB0aGUgdGFyZ2V0IHZhbHVlIGlzIHVwZGF0ZWQgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgQ2FsbGJhY2tQYXJhbTsgICAgICAvKiBQYXJhbWV0ZXIgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGNhbGJhY2sgZnVuY3Rpb24gKi8KKyAgICB2b2lkICAgICAgICAgICAgKnBDYWxsYmFja0hhbmRsZTsgICAvKiBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKyAgICB2b2lkICAgICAgICAgICAgKnBHZW5lcmFsUHVycG9zZTsgICAvKiBQb2ludGVyIGZvciBnZW5lcmFsIHB1cnBvc2UgdXNhZ2UgKi8KKyAgICBMVk1fQ2FsbGJhY2sgICAgcENhbGxCYWNrOyAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLworfSBMVk1peGVyM19zdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1peGVyM19zdCAgICAgTWl4ZXJTdHJlYW1bMV07ICAgIC8qIEluc3RhbmNlIFBhcmFtcyBmb3Igb25lIEF1ZGlvIFN0cmVhbSAqLworfSBMVk1peGVyM18xU3Rfc3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNaXhlcjNfc3QgICAgIE1peGVyU3RyZWFtWzJdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIHR3byBBdWRpbyBTdHJlYW1zICovCit9IExWTWl4ZXIzXzJTdF9zdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1peGVyM19zdCAgICAgTWl4ZXJTdHJlYW1bM107ICAgIC8qIEluc3RhbmNlIFBhcmFtcyBmb3IgdGhyZWUgQXVkaW8gU3RyZWFtcyAqLworfSBMVk1peGVyM18zU3Rfc3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBQUk9UT1RZUEVTIChISUdIIExFVkVMIEZVTkNUSU9OUykKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGdW5jdGlvbiBuYW1lcyBzaG91bGQgYmUgdW5pcXVlIHdpdGhpbiBmaXJzdCAxNiBjaGFyYWN0ZXJzICAqLworI2RlZmluZSAgICBMVk1peGVyM19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUICAgTFZNaXhlcjNfMVN0X0QxNkMzMV9TQVRfTWl4U29mdAorI2RlZmluZSAgICBMVk1peGVyM19NaXhJblNvZnRfRDE2QzMxX1NBVCAgICAgTFZNaXhlcjNfRDE2QzMxX1NBVF9NaXhJblNvZnQKKyNkZWZpbmUgICAgTFZNaXhlcjNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCAgIExWTWl4ZXIzXzJTdF9EMTZDMzFfU0FUX01peFNvZnQKKyNkZWZpbmUgICAgTFZNaXhlcjNfTWl4U29mdF8zU3RfRDE2QzMxX1NBVCAgIExWTWl4ZXIzXzNTdF9EMTZDMzFfU0FUX01peFNvZnQKKworCisvKioqIEdlbmVyYWwgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaGlzIHRpbWUgY29uc3RhbnQgY2FsY3VsYXRpb24gZnVuY3Rpb24gYXNzdW1lcyB0aGUgbWl4ZXIgd2lsbCBiZSBjYWxsZWQgd2l0aCAgKi8KKy8qIGxhcmdlIGJsb2NrIHNpemVzLiBXaGVuIHRoZSBibG9jayBzaXplIGlzIHNtYWxsLCBlc3BlY2lhbGx5IGlmIGxlc3MgdGhhbiA0LCAgICAqLworLyogdGhlbiB0aGUgY2FsY3VsYXRpb24gd2lsbCBnaXZlIGFuIGluY29ycmVjdCB2YWx1ZSBmb3IgYWxwaGEsIHNlZSB0aGUgbWl4ZXIgICAgICovCisvKiBkb2N1bWVudGF0aW9uIGZvciBmdXJ0aGVyIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUYXJnZXRHYWluKTsKKworTFZNX0lOVDMyIExWQ19NaXhlcl9HZXRUYXJnZXQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtKTsKKworTFZNX0lOVDMyIExWQ19NaXhlcl9HZXRDdXJyZW50KCBMVk1peGVyM19zdCAqcFN0cmVhbSk7CisKK3ZvaWQgTFZDX01peGVyX0luaXQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRhcmdldEdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgQ3VycmVudEdhaW4pOworCit2b2lkIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzKTsKKwordm9pZCBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyk7CisKKy8qKiogMTYgYml0IGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7CisKK3ZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7CisKK3ZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpkc3QsICAvKiBkc3QgY2Fubm90IGJlIGVxdWFsIHRvIHNyYzIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZvciBhcHBseWluZyBkaWZmZXJlbnQgZ2FpbnMgdG8gTGVmdCBhbmQgcmlnaHQgY2hlbm5hbHMgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTWl4ZXJTdHJlYW1bMF0gYXBwbGllcyB0byBMZWZ0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBNaXhlclN0cmVhbVsxXSBhcHBsaWVzIHRvIFJpZ2h0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEdhaW4gdmFsdWVzIHNob3VsZCBub3QgYmUgbW9yZSB0aGF0IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3Rfc3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9JTlQxNiAgICAgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpkc3QsICAgLyogZHN0IGNhbiBiZSBlcXVhbCB0byBzcmMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIG4pOyAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNlbmRpZiAvLyNpZm5kZWYgX19MVkNfTUlYRVJfSF9fCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRDdXJyZW50LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0Q3VycmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA5NjU4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0Q3VycmVudC5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFByb2plY3Q6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDgzOSAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0xNiAxNDoxNTo1MiArMDIwMCAoV2VkLCAxNiBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBMVk1peGVyM19HZXRDdXJyZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgQ3VycmVudEdhaW4gaW4gUTE2LjE1IGZvcm1hdCAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEN1cnJlbnRHYWluICAgICAgLSBDdXJyZW50R2FpbiB2YWx1ZSBpbiBRIDE2LjE1IGZvcm1hdCAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fSU5UMzIgTFZDX01peGVyX0dldEN1cnJlbnQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtKQoreworICAgIExWTV9JTlQzMiAgICAgICBDdXJyZW50R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZT0oTWl4X1ByaXZhdGVfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworICAgIEN1cnJlbnRHYWluPXBJbnN0YW5jZS0+Q3VycmVudD4+KDE2LXBJbnN0YW5jZS0+U2hpZnQpOyAgLy8gQ3VycmVudEdhaW4gaW4gUTE2LjE1IGZvcm1hdAorICAgIHJldHVybiBDdXJyZW50R2FpbjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZDJjZjk0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFByb2plY3Q6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDgzOSAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0xNiAxNDoxNTo1MiArMDIwMCAoV2VkLCAxNiBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgTFZNaXhlcjNfR2V0VGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIFRhcmdldEdhaW4gaW4gUTE2LjE1IGZvcm1hdCAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUYXJnZXRHYWluICAgICAgLSBUYXJnZXRHYWluIHZhbHVlIGluIFEgMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX0lOVDMyIExWQ19NaXhlcl9HZXRUYXJnZXQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtKQoreworICAgIExWTV9JTlQzMiAgICAgICBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisKKyAgICBUYXJnZXRHYWluPXBJbnN0YW5jZS0+VGFyZ2V0Pj4oMTYtcEluc3RhbmNlLT5TaGlmdCk7ICAvLyBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQKKworICAgIHJldHVybiBUYXJnZXRHYWluOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzYxZTQ2OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Jbml0LmMKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgTFZNaXhlcjNfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGludGlhbGl6YXRpb24gZnVuY3Rpb24gaW50aWFsaXplcyB0aGUgcHJpdmF0ZSBpbnN0YW5jZSAgICAgICAgICovCisvKiAgcGFyYW10ZXJzIGZvciBhIGdpdmVuIEF1ZGlvIFN0cmVhbSBiYXNlZCBvbiBUYXJnZXRHYWluIGFuZCAgICAgICAgICAqLworLyogIEN1cnJlbnRHYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGNhY2x1bGF0ZXMgdGhlICJTaGlmdCIgcmVxdWlyZWQgdG8gcHJvdmlkZSB0aGUgICAgICAgICovCisvKiAgaW50ZWdlciBwYXJ0IG9mIFRhcmdldEdhaW4gYW5kIGZyYWN0aW9uYWwgZ2FpbiB2YWx1ZXMgIlRhcmdldCIgYW5kICAqLworLyogICJDdXJyZW50IiBiYXNlZCBvbiBtYXhpbXVtKFRhcmdldEdhaW4sQ3VycmVudEdhaW4pICAgICAgICAgICAgICAgICAgKi8KKy8qICBFLmcuIEN1cnJlbnRHYWluPTEuOSBhbmQgVGFyZ2V0R2Fpbj0yLjUgdGhlbiBiYXNlZCBvbiAgICAgICAgICAgICAgICovCisvKiAgTWF4R2FpbiBvZiAyLjUsIFNoaWZ0ID0gMiwgQ3VycmVudD0xLjkvND0wLjQ3NSwgVGFyZ2V0PTIuNS80PTAuNjI1ICAqLworLyogIFRoZXJlZm9yZSBpbnRlZ2VyIGdhaW4gb2YgNCBpcyBwcm92aWRlZCBieSBMZWZ0IFNoaWZ0IG9mIDIgYW5kICAgICAgKi8KKy8qICBmcmFjdGlvbiBnYWluIGlzIHByb3ZpZGVkIHRocm91Z2ggQ3VycmVudD0wLjQ3NSBhbmQgVGFyZ2V0PTAuNjI1ICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBTdHJlYW0gICAgIC0gcHRyIHRvIEluc3RhbmNlIFBhcmFtZXRlciBTdHJ1Y3R1cmUgTFZNaXhlcjNfc3QgZm9yIGFuKi8KKy8qICAgICAgICAgICAgICAgIEF1ZGlvIFN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGFyZ2V0R2FpbiAgLSBUYXJnZXRHYWluIHZhbHVlIGluIFEgMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAqLworLyogIEN1cnJlbnRHYWluIC0gQ3VycmVudEdhaW4gdmFsdWUgaW4gUSAxNi4xNSBmb3JtYXQgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19NaXhlcl9Jbml0KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUYXJnZXRHYWluLAorICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIEN1cnJlbnRHYWluKQoreworICAgIExWTV9JTlQxNiAgICAgICBTaGlmdD0wOworICAgIExWTV9JTlQzMiAgICAgICBNYXhHYWluPVRhcmdldEdhaW47ICAgICAgICAgLy8gTWF4R2FpbiBpcyBpbiBRMTYuMTUgZm9ybWF0CisgICAgTWl4X1ByaXZhdGVfc3QgICpwSW5zdGFuY2U9KE1peF9Qcml2YXRlX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBpZihDdXJyZW50R2Fpbj5NYXhHYWluKQorICAgICAgICBNYXhHYWluPUN1cnJlbnRHYWluOyAgICAgICAgICAgICAgICAgICAgLy8gTWF4R2Fpbj1tYXgoQ3VycmVudEdhaW4sVGFyZ2V0R2FpbikKKworICAgIE1heEdhaW49TWF4R2Fpbj4+MTU7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF4R2FpbiBpbiBRMzEuMCBmb3JtYXQgaS5lIEludGVnZXIgcGFydCBvbmx5CisgICAgd2hpbGUoTWF4R2Fpbj4wKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgU2hpZnQgcmVxdWlyZWQgdG8gcHJvdmlkZSBpbnRlZ2VyIGdhaW4KKyAgICAgICAgU2hpZnQrKzsKKyAgICAgICAgTWF4R2Fpbj1NYXhHYWluPj4xOworICAgIH0KKyAgICBwSW5zdGFuY2UtPlRhcmdldD1UYXJnZXRHYWluPDwoMTYtU2hpZnQpOyAgIC8vIFVwZGF0ZSBmcmFjdGlvbmFsIGdhaW4gVGFyZ2V0CisgICAgcEluc3RhbmNlLT5DdXJyZW50PUN1cnJlbnRHYWluPDwoMTYtU2hpZnQpOyAvLyBVcGRhdGUgZnJhY3Rpb25hbCBnYWluIEN1cnJlbnQKKyAgICBwSW5zdGFuY2UtPlNoaWZ0PVNoaWZ0OyAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBTaGlmdAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNjFkNjcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkCisgICAgICRSZXZpc2lvbjogMTAwMCAkCisgICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fTFZDX01JWEVSX1BSSVZBVEVfSF9fCisjZGVmaW5lIF9fTFZDX01JWEVSX1BSSVZBVEVfSF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWQ19NaXhlci5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyogSW5zdGFuY2UgcGFyYW1ldGVyIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBHZW5lcmFsICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXQ7ICAgICAgICAgICAgICAgICAvKiAzMiBiaXQgbnVtYmVyIHNwZWNpZnlpbmcgZnJhY3Rpb25hbCB2YWx1ZSBvZiBUYXJnZXQgR2FpbiAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudDsgICAgICAgICAgICAgICAgLyogMzIgYml0IG51bWJlciBzcGVjaWZ5aW5nIGZyYWN0aW9uYWwgdmFsdWRlIG9mIEN1cnJlbnQgR2FpbiAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgU2hpZnQ7ICAgICAgICAgICAgICAgICAgLyogTGVmdCBTaGlmdCBmb3IgSW50ZWdlciBwYXJ0IG9mIEdhaW4gKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIERlbHRhOyAgICAgICAgICAgICAgICAgIC8qIDMyIGJpdCBudW1iZXIgc3BlY2lmeWluZyB0aGUgZnJhY3Rpb25hbCB2YWx1ZSBvZiBEZWx0YSBHYWluICovCit9IE1peF9Qcml2YXRlX3N0OworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIERFRklOSVRJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTFZDb3JlX01peEluU29mdF9EMzJDMzFfU0FUICAgIExWQ29yZV9JblNvZnRfRDMyQzMxX1NBVAorI2RlZmluZSBMVkNvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQSAgTFZDb3JlX1NvZnRfMVN0X0QzMkMzMV9XUkEKKyNkZWZpbmUgTFZDb3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQgIExWQ29yZV9IYXJkXzJTdF9EMzJDMzFfU0FUCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBQUk9UT1RZUEVTIChMT1cgTEVWRUwgU1VCRlVOQ1RJT05TKQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiogMTYgYml0IGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKwordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCBMVk1peGVyM19zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKwordm9pZCBMVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAqcEluc3RhbmNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX3N0ICAgICAgICAgKnBJbnN0YW5jZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRm9yIGFwcGx5aW5nIGRpZmZlcmVudCBnYWlucyB0byBMZWZ0IGFuZCByaWdodCBjaGVubmFscyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBwdHJJbnN0YW5jZTEgYXBwbGllcyB0byBMZWZ0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHB0ckluc3RhbmNlMiBhcHBsaWVzIHRvIFJpZ2h0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogR2FpbiB2YWx1ZXMgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYXQgMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKCBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgKmRzdCwgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbik7ICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGb3IgYXBwbHlpbmcgZGlmZmVyZW50IGdhaW5zIHRvIExlZnQgYW5kIHJpZ2h0IGNoZW5uYWxzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHB0ckluc3RhbmNlMSBhcHBsaWVzIHRvIExlZnQgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcHRySW5zdGFuY2UyIGFwcGxpZXMgdG8gUmlnaHQgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBHYWluIHZhbHVlcyBzaG91bGQgbm90IGJlIG1vcmUgdGhhdCAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgKmRzdCwgICAgLyogZHN0IGNhbiBiZSBlcXVhbCB0byBzcmMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgIG4pOyAgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLworCisKKworLyoqKiAzMiBiaXQgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworCit2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEoIExWTWl4ZXIzX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworCit2b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwSW5zdGFuY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICAqcEluc3RhbmNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNlbmRpZiAvLyNpZm5kZWYgX19MVkNfTUlYRVJfUFJJVkFURV9IX18KKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRkM2ZlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGFyZ2V0LmMKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgTFZNaXhlcjNfU2V0VGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIHByaXZhdGUgaW5zdGFuY2UgcGFyYW1ldGVyczogU2hpZnQsVGFyZ2V0LCovCisvKiAgQ3VycmVudCBmb3IgYSBnaXZlbiBBdWRpbyBTdHJlYW0gYmFzZWQgb24gbmV3IHZhbHVlIG9mIFRhcmdldEdhaW4gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGNhY2x1bGF0ZXMgdGhlICJTaGlmdCIgcmVxdWlyZWQgdG8gcHJvdmlkZSB0aGUgICAgICAgICovCisvKiAgaW50ZWdlciBwYXJ0IG9mIFRhcmdldEdhaW4gYW5kIGZyYWN0aW9uYWwgZ2FpbiB2YWx1ZXMgIlRhcmdldCIgYW5kICAqLworLyogICJDdXJyZW50IiBiYXNlZCBvbiBtYXhpbXVtKFRhcmdldEdhaW4sQ3VycmVudEdhaW4pICAgICAgICAgICAgICAgICAgKi8KKy8qICBFLmcuIEN1cnJlbnRHYWluPTEuOSBhbmQgVGFyZ2V0R2Fpbj0yLjUgdGhlbiBiYXNlZCBvbiAgICAgICAgICAgICAgICovCisvKiAgTWF4R2FpbiBvZiAyLjUsIFNoaWZ0ID0gMiwgQ3VycmVudD0xLjkvND0wLjQ3NSwgVGFyZ2V0PTIuNS80PTAuNjI1ICAqLworLyogIFRoZXJlZm9yZSBpbnRlZ2VyIGdhaW4gb2YgNCBpcyBwcm92aWRlZCBieSBMZWZ0IFNoaWZ0IG9mIDIgYW5kICAgICAgKi8KKy8qICBmcmFjdGlvbiBnYWluIGlzIHByb3ZpZGVkIHRocm91Z2ggQ3VycmVudD0wLjQ3NSBhbmQgVGFyZ2V0PTAuNjI1ICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBTdHJlYW0gICAgICAgICAtIHB0ciB0byBJbnN0YW5jZSBQYXJhbWV0ZXIgU3RydWN0dXJlIExWTWl4ZXIzX3N0ICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICBmb3IgYW4gQXVkaW8gU3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGFyZ2V0R2FpbiAgICAgIC0gVGFyZ2V0R2FpbiB2YWx1ZSBpbiBRIDE2LjE1IGZvcm1hdCAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZDX01peGVyX1NldFRhcmdldChMVk1peGVyM19zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGFyZ2V0R2FpbikKK3sKKyAgICBMVk1fSU5UMzIgICAgICAgU2hpZnQ9MDsKKyAgICBMVk1fSU5UMzIgICAgICAgQ3VycmVudEdhaW47CisgICAgTFZNX0lOVDMyICAgICAgIE1heEdhaW49VGFyZ2V0R2FpbjsgICAgICAgICAgICAgICAgICAgICAvLyBNYXhHYWluIGlzIGluIFExNi4xNSBmb3JtYXQKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZT0oTWl4X1ByaXZhdGVfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworICAgIEN1cnJlbnRHYWluPXBJbnN0YW5jZS0+Q3VycmVudD4+KDE2LXBJbnN0YW5jZS0+U2hpZnQpOyAgLy8gQ3VycmVudEdhaW4gaW4gUTE2LjE1IGZvcm1hdAorICAgIGlmKEN1cnJlbnRHYWluPk1heEdhaW4pCisgICAgICAgIE1heEdhaW49Q3VycmVudEdhaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXhHYWluPW1heChDdXJyZW50R2FpbixUYXJnZXRHYWluKQorCisgICAgTWF4R2Fpbj1NYXhHYWluPj4xNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXhHYWluIGluIFEzMS4wIGZvcm1hdCBpLmUgSW50ZWdlciBwYXJ0IG9ubHkKKyAgICB3aGlsZShNYXhHYWluPjApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBTaGlmdCByZXF1aXJlZCB0byBwcm92aWRlIGludGVnZXIgZ2FpbgorICAgICAgICBTaGlmdCsrOworICAgICAgICBNYXhHYWluPU1heEdhaW4+PjE7CisgICAgfQorICAgIHBJbnN0YW5jZS0+VGFyZ2V0PVRhcmdldEdhaW48PCgxNi1TaGlmdCk7ICAgICAgICAgICAgICAgLy8gVXBkYXRlIGZyYWN0aW9uYWwgZ2FpbiBUYXJnZXQKKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudEdhaW48PCgxNi1TaGlmdCk7ICAgICAgICAgICAgIC8vIFVwZGF0ZSBmcmFjdGlvbmFsIGdhaW4gQ3VycmVudAorICAgIHBJbnN0YW5jZS0+U2hpZnQ9U2hpZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIFNoaWZ0Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGYwZmQzNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuYwpAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorI2luY2x1ZGUgIkxWQ19NaXhlcl9Qcml2YXRlLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBMVk1peGVyM19TZXRUaW1lQ29uc3RhbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgc3RlcCBjaGFuZ2UgZm9yIGZyYWN0aW9uYWwgZ2FpbiBmb3IgYSAgKi8KKy8qICBnaXZlbiB0aW1lIGNvbnN0YW50LCBzYW1wbGUgcmF0ZSBhbmQgbnVtIGNoYW5uZWxzICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVsdGE9KDIxNDc0ODM2NDcqNCoxMDAwKS8oTnVtQ2hhbm5lbHMqU2FtcGxlUmF0ZSpUY19taWxsaXNlYykgICAgICAqLworLyogIGluIFEgMC4zMSBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBTdHJlYW0gICAgIC0gcHRyIHRvIEluc3RhbmNlIFBhcmFtZXRlciBTdHJ1Y3R1cmUgTFZNaXhlcjNfc3QgZm9yIGFuKi8KKy8qICAgICAgICAgICAgICAgIEF1ZGlvIFN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGNfbWlsbGlzZWMgLSBUaW1lQ29uc3RhbnQgaS5lIHRpbWUgcmVxdWlyZWQgaW4gbWlsbGkgc2Vjb25kIHRvICAgICAqLworLyogICAgICAgICAgICAgICAgZ28gZnJvbSBsaW5lYXIgZnJhY3Rpb25hbCBnYWluIG9mIDAgdG8gMC45OTk5OTk5OSAgICAgKi8KKy8qICBGcyAgICAgICAgICAtIExWTV9Gc19lbiBlbnVtZXJhdG9yIGZvciBTYW1wbGluZyBGcmVxdWVuY3kgICAgICAgICAgICovCisvKiAgTnVtQ2hhbm5lbHMgLSBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gQXVkaW8gU3RyZWFtIDE9TW9ubywgMj1TdGVyZW8gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFVQREFURVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVsdGEgICAgICAgLSB0aGUgc3RlcCBjaGFuZ2UgZm9yIGZyYWN0aW9uYWwgZ2FpbiBwZXIgNCBzYW1wbGVzICAgICAqLworLyogICAgICAgICAgICAgICAgaW4gUTAuMzEgZm9ybWF0IGZvciBhIGdpdmVuIFRpbWUgQ29uc3RhbnQsICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgIFNhbXBsZSBSYXRlIGFuZCBOdW1DaGFubmVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZDX01peGVyX1NldFRpbWVDb25zdGFudChMVk1peGVyM19zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscykKK3sKKyAgICBMVk1fSU5UMzIgICBEZWx0YVRhYmxlWzldPXsxMDczNzQxODI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc3OTEzMjM4OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTU4Mjc4ODIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM2ODcwOTEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4OTU2NjE5NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNTc5MTM5NDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjY4NDM1NDU2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5NDc4MzA5NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzg5NTY5NzF9OworICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisgICAgTFZNX0lOVDMyICAgRGVsdGE9RGVsdGFUYWJsZVtGc107CisgICAgRGVsdGE9RGVsdGE+PihOdW1DaGFubmVscy0xKTsKKworICAgIGlmKFRjX21pbGxpc2VjPT0wKQorICAgICAgICBEZWx0YT0weDdGRkZGRkZGOworICAgIGVsc2UKKyAgICAgICAgRGVsdGE9RGVsdGEvVGNfbWlsbGlzZWM7CisKKyAgICBpZihEZWx0YT09MCkKKyAgICAgICAgRGVsdGE9MTsgICAgICAgICAgICAgICAgLy8gSWYgVGltZSBDb25zdGFudCBpcyBzbyBsYXJnZSB0aGF0IERlbHRhIGlzIDAsIGFzc2lnbiBtaW5pbXVtIHZhbHVlIHRvIERlbHRhCisKKyAgICBwSW5zdGFuY2UtPkRlbHRhPURlbHRhOyAgICAgLy8gRGVsdGE9KDIxNDc0ODM2NDcqNCoxMDAwKS8oTnVtQ2hhbm5lbHMqU2FtcGxlUmF0ZSpUY19taWxsaXNlYykgaW4gUSAwLjMxIGZvcm1hdAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQyMGFmOWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmMKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFByb2plY3Q6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDAgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgTFZNaXhlcjNfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHN0ZXAgY2hhbmdlIGZvciBmcmFjdGlvbmFsIGdhaW4gZm9yIGEgICovCisvKiAgZ2l2ZW4gdGltZSBjb25zdGFudCwgc2FtcGxlIHJhdGUgYW5kIG51bSBjaGFubmVscyAgICAgICAgICAgICAgICAgICAqLworLyogIERlbHRhPSgyMTQ3NDgzNjQ3KjQqMTAwMCkvKE51bUNoYW5uZWxzKlNhbXBsZVJhdGUqVGNfbWlsbGlzZWMpICAgICAgKi8KKy8qICBpbiBRIDAuMzEgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwU3RyZWFtICAgICAtIHB0ciB0byBJbnN0YW5jZSBQYXJhbWV0ZXIgU3RydWN0dXJlIExWTWl4ZXIzX3N0IGZvciBhbiovCisvKiAgICAgICAgICAgICAgICBBdWRpbyBTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRjX21pbGxpc2VjIC0gVGltZUNvbnN0YW50IGkuZSB0aW1lIHJlcXVpcmVkIGluIG1pbGxpIHNlY29uZCB0byAgICAgKi8KKy8qICAgICAgICAgICAgICAgIGdvIGZyb20gbGluZWFyIGZyYWN0aW9uYWwgZ2FpbiBvZiAwIHRvIDAuOTk5OTk5OTkgICAgICovCisvKiAgRnMgICAgICAgICAgLSBMVk1fRnNfZW4gZW51bWVyYXRvciBmb3IgU2FtcGxpbmcgRnJlcXVlbmN5ICAgICAgICAgICAqLworLyogIE51bUNoYW5uZWxzIC0gTnVtYmVyIG9mIGNoYW5uZWxzIGluIEF1ZGlvIFN0cmVhbSAxPU1vbm8sIDI9U3RlcmVvICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVUERBVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlbHRhICAgICAgIC0gdGhlIHN0ZXAgY2hhbmdlIGZvciBmcmFjdGlvbmFsIGdhaW4gcGVyIDQgc2FtcGxlcyAgICAgKi8KKy8qICAgICAgICAgICAgICAgIGluIFEwLjMxIGZvcm1hdCBmb3IgYSBnaXZlbiBUaW1lIENvbnN0YW50LCAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICBTYW1wbGUgUmF0ZSBhbmQgTnVtQ2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzKQoreworICAgIExWTV9JTlQzMiAgIERlbHRhVGFibGVbOV09ezEwNzM3NDE4MjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzc5MTMyMzg5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxNTgyNzg4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzY4NzA5MTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzg5NTY2MTk0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1NzkxMzk0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjg0MzU0NTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTk0NzgzMDk3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3ODk1Njk3MX07CisgICAgTWl4X1ByaXZhdGVfc3QgICpwSW5zdGFuY2U9KE1peF9Qcml2YXRlX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBMVk1fSU5UMzIgICBEZWx0YT1EZWx0YVRhYmxlW0ZzXTsKKworICAgIExWTV9JTlQzMiAgIEN1cnJlbnQ7CisgICAgTFZNX0lOVDMyICAgVGFyZ2V0OworCisgICAgRGVsdGE9RGVsdGE+PihOdW1DaGFubmVscy0xKTsKKworICAgIC8qICBHZXQgZ2FpbiB2YWx1ZXMgICovCisgICAgQ3VycmVudCA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCBwU3RyZWFtICk7CisgICAgVGFyZ2V0ID0gTFZDX01peGVyX0dldFRhcmdldCggcFN0cmVhbSApOworCisgICAgaWYgKEN1cnJlbnQgIT0gVGFyZ2V0KQorICAgIHsKKyAgICAgICAgVGNfbWlsbGlzZWMgPSBUY19taWxsaXNlYyAqIDMyNzY3IC8gKEN1cnJlbnQgLSBUYXJnZXQpOworICAgICAgICBpZiAoVGNfbWlsbGlzZWM8MCkgVGNfbWlsbGlzZWMgPSAtVGNfbWlsbGlzZWM7CisKKyAgICAgICAgaWYoVGNfbWlsbGlzZWM9PTApCisgICAgICAgICAgICBEZWx0YT0weDdGRkZGRkZGOworICAgICAgICBlbHNlCisgICAgICAgICAgICBEZWx0YT1EZWx0YS9UY19taWxsaXNlYzsKKworICAgICAgICBpZihEZWx0YT09MCkKKyAgICAgICAgICAgIERlbHRhPTE7ICAgICAgICAgICAgLy8gSWYgVGltZSBDb25zdGFudCBpcyBzbyBsYXJnZSB0aGF0IERlbHRhIGlzIDAsIGFzc2lnbiBtaW5pbXVtIHZhbHVlIHRvIERlbHRhCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERlbHRhID0xOyAgICAgICAgICAgICAgIC8vIE1pbmltdW0gdmFsdWUgZm9yIHByb3BlciBjYWxsLWJhY2tzIChzZXR0aW5nIGl0IHRvIHplcm8gaGFzIHNvbWUgcHJvYmxlbXMsIHRvIGJlIGNvcnJlY3RlZCkKKyAgICB9CisKKworICAgIHBJbnN0YW5jZS0+RGVsdGE9RGVsdGE7ICAgICAvLyBEZWx0YT0oMjE0NzQ4MzY0Nyo0KjEwMDApLyhOdW1DaGFubmVscypTYW1wbGVSYXRlKlRjX21pbGxpc2VjKSBpbiBRIDAuMzEgZm9ybWF0Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fSFBGLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fSFBGLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzdjMTk5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuYwpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IG54cDI3MDc4ICQqLworLyogICAgICRSZXZpc2lvbjogNzYyICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTExIDE0OjUwOjMzICswMjAwICh2ciwgMTEganVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisjaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkZpbHRlci5oIgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICB2b2lkIExWTV9GT19MUEYoICAgTFZNX0lOVDMyICAgICAgIHcgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgIEZPX0MzMl9Db2Vmc190ICAqcENvZWZmcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGNvZWZmaWNpZW50IG9mIGZpcnN0IG9yZGVyIGxvdyBwYXNzICAgICAqLworLyogICAgZmlsdGVyLiBJdCB1c2VzIHRoZSBlcXVhdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBCMSAgICA9ICh0YW4ody8yKSAtIDEgKSAgLyAgKHRhbih3LzIpICsgMSApICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQTAgICAgPSAoMSAtIEIxKSAvIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEExICAgID0gQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhlIHZhbHVlIG9mIEIxIGlzIHRoZW4gY2FsY3VsYXRlZCBkaXJlY3RseSBmcm9tIHRoZSB2YWx1ZSB3IGJ5IGEgICAgKi8KKy8qICAgIHBvbHlub21pYWwgZXhwYW5zaW9uIHVzaW5nIGEgOXRoIG9yZGVyIHBvbHlub21pYWwuIEl0IHVzZXMgdGhlICAgICAgICovCisvKiAgICBmb2xsb3dpbmcgdGFibGUgb2YgMzItYml0IGludGVnZXIgcG9seW5vbWlhbCBjb2VmZmljaWVudHM6ICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQ29lZmZpY2llbnQgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEEwICAgICAgICAgICAgIC04Mzg4NTcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBMSAgICAgICAgICAgICAzMzU0Nzc0NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTIgICAgICAgICAgICAgLTY2ODE2NzkxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEEzICAgICAgICAgICAgIDE3MzM3NTMwOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBNCAgICAgICAgICAgICAtMzg4NDM3NTczICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTUgICAgICAgICAgICAgNzUyOTc1MzgzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE2ICAgICAgICAgICAgIC0xMTAzMDE2NjYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBNyAgICAgICAgICAgICAxMTIxODQ4NTY3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTggICAgICAgICAgICAgLTY4ODA3ODE1OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE5ICAgICAgICAgICAgIDE5NDY2OTU3NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBMTAgICAgICAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgWSA9IChBMCArIEExKlggKyBBMipYMiArIEEzKlgzICsghS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB3ICAgICAgICAgICAgICAgU2FtcGxlIHJhdGUgaW4gcmFkaWFucywgIHdoZXJlOiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIHcgPSAyICogUGkgKiBGYyAvIEZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICBGYyAgIGlzIHRoZSBjb3JuZXIgZnJlcXVlbmN5IGluIEh6ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgRnMgICBpcyB0aGUgc2FtcGxlIHJhdGUgaW4gSHogICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIHcgaXMgaW4gUTIuMjkgZm9ybWF0IGFuZCBkYXRhIHJhbmdlIGlzIFswIFBpXSAgICAgICAgICAqLworLyogIHBDb2VmZnMgICAgICAgICBQb2ludHMgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgY2FsY3VsYXRlZCBoZXJlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgaW4gUTEuMzAgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0xWTV9JTlQzMiBMVk1fRk9fSFBGKCAgIExWTV9JTlQzMiAgICAgICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzMyX0NvZWZzX3QgICpwQ29lZmZzKQoreworICAgIExWTV9JTlQzMiBZLENvZWZmaWNpZW50c1sxM109eyAgLTgzODg1NzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMzU0Nzc0NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02NjgxNjc5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3MzM3NTMwOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zODg0Mzc1NzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NTI5NzUzODMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTEwMzAxNjY2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMjE4NDg1NjcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNjg4MDc4MTU5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTk0NjY5NTc3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwfTsKKyAgICBZPUxWTV9Qb2x5bm9taWFsKCAgICAgICAgICAgKExWTV9VSU5UMTYpOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZWZmaWNpZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcpOworICAgIHBDb2VmZnMtPkIxPS1ZOyAgICAgICAgIC8qIFN0b3JlIC1CMSBpbiBmaWx0ZXIgc3RydWN0dXJlIGluc3RlYWQgb2YgQjEhKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBMD0oMS1CMSkvMj0gQjEvMiAtIDAuNSovCisgICAgWT1ZPj4xOyAgICAgICAgICAgICAgICAgLyogQTA9WT1CMS8yKi8KKyAgICBZPVktMHg0MDAwMDAwMDsgICAgICAgICAvKiBBMD1ZPShCMS8yIC0gMC41KSovCisgICAgTVVMMzJ4MTZJTlRPMzIoWSwgRklMVEVSX0xPU1MgLHBDb2VmZnMtPkEwICwxNSkgICAgIC8qIEFwcGx5IGxvc3MgdG8gYXZvaWQgb3ZlcmZsb3cqLworICAgIHBDb2VmZnMtPkExPS1wQ29lZmZzLT5BMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdG9yZSBBMT0tQTAqLworCisgICAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19MUEYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19MUEYuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YzczZDU5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0ZPX0xQRi5jCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogbnhwMjcwNzggJCovCisvKiAgICAgJFJldmlzaW9uOiA3NjIgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMTEgMTQ6NTA6MzMgKzAyMDAgKHZyLCAxMSBqdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiRmlsdGVyLmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHZvaWQgTFZNX0ZPX0xQRiggICBMVk1fSU5UMzIgICAgICAgdyAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgRk9fQzMyX0NvZWZzX3QgICpwQ29lZmZzKTsgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgY29lZmZpY2llbnQgb2YgZmlyc3Qgb3JkZXIgbG93IHBhc3MgICAgICovCisvKiAgICBmaWx0ZXIuIEl0IHVzZXMgdGhlIGVxdWF0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEIxICAgID0gKHRhbih3LzIpIC0gMSApICAvICAodGFuKHcvMikgKyAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBMCAgICA9ICgxICsgQjEpIC8gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQTEgICAgPSBBMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgdmFsdWUgb2YgQjEgaXMgdGhlbiBjYWxjdWxhdGVkIGRpcmVjdGx5IGZyb20gdGhlIHZhbHVlIHcgYnkgYSAgICAqLworLyogICAgcG9seW5vbWlhbCBleHBhbnNpb24gdXNpbmcgYSA5dGggb3JkZXIgcG9seW5vbWlhbC4gSXQgdXNlcyB0aGUgICAgICAgKi8KKy8qICAgIGZvbGxvd2luZyB0YWJsZSBvZiAzMi1iaXQgaW50ZWdlciBwb2x5bm9taWFsIGNvZWZmaWNpZW50czogICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBDb2VmZmljaWVudCAgICBWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTAgICAgICAgICAgICAgLTgzODg1NzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEExICAgICAgICAgICAgIDMzNTQ3NzQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBMiAgICAgICAgICAgICAtNjY4MTY3OTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTMgICAgICAgICAgICAgMTczMzc1MzA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE0ICAgICAgICAgICAgIC0zODg0Mzc1NzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBNSAgICAgICAgICAgICA3NTI5NzUzODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTYgICAgICAgICAgICAgLTExMDMwMTY2NjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE3ICAgICAgICAgICAgIDExMjE4NDg1NjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBOCAgICAgICAgICAgICAtNjg4MDc4MTU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTkgICAgICAgICAgICAgMTk0NjY5NTc3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEExMCAgICAgICAgICAgIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyCFLi4gKyBBTip4TikgPDwgQU4rMSAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHcgICAgICAgICAgICAgICBTYW1wbGUgcmF0ZSBpbiByYWRpYW5zLCAgd2hlcmU6ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgdyA9IDIgKiBQaSAqIEZjIC8gRnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIEZjICAgaXMgdGhlIGNvcm5lciBmcmVxdWVuY3kgaW4gSHogICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICBGcyAgIGlzIHRoZSBzYW1wbGUgcmF0ZSBpbiBIeiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgdyBpcyBpbiBRMi4yOSBmb3JtYXQgYW5kIGRhdGEgcmFuZ2UgaXMgWzAgUGldICAgICAgICAgICovCisvKiAgcENvZWZmcyAgICAgICAgIFBvaW50cyB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBjYWxjdWxhdGVkIGhlcmUgICAgICAqLworLyogICAgICAgICAgICAgICAgICBpbiBRMS4zMCBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworTFZNX0lOVDMyIExWTV9GT19MUEYoICAgTFZNX0lOVDMyICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgKnBDb2VmZnMpCit7CisgICAgTFZNX0lOVDMyIFksQ29lZmZpY2llbnRzWzEzXT17ICAtODM4ODU3MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzNTQ3NzQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTY2ODE2NzkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTczMzc1MzA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTM4ODQzNzU3MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc1Mjk3NTM4MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMTAzMDE2NjYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEyMTg0ODU2NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02ODgwNzgxNTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTQ2Njk1NzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4fTsKKyAgICBZPUxWTV9Qb2x5bm9taWFsKCAgICAgICAgICAgKExWTV9VSU5UMTYpOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZWZmaWNpZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcpOworICAgIHBDb2VmZnMtPkIxPS1ZOyAgICAgLy8gU3RvcmUgLUIxIGluIGZpbHRlciBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiBCMSEKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEwPSgxK0IxKS8yPSBCMS8yICsgMC41CisgICAgWT1ZPj4xOyAgICAgICAgICAgICAvLyBBMD1ZPUIxLzIKKyAgICBZPVkrMHg0MDAwMDAwMDsgICAgIC8vIEEwPVk9KEIxLzIgKyAwLjUpCisgICAgTVVMMzJ4MTZJTlRPMzIoWSwgRklMVEVSX0xPU1MgLHBDb2VmZnMtPkEwICwxNSkgICAgLy8gQXBwbHkgbG9zcyB0byBhdm9pZCBvdmVyZmxvdworICAgIHBDb2VmZnMtPkExPXBDb2VmZnMtPkEwOworICAgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFjYzEwZGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuYwpAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogbnhwMjcwNzggJCovCisvKiAgICAgJFJldmlzaW9uOiA3NjIgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMTEgMTQ6NTA6MzMgKzAyMDAgKHZyLCAxMSBqdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkZpbHRlci5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZWZpbmVzIGFuZCBUYWJsZXMgZm9yIDIqUGkvRnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTFZWRExfMlBpQnlfODAwMCAgICAgICAgMTcyNzEwODgyNiAgLyogSW4gUTQxIGZvcm1hdCAqLworI2RlZmluZSBMVlZETF8yUGlCeV8xMTAyNSAgICAgICAxMjUzMjMwODk0ICAvKiBJbiBRNDEgZm9ybWF0ICovCisjZGVmaW5lIExWVkRMXzJQaUJ5XzEyMDAwICAgICAgIDExNTE0MDU4ODQgIC8qIEluIFE0MSBmb3JtYXQgKi8KKworI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMSAgICAxMiAgICAgICAgICAvKiBRZm9ybWF0IHNoaWZ0IGZvciA4a0h6LCAxMS4wMjVrSHogYW5kIDEya0h6IGkuZS4gMTI9NDEtMjkgKi8KKyNkZWZpbmUgTFZWRExfMlBpQnlGc19TSElGVDIgICAgMTMgICAgICAgICAgLyogUWZvcm1hdCBzaGlmdCBmb3IgMTZrSHosIDIyLjA1MGtIeiBhbmQgMjRrSHogaS5lLiAxMz00Mi0yOSAqLworI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMyAgICAxNCAgICAgICAgICAvKiBRZm9ybWF0IHNoaWZ0IGZvciAzMmtIeiwgNDQuMWtIeiBhbmQgNDhrSHogaS5lLiAxND00My0yOSAqLworCitjb25zdCBMVk1fSU5UMzIgICAgIExWVkRMXzJQaU9uRnNUYWJsZVtdID0gIHtMVlZETF8yUGlCeV84MDAwICwgLyogOGtIeiBpbiBRNDEsIDE2a0h6IGluIFE0MiwgMzJrSHogaW4gUTQzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzExMDI1LCAgLyogMTEwMjUgSHogaW4gUTQxLCAyMjA1MEh6IGluIFE0MiwgNDQxMDAgSHogaW4gUTQzKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMTIwMDB9OyAvKiAxMmtIeiBpbiBRNDEsIDI0a0h6IGluIFE0MiwgNDhrSHogaW4gUTQzICovCisKKworY29uc3QgTFZNX0lOVDMyICAgICBMVlZETF8yUGlPbkZzU2hpZnRUYWJsZVtdPXtMVlZETF8yUGlCeUZzX1NISUZUMSAsICAgICAgICAgLyogOGtIeiwgMTEwMjVIeiwgMTJrSHogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlGc19TSElGVDIsICAgICAgICAgIC8qIDE2a0h6LCAyMjA1MEh6LCAyNGtIeiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5RnNfU0hJRlQzfTsgICAgICAgICAvKiAzMmtIeiwgNDQxMDBIeiwgNDhrSHogKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIExWTV9HZXRPbWVnYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIExWTV9JTlQzMiBMVk1fR2V0T21lZ2EoTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIEZjLCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICBGcykgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgdmFsdWUgb2YgdyB1c2luZyBGYyBhbmQgRnMgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9VSU5UMTYgICAgICAgICAgRmMgICAgIFRoZSBjb3JuZXIgZnJlcXVlbmN5IGluIEh6IFExNi4wIGZvcm1hdCAgICAgKi8KKy8qICBMVk1fRnNfZW4gICAgICAgICAgIEZzICAgICBUaGUgU2FtcGxlUmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICB3PTIqcGkqRmMvRnMgaW4gUTIuMjkgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0xWTV9JTlQzMiBMVk1fR2V0T21lZ2EoTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIEZjLAorICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICAgRnMpCit7CisgICAgTFZNX0lOVDMyICAgdzsKKyAgICBNVUwzMngzMklOVE8zMigoTFZNX0lOVDMyKUZjLExWVkRMXzJQaU9uRnNUYWJsZVtGcyUzXSx3LExWVkRMXzJQaU9uRnNTaGlmdFRhYmxlW0ZzLzNdKQorICAgIHJldHVybiB3OworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfRmlsdGVyQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfRmlsdGVyQ29lZmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDAyMzVlMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9GaWx0ZXJDb2VmZnMuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBNaXhlciBsaWJyYXJ5IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIENvZWZmaWNpZW50cyBhbmQgdGFibGUgdmFsdWVzIGZvciB0aGUgbWl4ZXIgbGlicmFyeSwgZ2VuZXJhdGVkIGJ5IHRoZSBNYXRsYWIgICAgICovCisvKiBTY3JpcHQ6IE1peGVyX0dlbmVyYXRlQ29lZmZzLm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19MVk1fTUlYRVJfRklMVEVSX0NPRUZGU19IX18KKyNkZWZpbmUgX19MVk1fTUlYRVJfRklMVEVSX0NPRUZGU19IX18KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFscGhhIFRpbWUgQ29uc3RhbnQgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBBbHBoYV9UYWJsZVNpemUgICAgICAgICAgICAgICAgICAgICAgICA1MCAgICAgIC8qIFRoZSBudW1iZXIgb2YgdGFibGUgZW50aXJlcyAqLworI2RlZmluZSBBTFBIQV8wICAgICAgICAgICAgICAgICAgICAgICAgMjE0NzQ4MDc2OSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5OTkgKi8KKyNkZWZpbmUgQUxQSEFfMSAgICAgICAgICAgICAgICAgICAgICAgIDIxNDc0Nzk1NzcgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTk4ICovCisjZGVmaW5lIEFMUEhBXzIgICAgICAgICAgICAgICAgICAgICAgICAyMTQ3NDc3ODkyICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk5NyAqLworI2RlZmluZSBBTFBIQV8zICAgICAgICAgICAgICAgICAgICAgICAgMjE0NzQ3NTUxMCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5OTYgKi8KKyNkZWZpbmUgQUxQSEFfNCAgICAgICAgICAgICAgICAgICAgICAgIDIxNDc0NzIxNDEgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTk1ICovCisjZGVmaW5lIEFMUEhBXzUgICAgICAgICAgICAgICAgICAgICAgICAyMTQ3NDY3Mzc3ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk5MiAqLworI2RlZmluZSBBTFBIQV82ICAgICAgICAgICAgICAgICAgICAgICAgMjE0NzQ2MDY0MiAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5ODkgKi8KKyNkZWZpbmUgQUxQSEFfNyAgICAgICAgICAgICAgICAgICAgICAgIDIxNDc0NTExMTggICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTg1ICovCisjZGVmaW5lIEFMUEhBXzggICAgICAgICAgICAgICAgICAgICAgICAyMTQ3NDM3NjUxICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk3OSAqLworI2RlZmluZSBBTFBIQV85ICAgICAgICAgICAgICAgICAgICAgICAgMjE0NzQxODYwOCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5NzAgKi8KKyNkZWZpbmUgQUxQSEFfMTAgICAgICAgICAgICAgICAgICAgICAgIDIxNDczOTE2ODMgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTU3ICovCisjZGVmaW5lIEFMUEhBXzExICAgICAgICAgICAgICAgICAgICAgICAyMTQ3MzUzNjExICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTkzOSAqLworI2RlZmluZSBBTFBIQV8xMiAgICAgICAgICAgICAgICAgICAgICAgMjE0NzI5OTc3OSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5MTQgKi8KKyNkZWZpbmUgQUxQSEFfMTMgICAgICAgICAgICAgICAgICAgICAgIDIxNDcyMjM2NjIgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5ODc5ICovCisjZGVmaW5lIEFMUEhBXzE0ICAgICAgICAgICAgICAgICAgICAgICAyMTQ3MTE2MDM3ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTgyOSAqLworI2RlZmluZSBBTFBIQV8xNSAgICAgICAgICAgICAgICAgICAgICAgMjE0Njk2Mzg2NSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk3NTggKi8KKyNkZWZpbmUgQUxQSEFfMTYgICAgICAgICAgICAgICAgICAgICAgIDIxNDY3NDg3MTIgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5NjU4ICovCisjZGVmaW5lIEFMUEhBXzE3ICAgICAgICAgICAgICAgICAgICAgICAyMTQ2NDQ0NTIyICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTUxNiAqLworI2RlZmluZSBBTFBIQV8xOCAgICAgICAgICAgICAgICAgICAgICAgMjE0NjAxNDQ3MiAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTkzMTYgKi8KKyNkZWZpbmUgQUxQSEFfMTkgICAgICAgICAgICAgICAgICAgICAgIDIxNDU0MDY1MjcgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5MDMzICovCisjZGVmaW5lIEFMUEhBXzIwICAgICAgICAgICAgICAgICAgICAgICAyMTQ0NTQ3MTg4ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5ODYzMyAqLworI2RlZmluZSBBTFBIQV8yMSAgICAgICAgICAgICAgICAgICAgICAgMjE0MzMzMjY2OSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTgwNjcgKi8KKyNkZWZpbmUgQUxQSEFfMjIgICAgICAgICAgICAgICAgICAgICAgIDIxNDE2MTY1MTQgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk3MjY4ICovCisjZGVmaW5lIEFMUEhBXzIzICAgICAgICAgICAgICAgICAgICAgICAyMTM5MTkyMjE1ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5NjEzOSAqLworI2RlZmluZSBBTFBIQV8yNCAgICAgICAgICAgICAgICAgICAgICAgMjEzNTc2ODkzOSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTQ1NDUgKi8KKyNkZWZpbmUgQUxQSEFfMjUgICAgICAgICAgICAgICAgICAgICAgIDIxMzA5Mzc3NzQgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTkyMjk1ICovCisjZGVmaW5lIEFMUEhBXzI2ICAgICAgICAgICAgICAgICAgICAgICAyMTI0MTI1MTUzICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk4OTEyMyAqLworI2RlZmluZSBBTFBIQV8yNyAgICAgICAgICAgICAgICAgICAgICAgMjExNDUyOTI2MyAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45ODQ2NTQgKi8KKyNkZWZpbmUgQUxQSEFfMjggICAgICAgICAgICAgICAgICAgICAgIDIxMDEwMzQ2MTIgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTc4MzcwICovCisjZGVmaW5lIEFMUEhBXzI5ICAgICAgICAgICAgICAgICAgICAgICAyMDgyMTAwMDMwICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk2OTU1MyAqLworI2RlZmluZSBBTFBIQV8zMCAgICAgICAgICAgICAgICAgICAgICAgMjA1NTYxNzM5OCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45NTcyMjEgKi8KKyNkZWZpbmUgQUxQSEFfMzEgICAgICAgICAgICAgICAgICAgICAgIDIwMTg3NDQ4MjQgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTQwMDUxICovCisjZGVmaW5lIEFMUEhBXzMyICAgICAgICAgICAgICAgICAgICAgICAxOTY3NzMzMDE1ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjkxNjI5NyAqLworI2RlZmluZSBBTFBIQV8zMyAgICAgICAgICAgICAgICAgICAgICAgMTg5Nzc5NDU4NyAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC44ODM3MjkgKi8KKyNkZWZpbmUgQUxQSEFfMzQgICAgICAgICAgICAgICAgICAgICAgIDE4MDMxMjMyMzQgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuODM5NjQ1ICovCisjZGVmaW5lIEFMUEhBXzM1ICAgICAgICAgICAgICAgICAgICAgICAxNjc3MjYyMjIwICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjc4MTAzNiAqLworI2RlZmluZSBBTFBIQV8zNiAgICAgICAgICAgICAgICAgICAgICAgMTUxNDE0MjY3NSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC43MDUwNzggKi8KKyNkZWZpbmUgQUxQSEFfMzcgICAgICAgICAgICAgICAgICAgICAgIDEzMTAxOTc4NzUgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuNjEwMTA4ICovCisjZGVmaW5lIEFMUEhBXzM4ICAgICAgICAgICAgICAgICAgICAgICAxMDY3ODEzNDgwICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjQ5NzIzOSAqLworI2RlZmluZSBBTFBIQV8zOSAgICAgICAgICAgICAgICAgICAgICAgIDc5OTYwMTM3MSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4zNzIzNDMgKi8KKyNkZWZpbmUgQUxQSEFfNDAgICAgICAgICAgICAgICAgICAgICAgICA1MzExODMwNDkgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMjQ3MzUxICovCisjZGVmaW5lIEFMUEhBXzQxICAgICAgICAgICAgICAgICAgICAgICAgMjk3OTA0MDA3ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjEzODcyMiAqLworI2RlZmluZSBBTFBIQV80MiAgICAgICAgICAgICAgICAgICAgICAgIDEzMTQ5OTc2OCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wNjEyMzQgKi8KKyNkZWZpbmUgQUxQSEFfNDMgICAgICAgICAgICAgICAgICAgICAgICAgNDEzNzUyODIgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDE5MjY3ICovCisjZGVmaW5lIEFMUEhBXzQ0ICAgICAgICAgICAgICAgICAgICAgICAgICA4MDY1ODk5ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMzc1NiAqLworI2RlZmluZSBBTFBIQV80NSAgICAgICAgICAgICAgICAgICAgICAgICAgIDc5OTA3NiAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAzNzIgKi8KKyNkZWZpbmUgQUxQSEFfNDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAzOTggICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAwMDE0ICovCisjZGVmaW5lIEFMUEhBXzQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjk5ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDAwMCAqLworI2RlZmluZSBBTFBIQV80OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAwMDAgKi8KKyNkZWZpbmUgQUxQSEFfNDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAwMDAwICovCisjZGVmaW5lIEFMUEhBXzUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDAwMCAqLworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRiNjk3NWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfVGltZUNvbnN0YW50LmMKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFByb2plY3Q6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDAgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisjaW5jbHVkZSAiTWl4ZXIuaCIKKyNpbmNsdWRlICJMVk1fTWl4ZXJfRmlsdGVyQ29lZmZzLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIExWTV9NaXhfR2V0VGltZUNvbnN0YW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBmaWx0ZXIgY29lZmZpY2llbnQgdXNpbmcgdGhlIGZvbGxvd2luZyAqLworLyogIGVxdWF0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIEFscGhhID0gZXhwKGxuKDAuMSkvICh0YyAqIFVwZGF0ZSArIDEuMCkpICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgaXMgdG8gYmUgdXNlZCB3aXRoIHRoZSBmb2xsb3cgZmlyc3Qgb3JkZXIgZmlsdGVyLCBjYWxsZWQgYXQgYSAgKi8KKy8qICByYXRlIG9mIFVwZGF0ZSB0aW1lcyBhIHNlY29uZC4gdGMgaXMgdGhlIHJlcXVpcmVkIHRpbWUgY29uc3RhbnQgaW4gICovCisvKiAgdW5pdHMgb2YgMTAwdXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIE91dHB1dChuKSA9IEFscGhhICogT3V0cHV0KG4tMSkgKyAoMSAtIEFscGhhKSAqIFRhcmdldChuKSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBmdW5jdGlvbiBhc3N1bWVzIHRoZSBibG9jayBzaXplIGlzIGxhcmdlLCBpLmUuIHRoZSB1cGRhdGUgcmF0ZSAgKi8KKy8qICBpcyBhcHByb3hpbWF0ZWx5IGEgZml4ZWQsIGFuZCBjb3JyZWN0IGZhY3RvciBvZiB0aGUgdmFsdWUgb2YgRnMgICAgICovCisvKiAgZ2l2ZW4gaW4gdGhlIGNhbGwuIFRoaXMgaXMgZXNwZWNpYWxseSBub3QgdHJ1ZSB3aGVuIHRoZSBibG9jayBzaXplICAqLworLyogIGlzIHZlcnkgc21hbGwsIHNlZSB0aGUgbWl4ZXIgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzLiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIGZ1bmN0aW9uIGRvZXMgbm90IHN1cHBvcnQgYWxsIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiBpbnB1dCAgICAqLworLyogIHZhbHVlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gTnVtQ2hhbm5lbHMgaXMgbGltaXRlZCB0byB0aGUgdmFsdWVzIDEgKE1vbm8pIGFuZCAyIChTdGVyZW8pICAgICAqLworLyogIDIuIFRoZSBwcm9kdWN0IHRjICogRnMgaXMgbGltaXRlZCBhcHByb3hpbWF0ZWx5IHRvIHRoZSByYW5nZSAgICAgICAgKi8KKy8qICAgICAgOCA8ICh0YyAqIEZzKSA8IDJeMzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB0YyAgICAgICAgICAgICAgLSB0aGUgdGltZSBjb25zdGFudCBpbiAxMDB1cyBzdGVwcywgaS5lLiAxMCA9IDFtcyAgICovCisvKiAgRnMgICAgICAgICAgICAgIC0gdGhlIGZpbHRlciB1cGRhdGUgcmF0ZSBpbiBIeiAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE51bUNoYW5uZWxzICAgICAtIE51bWJlciBvZiBjaGFubmVscyAxPU1vbm8sIDI9U3RlcmVvICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFscGhhICAgLSB0aGUgZmlsdGVyIGNvZWZmaWNpZW50IFEzMSBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fVUlOVDMyIExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZNX1VJTlQzMiAgIHRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgTnVtQ2hhbm5lbHMpCit7CisKKyAgICBMVk1fVUlOVDMyICBQcm9kdWN0OworICAgIExWTV9JTlQxNiAgIEludGVycG9sYXRlOworICAgIExWTV9VSU5UMTYgIFNoaWZ0OworICAgIExWTV9JTlQzMiAgIERpZmY7CisgICAgTFZNX1VJTlQzMiAgVGFibGVbXSA9IHtBTFBIQV8wLCAgICAgICAgICAgICAvKiBMb2cgc3BhY2VkIGxvb2stdXAgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV84LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8xMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8xNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8xOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzE5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8yMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8yNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8yNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMjksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8zMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8zMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzM0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8zNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzM3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8zOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfNDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV80MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzQzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfNDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV80NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzQ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfNDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV80OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzQ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfNTB9OworCisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIHByb2R1Y3Qgb2YgdGhlIHRpbWUgY29uc3RhbnQgYW5kIHRoZSBzYW1wbGUgcmF0ZSAqLworICAgIFByb2R1Y3QgPSAoKHRjID4+IDE2KSAqIChMVk1fVUlOVDMyKUZzKSA8PCAxMzsgIC8qIFN0ZXJlbyB2YWx1ZSAqLworICAgIFByb2R1Y3QgPSBQcm9kdWN0ICsgKCgodGMgJiAweDAwMDBGRkZGKSAqIChMVk1fVUlOVDMyKUZzKSA+PiAzKTsKKworICAgIGlmIChOdW1DaGFubmVscyA9PSAxKQorICAgIHsKKyAgICAgICAgUHJvZHVjdCA9IFByb2R1Y3QgPj4gMTsgICAvKiBNb25vIHZhbHVlICovCisgICAgfQorCisgICAgLyogTm9ybWFsaXplIHRvIGdldCB0aGUgdGFibGUgaW5kZXggYW5kIGludGVycG9sYXRpb24gZmFjdG9yICovCisgICAgZm9yIChTaGlmdD0wOyBTaGlmdDwoKEFscGhhX1RhYmxlU2l6ZS0xKS8yKTsgU2hpZnQrKykKKyAgICB7CisgICAgICAgIGlmICgoUHJvZHVjdCAmIDB4ODAwMDAwMDApIT0wKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIFByb2R1Y3QgPSBQcm9kdWN0IDw8IDE7CisgICAgfQorICAgIFNoaWZ0ID0gKExWTV9VSU5UMTYpKChTaGlmdCA8PCAxKSk7CisKKyAgICBpZiAoKFByb2R1Y3QgJiAweDQwMDAwMDAwKT09MCkKKyAgICB7CisgICAgICAgIFNoaWZ0Kys7CisgICAgfQorCisgICAgSW50ZXJwb2xhdGUgPSAoTFZNX0lOVDE2KSgoUHJvZHVjdCA+PiAxNSkgJiAweDAwMDA3RkZGKTsKKworICAgIERpZmYgPSAoTFZNX0lOVDMyKShUYWJsZVtTaGlmdF0gLSBUYWJsZVtTaGlmdCsxXSk7CisgICAgTVVMMzJ4MTZJTlRPMzIoRGlmZixJbnRlcnBvbGF0ZSxEaWZmLDE1KQorICAgICAgICBQcm9kdWN0ID0gVGFibGVbU2hpZnQrMV0gKyAoTFZNX1VJTlQzMilEaWZmOworCisgICAgcmV0dXJuIFByb2R1Y3Q7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG9seW5vbWlhbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1BvbHlub21pYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iOGNmNGI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1BvbHlub21pYWwuYwpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBMVk1fUG9seW5vbWlhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHBvbHlub21pYWwgZXhwYW5zaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyCFLi4gKyBBTip4TikgPDwgQU4rMSAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9JTlQzMiBMVk1fUG9seW5vbWlhbChMVk1fVUlOVDE2ICAgIE4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICpwQ29lZmZpY2llbnRzLCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICBYKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE4gICAgICAgICAgICAgICAgaXMgdGhlIHBvbHlub21pYWwgb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ29lZmZpY2llbnRzICAgIGlzIHRoZSBwdHIgdG8gcG9seW5vbWlhbCBjb2VmZmljaWVudHMgQTAsQTEuLiBpbiBRLjMxICovCisvKiAgWCAgICAgICAgICAgICAgICBpcyB0aGUgaW5wdXQgdmFyaWFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZSByZXN1bHQgb2YgdGhlIHBvbHlub21pYWwgZXhwYW5zaW9uIGluIFExLjMxIGZvcm1hdCAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworTFZNX0lOVDMyIExWTV9Qb2x5bm9taWFsKExWTV9VSU5UMTYgICAgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgKnBDb2VmZmljaWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgIFgpCit7CisgICAgTFZNX0lOVDMyIGk7CisgICAgTFZNX0lOVDMyIFksQSxYVGVtcCxUZW1wLHNpZ247CisKKyAgICBZPSpwQ29lZmZpY2llbnRzOyAvKiBZPUEwKi8KKyAgICBwQ29lZmZpY2llbnRzKys7CisKKyAgICBpZigoTFZNX1VJTlQzMilYPT0weDgwMDAwMDAwKQorICAgIHsKKyAgICAgICAgVGVtcD0tMTsKKyAgICAgICAgc2lnbj1UZW1wOworICAgICAgICBmb3IoaT0xO2k8PU47aSsrKQorICAgICAgICB7CisgICAgICAgICAgICBZKz0oKCpwQ29lZmZpY2llbnRzKSpzaWduKTsKKyAgICAgICAgICAgIHBDb2VmZmljaWVudHMrKzsKKyAgICAgICAgICAgIHNpZ24qPVRlbXA7CisgICAgICAgIH0KKworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFhUZW1wPVg7CisgICAgICAgIGZvcihpPU4tMTtpPj0wO2ktLSkKKyAgICAgICAgeworICAgICAgICAgICAgQT0qcENvZWZmaWNpZW50czsKKyAgICAgICAgICAgIHBDb2VmZmljaWVudHMrKzsKKworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIoQSxYVGVtcCxUZW1wLDMxKQorICAgICAgICAgICAgWSs9VGVtcDsKKworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIoWFRlbXAsWCxUZW1wLDMxKQorICAgICAgICAgICAgWFRlbXA9VGVtcDsKKyAgICAgICAgfQorICAgIH0KKyAgICBBPSpwQ29lZmZpY2llbnRzOworICAgIHBDb2VmZmljaWVudHMrKzsKKworICAgIGlmKEE8MCkKKyAgICB7CisgICAgICAgIEE9QWJzXzMyKEEpOworICAgICAgICBZPVk+PkE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFkgPSBZPDxBOworICAgIH0KKyAgICByZXR1cm4gWTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1Bvd2VyMTAuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb3dlcjEwLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWEzZjYzMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb3dlcjEwLmMKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiRmlsdGVyLmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIExWTV9Qb3dlcjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyAxMFggdXNpbmcgYW4gMTF0aCBvcmRlciBwb2x5bm9taWFsLiBJdCB1c2VzICAqLworLyogICB0aGUgZm9sbG93aW5nIHRhYmxlIG9mIDMyLWJpdCBpbnRlZ2VyIHBvbHlub21pYWwgY29lZmZpY2llbnRzOiAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIENvZWZmaWNpZW50ICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBMCAgICAgICAgICAgICA2NzEwMjU0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTEgICAgICAgICAgICAgMzA5MDMyOTk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEEyICAgICAgICAgICAgIDcxMjA5NjEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBMyAgICAgICAgICAgICAxMDkyNzk3MzMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTQgICAgICAgICAgICAgMTI1MTYyNTEzNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE1ICAgICAgICAgICAgIDExNTQ2NDk0NjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBNiAgICAgICAgICAgICA5MTU2NTQ4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTcgICAgICAgICAgICAgNTk3ODgzNjgzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE4ICAgICAgICAgICAgIDI4NDM3ODIzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBOSAgICAgICAgICAgICAxNTAyNjIwOTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTEwICAgICAgICAgICAgMTI0ODk0NDcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEExMSAgICAgICAgICAgIDUwNDc3MjQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBMTIgICAgICAgICAgICAtMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgWSA9IChBMCArIEExKlggKyBBMipYMiArIEEzKlgzICsghS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBYICAgICAgICAgICAgICAgaXMgdGhlIGlucHV0IHZhcmlhYmxlIGluIFEyLjMwIGZvcm1hdCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhlIHJlc3VsdCBvZiB0aGUgMTB4IGV4cGFuc2lvbiBpbiBROC4yNCBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitMVk1fSU5UMzIgTFZNX1Bvd2VyMTAoTFZNX0lOVDMyICAgICBYKQoreworICAgIExWTV9JTlQzMiBZLENvZWZmaWNpZW50c1sxM109eyAgMTY3NzU2MzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzcyNTgyNDksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzgwMjQwMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzMxOTkzMzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTI5MDYyODQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODg2NjIzNjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjg5MTM3MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDk0NzA5MjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzEwOTQ1NTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzc1NjU1MjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEyMjM2MTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI2MTkzMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMH07CisgICAgWT1MVk1fUG9seW5vbWlhbCgoTFZNX1VJTlQxNikxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvZWZmaWNpZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIFgpOworICAgIHJldHVybiBZOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9UaW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ0OWFhZGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXIuYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICBNeSBQcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBJTkNMVURFIEZJTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVk1fVGltZXIuaCIKKyNpbmNsdWRlICJMVk1fVGltZXJfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBUSU1FUiBGVU5DVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZNX1RpbWVyICAgICAgKCAgIExWTV9UaW1lcl9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICBCbG9ja1NpemUgKXsKKworICAgIExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QgKnBJbnN0YW5jZVByOworICAgIHBJbnN0YW5jZVByID0gKExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QgKilwSW5zdGFuY2U7CisKKyAgICBpZiAocEluc3RhbmNlUHItPlRpbWVyQXJtZWQpeworICAgICAgICBwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcyAtPSBCbG9ja1NpemU7CisgICAgICAgIGlmIChwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcyA8PSAwKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZVByLT5UaW1lckFybWVkID0gMDsKKyAgICAgICAgICAgICgqcEluc3RhbmNlUHItPnBDYWxsQmFjaykgKCBwSW5zdGFuY2VQci0+cENhbGxiYWNrSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlUHItPnBDYWxsQmFja1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2VQci0+Q2FsbEJhY2tQYXJhbSApOworICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBFTkQgT0YgRklMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXJfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyX0luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNDczMDM4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyX0luaXQuYwpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICBNeSBQcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBJTkNMVURFIEZJTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVk1fVGltZXIuaCIKKyNpbmNsdWRlICJMVk1fVGltZXJfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgREVGSU5JVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE9uZU92ZXJUaG91c2FuZEluUTI0IDE2Nzc3CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIElOSVQgRlVOQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVk1fVGltZXJfSW5pdCAoICAgTFZNX1RpbWVyX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9UaW1lcl9QYXJhbXNfdCAgICAgICAgICpwUGFyYW1zICAgICApeworCisgICAgTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCAqcEluc3RhbmNlUHI7CisgICAgcEluc3RhbmNlUHIgPSAoTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCAqKXBJbnN0YW5jZTsKKworICAgIHBJbnN0YW5jZVByLT5DYWxsQmFja1BhcmFtICAgICA9IHBQYXJhbXMtPkNhbGxCYWNrUGFyYW07CisgICAgcEluc3RhbmNlUHItPnBDYWxsQmFja1BhcmFtcyAgID0gcFBhcmFtcy0+cENhbGxCYWNrUGFyYW1zOworICAgIHBJbnN0YW5jZVByLT5wQ2FsbGJhY2tJbnN0YW5jZSA9IHBQYXJhbXMtPnBDYWxsYmFja0luc3RhbmNlOworICAgIHBJbnN0YW5jZVByLT5wQ2FsbEJhY2sgICAgICAgICA9IHBQYXJhbXMtPnBDYWxsQmFjazsKKyAgICBwSW5zdGFuY2VQci0+VGltZXJBcm1lZCAgICAgICAgPSAxOworCisgICAgTVVMMzJ4MTZJTlRPMzIocFBhcmFtcy0+U2FtcGxpbmdSYXRlLE9uZU92ZXJUaG91c2FuZEluUTI0LHBJbnN0YW5jZVByLT5SZW1haW5pbmdUaW1lSW5TYW1wbGVzLDE2KTsgIC8qIChRMCAqIFEyNCkgPj4xNiBpbnRvIFE4Ki8KKyAgICBNVUwzMngxNklOVE8zMihwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcyxwUGFyYW1zLT5UaW1lSW5NcyxwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcyw4KTsgIC8qIChROCAqIFEwKSA+PjggaW50byBRMCovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIEVORCBPRiBGSUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9UaW1lcl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXJfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA0ZDVhZjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXJfUHJpdmF0ZS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFByb2plY3Q6OiAgIE15IFByb2plY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDAgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTFZNX1RJTUVSX1BSSVZBVEVfSAorI2RlZmluZSBMVk1fVElNRVJfUFJJVkFURV9ICisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgVFlQRSBERUZJTklUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQzMiAgUmVtYWluaW5nVGltZUluU2FtcGxlczsKKyAgICBMVk1fSU5UMzIgIENhbGxCYWNrUGFyYW07CisgICAgTFZNX0lOVDMyICAqcENhbGxCYWNrUGFyYW1zOworICAgIHZvaWQgICpwQ2FsbGJhY2tJbnN0YW5jZTsKKyAgICB2b2lkICAoKnBDYWxsQmFjaykodm9pZCosdm9pZCosTFZNX0lOVDMyKTsKKyAgICBMVk1fSU5UMTYgVGltZXJBcm1lZDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBCb29sZWFuLCB0cnVlIGJldHdlZW4gaW5pdCBhbmQgY2FsbGJhY2sgKi8KKworfSBMVk1fVGltZXJfSW5zdGFuY2VfUHJpdmF0ZV90OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBFTkQgT0YgSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAgLyogTFZNX1RJTUVSX1BSSVZBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYzI3MzVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzE2LmMKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkCisgICAgICRSZXZpc2lvbjogMTAwMCAkCisgICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBMb2FkQ29uc3RfMTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExvYWRDb25zdF8xNihjb25zdCBMVk1fSU5UMTYgdmFsLAorICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApCit7CisgICAgTFZNX0lOVDE2IGlpOworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICAqZHN0ID0gdmFsOworICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xOWQ1ZDRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzMyLmMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTG9hZENvbnN0XzMyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMb2FkQ29uc3RfMzIoY29uc3QgTFZNX0lOVDMyICAgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKQoreworICAgIExWTV9JTlQxNiBpaTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgKmRzdCA9IHZhbDsKKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xOTQ5ZjNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTVNUbzJpX1NhdF8xNngxNi5jCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogYmVxMDc3MTYgJAorICAgICAkUmV2aXNpb246IDEwMDAgJAorICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gIE1TVE8ySV9TQVRfMTZYMTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIE1TVG8yaV9TYXRfMTZ4MTYoY29uc3QgTFZNX0lOVDE2ICAqc3JjTSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICpzcmNTLAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQoreworICAgIExWTV9JTlQzMiB0ZW1wLG1WYWwsc1ZhbDsKKyAgICBMVk1fSU5UMTYgaWk7CisKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgbVZhbD0oTFZNX0lOVDMyKSpzcmNNOworICAgICAgICBzcmNNKys7CisKKyAgICAgICAgc1ZhbD0oTFZNX0lOVDMyKSpzcmNTOworICAgICAgICBzcmNTKys7CisKKyAgICAgICAgdGVtcCA9IG1WYWwgKyBzVmFsOworCisgICAgICAgIGlmICh0ZW1wID4gMHgwMDAwN0ZGRikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IDB4N0ZGRjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0ZW1wIDwgLTB4MDAwMDgwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAtIDB4ODAwMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0lOVDE2KXRlbXA7CisgICAgICAgIH0KKyAgICAgICAgZHN0Kys7CisKKyAgICAgICAgdGVtcCA9IG1WYWwgLSBzVmFsOworCisgICAgICAgIGlmICh0ZW1wID4gMHgwMDAwN0ZGRikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IDB4N0ZGRjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0ZW1wIDwgLTB4MDAwMDgwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAtIDB4ODAwMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0lOVDE2KXRlbXA7CisgICAgICAgIH0KKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMTZ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8xNngxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVmMDRhZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMTZ4MTYuYwpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICVjcmVhdGVkX2J5OiAgICBzcmEgJSAoQ00vUykKKyAgICAgJW5hbWU6ICAgICAgICAgIE1hYzNzX1NhdF8xNngxNi5jICUgKENNL1MpCisgICAgICV2ZXJzaW9uOiAgICAgICAxICUgKENNL1MpCisgICAgICVkYXRlX2NyZWF0ZWQ6ICBGcmkgTm92IDEzIDEyOjA3OjEzIDIwMDkgJSAoQ00vUykKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBNYWMzU18xNlgxNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTWFjM3NfU2F0XzE2eDE2KCBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCisgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQoreworICAgIExWTV9JTlQxNiBpaTsKKyAgICBMVk1fSU5UMTYgc3JjdmFsOworICAgIExWTV9JTlQzMiBUZW1wLGRJblZhbDsKKworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBzcmN2YWw9KnNyYzsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgVGVtcCA9IChzcmN2YWwgKnZhbCk+PjE1OworCisgICAgICAgIGRJblZhbCAgPSAoTFZNX0lOVDMyKSpkc3Q7CisKKyAgICAgICAgVGVtcCA9IFRlbXAgKyBkSW5WYWw7CisKKyAgICAgICAgaWYgKFRlbXAgPiAweDAwMDA3RkZGKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gMHg3RkZGOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMHgwMDAwODAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IC0gMHg4MDAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IChMVk1fSU5UMTYpVGVtcDsKKyAgICAgICAgfQorCisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc0NmEyNzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuYwpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTUFDM1NfMTZYMTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIE1hYzNzX1NhdF8zMngxNiggIGNvbnN0IExWTV9JTlQzMiAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCit7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9JTlQzMiBzcmN2YWwsdGVtcCwgZEluVmFsLCBkT3V0VmFsOworCisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIHNyY3ZhbD0qc3JjOworICAgICAgICBzcmMrKzsKKworICAgICAgICBNVUwzMngxNklOVE8zMihzcmN2YWwsdmFsLHRlbXAsMTUpCisKKyAgICAgICAgICAgIGRJblZhbCAgPSAqZHN0OworICAgICAgICBkT3V0VmFsID0gdGVtcCArIGRJblZhbDsKKworCisgICAgICAgIGlmICgoKChkT3V0VmFsIF4gdGVtcCkgJiAoZE91dFZhbCBeIGRJblZhbCkpID4+IDMxKSE9MCkgICAgIC8qIG92ZXJmbG93IC8gdW5kZXJmbG93ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHRlbXA8MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkT3V0VmFsPTB4ODAwMDAwMDBsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRPdXRWYWw9MHg3RkZGRkZGRmw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAqZHN0ID0gZE91dFZhbDsKKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peEluU29mdF9EMzJDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhJblNvZnRfRDMyQzMxX1NBVC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM2ZGU2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhJblNvZnRfRDMyQzMxX1NBVC5jCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJNaXhlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgREVGSU5JVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFRSVUUgICAgICAgICAgMQorI2RlZmluZSBGQUxTRSAgICAgICAgIDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIE1JWElOU09GVF9EMzJDMzFfU0FUCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBNaXhJblNvZnRfRDMyQzMxX1NBVCggTWl4XzFTdF9DbGxfdCAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgbikKK3sKKyAgICBjaGFyIEhhcmRNaXhpbmcgPSBUUlVFOworCisgICAgaWYobjw9MCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQorICAgIHsKKyAgICAgICAgaWYocEluc3RhbmNlLT5BbHBoYSA9PSAwKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICB9ZWxzZSBpZiAoKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCA8UE9JTlRfWkVST19PTkVfREIpJiYKKyAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQikpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgIH1lbHNleworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoIHBJbnN0YW5jZSwgc3JjLCBkc3QsIG4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEhBUkQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChIYXJkTWl4aW5nKXsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ICE9IDApeyAvKiBOb3RoaW5nIHRvIGRvIGluIGNhc2UgVGFyZ2V0ID0gMCAqLworICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldD4+MTYpID09IDB4N0ZGRikKKyAgICAgICAgICAgICAgICBBZGQyX1NhdF8zMngzMiggc3JjLCBkc3QsIG4gKTsKKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVCggcEluc3RhbmNlLCBzcmMsIGRzdCwgbik7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIEluIGNhc2UgdGhlIGNvcmUgZnVuY3Rpb24gd291bGQgaGF2ZSBjaGFuZ2VkIHRoZSBDdXJyZW50IHZhbHVlICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQ0FMTCBCQUNLCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBDYWxsIGJhY2sgYmVmb3JlIHRoZSBoYXJkIG1peGluZywgYmVjYXVzZSBpbiB0aGlzIGNhc2UsIGhhcmQgbWl4aW5nIG1ha2VzCisgICAgICAgdXNlIG9mIHRoZSBjb3JlIHNvZnQgbWl4IGZ1bmN0aW9uIHdoaWNoIGNhbiBjaGFuZ2UgdGhlIEN1cnJlbnQgdmFsdWUhICAgICAgKi8KKworICAgIGlmIChwSW5zdGFuY2UtPkNhbGxiYWNrU2V0KXsKKyAgICAgICAgaWYgKChwSW5zdGFuY2UtPkN1cnJlbnQtcEluc3RhbmNlLT5UYXJnZXQgPFBPSU5UX1pFUk9fT05FX0RCKSYmCisgICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0ID4gLVBPSU5UX1pFUk9fT05FX0RCKSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q2FsbGJhY2tTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPnBDYWxsQmFjayAhPSAwKXsKKyAgICAgICAgICAgICAgICAoKnBJbnN0YW5jZS0+cENhbGxCYWNrKSAoIHBJbnN0YW5jZS0+cENhbGxiYWNrSGFuZGxlLCBwSW5zdGFuY2UtPnBHZW5lcmFsUHVycG9zZSxwSW5zdGFuY2UtPkNhbGxiYWNrUGFyYW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWNmMWEyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYwpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIERFRklOSVRJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUUlVFICAgICAgICAgIDEKKyNkZWZpbmUgRkFMU0UgICAgICAgICAwCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTUlYU09GVF8xU1RfRDMyQzMxX1dSQQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICAgTWl4XzFTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQoreworICAgIGNoYXIgSGFyZE1peGluZyA9IFRSVUU7CisKKyAgICBpZihuPD0wKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UtPkFscGhhID09IDApeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgIH1lbHNlIGlmICgocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0IDxQT0lOVF9aRVJPX09ORV9EQikmJgorICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0ID4gLVBPSU5UX1pFUk9fT05FX0RCKSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCBwSW5zdGFuY2UsIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZyl7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA9PSAwKQorICAgICAgICAgICAgTG9hZENvbnN0XzMyKDAsIGRzdCwgbik7CisgICAgICAgIGVsc2UgaWYgKChwSW5zdGFuY2UtPlRhcmdldD4+MTYpID09IDB4N0ZGRil7CisgICAgICAgICAgICBpZiAoc3JjICE9IGRzdCkKKyAgICAgICAgICAgICAgICBDb3B5XzE2KChMVk1fSU5UMTYqKXNyYywgKExWTV9JTlQxNiopZHN0LCAoTFZNX0lOVDE2KShuICogMikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE11bHQzc18zMngxNiggc3JjLCAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPkN1cnJlbnQ+PjE2KSwgZHN0LCBuICk7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocEluc3RhbmNlLT5DYWxsYmFja1NldCl7CisgICAgICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0IDxQT0lOVF9aRVJPX09ORV9EQikmJgorICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQikpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5wQ2FsbEJhY2sgIT0gMCl7CisgICAgICAgICAgICAgICAgKCpwSW5zdGFuY2UtPnBDYWxsQmFjaykgKCBwSW5zdGFuY2UtPnBDYWxsYmFja0hhbmRsZSwgcEluc3RhbmNlLT5wR2VuZXJhbFB1cnBvc2UscEluc3RhbmNlLT5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIwM2YwYmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzJTdF9EMzJDMzFfU0FULmMKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTUlYU09GVF8yU1RfRDMyQzMxX1NBVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTWl4U29mdF8yU3RfRDMyQzMxX1NBVCggICAgTWl4XzJTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKworICAgIGlmKG48PTApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKChwSW5zdGFuY2UtPkN1cnJlbnQxICE9IHBJbnN0YW5jZS0+VGFyZ2V0MSkgfHwgKHBJbnN0YW5jZS0+Q3VycmVudDIgIT0gcEluc3RhbmNlLT5UYXJnZXQyKSkKKyAgICB7CisgICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoIChNaXhfMVN0X0NsbF90KikgcEluc3RhbmNlLCBzcmMxLCBkc3QsIG4pOworICAgICAgICBNaXhJblNvZnRfRDMyQzMxX1NBVCggKE1peF8xU3RfQ2xsX3QqKSAmcEluc3RhbmNlLT5BbHBoYTIsIHNyYzIsIGRzdCwgbik7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEhBUkQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQxID09IDApCisgICAgICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAoTWl4XzFTdF9DbGxfdCopICZwSW5zdGFuY2UtPkFscGhhMiwgc3JjMiwgZHN0LCBuKTsKKyAgICAgICAgZWxzZSBpZiAocEluc3RhbmNlLT5DdXJyZW50MiA9PSAwKQorICAgICAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggKE1peF8xU3RfQ2xsX3QqKSBwSW5zdGFuY2UsIHNyYzEsIGRzdCwgbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVCggcEluc3RhbmNlLCBzcmMxLCBzcmMyLCBkc3QsIG4pOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhlcl9wcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhlcl9wcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDAxMjU0OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peGVyX3ByaXZhdGUuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDAwICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19NSVhFUl9QUklWQVRFX0hfXworI2RlZmluZSBfX01JWEVSX1BSSVZBVEVfSF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIk1peGVyLmgiCisKKyNkZWZpbmUgUE9JTlRfWkVST19PTkVfREIgMjQ3MzgwNSAvKiAwLjAxIGRCIG9uIGEgZnVsbCBzY2FsZSBzaWduYWwgPSAoMTBeKDAuMDEvMjApIC0xKSAqIDJeMzEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIERFRklOSVRJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNlbmRpZiAvLyNpZm5kZWYgX19NSVhFUl9QUklWQVRFX0hfXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Nb25vVG8ySV8xNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMDUzZTU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMTYuYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDAwICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIE1vbm9UbzJJXzE2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBNb25vVG8ySV8xNiggY29uc3QgTFZNX0lOVDE2ICpzcmMsCisgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgc3JjICs9IChuLTEpOworICAgIGRzdCArPSAoKG4qMiktMSk7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgICpkc3QgPSAqc3JjOworICAgICAgICBkc3QtLTsKKworICAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICAgZHN0LS07CisgICAgICAgIHNyYy0tOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lODE2NGJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMzIuYwpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBNb25vVG8ySV8zMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTW9ub1RvMklfMzIoIGNvbnN0IExWTV9JTlQzMiAgKnNyYywKKyAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAorICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgc3JjICs9IChuLTEpOworICAgIGRzdCArPSAoKG4qMiktMSk7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgICpkc3QgPSAqc3JjOworICAgICAgICBkc3QtLTsKKworICAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICAgZHN0LS07CisgICAgICAgIHNyYy0tOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NdWx0M3NfMzJ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL011bHQzc18zMngxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVlODM1MjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NdWx0M3NfMzJ4MTYuYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRlVOQ1RJT04gTVVMVDNTXzE2WDE2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBNdWx0M3NfMzJ4MTYoIGNvbnN0IExWTV9JTlQzMiAqc3JjLAorICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKKyAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAqZHN0LAorICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCit7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9JTlQzMiBzcmN2YWwsdGVtcDsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgc3JjdmFsPSpzcmM7CisgICAgICAgIHNyYysrOworCisgICAgICAgIE1VTDMyeDE2SU5UTzMyKHNyY3ZhbCx2YWwsdGVtcCwxNSkKKworICAgICAgICAqZHN0ID0gdGVtcDsKKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL05vbkxpbkNvbXBfRDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE0Mjg3NzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDAwICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJDb21wTGltX3ByaXZhdGUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTm9uTGluQ29tcF9EMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb24tbGluZWFyIGNvbXByZXNzaW9uIGJ5IGNvbXBhbmRpbmcuIFRoZSBmdW5jdGlvbiB3b3JrcyBvbiBhIHNhbXBsZSBieSBzYW1wbGUgICAgICAqLworLyogIGJhc2lzIGJ5IGluY3JlYXNpbmcgdGhlIGxldmVsIG5lYXIgdGhlIHplcm8gY3Jvc3NpbmcuIFRoaXMgZ2l2ZXMgYSB0dHJhZGUtb2ZmICAgICAgICovCisvKiAgYmV0d2VlbiBUSEQgYW5kIGNvbXByZXNzaW9uLiBJdCB1c2VzIHRoZSBlcXVhdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIE91dHB1dCA9IElucHV0ICsgSyAqIChJbnB1dCAtIElucHV0XjIpICAgICAgICBpZiBJbnB1dCA+ICAwICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgID0gSW5wdXQgKyBLICogKElucHV0ICsgSW5wdXReMikgICAgICBpZiBJbnB1dCA8PSAwICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhlIHZhbHVlIG9mIEsgY29udHJvbHMgdGhlIGFtb3VudCBvZiBjb21wcmVzc2lvbiBhbmQgYXMgYSBzaWRlIGVmZmVjdCB0aGUgYW1vdW50ICovCisvKiAgZGlzdG9ydGlvbiBpbnRyb2R1Y2VkLiBUaGUgYW1vdW50IG9mIGNvbXByZXNzaW9uIGlzIHNpZ25hbCBkZXBlbmRlbnQgYW5kIHRoZSB2YWx1ZXMgKi8KKy8qICBnaXZlbiBiZWxvdyBhcmUgYXBwcm94aW1hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgR2FpbiAoZnJhY3Rpb25hbCkgIEdhaW4gKGludGVnZXIpICAgIENvbXByZXNzaW9uICAgICAgICAgIFBrLVBrIFRIRCAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgMS4wICAgICAgICAgICAgICAgICAzMjc2NyAgICAgICAgICAgICs2ZEIgICAgICAgICAgICAxNmRCICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAwLjc4ICAgICAgICAgICAgICAgIDI1NTU5ICAgICAgICAgICAgKzVkQiAgICAgICAgICAgIDE5ZEIgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgIDAuNiAgICAgICAgICAgICAgICAgMTk2NjEgICAgICAgICAgICArNGRCICAgICAgICAgICAgMjFkQiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgMC40MSAgICAgICAgICAgICAgICAxMzQzNSAgICAgICAgICAgICszZEIgICAgICAgICAgICAyNGRCICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAwLjI2ICAgICAgICAgICAgICAgICA4NTIwICAgICAgICAgICAgKzJkQiAgICAgICAgICAgIDI4ZEIgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgIDAuMTIgICAgICAgICAgICAgICAgIDM5MzIgICAgICAgICAgICArMWRCICAgICAgICAgICAgMzRkQiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgMC4wICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICswZEIgICAgICAgICAgICA5OGRCICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEdhaW4gICAgICAgICAgICAtICAgIGNvbXByZXNzaW9uIGNvbnRyb2wgcGFyYW1ldGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgcERhdGFJbiAgICAgICAgIC0gICAgcG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBwRGF0YU91dCAgICAgICAgLSAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEJsb2NrTGVuZ3RoICAgICAtICAgIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTm9uTGluQ29tcF9EMTYoTFZNX0lOVDE2ICAgICAgICBHYWluLAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgIEJsb2NrTGVuZ3RoKQoreworCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgU2FtcGxlOyAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgc2FtcGxlcyAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgIFNhbXBsZU5vOyAgICAgICAgICAgICAgICAvKiBTYW1wbGUgaW5kZXggKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICBUZW1wOworCisKKyAgICAvKgorICAgICAqIFByb2Nlc3MgYSBibG9jayBvZiBzYW1wbGVzCisgICAgICovCisgICAgZm9yKFNhbXBsZU5vID0gMDsgU2FtcGxlTm88QmxvY2tMZW5ndGg7IFNhbXBsZU5vKyspCisgICAgeworCisgICAgICAgIC8qCisgICAgICAgICAqIFJlYWQgdGhlIGlucHV0CisgICAgICAgICAqLworICAgICAgICBTYW1wbGUgPSAqcERhdGFJbjsKKyAgICAgICAgcERhdGFJbisrOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgdGhlIGNvbXBhbmRlciwgdGhpcyBjb21wcmVzc2VzIHRoZSBzaWduYWwgYXQgdGhlIGV4cGVuc2Ugb2YKKyAgICAgICAgICogaGFybW9uaWMgZGlzdG9ydGlvbi4gVGhlIGFtb3VudCBvZiBjb21wcmVzc2lvbiBpcyBjb250cm9sIGJ5IHRoZQorICAgICAgICAgKiBnYWluIGZhY3RvcgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChMVk1fSU5UMzIpU2FtcGxlICE9IC0zMjc2OCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVtcCA9IChMVk1fSU5UMTYpKChTYW1wbGUgKiBTYW1wbGUpID4+IDE1KTsKKyAgICAgICAgICAgIGlmKFNhbXBsZSA+MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTYW1wbGUgPSAoTFZNX0lOVDE2KShTYW1wbGUgKyAoKEdhaW4gKiAoU2FtcGxlIC0gVGVtcCkpID4+IDE1KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2FtcGxlID0gKExWTV9JTlQxNikoU2FtcGxlICsgKChHYWluICogKFNhbXBsZSArIFRlbXApKSA+PiAxNSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTYXZlIHRoZSBvdXRwdXQKKyAgICAgICAgICovCisgICAgICAgICpwRGF0YU91dCA9IFNhbXBsZTsKKyAgICAgICAgcERhdGFPdXQrKzsKKworCisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA2Y2ZlODgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMCwKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIC1CMiwKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExNCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIEdhaW4sIGluIFExMSBmb3JtYXQKKworCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMSlSIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB4KG4tMilSIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSBpcyB5KG4tMSlSIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFEwIGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiB5bkwseW5SLHluTE8seW5STyx0ZW1wbDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5bkw9IChBMCAoUTE0KSAqICh4KG4pTCAoUTApIC0geChuLTIpTCAoUTApICkgPj4xNCkgIGluIFEwKi8KKyAgICAgICAgICAgIHRlbXBsPSgqcERhdGFJbiktcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIodGVtcGwscEJpcXVhZFN0YXRlLT5jb2Vmc1swXSx5bkwsMTQpCisKKyAgICAgICAgICAgIC8qIHluTCs9ICgoLUIyIChRMTQpICogeShuLTIpTCAoUTApICkgPj4xNCkgaW4gUTAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0sdGVtcGwsMTQpCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvKiB5bkwrPSAoKC1CMSAoUTE0KSAqIHkobi0xKUwgKFEwKSApID4+MTQpIGluIFEwICovCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0scEJpcXVhZFN0YXRlLT5jb2Vmc1syXSx0ZW1wbCwxNCkKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluTE89ICgoR2FpbiAoUTExKSAqIHluTCAoUTApKT4+MTEpIGluIFEwKi8KKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHluTCxwQmlxdWFkU3RhdGUtPmNvZWZzWzNdLHluTE8sMTEpCisKKyAgICAgICAgICAgIC8qIHluTE89KCB5bkxPKFEwKSArIHgobilMIChRMCkgKSBpbiBRMCovCisgICAgICAgICAgICB5bkxPKz0gKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5SPSAoQTAgKFExNCkgKiAoeChuKVIgKFEwKSAtIHgobi0yKVIgKFEwKSApID4+MTQpICAgaW4gUTAqLworICAgICAgICAgICAgdGVtcGw9KCoocERhdGFJbisxKSktcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIodGVtcGwscEJpcXVhZFN0YXRlLT5jb2Vmc1swXSx5blIsMTQpCisKKyAgICAgICAgICAgIC8qIHluUis9ICgoLUIyIChRMTQpICogeShuLTIpUiAoUTApICkgPj4xNCkgIGluIFEwKi8KKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSxwQmlxdWFkU3RhdGUtPmNvZWZzWzFdLHRlbXBsLDE0KQorICAgICAgICAgICAgeW5SKz10ZW1wbDsKKworICAgICAgICAgICAgLyogeW5SKz0gKCgtQjEgKFExNCkgKiB5KG4tMSlSIChRMCkgKSA+PjE0KSAgaW4gUTAgKi8KKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSxwQmlxdWFkU3RhdGUtPmNvZWZzWzJdLHRlbXBsLDE0KQorICAgICAgICAgICAgeW5SKz10ZW1wbDsKKworICAgICAgICAgICAgLyogeW5STz0gKChHYWluIChRMTEpICogeW5SIChRMCkpPj4xMSkgaW4gUTAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIoeW5SLHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10seW5STywxMSkKKworICAgICAgICAgICAgLyogeW5STz0oIHluUk8oUTApICsgeChuKVIgKFEwKSApIGluIFEwKi8KKyAgICAgICAgICAgIHluUk8rPSAoKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgLyogeShuLTIpUj15KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM109cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAvKiB4KG4tMilSPXgobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLyogeChuLTIpTD14KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XT15blI7IC8qIFVwZGF0ZSB5KG4tMSlSIGluIFEwKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XT15bkw7IC8qIFVwZGF0ZSB5KG4tMSlMIGluIFEwKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpTCBpbiBRMCovCisgICAgICAgICAgICBwRGF0YUluKys7CisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV09KCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKVIgaW4gUTAqLworICAgICAgICAgICAgcERhdGFJbisrOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dD15bkxPOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMCovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgKnBEYXRhT3V0PXluUk87IC8qIFdyaXRlIFJpZ2h0IG91cHV0IGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisKKyAgICAgICAgfQorCisgICAgfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzMwRzExX1RSQ19XUkFfMDEuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41Yjc4ZjYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzMwRzExX1RSQ19XUkFfMDEuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIlBLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEFTU1VNUFRJT05TOgorIENPRUZTLQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTAsCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyAtQjIsCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMzAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyBHYWluLCBpbiBRMTEgZm9ybWF0CisKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gaXMgeShuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUEtfMklfRDMyRjMyQzMwRzExX1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fSU5UMzIgeW5MLHluUix5bkxPLHluUk8sdGVtcGw7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5MPSAoQTAgKFEzMCkgKiAoeChuKUwgKFEwKSAtIHgobi0yKUwgKFEwKSApID4+MzApICBpbiBRMCovCisgICAgICAgICAgICB0ZW1wbD0oKnBEYXRhSW4pLXBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHRlbXBsLHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0seW5MLDMwKQorCisgICAgICAgICAgICAvKiB5bkwrPSAoKC1CMiAoUTMwKSAqIHkobi0yKUwgKFEwKSApID4+MzApIGluIFEwKi8KKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSxwQmlxdWFkU3RhdGUtPmNvZWZzWzFdLHRlbXBsLDMwKQorICAgICAgICAgICAgeW5MKz10ZW1wbDsKKworICAgICAgICAgICAgLyogeW5MKz0gKCgtQjEgKFEzMCkgKiB5KG4tMSlMIChRMCkgKSA+PjMwKSBpbiBRMCAqLworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0sdGVtcGwsMzApCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvKiB5bkxPPSAoKEdhaW4gKFExMSkgKiB5bkwgKFEwKSk+PjExKSBpbiBRMCovCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMih5bkwscEJpcXVhZFN0YXRlLT5jb2Vmc1szXSx5bkxPLDExKQorICAgICAgICAgICAgLyogeW5MTz0oIHluTE8oUTApICsgeChuKUwgKFEwKSApIGluIFEwKi8KKyAgICAgICAgICAgIHluTE8rPSAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5blI9IChBMCAoUTMwKSAqICh4KG4pUiAoUTApIC0geChuLTIpUiAoUTApICkgPj4zMCkgICBpbiBRMCovCisgICAgICAgICAgICB0ZW1wbD0oKihwRGF0YUluKzEpKS1wQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisgICAgICAgICAgICBNVUwzMngzMklOVE8zMih0ZW1wbCxwQmlxdWFkU3RhdGUtPmNvZWZzWzBdLHluUiwzMCkKKworICAgICAgICAgICAgLyogeW5SKz0gKCgtQjIgKFEzMCkgKiB5KG4tMilSIChRMCkgKSA+PjMwKSAgaW4gUTAqLworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddLHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0sdGVtcGwsMzApCisgICAgICAgICAgICB5blIrPXRlbXBsOworCisgICAgICAgICAgICAvKiB5blIrPSAoKC1CMSAoUTMwKSAqIHkobi0xKVIgKFEwKSApID4+MzApICBpbiBRMCAqLworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0sdGVtcGwsMzApCisgICAgICAgICAgICB5blIrPXRlbXBsOworCisgICAgICAgICAgICAvKiB5blJPPSAoKEdhaW4gKFExMSkgKiB5blIgKFEwKSk+PjExKSBpbiBRMCovCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMih5blIscEJpcXVhZFN0YXRlLT5jb2Vmc1szXSx5blJPLDExKQorCisgICAgICAgICAgICAvKiB5blJPPSggeW5STyhRMCkgKyB4KG4pUiAoUTApICkgaW4gUTAqLworICAgICAgICAgICAgeW5STys9ICgqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN109cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAvKiB5KG4tMilSPXkobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgLyogeShuLTIpTD15KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvKiB4KG4tMilMPXgobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdPXluUjsgLyogVXBkYXRlIHkobi0xKVIgaW4gUTAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdPXluTDsgLyogVXBkYXRlIHkobi0xKUwgaW4gUTAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdPSgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlMIGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT0oKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpUiBpbiBRMCovCisgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0PXluTE87IC8qIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgICAgICAqcERhdGFPdXQ9eW5STzsgLyogV3JpdGUgUmlnaHQgb3VwdXQgaW4gUTAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgfQorCisgICAgfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTdiY2QwYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorCisKK3ZvaWQgIFBLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzMyX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKyAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgID0oTFZNX0lOVDMyICopIHBUYXBzOworCisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF09cENvZWYtPkEwOworCisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV09cENvZWYtPkIyOworCisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl09cENvZWYtPkIxOworCisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM109cENvZWYtPkc7CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc0MWY1MDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfUEtfMklfRDMyRjMyQ0xMR1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXworI2RlZmluZSBfUEtfMklfRDMyRjMyQ0xMR1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDAwICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjA4OjIwICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCisvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXworeworICBMVk1fSU5UMzIgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgTFZNX0lOVDMyICAgICAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGU7CisKK3R5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CisKKyNlbmRpZiAvKiBfUEtfMklfRDMyRjMyQ0xMR1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYwMjMwNWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwMCAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIlBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKwordm9pZCAgUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPShMVk1fSU5UMzIgKikgcFRhcHM7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXT1wQ29lZi0+QTA7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXT1wQ29lZi0+QjI7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT1wQ29lZi0+QjE7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXT1wQ29lZi0+RzsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2EzMTY2OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9QS18ySV9EMzJGMzJDU1NHU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisjZGVmaW5lIF9QS18ySV9EMzJGMzJDU1NHU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFByb2plY3Q6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDAgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLworLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KK3sKKyAgTFZNX0lOVDMyICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgIExWTV9JTlQzMiAgICAgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOworCisjZW5kaWYgLyogX1BLXzJJX0QzMkYzMkNTU0dTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MTZ4djE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjE2eHYxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU0NDlhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjE2eHYxNi5jCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogYmVxMDc3MTYgJAorICAgICAkUmV2aXNpb246IDEwMDAgJAorICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzowODoyMCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gU2hpZnRfU2F0X3YxNnh2MTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFNoaWZ0X1NhdF92MTZ4djE2IChjb25zdCAgIExWTV9JTlQxNiAgIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDE2ICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBuKQoreworICAgIExWTV9JTlQzMiAgIHRlbXA7CisgICAgTFZNX0lOVDMyICAgaWk7CisgICAgTFZNX0lOVDE2ICAgUlNoaWZ0OworICAgIGlmKHZhbD4wKQorICAgIHsKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSAoTFZNX0lOVDMyKSpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKworICAgICAgICAgICAgdGVtcCA9IHRlbXAgPDwgdmFsOworCisgICAgICAgICAgICBpZiAodGVtcCA+IDB4MDAwMDdGRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKmRzdCA9IDB4N0ZGRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHRlbXAgPCAtMHgwMDAwODAwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqZHN0ID0gLSAweDgwMDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKmRzdCA9IChMVk1fSU5UMTYpdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdCsrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYodmFsPDApCisgICAgeworICAgICAgICBSU2hpZnQ9KExWTV9JTlQxNikoLXZhbCk7CisKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0lOVDE2KSgqc3JjID4+IFJTaGlmdCk7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgICAgIHNyYysrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKHNyYyE9ZHN0KQorICAgICAgICB7CisgICAgICAgICAgICBDb3B5XzE2KHNyYyxkc3Qsbik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBhYjk4ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFByb2plY3Q6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDAgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIFNoaWZ0X1NhdF92MzJ4djMyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBTaGlmdF9TYXRfdjMyeHYzMiAoY29uc3QgICBMVk1fSU5UMTYgICB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9JTlQzMiAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbikKK3sKKyAgICBMVk1fSU5UMzIgICBpaTsKKyAgICBMVk1fSU5UMTYgICBSU2hpZnQ7CisKKyAgICBpZih2YWw+MCkKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiBhLGI7CisKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGE9KnNyYzsKKyAgICAgICAgICAgIHNyYysrOworCisgICAgICAgICAgICBiPShhPDx2YWwpOworCisgICAgICAgICAgICBpZiggKGI+PnZhbCkgIT0gYSApIC8qIGlmIG92ZXJmbG93IG9jY3VyZWQsIHJpZ2h0IHNoaWZ0IHdpbGwgc2hvdyBkaWZmZXJlbmNlKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihhPDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiPTB4ODAwMDAwMDBsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiPTB4N0ZGRkZGRkZsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKmRzdCA9IGI7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKHZhbDwwKQorICAgIHsKKyAgICAgICAgUlNoaWZ0PShMVk1fSU5UMTYpKC12YWwpOworICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9ICgqc3JjID4+IFJTaGlmdCk7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgICAgIHNyYysrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKHNyYyE9ZHN0KQorICAgICAgICB7CisgICAgICAgICAgICBDb3B5XzE2KChMVk1fSU5UMTYgKilzcmMsKExWTV9JTlQxNiAqKWRzdCwoTFZNX0lOVDE2KShuPDwxKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL2RCX3RvX0xpbjMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFjMDM0M2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAlY3JlYXRlZF9ieTogICAgc3JhICUgKENNL1MpKi8KKy8qICAgICAlbmFtZTogICAgICAgICAgZEJfdG9fTGluMzIuYyAlIChDTS9TKSovCisvKiAgICAgJXZlcnNpb246ICAgICAgIDIgJSAoQ00vUykqLworLyogICAgICVkYXRlX2NyZWF0ZWQ6ICBXZWQgSnVuIDE4IDExOjI3OjQ2IDIwMDggJSAoQ00vUykqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworLyogIEluY2x1ZGUgZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKworI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5hbWUgICAgICAgIDogZEJfdG9fTGluMzIoKQorICogIElucHV0ICAgICAgIDogU2lnbmVkIDE2LWJpdCBpbnRlZ2VyCisgKiAgICAgICAgICAgICAgICAgIE1TQiAoMTYpID0gc2lnbiBiaXQKKyAqICAgICAgICAgICAgICAgICAgKDE1LT4wNSkgPSBpbnRlZ2VyIHBhcnQKKyAqICAgICAgICAgICAgICAgICAgKDA0LT4wMSkgPSBkZWNpbWFsIHBhcnQKKyAqICBPdXRwdXQgICAgICA6IFNpZ25lZCAzMi1iaXQgaW50ZWdlcgorICogICAgICAgICAgICAgICAgICBNU0IgKDMyKSA9IHNpZ24gYml0CisgKiAgICAgICAgICAgICAgICAgICgzMS0+MTYpID0gaW50ZWdlciBwYXJ0CisgKiAgICAgICAgICAgICAgICAgICgxNS0+MDEpID0gZGVjaW1hbCBwYXJ0CisgKiAgUmV0dXJucyAgICAgOiBMaW4gdmFsdWUgZm9ybWF0IDEuMTYuMTUKKyAqICBEZXNjcmlwdGlvbiA6CisgKiAgUmVtYXJrcyAgICAgOiAgTWFrZXMgYW4gYXBwcm94aW1hdGlvbiB0byB0aGUgY29udmVyc2lvbiBieSBjb3VudGluZyB0aGUgbnVtYmVyCisgKiAgICAgICAgICAgICAgICAgb2YgNmRCIHN0ZXBzIGZvciB1c2UgYXMgc2hpZnRzIGFuZCB0aGVuIGludGVycG9sYXRlcyB3aXRoIGEgcmVtYWluZGVyCisgKiAgICAgICAgICAgICAgICAgd2l0aCB0aGUgZXF1YXRpb246CisgKgorICogICAgICAgICAgICAgICAgIENvcnJlY3Rpb24gPSAoUmVtYWluZGVyIC8gMS41MDI5KSAtIChSZW1haW5kZXJeMiAvIDYpCisgKgorICogICAgICAgICAgICAgICAgIFRoZSB0d28gY29lZmZpY2llbnRzIGFyZSBzY2FsZWQgZnJvbSAweDQwMDAwMDAwIGluIDk2IHN0ZXBzIGFuZCBjYWxjdWxhdGVkCisgKiAgICAgICAgICAgICAgICAgYXMgZm9sbG93czoKKyAqCisgKiAgICAgICAgICAgICAgICAgRklSU1RfQ09FRiAgPSAweDgwMDAwMDAwIC8gKDk2ICogMS41MDI5KQorICogICAgICAgICAgICAgICAgIFNFQ09ORF9DT0VGID0gMHg4MDAwMDAwMCAvICg5Nl4yICogNikKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBGT1VSX09WRVJfU0lYICAgIDIxODQ2ICAgICAgICAgICAgICAgICAgLyogKDQgLyA2KSAqIDJeMTUgKi8KKyNkZWZpbmUgU0lYX0RCICAgICAgICAgICA5NiAgICAgICAgICAgICAgICAgICAgIC8qIDYgKiAxNiBvciA2ZEIgaW4gUTExLjQgZm9ybWF0ICovCisjZGVmaW5lIEZJUlNUX0NPRUZfTkVHICAgMTQ4ODQzMDUKKyNkZWZpbmUgRklSU1RfQ09FRl9QT1MgICA3NDQyMTUyICAgICAgICAgICAgICAgIC8qIEZJUlNUX0NPRUZfTkVHIC8gMiAqLworI2RlZmluZSBTRUNPTkRfQ09FRiAgICAgIDM4ODM2CisjZGVmaW5lIE1BWF9WQUxVRSAgICAgICAgMTUzNiAgICAgICAgICAgICAgICAgICAvKiA5NiAqIDE2ICovCisKK0xWTV9JTlQzMiAgIGRCX3RvX0xpbjMyKExWTV9JTlQxNiAgICBkYl9maXgpCit7CisgICAgTFZNX0lOVDMyIExpbl92YWxfMzI7CisgICAgTFZNX0lOVDE2IFNoaWZ0OworICAgIExWTV9JTlQzMiBSZW1haW47CisKKworICAgIC8qCisgICAgICogQ2hlY2sgc2lnbiBvZiB0aGUgaW5wdXQKKyAgICAgKi8KKyAgICBpZiAoZGJfZml4PDApCisgICAgeworICAgICAgICBpZiAoZGJfZml4ID4gLU1BWF9WQUxVRSkKKyAgICAgICAgeworICAgICAgICAgICAgU2hpZnQgID0gKExWTV9JTlQxNikoKCgoTFZNX1VJTlQzMikoLWRiX2ZpeCkgPj4gNCkgKiBGT1VSX09WRVJfU0lYKSA+PiAxNyk7ICAgICAgICAvKiBOdW1iZXIgb2YgNmRCIHN0ZXBzIGluIFExMS40IGZvcm1hdCAqLworICAgICAgICAgICAgUmVtYWluID0gLWRiX2ZpeCAtIChTaGlmdCAqIFNJWF9EQik7CisgICAgICAgICAgICBSZW1haW4gPSAoMHg3RkZGRkZGRiAtIChSZW1haW4gKiBGSVJTVF9DT0VGX05FRykpICsgKFJlbWFpbiAqIFJlbWFpbiAqIFNFQ09ORF9DT0VGKTsKKyAgICAgICAgICAgIExpbl92YWxfMzIgPSAoTFZNX0lOVDMyKSgoTFZNX1VJTlQzMilSZW1haW4gPj4gKDE2ICsgU2hpZnQpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIExpbl92YWxfMzIgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChkYl9maXggPCBNQVhfVkFMVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNoaWZ0ICA9IChMVk1fSU5UMTYpKCgoKExWTV9VSU5UMzIpZGJfZml4ID4+IDQpICogRk9VUl9PVkVSX1NJWCkgPj4gMTcpOyAgICAgICAgLyogTnVtYmVyIG9mIDZkQiBzdGVwcyBpbiBRMTEuNCBmb3JtYXQgKi8KKyAgICAgICAgICAgIFJlbWFpbiA9IGRiX2ZpeCAtIChTaGlmdCAqIFNJWF9EQik7CisgICAgICAgICAgICBSZW1haW4gPSAweDNGRkZGRkZGICsgKFJlbWFpbiAqIEZJUlNUX0NPRUZfUE9TKSArIChSZW1haW4gKiBSZW1haW4gKiBTRUNPTkRfQ09FRik7CisgICAgICAgICAgICBMaW5fdmFsXzMyID0gKExWTV9JTlQzMikoKExWTV9VSU5UMzIpUmVtYWluID4+ICgxNSAtIFNoaWZ0KSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBMaW5fdmFsXzMyID0gMHg3RkZGRkZGRjsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcmV0dXJuIExpbl92YWxfMzI7ICAvKiBmb3JtYXQgMS4xNi4xNSAqLworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9tdWx0M3NfMTZ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL211bHQzc18xNngxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI1MDA5NzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9tdWx0M3NfMTZ4MTYuYwpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDAwICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MDg6MjAgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIE1VTFQzU18xNlgxNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTXVsdDNzXzE2eDE2KCBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCisgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKKyAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQoreworICAgIExWTV9JTlQxNiBpaTsKKyAgICBMVk1fSU5UMzIgdGVtcDsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgdGVtcCA9IChMVk1fSU5UMzIpKCpzcmMpICogKExWTV9JTlQzMil2YWw7CisgICAgICAgIHNyYysrOworCisgICAgICAgICpkc3QgPSAoTFZNX0lOVDE2KSh0ZW1wID4+IDE1KTsKKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdiYTU4M2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oCkBAIC0wLDAgKzEsNDg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDA1ICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6NTg6MjggKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSGVhZGVyIGZpbGUgZm9yIHRoZSBhcHBsaWNhdGlvbiBsYXllciBpbnRlcmZhY2Ugb2YgdGhlIE4tQmFuZCBlcXVhbGlzZXIuICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZXMgaW5jbHVkZXMgYWxsIGRlZmluaXRpb25zLCB0eXBlcywgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb24gICAgICAgICAgICAgICAgICovCisvKiAgcHJvdG90eXBlcyByZXF1aXJlZCBieSB0aGUgY2FsbGluZyBsYXllci4gQWxsIG90aGVyIHR5cGVzLCBzdHJ1Y3R1cmVzIGFuZCAgICAgICAgICAgKi8KKy8qICBmdW5jdGlvbnMgYXJlIHByaXZhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5vdGU6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgPT09PT09PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgYWxnb3JpdGhtIGNhbiBleGVjdXRlIGVpdGhlciB3aXRoIHNlcGFyYXRlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBvciB3aXRoICAgICAqLworLyogIGEgY29tbW9uIGJ1ZmZlciwgaS5lLiB0aGUgZGF0YSBpcyBwcm9jZXNzZWQgaW4tcGxhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTm90ZTogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICA9PT09PT09ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFR3byBkYXRhIGZvcm1hdHMgYXJlIHN1cHBvcnQgU3RlcmVvIGFuZCBNb25vLUluLVN0ZXJlby4gVGhlIGRhdGEgaXMgaW50ZXJsZWF2ZWQgYXMgICovCisvKiAgZm9sbG93czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICBCeXRlIE9mZnNldCAgICAgICAgIFN0ZXJlbyBJbnB1dCAgICAgICAgIE1vbm8tSW4tU3RlcmVvIElucHV0ICAgICAgICAgICAqLworLyogICAgICAgICAgICAgID09PT09PT09PT09ICAgICAgICAgPT09PT09PT09PT09ICAgICAgICAgPT09PT09PT09PT09PT09PT09PT0gICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICBMZWZ0IFNhbXBsZSAjMSAgICAgICAgICBNb25vIFNhbXBsZSAjMSAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIFJpZ2h0IFNhbXBsZSAjMSAgICAgICAgIE1vbm8gU2FtcGxlICMxICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICAgTGVmdCBTYW1wbGUgIzIgICAgICAgICAgTW9ubyBTYW1wbGUgIzIgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIDYgICAgICAgICAgICAgICBSaWdodCBTYW1wbGUgIzIgICAgICAgICBNb25vIFNhbXBsZSAjMiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb25vIGZvcm1hdCBkYXRhIGlzIG5vdCBzdXBwb3J0ZWQsIHRoZSBjYWxsaW5nIHJvdXRpbmUgbXVzdCBjb252ZXJ0IGEgTW9ubyBzdHJlYW0gICAqLworLyogIGluIHRvIE1vbm8tSW4tU3RlcmVvIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTm90ZTogMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICA9PT09PT09ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgaW4gdGhlIGZpbHRlciBiYW5kIGRlZmluaXRpb24gc3RydWN0dXJlIGlzIGFzIGZvbGxvd3M6ICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgR2FpbiAgICAgICAgaXMgaW4gaW50ZWdlciBkQiwgcmFuZ2UgLTE1ZEIgdG8gKzE1ZEIgaW5jbHVzaXZlICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBGcmVxdWVuY3kgICBpcyB0aGUgY2VudHJlIGZyZXF1ZW5jeSBpbiBIeiwgcmFuZ2UgREMgdG8gTnlxdWlzdCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFFGYWN0b3IgICAgIGlzIHRoZSBRIG11bHRpcGxpZWQgYnkgMTAwLCByYW5nZSAwLjI1ICgyNSkgdG8gMTIgKDEyMDApICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEV4YW1wbGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEdhaW4gPSA3ICAgICAgICAgICAgN2RCIGdhaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRnJlcXVlbmN5ID0gMjQ2NyAgICBDZW50cmUgZnJlcXVlbmN5ID0gMi40NjdrSHogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBRRmFjdG9yID0gMTA4OSAgICAgIFEgPSAxMC44OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgZXF1YWxpc2VyIGZpbHRlcnMgYXJlIHBhc3NlZCBhcyBhIHBvaW50ZXIgdG8gYW5kIGFycmF5IG9mIGZpbHRlciBiYW5kICAgICAgICAgICAqLworLyogIGRlZmluaXRpb25zIHN0cnVjdHVyZXMuIFRoZXJlIG11c3QgYmUgb25lIGZpbHRlciBkZWZpbml0aW9uIGZvciBlYWNoIGJhbmQuICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19MVkVRTkJfSF9fCisjZGVmaW5lIF9fTFZFUU5CX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9Db21tb24uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTWVtb3J5IHRhYmxlICovCisjZGVmaW5lIExWRVFOQl9NRU1SRUdJT05fSU5TVEFOQ0UgICAgICAgICAgMCAgIC8qIE9mZnNldCB0byB0aGUgaW5zdGFuY2UgbWVtb3J5IHJlZ2lvbiAqLworI2RlZmluZSBMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQSAgIDEgICAvKiBPZmZzZXQgdG8gcGVyc2lzdGVudCBkYXRhIG1lbW9yeSByZWdpb24gKi8KKyNkZWZpbmUgTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUYgICAyICAgLyogT2Zmc2V0IHRvIHBlcnNpc3RlbnQgY29lZmZpY2llbnQgcmVnaW9uICovCisjZGVmaW5lIExWRVFOQl9NRU1SRUdJT05fU0NSQVRDSCAgICAgICAgICAgMyAgIC8qIE9mZnNldCB0byBkYXRhIHNjcmF0Y2ggbWVtb3J5IHJlZ2lvbiAqLworI2RlZmluZSBMVkVRTkJfTlJfTUVNT1JZX1JFR0lPTlMgICAgICAgICAgIDQgICAvKiBOdW1iZXIgb2YgbWVtb3J5IHJlZ2lvbnMgKi8KKworLyogQ2FsbGJhY2sgZXZlbnRzICovCisjZGVmaW5lIExWRVFOQl9FVkVOVF9OT05FICAgICAgICAgICAgICAgICAgIDB4MDAwMCAgICAvKiBOb3QgYSB2YWxpZCBldmVudCAqLworI2RlZmluZSBMVkVRTkJfRVZFTlRfQUxHT0ZGICAgICAgICAgICAgICAgICAweDAwMDEgICAgLyogRVFOQiBoYXMgY29tcGxldGVkIHN3aXRjaCBvZmYgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5zdGFuY2UgaGFuZGxlICovCit0eXBlZGVmIHZvaWQgKkxWRVFOQl9IYW5kbGVfdDsKKworCisvKiBPcGVyYXRpbmcgbW9kZXMgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWRVFOQl9CWVBBU1MgICA9IDAsCisgICAgTFZFUU5CX09OICAgICAgID0gMSwKKyAgICBMVkVRTkJfTU9ERV9NQVggPSBMVk1fTUFYSU5UXzMyCit9IExWRVFOQl9Nb2RlX2VuOworCisKKy8qIEZpbHRlciBtb2RlIGNvbnRyb2wgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWRVFOQl9GSUxURVJfT0ZGICAgPSAwLAorICAgIExWRVFOQl9GSUxURVJfT04gICAgPSAxLAorICAgIExWRVFOQl9GSUxURVJfRFVNTVkgPSBMVk1fTUFYSU5UXzMyCit9IExWRVFOQl9GaWx0ZXJNb2RlX2VuOworCisKKy8qIE1lbW9yeSBUeXBlcyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZFUU5CX1BFUlNJU1RFTlQgICAgICA9IDAsCisgICAgTFZFUU5CX1BFUlNJU1RFTlRfREFUQSA9IDEsCisgICAgTFZFUU5CX1BFUlNJU1RFTlRfQ09FRiA9IDIsCisgICAgTFZFUU5CX1NDUkFUQ0ggICAgICAgICA9IDMsCisgICAgTFZFUU5CX01FTU9SWV9NQVggICAgICA9IExWTV9NQVhJTlRfMzIKK30gTFZFUU5CX01lbW9yeVR5cGVzX2VuOworCisKKy8qIEZ1bmN0aW9uIHJldHVybiBzdGF0dXMgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWRVFOQl9TVUNDRVNTICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdWNjZXNzZnVsIHJldHVybiBmcm9tIGEgcm91dGluZSAqLworICAgIExWRVFOQl9BTElHTk1FTlRFUlJPUiA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgYWxpZ25tZW50IGVycm9yICovCisgICAgTFZFUU5CX05VTExBRERSRVNTICAgID0gMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5VTEwgYWxsb2NhdGlvbiBhZGRyZXNzICovCisgICAgTFZFUU5CX1RPT01BTllTQU1QTEVTID0gMywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBleGNlZWRlZCAqLworICAgIExWRVFOQl9TVEFUVVNfTUFYICAgICA9IExWTV9NQVhJTlRfMzIKK30gTFZFUU5CX1JldHVyblN0YXR1c19lbjsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExpbmtlZCBlbnVtZXJhdGVkIHR5cGUgYW5kIGNhcGFiaWxpdHkgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgY2FwYWJpbGl0eSBkZWZpbml0aW9ucyBhcmUgdXNlZCB0byBkZWZpbmUgdGhlIHJlcXVpcmVkIGNhcGFiaWxpdGllcyBhdCAgICAgICAgICAqLworLyogIGluaXRpYWxpc2F0aW9uLCB0aGVzZSBhcmUgYWRkZWQgdG9nZXRoZXIgdG8gZ2l2ZSB0aGUgY2FwYWJpbGl0eSB3b3JkLiBUaGUgICAgICAgICAgICovCisvKiAgZW51bWVyYXRlZCB0eXBlIGlzIHVzZWQgdG8gc2VsZWN0IHRoZSBtb2RlIHRocm91Z2ggYSBjb250cm9sIGZ1bmN0aW9uIGF0IHJ1biB0aW1lLiAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBjYXBhYmlsaXR5IGRlZmluaXRpb24gaXMgcmVsYXRlZCB0byB0aGUgZW51bWVyYXRlZCB0eXBlIHZhbHVlIGJ5IHRoZSBlcXVhdGlvbjogICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIENhcGFiaWxpdHlfdmFsdWUgPSAyXkVudW1lcmF0ZWRfdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRm9yIGV4YW1wbGUsIGEgbW9kdWxlIGNvdWxkIGJlIGNvbmZpZ3VyZCBhdCBpbml0aWFsaXNhdGlvbiB0byBzdXBwb3J0IHR3byBzYW1wbGUgICAgKi8KKy8qICByYXRlcyBvbmx5IGJ5IGNhbGxpbmcgdGhlIGluaXQgZnVuY3Rpb24gd2l0aCB0aGUgdmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBDYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSA9IExWRVFOQl9DQVBfMzIwMDAgKyBMVkVRTkJfQ0FQXzQ0MTAwOyAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBhbmQgYXQgcnVuIHRpbWUgaXQgd291bGQgYmUgcGFzc2VkIHRoZSB2YWx1ZSBMVkVRTkJfRlNfMzIwMDAgdGhyb3VnaCB0aGUgY29udHJvbCAgICAqLworLyogIGZ1bmN0aW9uIHRvIHNlbGVjdCBvcGVyYXRpb24gYXQgMzJrSHogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogU3VwcG9ydGVkIHNvdXJjZSBkYXRhIGZvcm1hdHMKKyAqLworI2RlZmluZSBMVkVRTkJfQ0FQX1NURVJFTyAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTFZFUU5CX0NBUF9NT05PSU5TVEVSRU8gICAgICAgICAgICAyCisKK3R5cGVkZWYgZW51bQoreworICAgIExWRVFOQl9TVEVSRU8gICAgICAgPSAwLAorICAgIExWRVFOQl9NT05PSU5TVEVSRU8gPSAxLAorICAgIExWRVFOQl9TT1VSQ0VfTUFYICAgPSBMVk1fTUFYSU5UXzMyCit9IExWRVFOQl9Tb3VyY2VGb3JtYXRfZW47CisKKworLyoKKyAqIFN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgaW4gc2FtcGxlcyBwZXIgc2Vjb25kCisgKi8KKyNkZWZpbmUgTFZFUU5CX0NBUF9GU184MDAwICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMTEwMjUgICAgICAgICAgICAgICAgMgorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzEyMDAwICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU18xNjAwMCAgICAgICAgICAgICAgICA4CisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMjIwNTAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU18yNDAwMCAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzMyMDAwICAgICAgICAgICAgICAgIDY0CisjZGVmaW5lIExWRVFOQl9DQVBfRlNfNDQxMDAgICAgICAgICAgICAgICAgMTI4CisjZGVmaW5lIExWRVFOQl9DQVBfRlNfNDgwMDAgICAgICAgICAgICAgICAgMjU2CisKK3R5cGVkZWYgZW51bQoreworICAgIExWRVFOQl9GU184MDAwICA9IDAsCisgICAgTFZFUU5CX0ZTXzExMDI1ID0gMSwKKyAgICBMVkVRTkJfRlNfMTIwMDAgPSAyLAorICAgIExWRVFOQl9GU18xNjAwMCA9IDMsCisgICAgTFZFUU5CX0ZTXzIyMDUwID0gNCwKKyAgICBMVkVRTkJfRlNfMjQwMDAgPSA1LAorICAgIExWRVFOQl9GU18zMjAwMCA9IDYsCisgICAgTFZFUU5CX0ZTXzQ0MTAwID0gNywKKyAgICBMVkVRTkJfRlNfNDgwMDAgPSA4LAorICAgIExWRVFOQl9GU19NQVggICA9IExWTV9NQVhJTlRfMzIKK30gTFZFUU5CX0ZzX2VuOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1lbW9yeSByZWdpb24gZGVmaW5pdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgU2l6ZTsgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHNpemUgaW4gYnl0ZXMgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgQWxpZ25tZW50OyAgICAgICAgICAgICAgLyogUmVnaW9uIGFsaWdubWVudCBpbiBieXRlcyAqLworICAgIExWRVFOQl9NZW1vcnlUeXBlc19lbiAgICAgICBUeXBlOyAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gdHlwZSAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqcEJhc2VBZGRyZXNzOyAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZWdpb24gYmFzZSBhZGRyZXNzICovCit9IExWRVFOQl9NZW1vcnlSZWdpb25fdDsKKworCisvKiBNZW1vcnkgdGFibGUgY29udGFpbmluZyB0aGUgcmVnaW9uIGRlZmluaXRpb25zICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWRVFOQl9NZW1vcnlSZWdpb25fdCAgICAgICBSZWdpb25bTFZFUU5CX05SX01FTU9SWV9SRUdJT05TXTsgIC8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAqLworfSBMVkVRTkJfTWVtVGFiX3Q7CisKKworLyogRXF1YWxpc2VyIGJhbmQgZGVmaW5pdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgR2FpbjsgICAgICAgICAgICAgICAgICAgLyogQmFuZCBnYWluIGluIGRCICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIEZyZXF1ZW5jeTsgICAgICAgICAgICAgIC8qIEJhbmQgY2VudHJlIGZyZXF1ZW5jeSBpbiBIeiAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBRRmFjdG9yOyAgICAgICAgICAgICAgICAvKiBCYW5kIHF1YWxpdHkgZmFjdG9yICovCit9IExWRVFOQl9CYW5kRGVmX3Q7CisKKworLyogUGFyYW1ldGVyIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KKyAgICBMVkVRTkJfTW9kZV9lbiAgICAgICAgICAgICAgT3BlcmF0aW5nTW9kZTsKKyAgICBMVkVRTkJfRnNfZW4gICAgICAgICAgICAgICAgU2FtcGxlUmF0ZTsKKyAgICBMVkVRTkJfU291cmNlRm9ybWF0X2VuICAgICAgU291cmNlRm9ybWF0OworCisgICAgLyogRXF1YWxpc2VyIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTkJhbmRzOyAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJhbmRzICovCisgICAgTFZFUU5CX0JhbmREZWZfdCAgICAgICAgICAgICpwQmFuZERlZmluaXRpb247ICAgICAgIC8qIFBvaW50ZXIgdG8gZXF1YWxpc2VyIGRlZmluaXRpb25zICovCisKK30gTFZFUU5CX1BhcmFtc190OworCisKKy8qIENhcGFiaWxpdHkgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBTYW1wbGVSYXRlOworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBTb3VyY2VGb3JtYXQ7CisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTWF4QmFuZHM7CisKKyAgICAvKiBDYWxsYmFjayBwYXJhbWV0ZXJzICovCisgICAgTFZNX0NhbGxiYWNrICAgICAgICAgICAgICAgIENhbGxCYWNrOyAgICAgICAgICAgICAgIC8qIEJ1bmRsZSBjYWxsYmFjayAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqcEJ1bmRsZUluc3RhbmNlOyAgICAgICAvKiBCdW5kbGUgaW5zdGFuY2UgaGFuZGxlICovCisKK30gTFZFUU5CX0NhcGFiaWxpdGllc190OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KKy8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAqLworLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAqLworLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfU1VDQ0VTUyAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgIFdoZW4gYW55IG9mIHBNZW1vcnlUYWJsZSBhbmQgcENhcGFiaWxpdGllcyBpcyBOVUxMIGFkZHJlc3MgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZFUU5CX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9NZW1vcnkoTFZFUU5CX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9NZW1UYWJfdCAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190ICAgICAgKnBDYXBhYmlsaXRpZXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ3JlYXRlIGFuZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIE4tQmFuZCBlcXVhbGxpc2VyIG1vZHVsZSAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGFsZ29yaXRobSBpbnN0YW5jZSBieSBjYWxsaW5nIHdpdGggICAgICAgICAgICovCisvKiAgaEluc3RhbmNlIHNldCB0byBOVUxMLiBJbiB0aGlzIGNhc2UgdGhlIGFsZ29yaXRobSByZXR1cm5zIHRoZSBuZXcgaW5zdGFuY2UgICAgICAgICAgKi8KKy8qICBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBmb3JjZSBhIGZ1bGwgcmUtaW5pdGlhbGlzYXRpb24gb2YgdGhlIGFsZ29yaXRobSAgICAgICAgKi8KKy8qICBieSBjYWxsaW5nIHdpdGggaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlLiBJbiB0aGlzIGNhc2UgdGhlIG1lbW9yeSB0YWJsZSAgICAgICAgICAqLworLyogIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIGVuc3VyZWQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gICAgICovCisvKiAgTFZFUU5CX01lbW9yeSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9TVUNDRVNTICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgICBXaGVuIHBDYXBhYmlsaXRpZXMgb3IgcE1lbW9yeVRhYmxlaXMgb3IgcGhJbnN0YW5jZSBhcmUgTlVMTCAqLworLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgICAgT25lIG9yIG1vcmUgb2YgdGhlIG1lbW9yeSByZWdpb25zIGhhcyBhIE5VTEwgYmFzZSBhZGRyZXNzICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIGZvciBhIG1lbW9yeSByZWdpb24gd2l0aCBhIG5vbi16ZXJvIHNpemUuICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGUgaW5zdGFuY2UgaGFuZGxlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG1lbW9yeSAgICAgICovCisvKiAgICAgIHJlZ2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAyLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZFUU5CX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfSW5pdChMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9NZW1UYWJfdCAgICAgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgKnBDYXBhYmlsaXRpZXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWRVFOQl9HZXRQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmVxdWVzdCB0aGUgZXF1YWxpc2VyIG1vZHVsZSBwYXJhbWV0ZXJzLiBUaGUgY3VycmVudCBwYXJhbWV0ZXIgc2V0IGlzIHJldHVybmVkICAgICAgKi8KKy8qICB2aWEgdGhlIHBhcmFtZXRlciBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9TVUNDRVNTICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgIEluc3RhbmNlIG9yIHBQYXJhbXMgIGlzIE5VTEwgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0dldFBhcmFtZXRlcnMoTFZFUU5CX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9QYXJhbXNfdCAgICAgKnBQYXJhbXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWRVFOQl9HZXRDYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmVxdWVzdCB0aGUgZXF1YWxpc2VyIG1vZHVsZSBjYXBhYmlsaXRpZXMuIFRoZSBjYXBhYmlsaXRpZXMgc2V0IGlzIHJldHVybmVkICAgICAgICAgKi8KKy8qICB2aWEgdGhlIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGNhcGFiaWxpdHkgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9TVUNDRVNTICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgIGhJbnN0YW5jZSBvciBwQ2FwYWJpbGl0aWVzIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0dldENhcGFiaWxpdGllcyhMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgICpwQ2FwYWJpbGl0aWVzKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWRVFOQl9Db250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNldHMgb3IgY2hhbmdlcyB0aGUgZXF1YWxpc2VyIG1vZHVsZSBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBhIHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICBJbnN0YW5jZSBvciBwUGFyYW1zICBpcyBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgIE5VTEwgYWRkcmVzcyBmb3IgdGhlIGVxdWFsaXNlciBmaWx0ZXIgZGVmaW5pdGlvbnMgYW5kIHRoZSAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGJhbmRzIGlzIG5vbi16ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0NvbnRyb2woTFZFUU5CX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX1BhcmFtc190ICAgICAgICpwUGFyYW1zKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWRVFOQl9Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFByb2Nlc3MgZnVuY3Rpb24gZm9yIHRoZSBMaWZlVmliZXMgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluRGF0YSAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwT3V0RGF0YSAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9TVUNDRVNTICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgV2hlbiBoSW5zdGFuY2UsIHBJbkRhdGEgb3IgcE91dERhdGEgYXJlIE5VTEwgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfQUxJR05NRU5URVJST1IgICBXaGVuIHBJbkRhdGEgb3IgcE91dERhdGEgYXJlIG5vdCAzMi1iaXQgYWxpZ25lZCAgICAgICAgICAgICAqLworLyogIExWRVFOQl9UT09NQU5ZU0FNUExFUyAgIE51bVNhbXBsZXMgd2FzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIGJsb2NrIHNpemUgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfUHJvY2VzcyhMVkVRTkJfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAgICAgIC8qIF9fTFZFUU5CX18gKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ2FsY0NvZWYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NhbGNDb2VmLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDg4MTA0OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NhbGNDb2VmLmMKQEAgLTAsMCArMSwzMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogYmVxMDc3MTYgJAorICAgICAkUmV2aXNpb246IDEwMDUgJAorICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzo1ODoyOCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWRVFOQl9Qcml2YXRlLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIERlZmluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICBMVkVRTkJfRG91YmxlUHJlY0NvZWZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBDYWxjdWxhdGUgZG91YmxlIHByZWNpc2lvbiBjb2VmZmljaWVudHMgICAgZm9yIGEgcGVha2luZyBmaWx0ZXIgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnMgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGluZyBmcmVxdWVuY3kgaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwRmlsdGVyRGVmaW5pdGlvbiAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXIgZGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDb2VmZmljaWVudHMgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9TVUNDRVNTICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoZSBlcXVhdGlvbnMgdXNlZCBhcmUgYXMgZm9sbG93czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRyAgPSAxMF4oR2FpbmRCLzIwKSAtIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0MCA9IDIgKiBQaSAqIEZjIC8gRnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEQgID0gMSAgICAgICAgICAgICAgICAgIGlmIEdhaW5kQiA+PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRCAgPSAxIC8gKDEgKyBHKSAgICAgICAgaWYgR2FpbmRCIDwgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGIyID0gLTAuNSAqICgyUSAtIEQgKiB0MCkgLyAoMlEgKyBEICogdDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYjEgPSAoMC41IC0gYjIpICogKDEgLSBjb3NlcnIodDApKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhMCA9ICgwLjUgKyBiMikgLyAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVyZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBHYWluZEIgICAgICBpcyB0aGUgZ2FpbiBpbiBkQnMsIHJhbmdlIC0xNWRCIHRvICsxNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEZjICAgICAgICAgIGlzIHRoZSBjZW50cmUgZnJlcXVlbmN5LCBEQyB0byBGcy81MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRnMgICAgICAgICAgaXMgdGhlIHNhbXBsZSBmcmVxdWVuY3ksIDgwMDAgdG8gNDgwMDAgaW4gZGVzY3JldGUgc3RlcHMgICAgICAgICAgICAqLworLyogICAgICBRICAgICAgICAgICBpcyB0aGUgUSBmYWN0b3IsIDAuMjUgdG8gMTIgKHJlcHJlc2VudGVkIGJ5IDI1IHRvIDEyMDApICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAyLiBUaGUgZG91YmxlIHByZWNpc2lvbiBjb2VmZmljaWVudHMgYXJlIG9ubHkgdXNlZCB3aGVuIGZjIGlzIGxlc3MgdGhhbiBmcy84NSwgc28gICAqLworLyogICAgIHRoZSBjb3NpbmUgb2YgdDAgaXMgYWx3YXlzIGNsb3NlIHRvIDEuMC4gSW5zdGVhZCBvZiBjYWxjdWxhdGluZyB0aGUgY29zaW5lICAgICAgICovCisvKiAgICAgaXRzZWxmIHRoZSBkaWZmZXJlbmNlIGZyb20gdGhlIHZhbHVlIDEuMCBpcyBjYWxjdWxhdGVkLCB0aGlzIGNhbiBiZSBkb25lIHdpdGggICAgKi8KKy8qICAgICBsb3dlciBwcmVjaXNpb24gbWF0aHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMy4gVGhlIHZhbHVlIG9mIHRoZSBCMiBjb2VmZmljaWVudCBpcyBvbmx5IGNhbGN1bGF0ZWQgYXMgYSBzaW5nbGUgcHJlY2lzaW9uIHZhbHVlLCAgKi8KKy8qICAgICBzbWFsbCBlcnJvcnMgaW4gdGhpcyB2YWx1ZSBoYXZlIGEgY29tYmluZWQgZWZmZWN0IG9uIHRoZSBRIGFuZCBHYWluIGJ1dCBub3QgdGhlICAqLworLyogICAgIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGZpbHRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0RvdWJsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzMyX0NvZWZzX3QgICAgKnBDb2VmZmljaWVudHMpCit7CisKKyAgICBleHRlcm4gTFZNX0lOVDE2ICAgIExWRVFOQl9HYWluVGFibGVbXTsKKyAgICBleHRlcm4gTFZNX0lOVDE2ICAgIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtdOworICAgIGV4dGVybiBMVk1fSU5UMTYgICAgTFZFUU5CX0RUYWJsZVtdOworICAgIGV4dGVybiBMVk1fSU5UMTYgICAgTFZFUU5CX0RQQ29zQ29lZltdOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGZpbHRlciBkZWZpbml0aW9uCisgICAgICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICBHYWluICAgICAgICA9IHBGaWx0ZXJEZWZpbml0aW9uLT5HYWluOworICAgIExWTV9VSU5UMTYgICAgICAgICAgRnJlcXVlbmN5ICAgPSBwRmlsdGVyRGVmaW5pdGlvbi0+RnJlcXVlbmN5OworICAgIExWTV9VSU5UMTYgICAgICAgICAgUUZhY3RvciAgICAgPSBwRmlsdGVyRGVmaW5pdGlvbi0+UUZhY3RvcjsKKworICAgIC8qCisgICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcworICAgICAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgVDA7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICBEOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQTA7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBCMTsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEIyOworICAgIExWTV9JTlQzMiAgICAgICAgICAgRHQwOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQjJfRGVuOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQjJfTnVtOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQ29zRXJyOworICAgIExWTV9JTlQxNiAgICAgICAgICAgY29lZjsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIGZhY3RvcjsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIHQwOworICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRpbmcgdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMKKyAgICAgKi8KKyAgICBUMCA9IChMVk1fSU5UMzIpRnJlcXVlbmN5ICogTFZFUU5CX1R3b1BpT25Gc1RhYmxlW0ZzXTsgICAgICAgIC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLworICAgIGlmIChHYWluID49IDApCisgICAgeworICAgICAgICBEID0gTFZFUU5CX0RUYWJsZVsxNV07ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEQgPSAxICAgICAgICAgICAgaWYgR2FpbmRCID49IDAgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRCA9IExWRVFOQl9EVGFibGVbR2FpbisxNV07ICAgICAgICAgICAgICAgICAgICAvKiBEID0gMSAvICgxICsgRykgIGlmIEdhaW5kQiA8ICAwICovCisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIEIyIGNvZWZmaWNpZW50CisgICAgICovCisgICAgRHQwID0gRCAqIChUMCA+PiAxMCk7CisgICAgQjJfRGVuID0gKChMVk1fSU5UMzIpUUZhY3RvciA8PCAxOSkgKyAoRHQwID4+IDIpOworICAgIEIyX051bSA9IChEdDAgPj4gMykgLSAoKExWTV9JTlQzMilRRmFjdG9yIDw8IDE4KTsKKyAgICBCMiA9IChCMl9OdW0gLyAoQjJfRGVuID4+IDE2KSkgPDwgMTU7CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgY29zaW5lIGVycm9yIGJ5IGEgcG9seW5vbWlhbCBleHBhbnNpb24gdXNpbmcgdGhlIGVxdWF0aW9uOgorICAgICAqCisgICAgICogIENvc0VyciArPSBjb2VmKG4pICogdDBebiAgICAgICAgICAgICAgICBGb3IgbiA9IDAgdG8gNAorICAgICAqLworICAgIFQwID0gKFQwID4+IDYpICogMHg3ZjUzOyAgICAgICAgICAgICAgICAgICAgLyogU2NhbGUgdG8gMS4wIGluIDE2LWJpdCBmb3IgcmFuZ2UgMCB0byBmcy81MCAqLworICAgIHQwID0gKExWTV9JTlQxNikoVDAgPj4gMTYpOworICAgIGZhY3RvciA9IDB4N2ZmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0byAxLjAgZm9yIHRoZSBhMCBjb2VmZmljaWVudCAqLworICAgIENvc0VyciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgdG8gemVybyAqLworICAgIGZvciAoaT0xOyBpPDU7IGkrKykKKyAgICB7CisgICAgICAgIGNvZWYgPSBMVkVRTkJfRFBDb3NDb2VmW2ldOyAgICAgICAgICAgICAvKiBHZXQgdGhlIG50aCBjb2VmZmljaWVudCAqLworICAgICAgICBDb3NFcnIgKz0gKGZhY3RvciAqIGNvZWYpID4+IDU7ICAgICAgICAgLyogVGhlIG50aCBwYXJ0aWFsIHN1bSAqLworICAgICAgICBmYWN0b3IgPSAoZmFjdG9yICogdDApID4+IDE1OyAgICAgICAgICAgLyogQ2FsY3VsYXRlIHQwXm4gKi8KKyAgICB9CisgICAgQ29zRXJyID0gQ29zRXJyIDw8IChMVkVRTkJfRFBDb3NDb2VmWzBdKTsgICAvKiBDb3JyZWN0IHRoZSBzY2FsaW5nICovCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgQjEgYW5kIEEwIGNvZWZmaWNpZW50cworICAgICAqLworICAgIEIxID0gKDB4NDAwMDAwMDAgLSBCMik7ICAgICAgICAgICAgICAgICAgICAgLyogQjEgPSAoMC41IC0gYjIvMikgKi8KKyAgICBBMCA9ICgoQjEgPj4gMTYpICogKENvc0VyciA+PiAxMCkpID4+IDY7ICAgIC8qIFRlbXBvcmFyeSBzdG9yYWdlIGZvciAoMC41IC0gYjIvMikgKiBjb3NlcnIodDApICovCisgICAgQjEgLT0gQTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCMSA9ICgwLjUgLSBiMi8yKSAqICgxIC0gY29zZXJyKHQwKSkgICovCisgICAgQTAgPSAoMHg0MDAwMDAwMCArIEIyKSA+PiAxOyAgICAgICAgICAgICAgICAvKiBBMCA9ICgwLjUgKyBiMikgKi8KKworICAgIC8qCisgICAgICogV3JpdGUgY29lZmYgaW50byB0aGUgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICBwQ29lZmZpY2llbnRzLT5BMCA9IEEwOworICAgIHBDb2VmZmljaWVudHMtPkIxID0gQjE7CisgICAgcENvZWZmaWNpZW50cy0+QjIgPSBCMjsKKyAgICBwQ29lZmZpY2llbnRzLT5HICA9IExWRVFOQl9HYWluVGFibGVbR2FpbisxNV07CisKKyAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOworCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIENhbGN1bGF0ZSBzaW5nbGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cyAgICBmb3IgYSBwZWFraW5nIGZpbHRlciAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBGcyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsaW5nIGZyZXF1ZW5jeSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBGaWx0ZXJEZWZpbml0aW9uICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGZpbHRlciBkZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENvZWZmaWNpZW50cyAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhlIGVxdWF0aW9ucyB1c2VkIGFyZSBhcyBmb2xsb3dzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBHICA9IDEwXihHYWluZEIvMjApIC0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHQwID0gMiAqIFBpICogRmMgLyBGcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRCAgPSAxICAgICAgICAgICAgICAgICAgaWYgR2FpbmRCID49IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBEICA9IDEgLyAoMSArIEcpICAgICAgICBpZiBHYWluZEIgPCAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYjIgPSAtMC41ICogKDJRIC0gRCAqIHQwKSAvICgyUSArIEQgKiB0MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBiMSA9ICgwLjUgLSBiMikgKiBjb3ModDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGEwID0gKDAuNSArIGIyKSAvIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZXJlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEdhaW5kQiAgICAgIGlzIHRoZSBnYWluIGluIGRCcywgcmFuZ2UgLTE1ZEIgdG8gKzE1ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRmMgICAgICAgICAgaXMgdGhlIGNlbnRyZSBmcmVxdWVuY3ksIERDIHRvIE55cXVpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBGcyAgICAgICAgICBpcyB0aGUgc2FtcGxlIGZyZXF1ZW5jeSwgODAwMCB0byA0ODAwMCBpbiBkZXNjcmV0ZSBzdGVwcyAgICAgICAgICAgICovCisvKiAgICAgIFEgICAgICAgICAgIGlzIHRoZSBRIGZhY3RvciwgMC4yNSB0byAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKExWTV9VSU5UMTYgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CYW5kRGVmX3QgICpwRmlsdGVyRGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMTZfQ29lZnNfdCAgICAqcENvZWZmaWNpZW50cykKK3sKKworICAgIGV4dGVybiBMVk1fSU5UMTYgICAgTFZFUU5CX0dhaW5UYWJsZVtdOworICAgIGV4dGVybiBMVk1fSU5UMTYgICAgTFZFUU5CX1R3b1BpT25Gc1RhYmxlW107CisgICAgZXh0ZXJuIExWTV9JTlQxNiAgICBMVkVRTkJfRFRhYmxlW107CisgICAgZXh0ZXJuIExWTV9JTlQxNiAgICBMVkVRTkJfQ29zQ29lZltdOworCisKKyAgICAvKgorICAgICAqIEdldCB0aGUgZmlsdGVyIGRlZmluaXRpb24KKyAgICAgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgIEdhaW4gICAgICAgID0gcEZpbHRlckRlZmluaXRpb24tPkdhaW47CisgICAgTFZNX1VJTlQxNiAgICAgICAgICBGcmVxdWVuY3kgICA9IHBGaWx0ZXJEZWZpbml0aW9uLT5GcmVxdWVuY3k7CisgICAgTFZNX1VJTlQxNiAgICAgICAgICBRRmFjdG9yICAgICA9IHBGaWx0ZXJEZWZpbml0aW9uLT5RRmFjdG9yOworCisKKyAgICAvKgorICAgICAqIEludGVybWVkaWF0ZSB2YXJpYWJsZXMgYW5kIHRlbXBvcmFyeSB2YWx1ZXMKKyAgICAgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgIFQwOworICAgIExWTV9JTlQxNiAgICAgICAgICAgRDsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEEwOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQjE7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBCMjsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIER0MDsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEIyX0RlbjsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEIyX051bTsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIENPU19UMDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIGNvZWY7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBmYWN0b3I7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICB0MDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIGk7CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0aW5nIHRoZSBpbnRlcm1lZGlhdGUgdmFsdWVzCisgICAgICovCisgICAgVDAgPSAoTFZNX0lOVDMyKUZyZXF1ZW5jeSAqIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtGc107ICAgICAgICAvKiBUMCA9IDIgKiBQaSAqIEZjIC8gRnMgKi8KKyAgICBpZiAoR2FpbiA+PSAwKQorICAgIHsKKyAgICAgICAgRCA9IExWRVFOQl9EVGFibGVbMTVdOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEID0gMSAgICAgICAgICAgIGlmIEdhaW5kQiA+PSAwICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEQgPSBMVkVRTkJfRFRhYmxlW0dhaW4rMTVdOyAgICAgICAgICAgICAgICAgICAgLyogRCA9IDEgLyAoMSArIEcpICBpZiBHYWluZEIgPCAgMCAqLworICAgIH0KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBCMiBjb2VmZmljaWVudAorICAgICAqLworICAgIER0MCA9IEQgKiAoVDAgPj4gMTApOworICAgIEIyX0RlbiA9ICgoTFZNX0lOVDMyKVFGYWN0b3IgPDwgMTkpICsgKER0MCA+PiAyKTsKKyAgICBCMl9OdW0gPSAoRHQwID4+IDMpIC0gKChMVk1fSU5UMzIpUUZhY3RvciA8PCAxOCk7CisgICAgQjIgPSAoQjJfTnVtIC8gKEIyX0RlbiA+PiAxNikpIDw8IDE1OworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIGNvc2luZSBieSBhIHBvbHlub21pYWwgZXhwYW5zaW9uIHVzaW5nIHRoZSBlcXVhdGlvbjoKKyAgICAgKgorICAgICAqICBDb3MgKz0gY29lZihuKSAqIHQwXm4gICAgICAgICAgICAgICAgICAgRm9yIG4gPSAwIHRvIDYKKyAgICAgKi8KKyAgICBUMCA9IChUMCA+PiAxMCkgKiAyMDg1OTsgICAgICAgICAgICAgICAgICAgIC8qIFNjYWxlIHRvIDEuMCBpbiAxNi1iaXQgZm9yIHJhbmdlIDAgdG8gZnMvMiAqLworICAgIHQwID0gKExWTV9JTlQxNikoVDAgPj4gMTYpOworICAgIGZhY3RvciA9IDB4N2ZmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0byAxLjAgZm9yIHRoZSBhMCBjb2VmZmljaWVudCAqLworICAgIENPU19UMCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgdG8gemVybyAqLworICAgIGZvciAoaT0xOyBpPDc7IGkrKykKKyAgICB7CisgICAgICAgIGNvZWYgPSBMVkVRTkJfQ29zQ29lZltpXTsgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG50aCBjb2VmZmljaWVudCAqLworICAgICAgICBDT1NfVDAgKz0gKGZhY3RvciAqIGNvZWYpID4+IDU7ICAgICAgICAgLyogVGhlIG50aCBwYXJ0aWFsIHN1bSAqLworICAgICAgICBmYWN0b3IgPSAoZmFjdG9yICogdDApID4+IDE1OyAgICAgICAgICAgLyogQ2FsY3VsYXRlIHQwXm4gKi8KKyAgICB9CisgICAgQ09TX1QwID0gQ09TX1QwIDw8IChMVkVRTkJfQ29zQ29lZlswXSs2KTsgICAgICAgICAgLyogQ29ycmVjdCB0aGUgc2NhbGluZyAqLworCisKKyAgICBCMSA9ICgoMHg0MDAwMDAwMCAtIEIyKSA+PiAxNikgKiAoQ09TX1QwID4+IDE2KTsgICAgLyogQjEgPSAoMC41IC0gYjIvMikgKiBjb3ModDApICovCisgICAgQTAgPSAoMHg0MDAwMDAwMCArIEIyKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEwID0gKDAuNSArIGIyLzIpICovCisKKyAgICAvKgorICAgICAqIFdyaXRlIGNvZWZmIGludG8gdGhlIGRhdGEgc3RydWN0dXJlCisgICAgICovCisgICAgcENvZWZmaWNpZW50cy0+QTAgPSAoTFZNX0lOVDE2KShBMD4+MTYpOworICAgIHBDb2VmZmljaWVudHMtPkIxID0gKExWTV9JTlQxNikoQjE+PjE1KTsKKyAgICBwQ29lZmZpY2llbnRzLT5CMiA9IChMVk1fSU5UMTYpKEIyPj4xNik7CisgICAgcENvZWZmaWNpZW50cy0+RyAgPSBMVkVRTkJfR2FpblRhYmxlW0dhaW4rMTVdOworCisKKyAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOworCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvZWZmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg3ZDcxNDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWZuZGVmIF9fTFZFUU5CX0NPRUZGU19IX18KKyNkZWZpbmUgX19MVkVRTkJfQ09FRkZTX0hfXworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogR2FpbiB0YWJsZSBmb3IgKDEwXihHYWluLzIwKSAtIDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExWRVFOQl9HQUlOU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNjg0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuODIyMTcyICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNjM5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuODAwNDc0ICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEzX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNTkwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNzc2MTI4ICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNTM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNzQ4ODExICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzExX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNDcxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNzE4MTYyICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEwX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNDAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNjgzNzcyICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzlfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMzIxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNjQ1MTg3ICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzhfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMjMzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNjAxODkzICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzdfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMTMzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNTUzMzE2ICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzZfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDIyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDk4ODEzICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtODk2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDM3NjU5ICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzU2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzY5MDQzICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTk4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjkyMDU0ICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDIxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjA1NjcyICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjIzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTA4NzQ5ICovCisjZGVmaW5lIExWRVFOQl9HYWluXzBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgTFZFUU5CX0dhaW5fMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjEyMjAxOCAqLworI2RlZmluZSBMVkVRTkJfR2Fpbl8yX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjU4OTI1ICovCisjZGVmaW5lIExWRVFOQl9HYWluXzNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODQ1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40MTI1MzggKi8KKyNkZWZpbmUgTFZFUU5CX0dhaW5fNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjU4NDg5MyAqLworI2RlZmluZSBMVkVRTkJfR2Fpbl81X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU5NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNzc4Mjc5ICovCisjZGVmaW5lIExWRVFOQl9HYWluXzZfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDM4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTUyNjIgKi8KKyNkZWZpbmUgTFZFUU5CX0dhaW5fN19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1MzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjIzODcyMSAqLworI2RlZmluZSBMVkVRTkJfR2Fpbl84X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA5NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuNTExODg2ICovCisjZGVmaW5lIExWRVFOQl9HYWluXzlfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNzI0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS44MTgzODMgKi8KKyNkZWZpbmUgTFZFUU5CX0dhaW5fMTBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAyLjE2MjI3OCAqLworI2RlZmluZSBMVkVRTkJfR2Fpbl8xMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTIxOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDIuNTQ4MTM0ICovCisjZGVmaW5lIExWRVFOQl9HYWluXzEyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MTA1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMi45ODEwNzIgKi8KKyNkZWZpbmUgTFZFUU5CX0dhaW5fMTNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxMDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAzLjQ2NjgzNiAqLworI2RlZmluZSBMVkVRTkJfR2Fpbl8xNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODIxNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDQuMDExODcyICovCisjZGVmaW5lIExWRVFOQl9HYWluXzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NDY5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNC42MjM0MTMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZyZXF1ZW5jeSB0YWJsZSBmb3IgMipQaS9GcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMVkVRTkJfRlJFUVNISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNSAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBMVkVRTkJfMlBpT25fODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjM1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwNzg1ICovCisjZGVmaW5lIExWRVFOQl8yUGlPbl8xMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MTIzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDA1NzAgKi8KKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc1NjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDUyNCAqLworI2RlZmluZSBMVkVRTkJfMlBpT25fMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzE3NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMzkzICovCisjZGVmaW5lIExWRVFOQl8yUGlPbl8yMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NTYxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAyODUgKi8KKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3ODUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDI2MiAqLworI2RlZmluZSBMVkVRTkJfMlBpT25fMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU4OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMTk2ICovCisjZGVmaW5lIExWRVFOQl8yUGlPbl80NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NzgxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAxNDIgKi8KKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzOTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDEzMSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogNTBEIHRhYmxlIGZvciA1MCAvICggMSArIEdhaW4gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExWRVFOQl8xMDBEU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3OTk1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNS42MjM0MTMgKi8KKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSA1LjAxMTg3MiAqLworI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDI5NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDQuNDY2ODM2ICovCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzEyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNzM5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMy45ODEwNzIgKi8KKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEzNTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAzLjU0ODEzNCAqLworI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDExOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDMuMTYyMjc4ICovCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzlfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MDE5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMi44MTgzODMgKi8KKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnOF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAyLjUxMTg4NiAqLworI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc3X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzE2NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDIuMjM4NzIxICovCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzZfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2Mzg1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS45OTUyNjIgKi8KKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2OTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjc3ODI3OSAqLworI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA3MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuNTg0ODkzICovCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NTIwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS40MTI1MzggKi8KKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwMjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjI1ODkyNSAqLworI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzU5MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMTIyMDE4ICovCisjZGVmaW5lIExWRVFOQl8xMDBEXzBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDAwMDAgKi8KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44OGY2ZmIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jCkBAIC0wLDAgKzEsNTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IG54cDAwNzc1MyAkCisgICAgICRSZXZpc2lvbjogMTIyMyAkCisgICAgICREYXRlOiAyMDEwLTA3LTE1IDE0OjI3OjAxICswMjAwIChUaHUsIDE1IEp1bCAyMDEwKSAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZFUU5CLmgiCisjaW5jbHVkZSAiTFZFUU5CX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiQklRVUFELmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSAgICAgTE9XX0ZSRVEgICAgICAgICAgICAyOTggICAgICAgICAgICAgLyogMzI3NjgvMTEwIGZvciBsb3cgdGVzdCBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgICAgIEhJR0hfRlJFUSAgICAgICAgICAgMzg2ICAgICAgICAgICAgIC8qIDMyNzY4Lzg1IGZvciBoaWdoIHRlc3QgZnJlcXVlbmN5ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWRVFOQl9HZXRQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmVxdWVzdCB0aGUgTi1CYW5kIGVxdWFsaXNlciBwYXJhbWV0ZXJzLiBUaGUgY3VycmVudCBwYXJhbWV0ZXIgc2V0IGlzIHJldHVybmVkIHZpYSAgKi8KKy8qICB0aGUgcGFyYW1ldGVyIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9TVUNDRVNTICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgSW5zdGFuY2Ugb3IgcFBhcmFtcyAgaXMgTlVMTCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0dldFBhcmFtZXRlcnMoTFZFUU5CX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9QYXJhbXNfdCAgICAgKnBQYXJhbXMpCit7CisKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0oTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisgICAvKgorICAgICAqIENoZWNrIGZvciBlcnJvciBjb25kaXRpb25zCisgICAgICovCisgICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBQYXJhbXMgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICAqcFBhcmFtcyA9IHBJbnN0YW5jZS0+UGFyYW1zOworCisgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZFUU5CX0dldENhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBHZXQgdGhlIE4tQmFuZCBlcXVhbGlzZXIgY2FwYWJpbGl0aWVzLiBUaGUgY3VycmVudCBjYXBhYmlsaXRpZXMgYXJlIHJldHVybmVkICAgICovCisvKiAgdmlhIHRoZSBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGNhcGFiaWxpdHkgc3RydWN0dXJlICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9TdWNjZXNzICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICAgaEluc3RhbmNlIG9yIHBDYXBhYmlsaXRpZXMgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfR2V0Q2FwYWJpbGl0aWVzKExWRVFOQl9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAgKnBDYXBhYmlsaXRpZXMpCit7CisKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0oTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisgICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBDYXBhYmlsaXRpZXMgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICAqcENhcGFiaWxpdGllcyA9IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzOworCisgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWRVFOQl9TZXRGaWx0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTZXRzIHRoZSBmaWx0ZXIgdHlwZSBiYXNlZCBvbiB0aGUgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdm9pZCAgICAgICAgICAgICAgICBOb3RoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVG8gc2VsZWN0IHRoZSBiaXF1YWQgdHlwZSB0aGUgZm9sbG93IHJ1bGVzIGFyZSBhcHBsaWVkOiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRG91YmxlIHByZWNpc2lvbiAgICBpZiAoZmMgPD0gZnMvMTEwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIERvdWJsZSBwcmVjaXNpb24gICAgaWYgKGZzLzExMCA8IGZjIDwgZnMvODUpICYgKFE+MykgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBTaW5nbGUgcHJlY2lzaW9uICAgIG90aGVyd2lzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgICAgTFZFUU5CX1NldEZpbHRlcnMoTFZFUU5CX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKK3sKKworICAgIGV4dGVybiBjb25zdCBMVk1fVUlOVDE2ICAgTFZFUU5CX1NhbXBsZVJhdGVUYWJbXTsgICAgICAgICAgIC8qIFNhbXBsZSByYXRlIHRhYmxlICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGJhbmQgaW5kZXggKi8KKyAgICBMVk1fVUlOVDMyICAgICAgICAgIGZzID0gKExWTV9VSU5UMzIpTFZFUU5CX1NhbXBsZVJhdGVUYWJbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07ICAvKiBTYW1wbGUgcmF0ZSAqLworICAgIExWTV9VSU5UMzIgICAgICAgICAgZmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBjZW50cmUgZnJlcXVlbmN5ICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICBRRmFjdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIFEgZmFjdG9yICovCisKKworICAgIHBJbnN0YW5jZS0+TkJhbmRzID0gcFBhcmFtcy0+TkJhbmRzOworCisgICAgZm9yIChpPTA7IGk8cFBhcmFtcy0+TkJhbmRzOyBpKyspCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIGZpbHRlciBzZXR0aW5ncworICAgICAgICAgKi8KKyAgICAgICAgZmMgPSAoTFZNX1VJTlQzMilwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV0uRnJlcXVlbmN5OyAgICAgLyogR2V0IHRoZSBiYW5kIGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICAgICAgUUZhY3RvciA9IChMVk1fSU5UMTYpcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLlFGYWN0b3I7ICAgLyogR2V0IHRoZSBiYW5kIFEgZmFjdG9yICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBGb3IgZWFjaCBmaWx0ZXIgc2V0IHRoZSB0eXBlIG9mIGJpcXVhZCByZXF1aXJlZAorICAgICAgICAgKi8KKyAgICAgICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXSA9IExWRVFOQl9TaW5nbGVQcmVjaXNpb247ICAgICAgICAgLyogRGVmYXVsdCB0byBzaW5nbGUgcHJlY2lzaW9uICovCisgICAgICAgIGlmICgoZmMgPDwgMTUpIDw9IChMT1dfRlJFUSAqIGZzKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGZjIDw9IGZzLzExMAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldID0gTFZFUU5CX0RvdWJsZVByZWNpc2lvbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoKGZjIDw8IDE1KSA8PSAoSElHSF9GUkVRICogZnMpKSAmJiAoUUZhY3RvciA+IDMwMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiAoZnMvMTEwIDwgZmMgPCBmcy84NSkgJiAoUT4zKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldID0gTFZFUU5CX0RvdWJsZVByZWNpc2lvbjsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgZm9yIG91dCBvZiByYW5nZSBmcmVxdWVuY2llcworICAgICAgICAgKi8KKyAgICAgICAgaWYgKGZjID4gKGZzID4+IDEpKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldID0gTFZFUU5CX091dE9mUmFuZ2U7CisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIENvcHkgdGhlIGZpbHRlciBkZWZpbml0aW9uIHRvIHBlcnNpc3RhbnQgbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnNbaV0gPSBwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV07CisKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVkVRTkJfU2V0Q29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2V0cyB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cy4gVGhpcyB1c2VzIHRoZSB0eXBlIHRvIHNlbGVjdCBzaW5nbGUgb3IgZG91YmxlICAgICAqLworLyogIHByZWNpc2lvbiBjb2VmZmljaWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAgICBMVkVRTkJfU2V0Q29lZmZpY2llbnRzKExWRVFOQl9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlKQoreworCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgaTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBiYW5kIGluZGV4ICovCisgICAgTFZFUU5CX0JpcXVhZFR5cGVfZW4gICAgQmlxdWFkVHlwZTsgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBiaXF1YWQgdHlwZSAqLworCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzIGZvciBlYWNoIGJhbmQgYnkgdGhlIGluaXQgZnVuY3Rpb24KKyAgICAgKi8KKyAgICBmb3IgKGk9MDsgaTxwSW5zdGFuY2UtPlBhcmFtcy5OQmFuZHM7IGkrKykKKyAgICB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgYmFuZCB0eXBlIGZvciBjb3JyZWN0IGluaXRpYWxpc2F0aW9uIG1ldGhvZCBhbmQgcmVjYWxjdWxhdGUgdGhlIGNvZWZmaWNpZW50cworICAgICAgICAgKi8KKyAgICAgICAgQmlxdWFkVHlwZSA9IHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV07CisgICAgICAgIHN3aXRjaCAgKEJpcXVhZFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgICAgTFZFUU5CX0RvdWJsZVByZWNpc2lvbjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQS19DMzJfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBkb3VibGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIExWRVFOQl9Eb3VibGVQcmVjQ29lZnMoKExWTV9VSU5UMTYpcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBQS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cEVRTkJfVGFwc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICAgIExWRVFOQl9TaW5nbGVQcmVjaXNpb246CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEtfQzE2X0NvZWZzX3QgICAgICBDb2VmZmljaWVudHM7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIENhbGN1bGF0ZSB0aGUgc2luZ2xlIHByZWNpc2lvbiBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBFUU5CX1RhcHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDbGVhcnMgdGhlIGZpbHRlciBkYXRhIGhpc3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KExWRVFOQl9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlKQoreworICAgIExWTV9JTlQxNiAgICAgICAqcFRhcEFkZHJlc3M7CisgICAgTFZNX0lOVDE2ICAgICAgIE51bVRhcHM7CisKKworICAgIHBUYXBBZGRyZXNzID0gKExWTV9JTlQxNiAqKXBJbnN0YW5jZS0+cEVRTkJfVGFwczsKKyAgICBOdW1UYXBzICAgICA9IChMVk1fSU5UMTYpKChwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCkpL3NpemVvZihMVk1fSU5UMTYpKTsKKworICAgIGlmIChOdW1UYXBzICE9IDApCisgICAgeworICAgICAgICBMb2FkQ29uc3RfMTYoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLworICAgICAgICAgICAgICAgICAgICAgcFRhcEFkZHJlc3MsICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgTnVtVGFwcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfQ29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTZXRzIG9yIGNoYW5nZXMgdGhlIExpZmVWaWJlcyBtb2R1bGUgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9TdWNjZXNzICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgSW5zdGFuY2Ugb3IgcFBhcmFtcyAgaXMgTlVMTCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICBOVUxMIGFkZHJlc3MgZm9yIHRoZSBlcXVhbGlzZXIgZmlsdGVyIGRlZmluaXRpb25zIGFuZCB0aGUgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBiYW5kcyBpcyBub24temVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZFUU5CX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Db250cm9sKExWRVFOQl9IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfUGFyYW1zX3QgICAgICAgICpwUGFyYW1zKQoreworCisgICAgTFZFUU5CX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgYkNoYW5nZSAgICA9IExWTV9GQUxTRTsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICBpID0gMDsKKyAgICBMVkVRTkJfTW9kZV9lbiAgICAgICBPcGVyYXRpbmdNb2RlU2F2ZSA7CisKKyAgICAvKgorICAgICAqIENoZWNrIGZvciBlcnJvciBjb25kaXRpb25zCisgICAgICovCisgICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBQYXJhbXMgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICBpZigocFBhcmFtcy0+TkJhbmRzICE9MCkgJiYgKHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbj09TFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICBPcGVyYXRpbmdNb2RlU2F2ZSA9IHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGU7CisKKyAgICAvKiBTZXQgdGhlIGFscGhhIGZhY3RvciBvZiB0aGUgbWl4ZXIgKi8KKyAgICBpZiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlKQorICAgIHsKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSxMVkVRTkJfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSxMVkVRTkJfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKyAgICB9CisKKworICAgIGlmKCAocEluc3RhbmNlLT5QYXJhbXMuTkJhbmRzICAgICAgICAgICAgIT0gIHBQYXJhbXMtPk5CYW5kcyAgICAgICAgICApIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICAgICAhPSAgcFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAgICkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLnBCYW5kRGVmaW5pdGlvbiAgICE9ICBwUGFyYW1zLT5wQmFuZERlZmluaXRpb24gKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAgICAgICAgIT0gIHBQYXJhbXMtPlNhbXBsZVJhdGUgICAgICApIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgICAgICAhPSAgcFBhcmFtcy0+U291cmNlRm9ybWF0ICAgICkpCisgICAgeworCisgICAgICAgIGJDaGFuZ2UgPSBMVk1fVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgcFBhcmFtcy0+TkJhbmRzOyBpKyspCisgICAgICAgIHsKKworICAgICAgICAgICAgaWYoKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5GcmVxdWVuY3kgICE9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5GcmVxdWVuY3kgKXx8CisgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5HYWluICAgICAgICE9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5HYWluICAgICAgKXx8CisgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5RRmFjdG9yICAgICE9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5RRmFjdG9yICAgKSkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGJDaGFuZ2UgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgaWYoYkNoYW5nZSl7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhlIHNhbXBsZSByYXRlIGhhcyBjaGFuZ2VkIGNsZWFyIHRoZSBoaXN0b3J5CisgICAgICAgICAqLworICAgICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KHBJbnN0YW5jZSk7ICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSAqLworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzCisgICAgICAgICAqLworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcyA9ICpwUGFyYW1zOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVzZXQgdGhlIGZpbHRlcnMgZXhjZXB0IGlmIHRoZSBhbGdvIGlzIHN3aXRjaGVkIG9mZgorICAgICAgICAgKi8KKyAgICAgICAgaWYocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVkVRTkJfQllQQVNTKXsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSZXNldCB0aGUgZmlsdGVycyBhcyBhbGwgcGFyYW1ldGVycyBjb3VsZCBoYXZlIGNoYW5nZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgTFZFUU5CX1NldEZpbHRlcnMocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyAqLworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVXBkYXRlIHRoZSBmaWx0ZXJzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIExWRVFOQl9TZXRDb2VmZmljaWVudHMocEluc3RhbmNlKTsgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgIH0KKworICAgICAgICBpZihwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IE9wZXJhdGluZ01vZGVTYXZlKQorICAgICAgICB7CisgICAgICAgICAgICBpZihwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLExWTV9NQVhJTlRfMTYpOworICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sMCk7CisKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCAgICAgICAgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFN0YXkgb24gdGhlIE9OIG9wZXJhdGluZyBtb2RlIHVudGlsIHRoZSB0cmFuc2l0aW9uIGlzIGRvbmUgKi8KKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZFUU5CX09OOworCisgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwwKTsKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLExWTV9NQVhJTlRfMTYpOworICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLExWRVFOQl9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSxMVkVRTkJfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKworICAgICAgICAgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9UUlVFOworICAgICAgICB9CisKKyAgICB9CisgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWRVFOQl9CeXBhc3NNaXhlckNhbGxCYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENhbGxCYWNrIGZ1bmN0aW9uIG9mIHRoZSBtaXhlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdHJhbnNpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fSU5UMzIgTFZFUU5CX0J5cGFzc01peGVyQ2FsbEJhY2sgKHZvaWQqIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgQ2FsbGJhY2tQYXJhbSkKK3sKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgPShMVkVRTkJfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0NhbGxiYWNrICAgICAgICAgICAgQ2FsbEJhY2sgID0gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuQ2FsbEJhY2s7CisKKyAgICAodm9pZCkgcEdlbmVyYWxQdXJwb3NlOworCisgICAgIC8qCisgICAgICAqIFNlbmQgYW4gQUxHT0ZGIGV2ZW50IGlmIHRoZSBPTi0+T0ZGIHN3aXRjaCB0cmFuc2l0aW9uIGlzIGZpbmlzaGVkCisgICAgICAqLworICAgIGlmKChMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSA9PSAweDAwMDAwMDAwKSAmJgorICAgICAgIChDYWxsYmFja1BhcmFtID09IDApKXsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWRVFOQl9CWVBBU1M7CisgICAgICAgIGlmIChDYWxsQmFjayAhPSBMVk1fTlVMTCl7CisgICAgICAgICAgICBDYWxsQmFjayhwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UsIExWTV9OVUxMLCBBTEdPUklUSE1fRVFOQl9JRHxMVkVRTkJfRVZFTlRfQUxHT0ZGKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogIEV4aXQgdHJhbnNpdGlvbiBzdGF0ZQorICAgICAqLworICAgIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPSBMVk1fRkFMU0U7CisKKyAgICByZXR1cm4gMTsKK30KKworCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMjlmZTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jCkBAIC0wLDAgKzEsMzI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDA1ICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6NTg6MjggKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWRVFOQi5oIgorI2luY2x1ZGUgIkxWRVFOQl9Qcml2YXRlLmgiCisjaW5jbHVkZSAiSW5zdEFsbG9jLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KKy8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAqLworLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAqLworLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfU1VDQ0VTUyAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgIFdoZW4gYW55IG9mIHBNZW1vcnlUYWJsZSBhbmQgcENhcGFiaWxpdGllcyBpcyBOVUxMIGFkZHJlc3MgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZFUU5CX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9NZW1vcnkoTFZFUU5CX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9NZW1UYWJfdCAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190ICAgICAgKnBDYXBhYmlsaXRpZXMpCit7CisKKyAgICBJTlNUX0FMTE9DICAgICAgICAgIEFsbG9jTWVtOworICAgIExWRVFOQl9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKKworCisgICAgaWYoKHBNZW1vcnlUYWJsZSA9PSBMVk1fTlVMTCl8fCAocENhcGFiaWxpdGllcyA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gTFZFUU5CX05VTExBRERSRVNTOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBGaWxsIGluIHRoZSBtZW1vcnkgdGFibGUKKyAgICAgKi8KKyAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogSW5zdGFuY2UgbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWRVFOQl9JbnN0YW5jZV90KSk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fSU5TVEFOQ0VdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW0pOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX0lOU1RBTkNFXS5BbGlnbm1lbnQgICAgPSBMVkVRTkJfSU5TVEFOQ0VfQUxJR047CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fSU5TVEFOQ0VdLlR5cGUgICAgICAgICA9IExWRVFOQl9QRVJTSVNURU5UOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIFBlcnNpc3RhbnQgZGF0YSBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QpKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCkpOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QpKSk7IC8qIEVxdWFsaXNlciBCaXF1YWQgVGFwcyAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoTFZFUU5CX0JhbmREZWZfdCkpKTsgICAgICAgIC8qIEZpbHRlciBkZWZpbml0aW9ucyAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoTFZFUU5CX0JpcXVhZFR5cGVfZW4pKSk7ICAgIC8qIEJpcXVhZCB0eXBlcyAqLworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbSk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5BbGlnbm1lbnQgICAgPSBMVkVRTkJfREFUQV9BTElHTjsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlR5cGUgICAgICAgICA9IExWRVFOQl9QRVJTSVNURU5UX0RBVEE7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBQZXJzaXN0YW50IGNvZWZmaWNpZW50IG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkpOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9JbnN0YW5jZV90KSk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF9JbnN0YW5jZV90KSk7IC8qIEVxdWFsaXNlciBCaXF1YWQgSW5zdGFuY2UgKi8KKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW0pOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uQWxpZ25tZW50ICAgID0gTFZFUU5CX0NPRUZfQUxJR047CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVkVRTkJfUEVSU0lTVEVOVF9DT0VGOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2NyYXRjaCBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfU0NSQVRDSEJVRkZFUlMqc2l6ZW9mKExWTV9JTlQxNikqcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5TaXplICAgICAgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW0pOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLkFsaWdubWVudCAgICAgICAgID0gTFZFUU5CX1NDUkFUQ0hfQUxJR047CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0uVHlwZSAgICAgICAgICAgICAgPSBMVkVRTkJfU0NSQVRDSDsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgICAgICA9IExWTV9OVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBSZWFkIGJhY2sgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KKyAgICAgICAgKnBNZW1vcnlUYWJsZSA9IHBJbnN0YW5jZS0+TWVtb3J5VGFibGU7CisgICAgfQorCisgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWRVFOQl9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENyZWF0ZSBhbmQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBOLUJhbmQgZXF1YWxpc2VyIG1vZHVsZSAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBhbGdvcml0aG0gaW5zdGFuY2UgYnkgY2FsbGluZyB3aXRoICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSBzZXQgdG8gTlVMTC4gSW4gdGhpcyBjYXNlIHRoZSBhbGdvcml0aG0gcmV0dXJucyB0aGUgbmV3IGluc3RhbmNlICAgICAgICAgICovCisvKiAgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZm9yY2UgYSBmdWxsIHJlLWluaXRpYWxpc2F0aW9uIG9mIHRoZSBhbGdvcml0aG0gICAgICAgICovCisvKiAgYnkgY2FsbGluZyB3aXRoIGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZS4gSW4gdGhpcyBjYXNlIHRoZSBtZW1vcnkgdGFibGUgICAgICAgICAgKi8KKy8qICBzaG91bGQgYmUgY29ycmVjdCBmb3IgdGhlIGluc3RhbmNlLCB0aGlzIGNhbiBiZSBlbnN1cmVkIGJ5IGNhbGxpbmcgdGhlIGZ1bmN0aW9uICAgICAqLworLyogIERCRV9NZW1vcnkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfU1VDQ0VTUyAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgICAgV2hlbiBwQ2FwYWJpbGl0aWVzIG9yIHBNZW1vcnlUYWJsZWlzIG9yIHBoSW5zdGFuY2UgYXJlIE5VTEwgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICAgIE9uZSBvciBtb3JlIG9mIHRoZSBtZW1vcnkgcmVnaW9ucyBoYXMgYSBOVUxMIGJhc2UgYWRkcmVzcyAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciBmb3IgYSBtZW1vcnkgcmVnaW9uIHdpdGggYSBub24temVybyBzaXplLiAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoZSBpbnN0YW5jZSBoYW5kbGUgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWVtb3J5ICAgICAgKi8KKy8qICAgICAgcmVnaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDIuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Jbml0KExWRVFOQl9IYW5kbGVfdCAgICAgICAgICAqcGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAqcENhcGFiaWxpdGllcykKK3sKKworICAgIExWRVFOQl9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZTsKKyAgICBMVk1fVUlOVDMyICAgICAgICAgIE1lbVNpemU7CisgICAgSU5TVF9BTExPQyAgICAgICAgICBBbGxvY01lbTsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIGk7CisKKyAgICAvKgorICAgICAqIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzCisgICAgICovCisgICAgaWYoKHBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpIHx8IChwQ2FwYWJpbGl0aWVzID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayB0aGUgbWVtb3J5IHRhYmxlIGZvciBOVUxMIHBvaW50ZXJzCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IExWRVFOQl9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLlNpemUhPTApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3M9PUxWTV9OVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybihMVkVRTkJfTlVMTEFERFJFU1MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIGluc3RhbmNlIGhhbmRsZSBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXNlZAorICAgICAqLworCisgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLCAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzKTsKKworICAgIGlmICgqcGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgICpwaEluc3RhbmNlID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sIHNpemVvZihMVkVRTkJfSW5zdGFuY2VfdCkpOworICAgIH0KKyAgICBwSW5zdGFuY2UgPShMVkVRTkJfSW5zdGFuY2VfdCAgKikqcGhJbnN0YW5jZTsKKworCisKKyAgICAvKgorICAgICAqIFNhdmUgdGhlIG1lbW9yeSB0YWJsZSBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlCisgICAgICovCisgICAgcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMgPSAqcENhcGFiaWxpdGllczsKKworCisgICAgLyoKKyAgICAgKiBTYXZlIHRoZSBtZW1vcnkgdGFibGUgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZSBhbmQKKyAgICAgKiBzZXQgdGhlIHN0cnVjdHVyZSBwb2ludGVycworICAgICAqLworICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUgICAgICAgPSAqcE1lbW9yeVRhYmxlOworCisgICAgLyoKKyAgICAgKiBBbGxvY2F0ZSBjb2VmZmljaWVudCBtZW1vcnkKKyAgICAgKi8KKyAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyk7CisKKyAgICBwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpKTsgLyogRXF1YWxpc2VyIEJpcXVhZCBJbnN0YW5jZSAqLworCisKKworICAgIC8qCisgICAgICogQWxsb2NhdGUgZGF0YSBtZW1vcnkKKyAgICAgKi8KKyAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyk7CisKKyAgICBNZW1TaXplID0gKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfVGFwc190KSk7CisgICAgcEluc3RhbmNlLT5wRVFOQl9UYXBzID0gKEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1TaXplKTsKKyAgICBNZW1TaXplID0gKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpKTsKKyAgICBwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnMgID0gKExWRVFOQl9CYW5kRGVmX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVNpemUpOworICAgIE1lbVNpemUgPSAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoTFZFUU5CX0JpcXVhZFR5cGVfZW4pKTsKKyAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlID0gKExWRVFOQl9CaXF1YWRUeXBlX2VuICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtU2l6ZSk7CisKKworICAgIC8qCisgICAgICogSW50ZXJuYWxseSBtYXAsIHN0cnVjdHVyZSBhbmQgYWxsaWduIHNjcmF0Y2ggbWVtb3J5CisgICAgICovCisgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzKTsKKworICAgIHBJbnN0YW5jZS0+cEZhc3RUZW1wb3JhcnkgPSAoTFZNX0lOVDE2ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fSU5UMTYpKTsKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcEluc3RhbmNlLT5QYXJhbXMuTkJhbmRzICAgICAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICAgPSBMVkVRTkJfQllQQVNTOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLnBCYW5kRGVmaW5pdGlvbiA9IExWTV9OVUxMOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgICAgICA9IExWRVFOQl9GU184MDAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCAgICA9IExWRVFOQl9TVEVSRU87CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIGZpbHRlcnMKKyAgICAgKi8KKyAgICBMVkVRTkJfU2V0RmlsdGVycyhwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBmaWx0ZXIgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QYXJhbXMpOworCisgICAgTFZFUU5CX1NldENvZWZmaWNpZW50cyhwSW5zdGFuY2UpOyAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworCisgICAgTFZFUU5CX0NsZWFyRmlsdGVySGlzdG9yeShwSW5zdGFuY2UpOyAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBmaWx0ZXIgaGlzdG9yeSAqLworCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXNlIHRoZSBieXBhc3MgdmFyaWFibGVzCisgICAgICovCisgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAwOworICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSAgICA9ICh2b2lkKilwSW5zdGFuY2U7CisgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVkVRTkJfQnlwYXNzTWl4ZXJDYWxsQmFjazsKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwwLDApOworICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMCxMVk1fRlNfODAwMCwyKTsKKworICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKKyAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7CisgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSBMVk1fTlVMTDsKKyAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayAgICAgICAgICA9IExWTV9OVUxMOworICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLDAsTFZNX01BWElOVF8xNik7CisgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwwLExWTV9GU184MDAwLDIpOworCisgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiAgICAgID0gTFZNX0ZBTFNFOworCisgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBhZTg0YWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogYmVxMDc3MTYgJAorICAgICAkUmV2aXNpb246IDEwMDUgJAorICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzo1ODoyOCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0xWRVFOQl9QUklWQVRFX0hfXworI2RlZmluZSBfX0xWRVFOQl9QUklWQVRFX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWRVFOQi5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYWxsaW5nIG9yIEFwcGxpY2F0aW9uIGxheWVyIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiTFZDX01peGVyLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVmaW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEdlbmVyYWwgKi8KKyNkZWZpbmUgTFZFUU5CX0lOVkFMSUQgICAgICAgICAgICAgIDB4RkZGRiAgICAgICAgICAgICAgLyogSW52YWxpZCBpbml0IHBhcmFtZXRlciAqLworCisvKiBNZW1vcnkgKi8KKyNkZWZpbmUgTFZFUU5CX0lOU1RBTkNFX0FMSUdOICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgaW5zdGFuY2Ugc3RydWN0dXJlcyAqLworI2RlZmluZSBMVkVRTkJfREFUQV9BTElHTiAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBzdHJ1Y3R1cmVzICovCisjZGVmaW5lIExWRVFOQl9DT0VGX0FMSUdOICAgICAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgd29yZHMgKi8KKyNkZWZpbmUgTFZFUU5CX1NDUkFUQ0hCVUZGRVJTICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworI2RlZmluZSBMVkVRTkJfU0NSQVRDSF9BTElHTiAgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBsb25nIGRhdGEgKi8KKworI2RlZmluZSBMVkVRTkJfQllQQVNTX01JWEVSX1RDICAgICAgMTAwICAgICAgICAgICAgICAgICAvKiBCeXBhc3MgTWl4ZXIgVEMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRmlsdGVyIGJpcXVhZCB0eXBlcyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZFUU5CX1NpbmdsZVByZWNpc2lvbiA9IDAsCisgICAgTFZFUU5CX0RvdWJsZVByZWNpc2lvbiA9IDEsCisgICAgTFZFUU5CX091dE9mUmFuZ2UgICAgICA9IDIsCisgICAgTFZFUU5CX0JJUVVBRFRZUEVfTUFYICA9IExWTV9NQVhJTlRfMzIKK30gTFZFUU5CX0JpcXVhZFR5cGVfZW47CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKy8qIEluc3RhbmNlIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBQdWJsaWMgcGFyYW1ldGVycyAqLworICAgIExWRVFOQl9NZW1UYWJfdCAgICAgICAgICAgICAgICAgTWVtb3J5VGFibGU7ICAgICAgICAvKiBJbnN0YW5jZSBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLworICAgIExWRVFOQl9QYXJhbXNfdCAgICAgICAgICAgICAgICAgUGFyYW1zOyAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwYXJhbWV0ZXJzICovCisgICAgTFZFUU5CX0NhcGFiaWxpdGllc190ICAgICAgICAgICBDYXBhYmlsaXRpZXM7ICAgICAgIC8qIEluc3RhbmNlIGNhcGFiaWxpdGllcyAqLworCisgICAgLyogQWxpZ25lZCBtZW1vcnkgcG9pbnRlcnMgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgKnBGYXN0VGVtcG9yYXJ5OyAgICAgICAgLyogRmFzdCB0ZW1wb3JhcnkgZGF0YSBiYXNlIGFkZHJlc3MgKi8KKworICAgIC8qIFByb2Nlc3MgdmFyaWFibGVzICovCisgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgICAgICAgICAqcEVRTkJfVGFwczsgICAgICAgIC8qIEVxdWFsaXNlciBUYXBzICovCisgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAgICAgICAqcEVRTkJfRmlsdGVyU3RhdGU7IC8qIFN0YXRlIGZvciBlYWNoIGZpbHRlciBiYW5kICovCisKKyAgICAvKiBGaWx0ZXIgZGVmaW5pdGlvbnMgYW5kIGNhbGwgYmFjayAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICAgICAgTkJhbmRzOyAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmFuZHMgKi8KKyAgICBMVkVRTkJfQmFuZERlZl90ICAgICAgICAgICAgICAgICpwQmFuZERlZmluaXRpb25zOyAgLyogRmlsdGVyIGJhbmQgZGVmaW5pdGlvbnMgKi8KKyAgICBMVkVRTkJfQmlxdWFkVHlwZV9lbiAgICAgICAgICAgICpwQmlxdWFkVHlwZTsgICAgICAgLyogRmlsdGVyIGJpcXVhZCB0eXBlcyAqLworCisgICAgLyogQnlwYXNzIHZhcmlhYmxlICovCisgICAgTFZNaXhlcjNfMlN0X3N0ICAgICAgICAgICBCeXBhc3NNaXhlcjsgICAgICAgICAgICAgIC8qIEJ5cGFzcyBtaXhlciB1c2VkIGluIHRyYW5zaXRpb25zICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgYkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb247IC8qIE9wZXJhdGluZyBtb2RlIHRyYW5zaXRpb24gZmxhZyAqLworCit9IExWRVFOQl9JbnN0YW5jZV90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgICAgTFZFUU5CX1NldEZpbHRlcnMoTFZFUU5CX0luc3RhbmNlX3QgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfUGFyYW1zX3QgICAgICpwUGFyYW1zKTsKKwordm9pZCAgICBMVkVRTkJfU2V0Q29lZmZpY2llbnRzKExWRVFOQl9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UpOworCit2b2lkICAgIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkoTFZFUU5CX0luc3RhbmNlX3QgKnBJbnN0YW5jZSk7CisKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1NpbmdsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzE2X0NvZWZzX3QgICAgKnBDb2VmZmljaWVudHMpOworCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Eb3VibGVQcmVjQ29lZnMoTFZNX1VJTlQxNiAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0JhbmREZWZfdCAgKnBGaWx0ZXJEZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0MzMl9Db2Vmc190ICAgICpwQ29lZmZpY2llbnRzKTsKKworTFZNX0lOVDMyIExWRVFOQl9CeXBhc3NNaXhlckNhbGxCYWNrICh2b2lkKiBoSW5zdGFuY2UsIHZvaWQgKnBHZW5lcmFsUHVycG9zZSwgTFZNX0lOVDE2IENhbGxiYWNrUGFyYW0pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX19MVkVRTkJfUFJJVkFURV9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUyOWU4ODEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogYmVxMDc3MTYgJAorICAgICAkUmV2aXNpb246IDEwMDUgJAorICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzo1ODoyOCArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWRVFOQi5oIgorI2luY2x1ZGUgIkxWRVFOQl9Qcml2YXRlLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkJJUVVBRC5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVmaW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgU0hJRlQgICAgICAgMTMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQcm9jZXNzIGZ1bmN0aW9uIGZvciB0aGUgTi1CYW5kIEVxdWFsaXNlciBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbkRhdGEgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1TYW1wbGVzICAgICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfU1VDQ0VTUyAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgIFdoZW4gaEluc3RhbmNlLCBwSW5EYXRhIG9yIHBPdXREYXRhIGFyZSBOVUxMICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX0FMSUdOTUVOVEVSUk9SICAgV2hlbiBwSW5EYXRhIG9yIHBPdXREYXRhIGFyZSBub3QgMzItYml0IGFsaWduZWQgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfVE9PTUFOWVNBTVBMRVMgICBOdW1TYW1wbGVzIHdhcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSBibG9jayBzaXplICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1Byb2Nlc3MoTFZFUU5CX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcykKK3sKKworICAgIExWTV9VSU5UMTYgICAgICAgICAgaTsKKyAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICpwQmlxdWFkOworICAgIExWRVFOQl9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0lOVDMyICAgICAgICAgICAqcFNjcmF0Y2g7CisKKworICAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLworICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5EYXRhID09IExWTV9OVUxMKSB8fCAocE91dERhdGEgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhIGJ1ZmZlcnMgYXJlIDMyLWJpdCBhbGlnbmVkICovCisgICAgaWYgKCgoKExWTV9JTlQzMilwSW5EYXRhICUgNCkgIT0gMCkgfHwgKCgoTFZNX0lOVDMyKXBPdXREYXRhICUgNCkgIT0gMCkpCisgICAgeworICAgICAgICByZXR1cm4gTFZFUU5CX0FMSUdOTUVOVEVSUk9SOworICAgIH0KKworICAgIHBTY3JhdGNoICA9IChMVk1fSU5UMzIgKilwSW5zdGFuY2UtPnBGYXN0VGVtcG9yYXJ5OworCisgICAgLyoKKyAgICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCisgICAgKi8KKyAgICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybihMVkVRTkJfVE9PTUFOWVNBTVBMRVMpOworICAgIH0KKworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIENvbnZlcnQgZnJvbSAxNi1iaXQgdG8gMzItYml0CisgICAgICAgICAqLworICAgICAgICBJbnQxNkxTaGlmdFRvSW50MzJfMTZ4MzIoKExWTV9JTlQxNiAqKXBJbkRhdGEsICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSwgLyogTGVmdCBhbmQgUmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNISUZUKTsgICAgICAgICAgICAgICAgICAgIC8qIFNjYWxpbmcgc2hpZnQgKi8KKworICAgICAgICAvKgorICAgICAgICAgKiBGb3IgZWFjaCBzZWN0aW9uIGV4ZWN0ZSB0aGUgZmlsdGVyIHVubGVzcyB0aGUgZ2FpbiBpcyAwZEIKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPk5CYW5kcyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTxwSW5zdGFuY2UtPk5CYW5kczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgYmFuZCBpcyBub24temVybyBkQiBnYWluCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5HYWluICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGJpcXVhZCBpbnN0YW5jZQorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgcEJpcXVhZCA9ICZwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlW2ldOworCisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogU2VsZWN0IHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uIGFzIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFZFUU5CX1NpbmdsZVByZWNpc2lvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMShwQmlxdWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMVkVRTkJfRG91YmxlUHJlY2lzaW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxKHBCaXF1YWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMiAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSl7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBDb252ZXJ0IGZyb20gMzItYml0IHRvIDE2LSBiaXQgYW5kIHNhdHVyYXRlCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNihwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcFNjcmF0Y2gsICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcyksICAgICAvKiBMZWZ0IGFuZCBSaWdodCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hJRlQpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNjYWxpbmcgc2hpZnQgKi8KKworICAgICAgICAgICAgICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpKTsKKworICAgICAgICAgICAgICAgIENvcHlfMTYoKExWTV9JTlQxNiopcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgUmlnaHQgc2FtcGxlcyAqLworICAgICAgICB9CisgICAgICAgIGVsc2V7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDb252ZXJ0IGZyb20gMzItYml0IHRvIDE2LSBiaXQgYW5kIHNhdHVyYXRlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYocFNjcmF0Y2gsICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICkoMipOdW1TYW1wbGVzKSwgLyogTGVmdCBhbmQgUmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hJRlQpOyAgICAgICAgICAgICAgICAvKiBTY2FsaW5nIHNoaWZ0ICovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogTW9kZSBpcyBPRkYgc28gY29weSB0aGUgZGF0YSBpZiBuZWNlc3NhcnkKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5EYXRhICE9IHBPdXREYXRhKQorICAgICAgICB7CisgICAgICAgICAgICBDb3B5XzE2KHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCBSaWdodCBzYW1wbGVzICovCisgICAgICAgIH0KKyAgICB9CisKKworCisgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zM2MwN2RhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkCisgICAgICRSZXZpc2lvbjogMTAwNSAkCisgICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjU4OjI4ICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkVRTkIuaCIKKyNpbmNsdWRlICJMVkVRTkJfQ29lZmZzLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBTYW1wbGUgcmF0ZSB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBTYW1wbGUgcmF0ZSB0YWJsZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIHRoZSBlbnVtZXJhdGVkIHR5cGUgYW5kIHRoZSBhY3R1YWwKKyAqIGZyZXF1ZW5jeQorICovCitjb25zdCBMVk1fVUlOVDE2ICAgIExWRVFOQl9TYW1wbGVSYXRlVGFiW10gPSB7ODAwMCwgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwfTsgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIENvZWZmaWNpZW50IGNhbGN1bGF0aW9uIHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRhYmxlIGZvciAyICogUGkgLyBGcworICovCitjb25zdCBMVk1fSU5UMTYgICAgIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtdID0ge0xWRVFOQl8yUGlPbl84MDAwLCAgICAgIC8qIDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8xMTAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzEyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8yMjA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzI0MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl80NDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzQ4MDAwfTsgICAgLyogNDhrUy9zICovCisKKy8qCisgKiBHYWluIHRhYmxlCisgKi8KK2NvbnN0IExWTV9JTlQxNiAgICAgTFZFUU5CX0dhaW5UYWJsZVtdID0ge0xWRVFOQl9HYWluX05lZzE1X2RCLCAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxM19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzEyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxMF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzlfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc4X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnN19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzZfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc1X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnNF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzNfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzBfZEIsICAgICAgICAgICAgLyogMGRCIGdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8yX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fM19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl81X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fNl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzdfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl84X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fOV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzEwX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xMl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzEzX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xNV9kQn07ICAgICAgICAgIC8qICsxNWRCIGdhaW4gKi8KKworCisvKgorICogRCB0YWJsZSBmb3IgMTAwIC8gKEdhaW4gKyAxKQorICovCitjb25zdCBMVk1fSU5UMTYgICAgTFZFUU5CX0RUYWJsZVtdID0ge0xWRVFOQl8xMDBEX05lZzE1X2RCLCAgICAgICAgICAgIC8qIC0xNWRCIGdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzEzX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxMl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzEwX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc5X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc4X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc3X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc2X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc1X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc0X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWczX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF8wX2RCfTsgICAgICAgICAgICAgICAvKiAwZEIgZ2FpbiAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRmlsdGVyIHBvbHlub21pYWwgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29lZmZpY2llbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgY29zaW5lIHdpdGggdGhlIGVxdWF0aW9uOgorICoKKyAqICBDb3MoeCkgPSAoMl5TaGlmdHMpKihhMCArIGExKnggKyBhMip4XjIgKyBhMyp4XjMgKyBhNCp4XjQgKyBhNSp4XjUpCisgKgorICogVGhlc2UgY29lZmZpY2llbnRzIGV4cGVjdCB0aGUgaW5wdXQsIHgsIHRvIGJlIGluIHRoZSByYW5nZSAwIHRvIDMyNzY4IHJlc3ByZXNlbnRpbmcKKyAqIGEgcmFuZ2Ugb2YgMCB0byBQaS4gVGhlIG91dHB1dCBpcyBpbiB0aGUgcmFuZ2UgMzI3NjcgdG8gLTMyNzY4IHJlcHJlc2VudGluZyB0aGUgcmFuZ2UKKyAqICsxLjAgdG8gLTEuMAorICovCitjb25zdCBMVk1fSU5UMTYgICAgIExWRVFOQl9Db3NDb2VmW10gPSB7MywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOTcyNSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNjcxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzNzMwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC05NDkwfTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNSAqLworCisvKgorICogQ29lZmZpY2llbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgY29zaW5lIGVycm9yIHdpdGggdGhlIGVxdWF0aW9uOgorICoKKyAqICBDb3NFcnIoeCkgPSAoMl5TaGlmdHMpKihhMCArIGExKnggKyBhMip4XjIgKyBhMyp4XjMpCisgKgorICogVGhlc2UgY29lZmZpY2llbnRzIGV4cGVjdCB0aGUgaW5wdXQsIHgsIHRvIGJlIGluIHRoZSByYW5nZSAwIHRvIDMyNzY4IHJlc3ByZXNlbnRpbmcKKyAqIGEgcmFuZ2Ugb2YgMCB0byBQaS8yNS4gVGhlIG91dHB1dCBpcyBpbiB0aGUgcmFuZ2UgMCB0byAzMjc2NyByZXByZXNlbnRpbmcgdGhlIHJhbmdlCisgKiAwLjAgdG8gMC4wMDc4ODUyOTg2CisgKgorICogVGhpcyBpcyB1c2VkIHRvIGdpdmUgYSBkb3VibGUgcHJlY2lzaW9uIGNvc2luZSBvdmVyIHRoZSByYW5nZSAwIHRvIFBpLzI1IHVzaW5nIHRoZQorICogdGhlIGVxdWF0aW9uOgorICoKKyAqIENvcyh4KSA9IDEuMCAtIENvc0Vycih4KQorICovCitjb25zdCBMVk1fSU5UMTYgICAgIExWRVFOQl9EUENvc0NvZWZbXSA9IHsxLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY1ODYsICAgICAgICAgICAgICAgICAgICAgICAvKiBhMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTQ0fTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBCeXBhc3MgbWl4ZXIgdGltZSBjb25zdGFudHMgKDEwMG1zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzODAwMCAgICAzMjU4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk0MjYyNjk1ICovCisjZGVmaW5lIExWRVFOQl9NSVhfVENfRnMxMTAyNSAgIDMyNjMyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTU4NDk2MDkgKi8KKyNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczEyMDAwICAgMzI2NDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NjE4NTMwMyAqLworI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMTYwMDAgICAzMjY3NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk3MTMxMzQ4ICovCisjZGVmaW5lIExWRVFOQl9NSVhfVENfRnMyMjA1MCAgIDMyNzAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTc5MjQ4MDUgKi8KKyNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczI0MDAwICAgMzI3MDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODA3NzM5MyAqLworI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMzIwMDAgICAzMjcyMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4NTY1Njc0ICovCisjZGVmaW5lIExWRVFOQl9NSVhfVENfRnM0NDEwMCAgIDMyNzM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg5NjI0MDIgKi8KKyNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczQ4MDAwICAgMzI3MzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTA1Mzk1NSAqLworCisKK2NvbnN0IExWTV9JTlQxNiBMVkVRTkJfTWl4ZXJUQ1RhYmxlW10gPSB7CisgICAgTFZFUU5CX01JWF9UQ19GczgwMDAsCisgICAgTFZFUU5CX01JWF9UQ19GczExMDI1LAorICAgIExWRVFOQl9NSVhfVENfRnMxMjAwMCwKKyAgICBMVkVRTkJfTUlYX1RDX0ZzMTYwMDAsCisgICAgTFZFUU5CX01JWF9UQ19GczIyMDUwLAorICAgIExWRVFOQl9NSVhfVENfRnMyNDAwMCwKKyAgICBMVkVRTkJfTUlYX1RDX0ZzMzIwMDAsCisgICAgTFZFUU5CX01JWF9UQ19GczQ0MTAwLAorICAgIExWRVFOQl9NSVhfVENfRnM0ODAwMH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIvTFZQU0EuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL2xpYi9MVlBTQS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI5OTAzYjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIvTFZQU0EuaApAQCAtMCwwICsxLDI5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgUFNBXzAxX0FSTUNfMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwNiAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxNDowMTo0NyArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX0xWUFNBX0hfCisjZGVmaW5lIF9MVlBTQV9IXworCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ09OU1RBTlRTIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1lbW9yeSB0YWJsZSovCisjZGVmaW5lICAgICBMVlBTQV9OUl9NRU1PUllfUkVHSU9OUyAgICAgICAgICAgICAgICAgIDQgICAgICAvKiBOdW1iZXIgb2YgbWVtb3J5IHJlZ2lvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRZUEVTIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTWVtb3J5IFR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVlBTQV9QRVJTSVNURU5UICAgICAgPSBMVk1fUEVSU0lTVEVOVCwKKyAgICBMVlBTQV9QRVJTSVNURU5UX0RBVEEgPSBMVk1fUEVSU0lTVEVOVF9EQVRBLAorICAgIExWUFNBX1BFUlNJU1RFTlRfQ09FRiA9IExWTV9QRVJTSVNURU5UX0NPRUYsCisgICAgTFZQU0FfU0NSQVRDSCAgICAgICAgID0gTFZNX1NDUkFUQ0gsCisgICAgTFZQU0FfTUVNT1JZX0RVTU1ZID0gTFZNX01BWElOVF8zMiAgICAgICAgICAgICAgICAgICAgICAvKiBGb3JjZSAzMiBiaXRzIGVudW0sIGRvbid0IHVzZSBpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBMVlBTQV9NZW1vcnlUeXBlc19lbjsKKworLyogTGV2ZWwgZGV0ZWN0aW9uIHNwZWVkIGNvbnRyb2wgcGFyYW1ldGVycyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZQU0FfU1BFRURfTE9XLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgc3BlZWQgbGV2ZWwgICBkZXRlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWUFNBX1NQRUVEX01FRElVTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWVkaXVtIHNwZWVkIGxldmVsICAgZGV0ZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVlBTQV9TUEVFRF9ISUdILCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggc3BlZWQgbGV2ZWwgICBkZXRlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfU1BFRURfRFVNTVkgPSBMVk1fTUFYSU5UXzMyICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3JjZSAzMiBiaXRzIGVudW0sIGRvbid0IHVzZSBpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBMVlBTQV9MZXZlbERldGVjdFNwZWVkX2VuOworCisvKiBGaWx0ZXIgY29udHJvbCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIENlbnRlckZyZXF1ZW5jeTsgICAgICAgICAgICAgLyogQ2VudGVyIGZyZXF1ZW5jeSBvZiB0aGUgYmFuZC1wYXNzIGZpbHRlciAoaW4gSHopICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBRRmFjdG9yOyAgICAgICAgICAgICAgICAgICAgIC8qIFF1YWxpdHkgZmFjdG9yIG9mIHRoZSBmaWx0ZXIgICAgICAgICAgICAgKGluIDEvMTAwKSAgICAgICAgICAgICAgICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgUG9zdEdhaW47ICAgICAgICAgICAgICAgICAgICAvKiBQb3N0Z2FpbiB0byBhcHBseSBhZnRlciB0aGUgZmlsdGVyaW5nICAgIChpbiBkQiBRMTYuMCkgICAgICAgICAgICAqLworCit9IExWUFNBX0ZpbHRlclBhcmFtX3Q7CisKKy8qIExWUFNBIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgU3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb247ICAvKiBTcGVjdHJhbCBkYXRhIGJ1ZmZlciBkdXJhdGlvbiBpbiB0aW1lIChtcyBpbiBRMTYuMCkgICAgICAgICAgICAgICAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE1heElucHV0QmxvY2tTaXplOyAgICAgICAgICAgLyogTWF4aW11bSBleHBlY3RlZCBpbnB1dCBibG9jayBzaXplIChpbiBzYW1wbGVzKSAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBuQmFuZHM7ICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyBvZiB0aGUgU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICAgICAqcEZpbHRlcnNQYXJhbXM7ICAgICAgICAgICAgICAvKiBQb2ludHMgdG8gbkJhbmRzIGZpbHRlciBwYXJhbSBzdHJ1Y3R1cmVzIGZvciBmaWx0ZXJzIHNldHRpbmdzICAgICAqLworCit9IExWUFNBX0luaXRQYXJhbXNfdCwgKnBMVlBTQV9Jbml0UGFyYW1zX3Q7CisKKy8qIExWUFNBIGNvbnRyb2wgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICBGczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IHNhbXBsaW5nIHJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfTGV2ZWxEZXRlY3RTcGVlZF9lbiAgTGV2ZWxEZXRlY3Rpb25TcGVlZDsgICAgICAgICAvKiBMZXZlbCBkZXRlY3Rpb24gc3BlZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCit9IExWUFNBX0NvbnRyb2xQYXJhbXNfdCwgKnBMVlBTQV9Db250cm9sUGFyYW1zX3Q7CisKKy8qIE1lbW9yeSByZWdpb24gZGVmaW5pdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiBzaXplIGluIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfTWVtb3J5VHlwZXNfZW4gICAgICAgVHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICpwQmFzZUFkZHJlc3M7ICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgcmVnaW9uIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gTFZQU0FfTWVtb3J5UmVnaW9uX3Q7CisKKy8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZQU0FfTWVtb3J5UmVnaW9uX3QgICAgICAgUmVnaW9uW0xWUFNBX05SX01FTU9SWV9SRUdJT05TXTsvKiBPbmUgZGVmaW5pdGlvbiBmb3IgZWFjaCByZWdpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBMVlBTQV9NZW1UYWJfdDsKKworLyogQXVkaW8gdGltZSB0eXBlICovCit0eXBlZGVmIExWTV9JTlQzMiBMVlBTQV9UaW1lOworCisvKiBNb2R1bGUgaW5zdGFuY2UgSGFuZGxlICovCit0eXBlZGVmIHZvaWQgKnBMVlBTQV9IYW5kbGVfdDsKKworLyogTFZQU0EgcmV0dXJuIGNvZGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVlBTQV9PSywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBmdW5jdGlvbiByYW4gd2l0aG91dCBhbnkgcHJvYmxlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBIHBhcmFtZXRlciBpcyBpbmNvcnJlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWUFNBX0VSUk9SX1dST05HVElNRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQW4gaW5jb3JyZWN0IEF1ZGlvVGltZSBpcyB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVlBTQV9FUlJPUl9OVUxMQUREUkVTUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEgcG9pbnRlciBoYXMgYSBOVUxMIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfUkVUVVJOX0RVTU1ZID0gTFZNX01BWElOVF8zMiAgICAgICAgICAgICAgICAgICAgICAvKiBGb3JjZSAzMiBiaXRzIGVudW0sIGRvbid0IHVzZSBpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBMVlBTQV9SRVRVUk47CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTlMgUFJPVE9UWVBFCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWVtb3J5VGFibGUgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluaXRQYXJhbXMgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBpbml0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX01lbW9yeSAgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX01lbVRhYl90ICAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICAgICAqcEluaXRQYXJhbXMgICAgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5pdGlhbGl6ZXMgdGhlIExWUFNBIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5pdFBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGluaXQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENvbnRyb2xQYXJhbXMgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBjb250cm9sIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNZW1vcnlUYWJsZSAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfSW5pdCAgICAgICAgICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICAgICAgKnBJbml0UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgICpwQ29udHJvbFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX01lbVRhYl90ICAgICAgICAgICAgICAqcE1lbW9yeVRhYmxlICApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb250cm9scyB0aGUgTFZQU0EgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE5ld1BhcmFtcyAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBuZXcgY29udHJvbCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX0NvbnRyb2wgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwTmV3UGFyYW1zICAgICApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgcHJvY2VzcyBjYWxjdWxhdGVzIHRoZSBsZXZlbHMgb2YgdGhlIGZyZXF1ZW5jeSBiYW5kcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcExWUFNBX0lucHV0U2FtcGxlcyBQb2ludGVyIHRvIHRoZSBpbnB1dCBzYW1wbGVzIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIElucHV0QmxvY2tTaXplICAgICAgTnVtYmVyIG9mIG1vbm8gc2FtcGxlcyB0byBwcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBdWRpb1RpbWUgICAgICAgICAgIFBsYXliYWNrIHRpbWUgb2YgdGhlIGZpcnN0IGlucHV0IHNhbXBsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX1Byb2Nlc3MgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqcExWUFNBX0lucHV0U2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgIElucHV0QmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfVGltZSAgICAgICAgICAgQXVkaW9UaW1lICAgICAgICAgICAgICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfR2V0U3BlY3RydW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgR2V0U3BlY3RydW1BdWRpb1RpbWUgVGltZSB0byByZXRyaWV2ZSB0aGUgdmFsdWVzIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDdXJyZW50VmFsdWVzICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgYnVmZmVyIDogQ3VycmVudCBsZXZlbCB2YWx1ZXMgb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGVha1ZhbHVlcyAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGJ1ZmZlciA6IFBlYWsgbGV2ZWwgdmFsdWVzIG91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX0dldFNwZWN0cnVtICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfVGltZSAgICAgICAgICAgR2V0U3BlY3RydW1BdWRpb1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICpwQ3VycmVudFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgKnBQZWFrVmFsdWVzICAgICAgICAgICApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0dldENvbnRyb2xQYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBHZXQgdGhlIGN1cnJlbnQgY29udHJvbCBwYXJhbWV0ZXJzIG9mIHRoZSBMVlBTQSBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGNvbnRyb2wgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfR2V0Q29udHJvbFBhcmFtcyAgKCAgICBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICpwUGFyYW1zICAgICAgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9HZXRJbml0UGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgR2V0IHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIG9mIHRoZSBMVlBTQSBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBpbml0IHBhcmFtZXRlcnMgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX0dldEluaXRQYXJhbXMgICAgICggICAgcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfSW5pdFBhcmFtc190ICAgICAgICAqcFBhcmFtcyAgICAgICk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9MVlBTQV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYmU4ZmYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuYwpAQCAtMCwwICsxLDcxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgUFNBXzAxX0FSTUNfMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwNiAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxNDowMTo0NyArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICAgICJMVlBTQS5oIgorI2luY2x1ZGUgICAgIkxWUFNBX1ByaXZhdGUuaCIKKyNpbmNsdWRlICAgICJWZWN0b3JBcml0aG1ldGljLmgiCisKKyNkZWZpbmUgICAgIExPV19GUkVRICAgICAgICAgICAgMjk4ICAgICAgICAgICAgIC8qIDMyNzY4LzExMCBmb3IgbG93IHRlc3QgZnJlcXVlbmN5ICovCisjZGVmaW5lICAgICBISUdIX0ZSRVEgICAgICAgICAgIDM4NiAgICAgICAgICAgICAvKiAzMjc2OC84NSBmb3IgaGlnaCB0ZXN0IGZyZXF1ZW5jeSAqLworCitMVlBTQV9SRVRVUk4gTFZQU0FfU2V0QlBGaWx0ZXJzVHlwZSAoICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICpwSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwUGFyYW1zICApOworCitMVlBTQV9SRVRVUk4gTFZQU0FfU2V0UVBGQ29lZmZpY2llbnRzKCBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICpwSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwUGFyYW1zICApOworCitMVlBTQV9SRVRVUk4gTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoICBMVk1fVUlOVDE2ICAgICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICpwRmlsdGVyUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzE2X0NvZWZzX3QgICAgICAgICpwQ29lZmZpY2llbnRzKTsKKworTFZQU0FfUkVUVVJOIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKCAgTFZNX1VJTlQxNiAgICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgKnBGaWx0ZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAqcENvZWZmaWNpZW50cyk7CisKK0xWUFNBX1JFVFVSTiBMVlBTQV9CUERvdWJsZVByZWNDb2VmcyggIExWTV9VSU5UMTYgICAgICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICAgKnBGaWx0ZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWZmaWNpZW50cyk7CisKK0xWUFNBX1JFVFVSTiBMVlBTQV9TZXRCUEZDb2VmZmljaWVudHMoIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMgICk7CisKK0xWUFNBX1JFVFVSTiBMVlBTQV9DbGVhckZpbHRlckhpc3RvcnkoIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0KTsKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9Db250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgR2l2ZSBzb21lIG5ldyBjb250cm9sIHBhcmFtZXRlcnMgdG8gdGhlIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5ld1BhcmFtcyAgICAgICAgICAgU3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIG5ldyBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9Db250cm9sICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcE5ld1BhcmFtcyAgICAgKQoreworCisgICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAqcExWUFNBX0luc3QgICAgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7CisKKyAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocE5ld1BhcmFtcyA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIH0KKyAgICBpZihwTmV3UGFyYW1zLT5GcyA+PSBMVlBTQV9OUl9TVVBQT1JURURfUkFURSkKKyAgICB7CisgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOworICAgIH0KKyAgICBpZihwTmV3UGFyYW1zLT5MZXZlbERldGVjdGlvblNwZWVkID49IExWUFNBX05SX1NVUFBPUlRFRF9TUEVFRCkKKyAgICB7CisgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOworICAgIH0KKworICAgIHBMVlBTQV9JbnN0LT5OZXdQYXJhbXMgPSAqcE5ld1BhcmFtczsKKyAgICBwTFZQU0FfSW5zdC0+YkNvbnRyb2xQZW5kaW5nID0gTFZNX1RSVUU7CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0dldENvbnRyb2xQYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBHZXQgdGhlIGN1cnJlbnQgY29udHJvbCBwYXJhbWV0ZXJzIG9mIHRoZSBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgY29udHJvbCBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfR2V0Q29udHJvbFBhcmFtcyAgICAgICAgICggICAgcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgKnBQYXJhbXMgKQoreworICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgKnBMVlBTQV9JbnN0ICAgID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOworCisgICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBQYXJhbXMgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKKyAgICB9CisKKyAgICBwUGFyYW1zLT5GcyAgICAgICAgICAgICAgICAgICAgID0gcExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuRnM7CisgICAgcFBhcmFtcy0+TGV2ZWxEZXRlY3Rpb25TcGVlZCAgICA9IHBMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkxldmVsRGV0ZWN0aW9uU3BlZWQ7CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfR2V0SW5pdFBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEdldCB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBvZiB0aGUgbW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBjb250cm9sIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9HZXRJbml0UGFyYW1zICAgICAgICAgKCAgICBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfSW5pdFBhcmFtc190ICAgICAgICAqcFBhcmFtcyApCit7CisgICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAqcExWUFNBX0luc3QgICAgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7CisKKyAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocFBhcmFtcyA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIH0KKworICAgIHBQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uICAgPSBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb247CisgICAgcFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgICAgICAgICAgICA9IHBMVlBTQV9JbnN0LT5NYXhJbnB1dEJsb2NrU2l6ZTsKKyAgICBwUGFyYW1zLT5uQmFuZHMgICAgICAgICAgICAgICAgICAgICAgID0gcExWUFNBX0luc3QtPm5CYW5kczsKKyAgICBwUGFyYW1zLT5wRmlsdGVyc1BhcmFtcyAgICAgICAgICAgICAgID0gcExWUFNBX0luc3QtPnBGaWx0ZXJzUGFyYW1zOworCisgICAgcmV0dXJuKExWUFNBX09LKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0FwcGx5TmV3U2V0dGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZWluaXRpYWxpemUgc29tZSBwYXJhbWV0ZXJzIGFuZCBjaGFuZ2VzIGZpbHRlcnMnIGNvZWZmaWNpZW50cyBpZiAgICAgICAgICAgICAgICovCisvKiAgc29tZSBjb250cm9sIHBhcmFtZXRlcnMgaGF2ZSBjaGFuZ2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluc3QgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyAoTFZQU0FfSW5zdGFuY2VQcl90ICAgICAqcEluc3QpCit7CisgICAgTFZNX1VJTlQxNiBpaTsKKyAgICBMVk1fVUlOVDE2IEZyZXE7CisgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgUGFyYW1zOworICAgIGV4dGVybiBMVk1fSU5UMTYgICAgICAgIExWUFNBX25TYW1wbGVzQnVmZmVyVXBkYXRlW107CisgICAgZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdOworICAgIGV4dGVybiBMVk1fVUlOVDE2ICAgICAgIExWUFNBX0Rvd25TYW1wbGluZ0ZhY3RvcltdOworCisKKyAgICBpZihwSW5zdCA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKKyAgICB9CisKKyAgICBQYXJhbXMgPSBwSW5zdC0+TmV3UGFyYW1zOworCisgICAgLyogTW9kaWZpZXMgZmlsdGVycyB0eXBlcyBhbmQgY29lZmZpY2llbnRzLCBjbGVhciB0aGUgdGFwcyBhbmQKKyAgICAgICByZS1pbml0aWFsaXplcyBwYXJhbWV0ZXJzIGlmIHNhbXBsZSBmcmVxdWVuY3kgaGFzIGNoYW5nZWQgICAgKi8KKyAgICBpZihQYXJhbXMuRnMgIT0gcEluc3QtPkN1cnJlbnRQYXJhbXMuRnMpCisgICAgeworICAgICAgICBwSW5zdC0+Q3VycmVudFBhcmFtcy5GcyA9IFBhcmFtcy5GczsKKworICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBjZW50ZXIgZnJlcWV1bmNpZXMgYXMgYSBmdW5jdGlvbiBvZiB0aGUgc2FtcGxlIHJhdGUgKi8KKyAgICAgICAgRnJlcSA9IChMVk1fVUlOVDE2KSAoKExWUFNBX1NhbXBsZVJhdGVUYWJbcEluc3QtPkN1cnJlbnRQYXJhbXMuRnNdPj4xKSAvIChwSW5zdC0+bkJhbmRzICsgMSkpOworICAgICAgICBmb3IoaWkgPSBwSW5zdC0+bkJhbmRzOyBpaSA+IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaS0xXS5DZW50ZXJGcmVxdWVuY3kgPSAoTFZNX1VJTlQxNikgKEZyZXEgKiBpaSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIHJlbGV2YW50IGZpbHRlcnMuIElmIHRoZSBjZW50ZXIgZnJlcXVlbmN5IG9mIHRoZSBmaWx0ZXIgaXMKKyAgICAgICAgICAgYmlnZ2VyIHRoYW4gdGhlIG55cXVpc3QgZnJlcXVlbmN5LCB0aGVuIHRoZSBmaWx0ZXIgaXMgbm90IHJlbGV2YW50IGFuZCBkb2Vzbid0CisgICAgICAgICAgIG5lZWQgdG8gYmUgdXNlZCAqLworICAgICAgICBmb3IoaWkgPSBwSW5zdC0+bkJhbmRzOyBpaSA+IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaS0xXS5DZW50ZXJGcmVxdWVuY3kgPCAoTFZQU0FfU2FtcGxlUmF0ZVRhYltwSW5zdC0+Q3VycmVudFBhcmFtcy5Gc10+PjEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBJbnN0LT5uUmVsZXZhbnRGaWx0ZXJzID0gaWk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTFZQU0FfU2V0QlBGaWx0ZXJzVHlwZShwSW5zdCwgJlBhcmFtcyk7CisgICAgICAgIExWUFNBX1NldEJQRkNvZWZmaWNpZW50cyhwSW5zdCwgJlBhcmFtcyk7CisgICAgICAgIExWUFNBX1NldFFQRkNvZWZmaWNpZW50cyhwSW5zdCwgJlBhcmFtcyk7CisgICAgICAgIExWUFNBX0NsZWFyRmlsdGVySGlzdG9yeShwSW5zdCk7CisgICAgICAgIHBJbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSA9IChMVk1fVUlOVDE2KUxWUFNBX25TYW1wbGVzQnVmZmVyVXBkYXRlW1BhcmFtcy5Gc107CisgICAgICAgIHBJbnN0LT5CdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQgPSAwOworICAgICAgICBwSW5zdC0+RG93blNhbXBsaW5nRmFjdG9yID0gTFZQU0FfRG93blNhbXBsaW5nRmFjdG9yW1BhcmFtcy5Gc107CisgICAgICAgIHBJbnN0LT5Eb3duU2FtcGxpbmdDb3VudCA9IDA7CisgICAgICAgIGZvcihpaSA9IDA7IGlpIDwgKHBJbnN0LT5uQmFuZHMgKiBwSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoKTsgaWkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydFtpaV0gPSAwOworICAgICAgICB9CisgICAgICAgIGZvcihpaSA9IDA7IGlpIDwgcEluc3QtPm5CYW5kczsgaWkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3QtPnBQcmV2aW91c1BlYWtzW2lpXSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoUGFyYW1zLkxldmVsRGV0ZWN0aW9uU3BlZWQgIT0gcEluc3QtPkN1cnJlbnRQYXJhbXMuTGV2ZWxEZXRlY3Rpb25TcGVlZCkKKyAgICAgICAgeworICAgICAgICAgICAgTFZQU0FfU2V0UVBGQ29lZmZpY2llbnRzKHBJbnN0LCAmUGFyYW1zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBJbnN0LT5DdXJyZW50UGFyYW1zID0gcEluc3QtPk5ld1BhcmFtczsKKworICAgIHJldHVybiAoTFZQU0FfT0spOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9TZXRCUEZpbHRlcnNUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2V0cyB0aGUgZmlsdGVyIHR5cGUgYmFzZWQgb24gdGhlIEJQRmlsdGVyVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluc3QgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgUG9uaXRlciB0byBjb25yb2wgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUFNBX09LICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRvIHNlbGVjdCB0aGUgYmlxdWFkIHR5cGUgdGhlIGZvbGxvdyBydWxlcyBhcmUgYXBwbGllZDogICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIERvdWJsZSBwcmVjaXNpb24gICAgaWYgKGZjIDw9IGZzLzExMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBEb3VibGUgcHJlY2lzaW9uICAgIGlmIChmcy8xMTAgPCBmYyA8IGZzLzg1KSAmIChRPjMpICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgU2luZ2xlIHByZWNpc2lvbiAgICBvdGhlcndpc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRmlsdGVyc1R5cGUgKCAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwUGFyYW1zICApCit7CisKKyAgICBleHRlcm4gTFZNX1VJTlQxNiAgIExWUFNBX1NhbXBsZVJhdGVUYWJbXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZSByYXRlIHRhYmxlICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICBpaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgYmFuZCBpbmRleCAqLworICAgIExWTV9VSU5UMzIgICAgICAgICAgZnMgPSAoTFZNX1VJTlQzMilMVlBTQV9TYW1wbGVSYXRlVGFiWyhMVk1fVUlOVDE2KXBQYXJhbXMtPkZzXTsgICAgICAvKiBTYW1wbGUgcmF0ZSAqLworICAgIExWTV9VSU5UMzIgICAgICAgICAgZmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgIFFGYWN0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBRIGZhY3RvciAqLworCisgICAgZm9yIChpaSA9IDA7IGlpIDwgcEluc3QtPm5SZWxldmFudEZpbHRlcnM7IGlpKyspCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIGZpbHRlciBzZXR0aW5ncworICAgICAgICAgKi8KKyAgICAgICAgZmMgPSAoTFZNX1VJTlQzMilwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLkNlbnRlckZyZXF1ZW5jeTsgICAgIC8qIEdldCB0aGUgYmFuZCBjZW50cmUgZnJlcXVlbmN5ICovCisgICAgICAgIFFGYWN0b3IgPShMVk1fSU5UMTYpIHBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0uUUZhY3RvcjsgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgYmFuZCBRIGZhY3RvciAqLworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogRm9yIGVhY2ggZmlsdGVyIHNldCB0aGUgdHlwZSBvZiBiaXF1YWQgcmVxdWlyZWQKKyAgICAgICAgICovCisgICAgICAgIHBJbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uW2lpXSA9IExWUFNBX1NpbXBsZVByZWNpc2lvbkZpbHRlcjsgICAgIC8qIERlZmF1bHQgdG8gc2luZ2xlIHByZWNpc2lvbiAqLworICAgICAgICBpZiAoKExPV19GUkVRICogZnMpID49IChmYyA8PCAxNSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBmYyA8PSBmcy8xMTAKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcEluc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldID0gTFZQU0FfRG91YmxlUHJlY2lzaW9uRmlsdGVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCgoTE9XX0ZSRVEgKiBmcykgPCAoZmMgPDwgMTUpKSAmJiAoKGZjIDw8IDE1KSA8IChISUdIX0ZSRVEgKiBmcykpICYmIChRRmFjdG9yID4gMzAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICogKGZzLzExMCA8IGZjIDwgZnMvODUpICYgKFE+MykKKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHBJbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uW2lpXSA9IExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihMVlBTQV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfU2V0QlBGQ29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNldHMgdGhlIGJhbmQgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzLiBUaGlzIHVzZXMgdGhlIHR5cGUgdG8gc2VsZWN0ICAgICAgICAgICAgKi8KKy8qICBzaW5nbGUgb3IgZG91YmxlIHByZWNpc2lvbiBjb2VmZmljaWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdCAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUGFyYW1zICAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9TZXRCUEZDb2VmZmljaWVudHMoICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICpwSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcFBhcmFtcykKK3sKKworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICAgICAgaWk7CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzIGZvciBlYWNoIGJhbmQgYnkgdGhlIGluaXQgZnVuY3Rpb24KKyAgICAgKi8KKyAgICBmb3IgKGlpID0gMDsgaWkgPCBwSW5zdC0+blJlbGV2YW50RmlsdGVyczsgaWkrKykKKyAgICB7CisgICAgICAgIHN3aXRjaCAgKHBJbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uW2lpXSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAgICBMVlBTQV9Eb3VibGVQcmVjaXNpb25GaWx0ZXI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQlBfQzMyX0NvZWZzX3QgICAgICBDb2VmZmljaWVudHM7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIENhbGN1bGF0ZSB0aGUgZG91YmxlIHByZWNpc2lvbiBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBMVlBTQV9CUERvdWJsZVByZWNDb2VmcygoTFZNX1VJTlQxNilwUGFyYW1zLT5GcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICZwSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEJQX1RhcHNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAgICBMVlBTQV9TaW1wbGVQcmVjaXNpb25GaWx0ZXI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQlBfQzE2X0NvZWZzX3QgICAgICBDb2VmZmljaWVudHM7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIENhbGN1bGF0ZSB0aGUgc2luZ2xlIHByZWNpc2lvbiBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBMVlBTQV9CUFNpbmdsZVByZWNDb2VmcygoTFZNX1VJTlQxNilwUGFyYW1zLT5GcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICZwSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEJQX1RhcHNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihMVlBTQV9PSyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9TZXRRUEZDb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2V0cyB0aGUgcXVhc2kgcGVhayBmaWx0ZXJzIGNvZWZmaWNpZW50cy4gVGhpcyB1c2VzIHRoZSBjaG9zZW4gICAgICAgICAgICAgICAgICAqLworLyogIExldmVsRGV0ZWN0aW9uU3BlZWQgZnJvbSB0aGUgY29udHJvbCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0ICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQYXJhbXMgICAgICAgICAgICAgIENvbnRyb2wgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX1NldFFQRkNvZWZmaWNpZW50cyggICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICpwSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMgICkKK3sKKyAgICBMVk1fVUlOVDE2ICAgICBpaTsKKyAgICBMVk1fRnNfZW4gICAgICBGcyA9IHBQYXJhbXMtPkZzOworICAgIFFQRF9DMzJfQ29lZnMgICpwQ29lZmZpY2llbnRzOworICAgIGV4dGVybiAgICAgICAgIFFQRF9DMzJfQ29lZnMgICAgIExWUFNBX1FQRF9Db2Vmc1tdOworCisKKyAgICBwQ29lZmZpY2llbnRzID0gJkxWUFNBX1FQRF9Db2Vmc1socFBhcmFtcy0+TGV2ZWxEZXRlY3Rpb25TcGVlZCAqIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFKSArIEZzXTsKKworCisgICAgZm9yIChpaSA9IDA7IGlpIDwgcEluc3QtPm5SZWxldmFudEZpbHRlcnM7IGlpKyspCisgICAgeworICAgICAgICAgICAgTFZQU0FfUVBEX0luaXQgKCZwSW5zdC0+cFFQRF9TdGF0ZXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cFFQRF9UYXBzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29lZmZpY2llbnRzICk7CisgICAgfQorCisgICAgcmV0dXJuKExWUFNBX09LKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVlBTQV9CUFNpbmdsZVByZWNDb2VmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENhbGN1bGF0ZSBzaW5nbGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cyBmb3IgYSBiYW5kIHBhc3MgZmlsdGVyICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEZzICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGluZyBmcmVxdWVuY3kgaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEZpbHRlclBhcmFtcyAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGZpbHRlciBkZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ29lZmZpY2llbnRzICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGUgZXF1YXRpb25zIHVzZWQgYXJlIGFzIGZvbGxvd3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHQwID0gMiAqIFBpICogRmMgLyBGcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBiMiA9IC0wLjUgKiAoMlEgLSB0MCkgLyAoMlEgKyB0MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGIxID0gKDAuNSAtIGIyKSAqIGNvcyh0MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYTAgPSAoMC41ICsgYjIpIC8gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlcmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRmMgICAgICAgICAgaXMgdGhlIGNlbnRyZSBmcmVxdWVuY3ksIERDIHRvIE55cXVpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBGcyAgICAgICAgICBpcyB0aGUgc2FtcGxlIGZyZXF1ZW5jeSwgODAwMCB0byA0ODAwMCBpbiBkZXNjcmV0ZSBzdGVwcyAgICAgICAgICAgICovCisvKiAgICAgIFEgICAgICAgICAgIGlzIHRoZSBRIGZhY3RvciwgMC4yNSB0byAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDIuIFRoaXMgZnVuY3Rpb24gaXMgZW50aXJlbHkgYmFzZWQgb24gdGhlIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMgZnVuY3Rpb24gICAgICAgICAgICovCisvKiAgICAgb2YgdGhlIG4gYmFuZHMgZXF1YWxpemVyIChMVkVRTkIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgICpwRmlsdGVyUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMTZfQ29lZnNfdCAgICAgICAgICpwQ29lZmZpY2llbnRzKQoreworCisgICAgZXh0ZXJuIExWTV9JTlQxNiAgICBMVlBTQV9Ud29QaU9uRnNUYWJsZVtdOworICAgIGV4dGVybiBMVk1fSU5UMTYgICAgTFZQU0FfQ29zQ29lZltdOworCisKKyAgICAvKgorICAgICAqIEludGVybWVkaWF0ZSB2YXJpYWJsZXMgYW5kIHRlbXBvcmFyeSB2YWx1ZXMKKyAgICAgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgIFQwOworICAgIExWTV9JTlQxNiAgICAgICAgICAgRDsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEEwOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQjE7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBCMjsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIER0MDsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEIyX0RlbjsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEIyX051bTsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIENPU19UMDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIGNvZWY7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBmYWN0b3I7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICB0MDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIGk7CisKKworICAgIC8qCisgICAgICogR2V0IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbgorICAgICAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgRnJlcXVlbmN5ICAgPSBwRmlsdGVyUGFyYW1zLT5DZW50ZXJGcmVxdWVuY3k7CisgICAgTFZNX1VJTlQxNiAgICAgICAgICBRRmFjdG9yICAgICA9IHBGaWx0ZXJQYXJhbXMtPlFGYWN0b3I7CisKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRpbmcgdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMKKyAgICAgKi8KKyAgICBUMCA9IChMVk1fSU5UMzIpRnJlcXVlbmN5ICogTFZQU0FfVHdvUGlPbkZzVGFibGVbRnNdOyAgIC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLworICAgIEQgPSAzMjAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDAwMDAgKDEqMTAwKjJeNSkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvcmNlIEQgPSAxIDogdGhlIGZ1bmN0aW9uIHdhcyBvcmlnaW5hbGx5IHVzZWQgZm9yIGEgcGVha2luZyBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgRCBwYXJhbWV0ZXIgZG8gbm90IGV4aXN0IGZvciBhIEJhbmRQYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBCMiBjb2VmZmljaWVudAorICAgICAqLworICAgIER0MCA9IEQgKiAoVDAgPj4gMTApOworICAgIEIyX0RlbiA9IChMVk1fSU5UMzIpKCgoTFZNX1VJTlQzMilRRmFjdG9yIDw8IDE5KSArIChMVk1fVUlOVDMyKShEdDAgPj4gMikpOworICAgIEIyX051bSA9IChMVk1fSU5UMzIpKChMVk1fVUlOVDMyKShEdDAgPj4gMykgLSAoKExWTV9VSU5UMzIpUUZhY3RvciA8PCAxOCkpOworICAgIEIyID0gKEIyX051bSAvIChCMl9EZW4gPj4gMTYpKSA8PCAxNTsKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBjb3NpbmUgYnkgYSBwb2x5bm9taWFsIGV4cGFuc2lvbiB1c2luZyB0aGUgZXF1YXRpb246CisgICAgICoKKyAgICAgKiAgQ29zICs9IGNvZWYobikgKiB0MF5uICAgICAgICAgICAgICAgICAgIEZvciBuID0gMCB0byA2CisgICAgICovCisgICAgVDAgPSAoVDAgPj4gMTApICogMjA4NTk7ICAgICAgICAgICAgICAgICAgICAvKiBTY2FsZSB0byAxLjAgaW4gMTYtYml0IGZvciByYW5nZSAwIHRvIGZzLzIgKi8KKyAgICB0MCA9IChMVk1fSU5UMTYpKFQwID4+IDE2KTsKKyAgICBmYWN0b3IgPSAweDdmZmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdG8gMS4wIGZvciB0aGUgYTAgY29lZmZpY2llbnQgKi8KKyAgICBDT1NfVDAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGVycm9yIHRvIHplcm8gKi8KKyAgICBmb3IgKGk9MTsgaTw3OyBpKyspCisgICAgeworICAgICAgICBjb2VmID0gTFZQU0FfQ29zQ29lZltpXTsgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBudGggY29lZmZpY2llbnQgKi8KKyAgICAgICAgQ09TX1QwICs9IChmYWN0b3IgKiBjb2VmKSA+PiA1OyAgICAgICAgIC8qIFRoZSBudGggcGFydGlhbCBzdW0gKi8KKyAgICAgICAgZmFjdG9yID0gKGZhY3RvciAqIHQwKSA+PiAxNTsgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0MF5uICovCisgICAgfQorICAgIENPU19UMCA9IENPU19UMCA8PCAoTFZQU0FfQ29zQ29lZlswXSs2KTsgICAgICAgICAgLyogQ29ycmVjdCB0aGUgc2NhbGluZyAqLworCisKKyAgICBCMSA9ICgoMHg0MDAwMDAwMCAtIEIyKSA+PiAxNikgKiAoQ09TX1QwID4+IDE2KTsgICAgLyogQjEgPSAoMC41IC0gYjIpICogY29zKHQwKSAqLworICAgIEEwID0gKDB4NDAwMDAwMDAgKyBCMikgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBBMCA9ICgwLjUgKyBiMikgLyAyICovCisKKyAgICAvKgorICAgICAqIFdyaXRlIGNvZWZmIGludG8gdGhlIGRhdGEgc3RydWN0dXJlCisgICAgICovCisgICAgcENvZWZmaWNpZW50cy0+QTAgPSAoTFZNX0lOVDE2KShBMD4+MTYpOworICAgIHBDb2VmZmljaWVudHMtPkIxID0gKExWTV9JTlQxNikoQjE+PjE1KTsKKyAgICBwQ29lZmZpY2llbnRzLT5CMiA9IChMVk1fSU5UMTYpKEIyPj4xNik7CisKKworICAgIHJldHVybihMVlBTQV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ2FsY3VsYXRlIGRvdWJsZSBwcmVjaXNpb24gY29lZmZpY2llbnRzIGZvciBhIGJhbmQgcGFzcyBmaWx0ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnMgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsaW5nIGZyZXF1ZW5jeSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwRmlsdGVyUGFyYW1zICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZmlsdGVyIGRlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDb2VmZmljaWVudHMgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUFNBX09LICAgICAgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoZSBlcXVhdGlvbnMgdXNlZCBhcmUgYXMgZm9sbG93czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdDAgPSAyICogUGkgKiBGYyAvIEZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGIyID0gLTAuNSAqICgyUSAtIHQwKSAvICgyUSArIHQwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYjEgPSAoMC41IC0gYjIpICogKDEgLSBjb3NlcnIodDApKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhMCA9ICgwLjUgKyBiMikgLyAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVyZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBGYyAgICAgICAgICBpcyB0aGUgY2VudHJlIGZyZXF1ZW5jeSwgREMgdG8gRnMvNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEZzICAgICAgICAgIGlzIHRoZSBzYW1wbGUgZnJlcXVlbmN5LCA4MDAwIHRvIDQ4MDAwIGluIGRlc2NyZXRlIHN0ZXBzICAgICAgICAgICAgKi8KKy8qICAgICAgUSAgICAgICAgICAgaXMgdGhlIFEgZmFjdG9yLCAwLjI1IHRvIDEyIChyZXByZXNlbnRlZCBieSAyNSB0byAxMjAwKSAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMi4gVGhlIGRvdWJsZSBwcmVjaXNpb24gY29lZmZpY2llbnRzIGFyZSBvbmx5IHVzZWQgd2hlbiBmYyBpcyBsZXNzIHRoYW4gZnMvODUsIHNvICAgKi8KKy8qICAgICB0aGUgY29zaW5lIG9mIHQwIGlzIGFsd2F5cyBjbG9zZSB0byAxLjAuIEluc3RlYWQgb2YgY2FsY3VsYXRpbmcgdGhlIGNvc2luZSAgICAgICAqLworLyogICAgIGl0c2VsZiB0aGUgZGlmZmVyZW5jZSBmcm9tIHRoZSB2YWx1ZSAxLjAgaXMgY2FsY3VsYXRlZCwgdGhpcyBjYW4gYmUgZG9uZSB3aXRoICAgICovCisvKiAgICAgbG93ZXIgcHJlY2lzaW9uIG1hdGhzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDMuIFRoZSB2YWx1ZSBvZiB0aGUgQjIgY29lZmZpY2llbnQgaXMgb25seSBjYWxjdWxhdGVkIGFzIGEgc2luZ2xlIHByZWNpc2lvbiB2YWx1ZSwgICovCisvKiAgICAgc21hbGwgZXJyb3JzIGluIHRoaXMgdmFsdWUgaGF2ZSBhIGNvbWJpbmVkIGVmZmVjdCBvbiB0aGUgUSBhbmQgR2FpbiBidXQgbm90IHRoZSAgKi8KKy8qICAgICB0aGUgZnJlcXVlbmN5IG9mIHRoZSBmaWx0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgNC4gVGhpcyBmdW5jdGlvbiBpcyBlbnRpcmVseSBiYXNlZCBvbiB0aGUgTFZFUU5CX0RvdWJsZVByZWNDb2VmcyBmdW5jdGlvbiAgICAgICAgICAgKi8KKy8qICAgICBvZiB0aGUgbiBiYW5kcyBlcXVhbGl6ZXIgKExWRVFOQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9CUERvdWJsZVByZWNDb2VmcyggICBMVk1fVUlOVDE2ICAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgKnBGaWx0ZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzMyX0NvZWZzX3QgICAgICAgKnBDb2VmZmljaWVudHMpCit7CisKKyAgICBleHRlcm4gTFZNX0lOVDE2ICAgIExWUFNBX1R3b1BpT25Gc1RhYmxlW107CisgICAgZXh0ZXJuIExWTV9JTlQxNiAgICBMVlBTQV9EUENvc0NvZWZbXTsKKworICAgIC8qCisgICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcworICAgICAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgVDA7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICBEOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQTA7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBCMTsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEIyOworICAgIExWTV9JTlQzMiAgICAgICAgICAgRHQwOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQjJfRGVuOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQjJfTnVtOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQ29zRXJyOworICAgIExWTV9JTlQxNiAgICAgICAgICAgY29lZjsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIGZhY3RvcjsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIHQwOworICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKKworICAgIC8qCisgICAgICogR2V0IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbgorICAgICAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgRnJlcXVlbmN5ICAgPSBwRmlsdGVyUGFyYW1zLT5DZW50ZXJGcmVxdWVuY3k7CisgICAgTFZNX1VJTlQxNiAgICAgICAgICBRRmFjdG9yICAgICA9IHBGaWx0ZXJQYXJhbXMtPlFGYWN0b3I7CisKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRpbmcgdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMKKyAgICAgKi8KKyAgICBUMCA9IChMVk1fSU5UMzIpRnJlcXVlbmN5ICogTFZQU0FfVHdvUGlPbkZzVGFibGVbRnNdOyAgIC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLworICAgIEQgPSAzMjAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDAwMDAgKDEqMTAwKjJeNSkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvcmNlIEQgPSAxIDogdGhlIGZ1bmN0aW9uIHdhcyBvcmlnaW5hbGx5IHVzZWQgZm9yIGEgcGVha2luZyBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgRCBwYXJhbWV0ZXIgZG8gbm90IGV4aXN0IGZvciBhIEJhbmRQYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBCMiBjb2VmZmljaWVudAorICAgICAqLworICAgIER0MCA9IEQgKiAoVDAgPj4gMTApOworICAgIEIyX0RlbiA9IChMVk1fSU5UMzIpKCgoTFZNX1VJTlQzMilRRmFjdG9yIDw8IDE5KSArIChMVk1fVUlOVDMyKShEdDAgPj4gMikpOworICAgIEIyX051bSA9IChMVk1fSU5UMzIpKChMVk1fVUlOVDMyKShEdDAgPj4gMykgLSAoKExWTV9VSU5UMzIpUUZhY3RvciA8PCAxOCkpOworICAgIEIyID0gKEIyX051bSAvIChCMl9EZW4gPj4gMTYpKSA8PCAxNTsKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBjb3NpbmUgZXJyb3IgYnkgYSBwb2x5bm9taWFsIGV4cGFuc2lvbiB1c2luZyB0aGUgZXF1YXRpb246CisgICAgICoKKyAgICAgKiAgQ29zRXJyICs9IGNvZWYobikgKiB0MF5uICAgICAgICAgICAgICAgIEZvciBuID0gMCB0byA0CisgICAgICovCisgICAgVDAgPSAoVDAgPj4gNikgKiAweDdmNTM7ICAgICAgICAgICAgICAgICAgICAvKiBTY2FsZSB0byAxLjAgaW4gMTYtYml0IGZvciByYW5nZSAwIHRvIGZzLzUwICovCisgICAgdDAgPSAoTFZNX0lOVDE2KShUMCA+PiAxNik7CisgICAgZmFjdG9yID0gMHg3ZmZmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlIHRvIDEuMCBmb3IgdGhlIGEwIGNvZWZmaWNpZW50ICovCisgICAgQ29zRXJyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlIHRoZSBlcnJvciB0byB6ZXJvICovCisgICAgZm9yIChpPTE7IGk8NTsgaSsrKQorICAgIHsKKyAgICAgICAgY29lZiA9IExWUFNBX0RQQ29zQ29lZltpXTsgICAgICAgICAgICAgIC8qIEdldCB0aGUgbnRoIGNvZWZmaWNpZW50ICovCisgICAgICAgIENvc0VyciArPSAoZmFjdG9yICogY29lZikgPj4gNTsgICAgICAgICAvKiBUaGUgbnRoIHBhcnRpYWwgc3VtICovCisgICAgICAgIGZhY3RvciA9IChmYWN0b3IgKiB0MCkgPj4gMTU7ICAgICAgICAgICAvKiBDYWxjdWxhdGUgdDBebiAqLworICAgIH0KKyAgICBDb3NFcnIgPSBDb3NFcnIgPDwgKExWUFNBX0RQQ29zQ29lZlswXSk7ICAgICAgICAgIC8qIENvcnJlY3QgdGhlIHNjYWxpbmcgKi8KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBCMSBhbmQgQTAgY29lZmZpY2llbnRzCisgICAgICovCisgICAgQjEgPSAoMHg0MDAwMDAwMCAtIEIyKTsgICAgICAgICAgICAgICAgICAgICAvKiBCMSA9ICgwLjUgLSBiMikgKi8KKyAgICBBMCA9ICgoQjEgPj4gMTYpICogKENvc0VyciA+PiAxMCkpID4+IDY7ICAgIC8qIFRlbXBvcmFyeSBzdG9yYWdlIGZvciAoMC41IC0gYjIpICogY29zZXJyKHQwKSAqLworICAgIEIxIC09IEEwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQjEgPSAoMC41IC0gYjIpICogKDEgLSBjb3NlcnIodDApKSAgKi8KKyAgICBBMCA9ICgweDQwMDAwMDAwICsgQjIpID4+IDE7ICAgICAgICAgICAgICAgIC8qIEEwID0gKDAuNSArIGIyKSAvIDIgKi8KKworICAgIC8qCisgICAgICogV3JpdGUgY29lZmYgaW50byB0aGUgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICBwQ29lZmZpY2llbnRzLT5BMCA9IEEwOworICAgIHBDb2VmZmljaWVudHMtPkIxID0gQjE7CisgICAgcENvZWZmaWNpZW50cy0+QjIgPSBCMjsKKworICAgIHJldHVybihMVlBTQV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfQ2xlYXJGaWx0ZXJIaXN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENsZWFycyB0aGUgZmlsdGVycycgZGF0YSBoaXN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0ICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUFNBX09LICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfQ2xlYXJGaWx0ZXJIaXN0b3J5KExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0KQoreworICAgIExWTV9JTlQ4ICAgICAgICpwVGFwQWRkcmVzczsKKyAgICBMVk1fVUlOVDMyICAgICAgIGk7CisKKyAgICAvKiBCYW5kIFBhc3MgZmlsdGVycyB0YXBzICovCisgICAgcFRhcEFkZHJlc3MgPSAoTFZNX0lOVDggKilwSW5zdC0+cEJQX1RhcHM7CisgICAgZm9yKGkgPSAwOyBpIDwgcEluc3QtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCk7IGkrKykKKyAgICB7CisgICAgICAgIHBUYXBBZGRyZXNzW2ldID0gMDsKKyAgICB9CisKKyAgICAvKiBRdWFzaS1wZWFrIGZpbHRlcnMgdGFwcyAqLworICAgIHBUYXBBZGRyZXNzID0gKExWTV9JTlQ4ICopcEluc3QtPnBRUERfVGFwczsKKyAgICBmb3IoaSA9IDA7IGkgPCBwSW5zdC0+bkJhbmRzICogc2l6ZW9mKFFQRF9UYXBzX3QpOyBpKyspCisgICAgeworICAgICAgICBwVGFwQWRkcmVzc1tpXSA9IDA7CisgICAgfQorCisgICAgcmV0dXJuKExWUFNBX09LKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWI0NTY3OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Jbml0LmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFByb2plY3Q6OiAgIFBTQV8wMV9BUk1DXzAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDYgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTQ6MDE6NDcgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAgICAiTFZQU0EuaCIKKyNpbmNsdWRlICAgICJMVlBTQV9Qcml2YXRlLmgiCisjaW5jbHVkZSAgICAiSW5zdEFsbG9jLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluaXRpYWxpemUgdGhlIExWUFNBIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgIFBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5pdFBhcmFtcyAgICAgICAgICBJbml0IHBhcmFtZXRlcnMgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvbnRyb2xQYXJhbXMgICAgICAgQ29udHJvbCBwYXJhbWV0ZXJzIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWVtb3J5VGFibGUgICAgICAgIE1lbW9yeSB0YWJsZSB0aGF0IGNvbnRhaW5zIG1lbW9yeSBhcmVhcyBkZWZpbml0aW9uICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX0luaXQgICAgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgICpwaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfSW5pdFBhcmFtc190ICAgICAgICAgICpwSW5pdFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICAqcENvbnRyb2xQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9NZW1UYWJfdCAgICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSApCit7CisgICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAgICpwTFZQU0FfSW5zdDsKKyAgICBMVlBTQV9SRVRVUk4gICAgICAgICAgICAgICAgZXJyb3JDb2RlICAgICAgID0gTFZQU0FfT0s7CisgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIGlpOworICAgIGV4dGVybiBMVk1fSU5UMTYgICAgICAgICAgICBMVlBTQV9HYWluVGFibGVbXTsKKyAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgQnVmZmVyTGVuZ3RoID0gMDsKKworICAgIC8qIEludHNfQWxsb2MgaW5zdGFuY2VzLCBuZWVkZWQgZm9yIG1lbW9yeSBhbGlnbm1lbnQgbWFuYWdlbWVudCAqLworICAgIElOU1RfQUxMT0MgICAgICAgICAgSW5zdGFuY2U7CisgICAgSU5TVF9BTExPQyAgICAgICAgICBTY3JhdGNoOworICAgIElOU1RfQUxMT0MgICAgICAgICAgRGF0YTsKKyAgICBJTlNUX0FMTE9DICAgICAgICAgIENvZWY7CisKKyAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgICAgaWYoKHBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5pdFBhcmFtcyA9PSBMVk1fTlVMTCkgfHwgKHBDb250cm9sUGFyYW1zID09IExWTV9OVUxMKSB8fCAocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7CisgICAgfQorICAgIGlmKCAocEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uID4gTFZQU0FfTUFYQlVGRkVSRFVSQVRJT04pICAgfHwKKyAgICAgICAgKHBJbml0UGFyYW1zLT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgIChwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgPiBMVlBTQV9NQVhJTlBVVEJMT0NLU0laRSkgICAgICB8fAorICAgICAgICAocEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplID09IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgKHBJbml0UGFyYW1zLT5uQmFuZHMgPCBMVlBTQV9OQkFORFNNSU4pICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgIChwSW5pdFBhcmFtcy0+bkJhbmRzID4gTFZQU0FfTkJBTkRTTUFYKSAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zID09IDApKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7CisgICAgfQorICAgIGZvcihpaSA9IDA7IGlpIDwgcEluaXRQYXJhbXMtPm5CYW5kczsgaWkrKykKKyAgICB7CisgICAgICAgIGlmKChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLkNlbnRlckZyZXF1ZW5jeSA+IExWUFNBX01BWENFTlRFUkZSRVEpIHx8CisgICAgICAgICAgIChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlBvc3RHYWluICAgICAgICA+IExWUFNBX01BWFBPU1RHQUlOKSAgIHx8CisgICAgICAgICAgIChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlBvc3RHYWluICAgICAgICA8IExWUFNBX01JTlBPU1RHQUlOKSAgIHx8CisgICAgICAgICAgIChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlFGYWN0b3IgPCBMVlBTQV9NSU5RRkFDVE9SKSAgICAgICAgICAgIHx8CisgICAgICAgICAgIChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlFGYWN0b3IgPiBMVlBTQV9NQVhRRkFDVE9SKSkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOworICAgICAgICAgICB9CisgICAgfQorCisKKyAgICAvKkluc3RfQWxsb2MgaW5zdGFuY2VzIGluaXRpYWxpemF0aW9uICovCisgICAgSW5zdEFsbG9jX0luaXQoICZJbnN0YW5jZSAgICwgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3MpOworICAgIEluc3RBbGxvY19Jbml0KCAmU2NyYXRjaCAgICAsIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MpOworICAgIEluc3RBbGxvY19Jbml0KCAmRGF0YSAgICAgICAsIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyk7CisgICAgSW5zdEFsbG9jX0luaXQoICZDb2VmICAgICAgICwgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzKTsKKworCisgICAgLyogU2V0IHRoZSBpbnN0YW5jZSBoYW5kbGUgaWYgbm90IGFscmVhZHkgaW5pdGlhbGlzZWQgKi8KKyAgICBpZiAoKnBoSW5zdGFuY2UgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICAqcGhJbnN0YW5jZSA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgc2l6ZW9mKExWUFNBX0luc3RhbmNlUHJfdCkgKTsKKyAgICB9CisgICAgcExWUFNBX0luc3QgPShMVlBTQV9JbnN0YW5jZVByX3QqKSpwaEluc3RhbmNlOworCisKKyAgICAvKiBDaGVjayB0aGUgbWVtb3J5IHRhYmxlIGZvciBOVUxMIHBvaW50ZXJzICovCisgICAgZm9yIChpaSA9IDA7IGlpIDwgTFZQU0FfTlJfTUVNT1JZX1JFR0lPTlM7IGlpKyspCisgICAgeworICAgICAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25baWldLlNpemUhPTApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpaV0ucEJhc2VBZGRyZXNzPT1MVk1fTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcExWUFNBX0luc3QtPk1lbW9yeVRhYmxlLlJlZ2lvbltpaV0gPSBwTWVtb3J5VGFibGUtPlJlZ2lvbltpaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIG1vZHVsZSdzIGludGVybmFsIHBhcmFtZXRlcnMgKi8KKyAgICBwTFZQU0FfSW5zdC0+YkNvbnRyb2xQZW5kaW5nID0gTFZNX0ZBTFNFOworICAgIHBMVlBTQV9JbnN0LT5uQmFuZHMgPSBwSW5pdFBhcmFtcy0+bkJhbmRzOworICAgIHBMVlBTQV9JbnN0LT5NYXhJbnB1dEJsb2NrU2l6ZSA9IHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZTsKKyAgICBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gPSBwSW5pdFBhcmFtcy0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb247CisgICAgcExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuRnMgPSBMVk1fRlNfRFVNTVk7CisgICAgcExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuTGV2ZWxEZXRlY3Rpb25TcGVlZCA9IExWUFNBX1NQRUVEX0RVTU1ZOworCisgICAgeyAgIC8qIGZvciBhdm9pZGluZyBRQUMgd2FybmluZ3MgKi8KKyAgICAgICAgTFZNX0lOVDMyIFNEQkQ9KExWTV9JTlQzMilwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb247CisgICAgICAgIExWTV9JTlQzMiBJUlRJPShMVk1fSU5UMzIpTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZUludjsKKyAgICAgICAgTFZNX0lOVDMyIEJMOworCisgICAgICAgIE1VTDMyeDMySU5UTzMyKFNEQkQsSVJUSSxCTCxMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lU2hpZnQpCisKKyAgICAgICAgQnVmZmVyTGVuZ3RoPShMVk1fVUlOVDMyKUJMOworICAgIH0KKworICAgIGlmKChCdWZmZXJMZW5ndGggKiBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lKSAhPSBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24pCisgICAgeworICAgICAgICBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoID0gQnVmZmVyTGVuZ3RoICsgMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCA9IEJ1ZmZlckxlbmd0aDsKKyAgICB9CisKKworICAgIC8qIEFzc2lnbiB0aGUgcG9pbnRlcnMgKi8KKworICAgIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zICAgICAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fVUlOVDE2KSApOworICAgIHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtcyAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVlBTQV9GaWx0ZXJQYXJhbV90KSApOworICAgIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGggKiBzaXplb2YoTFZNX1VJTlQ4KSApOworICAgIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrcyAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fVUlOVDgpICk7CisgICAgcExWUFNBX0luc3QtPnBCUEZpbHRlcnNQcmVjaXNpb24gICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWUFNBX0JQRmlsdGVyUHJlY2lzaW9uX2VuKSApOworCisgICAgcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXMgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkgKTsKKyAgICBwTFZQU0FfSW5zdC0+cFFQRF9TdGF0ZXMgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKFFQRF9TdGF0ZV90KSApOworCisgICAgcExWUFNBX0luc3QtPnBCUF9UYXBzICAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCkgKTsKKyAgICBwTFZQU0FfSW5zdC0+cFFQRF9UYXBzICAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZEYXRhLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKFFQRF9UYXBzX3QpICk7CisKKworICAgIC8qIENvcHkgZmlsdGVycyBwYXJhbWV0ZXJzIGluIHRoZSBwcml2YXRlIGluc3RhbmNlICovCisgICAgZm9yKGlpID0gMDsgaWkgPCBwTFZQU0FfSW5zdC0+bkJhbmRzOyBpaSsrKQorICAgIHsKKyAgICAgICAgcExWUFNBX0luc3QtPnBGaWx0ZXJzUGFyYW1zW2lpXSA9IHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV07CisgICAgfQorCisgICAgLyogU2V0IFBvc3QgZmlsdGVycyBnYWlucyovCisgICAgZm9yKGlpID0gMDsgaWkgPCBwTFZQU0FfSW5zdC0+bkJhbmRzOyBpaSsrKQorICAgIHsKKyAgICAgICAgcExWUFNBX0luc3QtPnBQb3N0R2FpbnNbaWldID0oTFZNX1VJTlQxNikgTFZQU0FfR2FpblRhYmxlW3BJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUG9zdEdhaW4gKyAxNV07CisgICAgfQorICAgIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydDsKKworCisgICAgLyogSW5pdGlhbGl6ZSBjb250cm9sIGRlcGVuZGFudCBpbnRlcm5hbCBwYXJhbWV0ZXJzICovCisgICAgZXJyb3JDb2RlID0gTFZQU0FfQ29udHJvbCAoKnBoSW5zdGFuY2UsIHBDb250cm9sUGFyYW1zKTsKKworICAgIGlmKGVycm9yQ29kZSE9MCkKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvckNvZGU7CisgICAgfQorCisgICAgZXJyb3JDb2RlID0gTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyAocExWUFNBX0luc3QpOworCisgICAgaWYoZXJyb3JDb2RlIT0wKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yQ29kZTsKKyAgICB9CisKKyAgICByZXR1cm4oZXJyb3JDb2RlKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA1OWNiNGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfTWVtb3J5LmMKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFByb2plY3Q6OiAgIFBTQV8wMV9BUk1DXzAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDYgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTQ6MDE6NDcgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAgICAiTFZQU0EuaCIKKyNpbmNsdWRlICAgICJMVlBTQV9Qcml2YXRlLmgiCisjaW5jbHVkZSAgICAiSW5zdEFsbG9jLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KKy8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAqLworLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAqLworLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KKy8qICBJbml0UGFyYW1zICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBpbml0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX01lbW9yeSAgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX01lbVRhYl90ICAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICAgICAqcEluaXRQYXJhbXMgICAgKQoreworICAgIExWTV9VSU5UMzIgICAgICAgICAgaWk7CisgICAgTFZNX1VJTlQzMiAgICAgICAgICBCdWZmZXJMZW5ndGg7CisgICAgSU5TVF9BTExPQyAgICAgICAgICBJbnN0YW5jZTsKKyAgICBJTlNUX0FMTE9DICAgICAgICAgIFNjcmF0Y2g7CisgICAgSU5TVF9BTExPQyAgICAgICAgICBEYXRhOworICAgIElOU1RfQUxMT0MgICAgICAgICAgQ29lZjsKKyAgICBMVlBTQV9JbnN0YW5jZVByX3QgKnBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOworCisKKyAgICBJbnN0QWxsb2NfSW5pdCggJkluc3RhbmNlICAgLCBMVk1fTlVMTCk7CisgICAgSW5zdEFsbG9jX0luaXQoICZTY3JhdGNoICAgICwgTFZNX05VTEwpOworICAgIEluc3RBbGxvY19Jbml0KCAmRGF0YSAgICAgICAsIExWTV9OVUxMKTsKKyAgICBJbnN0QWxsb2NfSW5pdCggJkNvZWYgICAgICAgLCBMVk1fTlVMTCk7CisKKworICAgIGlmKChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpIHx8IChwSW5pdFBhcmFtcyA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBGaWxsIGluIHRoZSBtZW1vcnkgdGFibGUKKyAgICAgKi8KKyAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKQorICAgIHsKKworICAgICAgICAvKiBDaGVjayBpbml0IHBhcmFtZXRlciAqLworICAgICAgICBpZiggKHBJbml0UGFyYW1zLT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiA+IExWUFNBX01BWEJVRkZFUkRVUkFUSU9OKSAgIHx8CisgICAgICAgICAgICAocEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uID09IDApICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgPiBMVlBTQV9NQVhJTlBVVEJMT0NLU0laRSkgICAgICB8fAorICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAocEluaXRQYXJhbXMtPm5CYW5kcyA8IExWUFNBX05CQU5EU01JTikgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+bkJhbmRzID4gTFZQU0FfTkJBTkRTTUFYKSAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtcyA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yKGlpID0gMDsgaWkgPCBwSW5pdFBhcmFtcy0+bkJhbmRzOyBpaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZigocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5DZW50ZXJGcmVxdWVuY3kgPiBMVlBTQV9NQVhDRU5URVJGUkVRKSB8fAorICAgICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUG9zdEdhaW4gICAgICAgID4gTFZQU0FfTUFYUE9TVEdBSU4pICAgfHwKKyAgICAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlBvc3RHYWluICAgICAgICA8IExWUFNBX01JTlBPU1RHQUlOKSAgIHx8CisgICAgICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5RRmFjdG9yIDwgTFZQU0FfTUlOUUZBQ1RPUikgICAgICAgICAgICB8fAorICAgICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUUZhY3RvciA+IExWUFNBX01BWFFGQUNUT1IpKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEluc3RhbmNlIG1lbW9yeQorICAgICAgICAgKi8KKworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHNpemVvZihMVlBTQV9JbnN0YW5jZVByX3QpICk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fVUlOVDE2KSApOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZQU0FfRmlsdGVyUGFyYW1fdCkgKTsKKworICAgICAgICB7CisgICAgICAgICAgICAvKiBmb3IgYXZvaWRpbmcgUUFDIHdhcm5pbmdzIGFzIE1VTDMyeDMySU5UTzMyIHdvcmtzIG9uIExWTV9JTlQzMiBvbmx5Ki8KKyAgICAgICAgICAgIExWTV9JTlQzMiBTREJEPShMVk1fSU5UMzIpcEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOworICAgICAgICAgICAgTFZNX0lOVDMyIElSVEk9KExWTV9JTlQzMilMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lSW52OworICAgICAgICAgICAgTFZNX0lOVDMyIEJMOworCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihTREJELElSVEksQkwsTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0KQorICAgICAgICAgICAgQnVmZmVyTGVuZ3RoPShMVk1fVUlOVDMyKUJMOworICAgICAgICB9CisKKworICAgICAgICBpZigoQnVmZmVyTGVuZ3RoICogTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZSkgIT0gcEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBCdWZmZXJMZW5ndGgrKzsKKyAgICAgICAgfQorICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBCdWZmZXJMZW5ndGggKiBzaXplb2YoTFZNX1VJTlQ4KSApOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZNX1VJTlQ4KSApOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZQU0FfQlBGaWx0ZXJQcmVjaXNpb25fZW4pICk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9JTlNUQU5DRV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZJbnN0YW5jZSk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9JTlNUQU5DRV0uVHlwZSAgICAgICAgID0gTFZQU0FfUEVSU0lTVEVOVDsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBTY3JhdGNoIG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJlNjcmF0Y2gsIDIgKiBwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgKiBzaXplb2YoTFZNX0lOVDE2KSApOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZTY3JhdGNoKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0hdLlR5cGUgICAgICAgICA9IExWUFNBX1NDUkFUQ0g7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBQZXJzaXN0ZW50IGNvZWZmaWNpZW50cyBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF9JbnN0YW5jZV90KSApOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfU3RhdGVfdCkgKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZDb2VmKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uVHlwZSAgICAgICAgID0gTFZQU0FfUEVSU0lTVEVOVF9DT0VGOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBQZXJzaXN0ZW50IGRhdGEgbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCkgKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX1RhcHNfdCkgKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZEYXRhKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uVHlwZSAgICAgICAgID0gTFZQU0FfUEVSU0lTVEVOVF9EQVRBOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBSZWFkIGJhY2sgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KKyAgICAgICAgKnBNZW1vcnlUYWJsZSA9IHBMVlBTQV9JbnN0LT5NZW1vcnlUYWJsZTsKKyAgICB9CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYjlmYThmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaApAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgUFNBXzAxX0FSTUNfMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwNiAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxNDowMTo0NyArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX0xWUFNBX1BSSVZBVEVfSF8KKyNkZWZpbmUgX0xWUFNBX1BSSVZBVEVfSF8KKworI2luY2x1ZGUgIkxWUFNBLmgiCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiTFZQU0FfUVBELmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgQ09OU1RBTlQgREVGSU5JVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNZW1vcnkgKi8KKyNkZWZpbmUgTFZQU0FfSU5TVEFOQ0VfQUxJR04gICAgICAgICAgICAgNCAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIHN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfU0NSQVRDSF9BTElHTiAgICAgICAgICAgICAgNCAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfQ09FRl9BTElHTiAgICAgICAgICAgICAgICAgNCAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgd29yZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfREFUQV9BTElHTiAgICAgICAgICAgICAgICAgNCAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fSU5TVEFOQ0UgICAgICAgICAwICAgICAgLyogT2Zmc2V0IHRvIGluc3RhbmNlIG1lbW9yeSByZWdpb24gaW4gbWVtb3J5IHRhYmxlICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGICAxICAgICAgLyogT2Zmc2V0IHRvIHBlcnNpc3RlbnQgY29lZmZpY2llbnRzICBtZW1vcnkgcmVnaW9uIGluIG1lbW9yeSB0YWJsZSAqLworI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBICAyICAgICAgLyogT2Zmc2V0IHRvIHBlcnNpc3RlbnQgdGFwcyAgbWVtb3J5IHJlZ2lvbiBpbiBtZW1vcnkgdGFibGUgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fU0NSQVRDSCAgICAgICAgICAzICAgICAgLyogT2Zmc2V0IHRvIHNjcmF0Y2ggIG1lbW9yeSByZWdpb24gaW4gbWVtb3J5IHRhYmxlICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFICAgICAgICAgIDkgICAgICAvKiBGcm9tIDgwMDBIeiB0byA0ODAwMEh6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9TUEVFRCAgICAgICAgIDMgICAgICAvKiBMT1csIE1FRElVTSwgSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTFZQU0FfTUFYQlVGRkVSRFVSQVRJT04gICAgICAgICAgNDAwMCAgIC8qIE1heGltdW0gbGVuZ3RoIGluIG1zIG9mIHRoZSBsZXZlbHMgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTUFYSU5QVVRCTE9DS1NJWkUgICAgICAgICAgNTAwMCAgIC8qIE1heGltdW0gbGVuZ3RoIGluIG1vbm8gc2FtcGxlcyBvZiB0aGUgYmxvY2sgdG8gcHJvY2VzcyAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTkJBTkRTTUlOICAgICAgICAgICAgICAgICAgMSAgICAgIC8qIE1pbmltdW0gbnVtYmVyIG9mIGZyZXF1ZW5jeSBiYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTkJBTkRTTUFYICAgICAgICAgICAgICAgICAgMzAgICAgIC8qIE1heGltdW0gbnVtYmVyIG9mIGZyZXF1ZW5jeSBiYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTUFYQ0VOVEVSRlJFUSAgICAgICAgICAgICAgMjAwMDAgIC8qIE1heGltdW0gcG9zc2libGUgY2VudGVyIGZyZXF1ZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTUlOUE9TVEdBSU4gICAgICAgICAgICAgICAgLTE1ICAgIC8qIE1pbmltdW0gcG9zc2libGUgcG9zdCBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTUFYUE9TVEdBSU4gICAgICAgICAgICAgICAgMTUgICAgIC8qIE1heGltdW0gcG9zc2libGUgcG9zdCBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTUlOUUZBQ1RPUiAgICAgICAgICAgICAgICAgMjUgICAgIC8qIE1pbmltdW0gcG9zc2libGUgUSBmYWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTUFYUUZBQ1RPUiAgICAgICAgICAgICAgICAgMTIwMCAgIC8qIE1heGltdW0gcG9zc2libGUgUSBmYWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBMVlBTQV9NQVhMRVZFTERFQ0FZRkFDVE9SICAgICAgICAweDQxMTEgLyogRGVjYXkgZmFjdG9yIGZvciB0aGUgbWF4aW11bSB2YWx1ZXMgY2FsY3VsYXRpb24gICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NQVhMRVZFTERFQ0FZU0hJRlQgICAgICAgICAxNCAgICAgLyogRGVjYXkgc2hpZnQgZm9yIHRoZSBtYXhpbXVtIHZhbHVlcyBjYWxjdWxhdGlvbiAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIExWUFNBX01BWFVOU0lHTkVEQ0hBUiAgICAgICAgICAgIDB4RkYKKworI2RlZmluZSBMVlBTQV9Gc0ludmVydFNoaWZ0ICAgICAgICAgICAgICAzMQorI2RlZmluZSBMVlBTQV9HQUlOU0hJRlQgICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBMVlBTQV9GUkVRU0hJRlQgICAgICAgICAgICAgICAgICAyNQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgVFlQRVMgREVGSU5JVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWUgICAgICAgMHgwMDE0ICAgIC8qIDIwIG1zICg1MEh6KSBpbiBRMTYuMCAgICAgICovCisjZGVmaW5lIExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVJbnYgICAgMHgwNjY2ICAgIC8qIDEvMjBtcyBsZWZ0IHNoaWZ0ZWQgYnkgMTUgICovCisjZGVmaW5lIExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVTaGlmdCAgMTUKKworCisvKiBQcmVjaXNpb24gb2YgdGhlIGZpbHRlciAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZQU0FfU2ltcGxlUHJlY2lzaW9uRmlsdGVyLCAgICAvKiBTaW1wbGUgcHJlY2lzaW9uICovCisgICAgTFZQU0FfRG91YmxlUHJlY2lzaW9uRmlsdGVyICAgICAvKiBEb3VibGUgcHJlY2lzaW9uICovCit9IExWUFNBX0JQRmlsdGVyUHJlY2lzaW9uX2VuOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9DSEFSICAgICAgICAgICAgICAgICAgICBiQ29udHJvbFBlbmRpbmc7ICAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGluY2F0aW5nIGEgY2hhbmdlIG9mIHRoZSBjb250cm9sIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBuQmFuZHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmFuZHMgb2YgdGhlIHNwZWN0cnVtIGFuYWx5emVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBNYXhJbnB1dEJsb2NrU2l6ZTsgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIGlucHV0IGRhdGEgYnVmZmVyIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgIEN1cnJlbnRQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBwYXJhbWV0ZXJzIG9mIHRoZSBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgIE5ld1BhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldyBjb250cm9sIHBhcmFtZXRlcnMgZ2l2ZW4gYnkgdGhlIHVzZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfTWVtVGFiX3QgICAgICAgICAgICAgIE1lbW9yeVRhYmxlOworCisgICAgTFZQU0FfQlBGaWx0ZXJQcmVjaXNpb25fZW4gKnBCUEZpbHRlcnNQcmVjaXNpb247ICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBmaWx0ZXIgcHJlY2lzaW9uIGZvciBlYWNoIGJhbmQgICAgICAgICAgICAgICovCisgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAgKnBCUF9JbnN0YW5jZXM7ICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBiYW5kIHBhc3MgZmlsdGVyIGluc3RhbmNlIGZvciBlYWNoIGJhbmQgICAgICovCisgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgICAgKnBCUF9UYXBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBiYW5kIHBhc3MgZmlsdGVyIHRhcHMgZm9yIGVhY2ggYmFuZCAgICAgICAgICovCisgICAgUVBEX1N0YXRlX3QgICAgICAgICAgICAgICAgKnBRUERfU3RhdGVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBRUEQgZmlsdGVyIGluc3RhbmNlIGZvciBlYWNoIGJhbmQgICAgICAgICAgICovCisgICAgUVBEX1RhcHNfdCAgICAgICAgICAgICAgICAgKnBRUERfVGFwczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBRUEQgZmlsdGVyIHRhcHMgZm9yIGVhY2ggYmFuZCAgICAgICAgICAgICAgICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgKnBQb3N0R2FpbnM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBwb3N0LWZpbHRlciBnYWlucyBmb3IgZWFjaCBiYW5kICAgICAgICAgICAgICovCisKKyAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgICAgICAqcEZpbHRlcnNQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgLyogQ29weSBvZiB0aGUgZmlsdGVycyBwYXJhbWV0ZXJzIGZyb20gdGhlIGlucHV0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIG5TYW1wbGVzQnVmZmVyVXBkYXRlOyAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIG1ha2UgMjBtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudDsgICAgICAgICAgIC8qIENvdW50ZXIgdXNlZCB0byBrbm93IHdoZW4gdG8gcHV0IGEgbmV3IHZhbHVlIGluIHRoZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIG5SZWxldmFudEZpbHRlcnM7ICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiByZWxldmVudCBmaWx0ZXJzIGRlcGVuZGluZyBvbiBzYW1wbGluZyBmcmVxdWVuY3kgYW5kIGJhbmRzIGNlbnRlciBmcmVxdWVuY3kgICAgICAgICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIExvY2FsU2FtcGxlc0NvdW50OyAgICAgICAgICAgICAgICAgIC8qIENvdW50ZXIgdXNlZCB0byB1cGRhdGUgdGhlIFNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRG93blNhbXBsaW5nRmFjdG9yOyAgICAgICAgICAgICAgICAgLyogRG93biBzYW1wbGluZyBmYWN0b3IgZGVwZW5kaW5nIG9uIHRoZSBzYW1wbGluZyBmcmVxdWVuY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRG93blNhbXBsaW5nQ291bnQ7ICAgICAgICAgICAgICAgICAgLyogQ291bnRlciB1c2VkIGZvciB0aGUgZG93bnNhbXBsaW5nIGhhbmRsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBTcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbjsgICAgICAgICAvKiBMZW5ndGggb2YgdGhlIGJ1ZmZlciBpbiB0aW1lIChtcykgZGVmaW5lZCBieSB0aGUgYXBwbGljYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICAgICpwU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQ7ICAgICAgICAgICAvKiBTdGFydGluZyBhZGRyZXNzIG9mIHRoZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICAgICpwU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyOyAgICAvKiBDdXJyZW50IHBvc2l0aW9uIG9mIHRoZSB3cml0dGluZyBwb2ludGVyIG9mIHRoZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWUFNBX1RpbWUgICAgICAgICAgICAgICAgICBTcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWU7ICAgICAgICAvKiBBdWRpb1RpbWUgYXQgd2hpY2ggdGhlIGxhc3QgdmFsdWUgc2F2ZSBvY2N1cmVkIGluIHRoZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBTcGVjdHJhbERhdGFCdWZmZXJMZW5ndGg7ICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3BlY3RydW0gZGF0YSB2YWx1ZSB0aGF0IHRoZSBidWZmZXIgY2FuIGNvbnRhaW4gKHBlciBiYW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uLzIwbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgICAgKnBQcmV2aW91c1BlYWtzOyAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyB0byBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBwcmV2aW91cyBwZWFrIHZhbHVlIG9mIHRoZSBsZXZlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uLiBUaG9zZSB2YWx1ZXMgYXJlIGRlY3JlbWVudGVkIGFmdGVyIGVhY2ggY2FsbCB0byB0aGUgR2V0U3BlY3RydW0gZnVuY3Rpb24gICAgICAgICAgKi8KKworfUxWUFNBX0luc3RhbmNlUHJfdCwgKnBMVlBTQV9JbnN0YW5jZVByX3Q7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT05TIFBST1RPVFlQRQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0FwcGx5TmV3U2V0dGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZWluaXRpYWxpemUgc29tZSBwYXJhbWV0ZXJzIGFuZCBjaGFuZ2VzIGZpbHRlcnMnIGNvZWZmaWNpZW50cyBpZiAgICAgICAgICAgICAgICovCisvKiAgc29tZSBjb250cm9sIHBhcmFtZXRlcnMgaGF2ZSBjaGFuZ2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluc3QgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyAoTFZQU0FfSW5zdGFuY2VQcl90ICAgICAqcEluc3QpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX0xWUFNBX1BSSVZBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDg4YTc1MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFByb2plY3Q6OiAgIFBTQV8wMV9BUk1DXzAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDYgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTQ6MDE6NDcgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAgICAiTFZQU0EuaCIKKyNpbmNsdWRlICAgICJMVlBTQV9Qcml2YXRlLmgiCisjaW5jbHVkZSAgICAiTFZNX01hY3Jvcy5oIgorI2luY2x1ZGUgICAgIlZlY3RvckFyaXRobWV0aWMuaCIKKworI2RlZmluZSBMVk1fTUlOSU5UXzMyICAgMHg4MDAwMDAwMAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBwcm9jZXNzIGFwcGxpZXMgYmFuZCBwYXNzIGZpbHRlcnMgdG8gdGhlIHNpZ25hbC4gRWFjaCBvdXRwdXQgICAgICAgICAgICAgICAgKi8KKy8qICBmZWVkcyBhIHF1YXNpIHBlYWsgZmlsdGVyIGZvciBsZXZlbCBkZXRlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcExWUFNBX0lucHV0U2FtcGxlcyBQb2ludGVyIHRvIHRoZSBpbnB1dCBzYW1wbGVzIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIElucHV0QmxvY2tTaXplICAgICAgTnVtYmVyIG9mIG1vbm8gc2FtcGxlcyB0byBwcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBdWRpb1RpbWUgICAgICAgICAgIFBsYXliYWNrIHRpbWUgb2YgdGhlIGlucHV0IHNhbXBsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX1Byb2Nlc3MgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqcExWUFNBX0lucHV0U2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgIElucHV0QmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfVGltZSAgICAgICAgICAgQXVkaW9UaW1lICAgICAgICAgICAgKQorCit7CisgICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAqcExWUFNBX0luc3QgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBTY3JhdGNoOworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIGlpOworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEF1ZGlvVGltZUluYzsKKyAgICBleHRlcm4gTFZNX1VJTlQzMiAgICAgICBMVlBTQV9TYW1wbGVSYXRlSW52VGFiW107CisgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgKnBXcml0ZV9TYXZlOyAgICAgICAgIC8qIFBvc2l0aW9uIG9mIHRoZSB3cml0ZSBwb2ludGVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByb2Nlc3MgICovCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQ0hFQ0sgUEFSQU1FVEVSUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYoaEluc3RhbmNlID09IExWTV9OVUxMIHx8IHBMVlBTQV9JbnB1dFNhbXBsZXMgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIH0KKyAgICBpZihJbnB1dEJsb2NrU2l6ZSA9PSAwIHx8IElucHV0QmxvY2tTaXplID4gcExWUFNBX0luc3QtPk1heElucHV0QmxvY2tTaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7CisgICAgfQorCisgICAgcFNjcmF0Y2ggPSAoTFZNX0lOVDE2KilwTFZQU0FfSW5zdC0+TWVtb3J5VGFibGUuUmVnaW9uW0xWUFNBX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3M7CisgICAgcFdyaXRlX1NhdmUgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlcjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBBUFBMWSBORVcgU0VUVElOR1MgSUYgTkVFREVECisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAocExWUFNBX0luc3QtPmJDb250cm9sUGVuZGluZyA9PSBMVk1fVFJVRSkKKyAgICB7CisgICAgICAgIHBMVlBTQV9JbnN0LT5iQ29udHJvbFBlbmRpbmcgPSAwOworICAgICAgICBMVlBTQV9BcHBseU5ld1NldHRpbmdzKCBwTFZQU0FfSW5zdCk7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFBST0NFU1MgU0FNUExFUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogUHV0IHNhbXBsZXMgaW4gcmFuZ2UgWy0wLjU7MC41WyBmb3IgQlAgZmlsdGVycyAoc2VlIEJpcXVhZHMgZG9jdW1lbnRhdGlvbikgKi8KKyAgICBDb3B5XzE2KCBwTFZQU0FfSW5wdXRTYW1wbGVzLHBTY3JhdGNoLChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUpOworICAgIFNoaWZ0X1NhdF92MTZ4djE2KC0xLHBTY3JhdGNoLHBTY3JhdGNoLChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUpOworCisgICAgZm9yIChpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5SZWxldmFudEZpbHRlcnM7IGlpKyspCisgICAgeworICAgICAgICBzd2l0Y2gocExWUFNBX0luc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIExWUFNBX1NpbXBsZVByZWNpc2lvbkZpbHRlcjoKKyAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAgKCAmcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgSW5wdXRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTFZQU0FfRG91YmxlUHJlY2lzaW9uRmlsdGVyOgorICAgICAgICAgICAgICAgIEJQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxICAoICZwTFZQU0FfSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2ggKyBJbnB1dEJsb2NrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworCisgICAgICAgIExWUFNBX1FQRF9Qcm9jZXNzICAgKCBwTFZQU0FfSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgSW5wdXRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWkpOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBVUERBVEUgU3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyICE9IHBXcml0ZV9TYXZlKQorICAgIHsKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIoKEF1ZGlvVGltZSArIChMVk1fSU5UMzIpKChMVk1fSU5UMzIpcExWUFNBX0luc3QtPkxvY2FsU2FtcGxlc0NvdW50KjEwMDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpTFZQU0FfU2FtcGxlUmF0ZUludlRhYltwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5Gc10sCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RpbWVJbmMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Gc0ludmVydFNoaWZ0KQorICAgICAgICBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lID0gQXVkaW9UaW1lICsgQXVkaW9UaW1lSW5jOworICAgIH0KKworICAgIHJldHVybihMVlBTQV9PSyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9HZXRTcGVjdHJ1bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgR2V0cyB0aGUgbGV2ZWxzIHZhbHVlcyBhdCBhIGNlcnRhaW4gcG9pbnQgaW4gdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBHZXRTcGVjdHJ1bUF1ZGlvVGltZSBSZXRyaWV2ZSB0aGUgdmFsdWVzIGF0IHRoaXMgdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEN1cnJlbnRWYWx1ZXMgICAgICAgUG9pbnRlciB0byBhIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbiBsZXZlbHMnIHZhbHVlcyAgICAgICAqLworLyogIHBNYXhWYWx1ZXMgICAgICAgICAgIFBvaW50ZXIgdG8gYSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gbWF4IGxldmVscycgdmFsdWVzICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfR2V0U3BlY3RydW0gICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9UaW1lICAgICAgICAgICBHZXRTcGVjdHJ1bUF1ZGlvVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgKnBDdXJyZW50VmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAqcFBlYWtWYWx1ZXMgICAgICAgICAgICkKKworeworCisgICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgKnBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIFN0YXR1c0RlbHRhLCBpaTsKKyAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAqcFJlYWQ7CisKKyAgICBpZihoSW5zdGFuY2UgPT0gTFZNX05VTEwgfHwgcEN1cnJlbnRWYWx1ZXMgPT0gTFZNX05VTEwgfHwgcFBlYWtWYWx1ZXMgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIH0KKworCisgICAgLyogRmlyc3QgZmluZCB0aGUgcGxhY2Ugd2hlcmUgdG8gbG9vayBpbiB0aGUgc3RhdHVzIGJ1ZmZlciAqLworICAgIGlmKEdldFNwZWN0cnVtQXVkaW9UaW1lIDw9IHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUpCisgICAgeworICAgICAgICBNVUwzMngzMklOVE8zMigocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSAtIEdldFNwZWN0cnVtQXVkaW9UaW1lKSxMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lSW52LFN0YXR1c0RlbHRhLExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVTaGlmdCk7CisgICAgICAgIGlmKChTdGF0dXNEZWx0YSAqIExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWUpICE9IChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lIC0gR2V0U3BlY3RydW1BdWRpb1RpbWUpKQorICAgICAgICB7CisgICAgICAgICAgICBTdGF0dXNEZWx0YSArPSAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFRoaXMgcGFydCBoYW5kbGVzIHRoZSB3cmFwIGFyb3VuZCAqLworICAgICAgICBNVUwzMngzMklOVE8zMigoKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUgLSAoTFZNX0lOVDMyKUxWTV9NSU5JTlRfMzIpICsgKChMVk1fSU5UMzIpTFZNX01BWElOVF8zMiAtIEdldFNwZWN0cnVtQXVkaW9UaW1lKSksTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZUludixTdGF0dXNEZWx0YSxMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lU2hpZnQpCisgICAgICAgIGlmKCgoTFZNX0lOVDMyKShTdGF0dXNEZWx0YSAqIExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWUpKSAhPSAoKExWTV9JTlQzMikoKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUgLSAoTFZNX0lOVDMyKUxWTV9NSU5JTlRfMzIpICsgKChMVk1fSU5UMzIpTFZNX01BWElOVF8zMiAtIEdldFNwZWN0cnVtQXVkaW9UaW1lKSkpKQorICAgICAgICB7CisgICAgICAgICAgICBTdGF0dXNEZWx0YSArPSAxOworICAgICAgICB9CisgICAgfQorICAgIC8qIENoZWNrIHdoZXRoZXIgdGhlIGRlc2lyZWQgbGV2ZWwgaXMgbm90IHRvbyAib2xkIiAoc2VlIDIuMTAgaW4gTFZQU0FfRGVzaWduTm90ZXMuZG9jKSovCisgICAgaWYoCisgICAgICAgICgoR2V0U3BlY3RydW1BdWRpb1RpbWUgPCBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lKSYmCisgICAgICAgICAoKEdldFNwZWN0cnVtQXVkaW9UaW1lPDApJiYocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZT4wKSkmJgorICAgICAgICAgKCgoTFZNX0lOVDMyKSgtR2V0U3BlY3RydW1BdWRpb1RpbWUgKyBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lKSk+TFZNX01BWElOVF8zMikpfHwKKworICAgICAgICAgKChHZXRTcGVjdHJ1bUF1ZGlvVGltZSA+IHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUpJiYKKyAgICAgICAgICgoKEdldFNwZWN0cnVtQXVkaW9UaW1lPj0wKSYmKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWU+PTApKXx8CisgICAgICAgICAgKChHZXRTcGVjdHJ1bUF1ZGlvVGltZTw9MCkmJihwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lPD0wKSl8fAorICAgICAgICAgKCgoR2V0U3BlY3RydW1BdWRpb1RpbWU+PTApJiYocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZTw9MCkpJiYKKyAgICAgICAgICgoKExWTV9JTlQzMikoR2V0U3BlY3RydW1BdWRpb1RpbWUgLSBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lKSk8TFZNX01BWElOVF8zMikpKSl8fAorCisgICAgICAgIChTdGF0dXNEZWx0YSA+IChMVk1fSU5UMzIpcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCkgfHwKKyAgICAgICAgKCFTdGF0dXNEZWx0YSkpCisgICAgeworICAgICAgICBmb3IoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uQmFuZHM7IGlpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBDdXJyZW50VmFsdWVzW2lpXSAgPSAwOworICAgICAgICAgICAgcFBlYWtWYWx1ZXNbaWldICAgICAgPSAwOworICAgICAgICB9CisgICAgICAgIHJldHVybihMVlBTQV9PSyk7CisgICAgfQorICAgIC8qIFNldCB0aGUgcmVhZGluZyBwb2ludGVyICovCisgICAgaWYoKExWTV9JTlQzMikoU3RhdHVzRGVsdGEgKiBwTFZQU0FfSW5zdC0+bkJhbmRzKSA+IChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAtIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQpKQorICAgIHsKKyAgICAgICAgcFJlYWQgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciArIChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoIC0gKExWTV9VSU5UMzIpU3RhdHVzRGVsdGEpICogcExWUFNBX0luc3QtPm5CYW5kczsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcFJlYWQgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAgLSBTdGF0dXNEZWx0YSAqIHBMVlBTQV9JbnN0LT5uQmFuZHM7CisgICAgfQorCisKKyAgICAvKiBSZWFkIHRoZSBzdGF0dXMgYnVmZmVyIGFuZCBmaWxsIHRoZSBvdXRwdXQgYnVmZmVycyAqLworICAgIGZvcihpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5CYW5kczsgaWkrKykKKyAgICB7CisgICAgICAgIHBDdXJyZW50VmFsdWVzW2lpXSA9IHBSZWFkW2lpXTsKKyAgICAgICAgaWYocExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzW2lpXSA8PSBwUmVhZFtpaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV0gPSBwUmVhZFtpaV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3NbaWldICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIExWTV9JTlQzMiB0ZW1wOworICAgICAgICAgICAgLypSZS1jb21wdXRlIG1heCB2YWx1ZXMgZm9yIGRlY2F5ICovCisgICAgICAgICAgICB0ZW1wID0gKExWTV9JTlQzMikoTFZQU0FfTUFYVU5TSUdORURDSEFSIC0gcExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzW2lpXSk7CisgICAgICAgICAgICB0ZW1wID0gKCh0ZW1wICogTFZQU0FfTUFYTEVWRUxERUNBWUZBQ1RPUik+PkxWUFNBX01BWExFVkVMREVDQVlTSElGVCk7CisgICAgICAgICAgICAvKiBJZiB0aGUgZ2FpbiBoYXMgbm8gZWZmZWN0LCAiaGVscCIgdGhlIHZhbHVlIHRvIGluY3JlYXNlICovCisgICAgICAgICAgICBpZih0ZW1wID09IChMVlBTQV9NQVhVTlNJR05FRENIQVIgLSBwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3NbaWldKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBTYXR1cmF0ZSAqLworICAgICAgICAgICAgdGVtcCA9ICh0ZW1wID4gTFZQU0FfTUFYVU5TSUdORURDSEFSKSA/IExWUFNBX01BWFVOU0lHTkVEQ0hBUiA6IHRlbXA7CisgICAgICAgICAgICAvKiBTdG9yZSBuZXcgbWF4IGxldmVsICovCisgICAgICAgICAgICBwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3NbaWldID0gIChMVk1fVUlOVDgpKExWUFNBX01BWFVOU0lHTkVEQ0hBUiAtIHRlbXApOworICAgICAgICB9CisKKyAgICAgICAgcFBlYWtWYWx1ZXNbaWldID0gcExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzW2lpXTsKKyAgICB9CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRC5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY0MTM1N2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBELmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgUFNBXzAxX0FSTUNfMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwNiAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxNDowMTo0NyArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX0xWUFNBX1FQRF9IXworI2RlZmluZSBfTFZQU0FfUVBEX0hfCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERlbGF5OyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZWZzWzJdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9UVBEX1N0YXRlX3QsICpwUVBEX1N0YXRlX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDMyIEtQOyAgICAvKnNob3VsZCBzdG9yZSBhMCovCisgICAgTFZNX0lOVDMyIEtNOyAgICAvKnNob3VsZCBzdG9yZSBiMiovCisKK30gUVBEX0MzMl9Db2VmcywgKlBRUERfQzMyX0NvZWZzOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQzMiBTdG9yYWdlWzFdOworCit9IFFQRF9UYXBzX3QsICpwUVBEX1RhcHNfdDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9RUERfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQXBwbHkgZG93bnNhbXBsaW5nLCBwb3N0IGdhaW4sIHF1YXNpIHBlYWsgZmlsdGVyaW5nIGFuZCB3cml0ZSB0aGUgbGV2ZWxzIHZhbHVlcyAqLworLyogIGluIHRoZSBidWZmZXIgZXZlcnkgMjAgbXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZQU0FfUVBEX1Byb2Nlc3MgKCAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJblNhbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmRJbmRleCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluaXRpYWxpemUgYSBxdWFzaSBwZWFrIGZpbHRlciBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcFRhcHMgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXIncyB0YXBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBDb2VmICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZmlsdGVyJ3MgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZQU0FfUVBEX0luaXQgKCAgIFFQRF9TdGF0ZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBRUERfVGFwc190ICAgICAgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICBRUERfQzMyX0NvZWZzICAgICAqcENvZWYgICAgICk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzdhYmU0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFByb2plY3Q6OiAgIFBTQV8wMV9BUk1DXzAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkKi8KKy8qICAgICAkUmV2aXNpb246IDEwMDYgJCovCisvKiAgICAgJERhdGU6IDIwMTAtMDYtMjggMTQ6MDE6NDcgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiTFZQU0FfUVBELmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluaXRpYWxpemUgYSBxdWFzaSBwZWFrIGZpbHRlciBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBRUERfU3RhdGUgICAgICAgICAgUG9pbnRlciB0byB0aGUgZmlsdGVyIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcFRhcHMgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXIncyB0YXBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBDb2VmICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZmlsdGVyJ3MgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZQU0FfUVBEX0luaXQgKCAgIHBRUERfU3RhdGVfdCAgICAgICBwUVBEX1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgUVBEX1RhcHNfdCAgICAgICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgUVBEX0MzMl9Db2VmcyAgICAgKnBDb2VmICAgICApCit7CisgICAgcFFQRF9TdGF0ZS0+cERlbGF5ICA9IHBUYXBzLT5TdG9yYWdlOworICAgIHBRUERfU3RhdGUtPkNvZWZzWzBdICA9IHBDb2VmLT5LUDsKKyAgICBwUVBEX1N0YXRlLT5Db2Vmc1sxXSAgPSBwQ29lZi0+S007Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcwODc0NzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX1Byb2Nlc3MuYwpAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUHJvamVjdDo6ICAgUFNBXzAxX0FSTUNfMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICRBdXRob3I6IGJlcTA3NzE2ICQqLworLyogICAgICRSZXZpc2lvbjogMTAwNiAkKi8KKy8qICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxNDowMTo0NyArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJMVlBTQV9RUEQuaCIKKyNpbmNsdWRlICJMVlBTQV9Qcml2YXRlLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX1dyaXRlUGVhayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdyaXRlIGEgbGV2ZWwgdmFsdWUgaW4gdGhlIGJ1ZmZlciBpbiB0aGUgY29ycmVzcG9uZGluZyBiYW5kLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0ICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgTFZQU0EgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwcFdyaXRlICAgICAgICAgICAgIFBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ2FsbE51bWJlciAgICAgICAgICBOdW1iZXIgb2YgdGhlIGJhbmQgdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuIGluICAgICAgICAgICAqLworLyogIFZhbHVlICAgICAgICAgICAgICAgVmFsdWUgdG8gd3JpdGUgaW4gdGhlIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIExWUFNBX1FQRF9Xcml0ZVBlYWsoICAgcExWUFNBX0luc3RhbmNlUHJfdCAgICAgICBwTFZQU0FfSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgKipwcFdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJhbmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBWYWx1ZSAgICk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1FQRF9Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBcHBseSBkb3duc2FtcGxpbmcsIHBvc3QgZ2FpbiwgcXVhc2kgcGVhayBmaWx0ZXJpbmcgYW5kIHdyaXRlIHRoZSBsZXZlbHMgdmFsdWVzICovCisvKiAgaW4gdGhlIGJ1ZmZlciBldmVyeSAyMCBtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVlBTQV9RUERfUHJvY2VzcyAoICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAqcEluU2FtcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFuZEluZGV4KQoreworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFBBUkFNRVRFUlMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgKnBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOworICAgIFFQRF9TdGF0ZV90ICpwUVBEU3RhdGUgPSAgKFFQRF9TdGF0ZV90KikmcExWUFNBX0luc3QtPnBRUERfU3RhdGVzW0JhbmRJbmRleF07CisKKyAgICAvKiBQb2ludGVyIHRvIHRhcHMgKi8KKyAgICBMVk1fSU5UMzIqIHBEZWxheSAgPSBwUVBEU3RhdGUtPnBEZWxheTsKKworICAgIC8qIFBhcmFtZXRlcnMgbmVlZGVkIGR1cmluZyBxdWFzaSBwZWFrIGNhbGN1bGF0aW9ucyAqLworICAgIExWTV9JTlQzMiAgIFgwOworICAgIExWTV9JTlQzMiAgIHRlbXAsdGVtcDI7CisgICAgTFZNX0lOVDMyICAgYWNjdTsKKyAgICBMVk1fSU5UMTYgICBYZzA7CisgICAgTFZNX0lOVDE2ICAgRDA7CisgICAgTFZNX0lOVDE2ICAgVjAgPSAoTFZNX0lOVDE2KSgqcERlbGF5KTsKKworICAgIC8qIEZpbHRlcidzIGNvZWYgKi8KKyAgICBMVk1fSU5UMzIgICBLcCA9IHBRUERTdGF0ZS0+Q29lZnNbMF07CisgICAgTFZNX0lOVDMyICAgS20gPSBwUVBEU3RhdGUtPkNvZWZzWzFdOworCisgICAgTFZNX0lOVDE2ICAgaWkgPSBudW1TYW1wbGVzOworCisgICAgTFZNX1VJTlQ4ICAqcFdyaXRlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXI7CisgICAgTFZNX0lOVDMyICAgQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50ID0gcExWUFNBX0luc3QtPkJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudDsKKyAgICBMVk1fVUlOVDE2ICBEb3duU2FtcGxpbmdGYWN0b3IgPSBwTFZQU0FfSW5zdC0+RG93blNhbXBsaW5nRmFjdG9yOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIElOSVRJQUxJWkFUSU9OCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBDb3JyZWN0IHRoZSBwb2ludGVyIHRvIHRha2UgdGhlIGZpcnN0IGRvd24gc2FtcGxlZCBzaWduYWwgc2FtcGxlICovCisgICAgcEluU2FtcHMgKz0gcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0NvdW50OworICAgIC8qIENvcnJlY3QgYWxzbyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgKi8KKyAgICBpaSA9IChMVk1fSU5UMTYpKGlpIC0gKExWTV9JTlQxNilwTFZQU0FfSW5zdC0+RG93blNhbXBsaW5nQ291bnQpOworCisgICAgd2hpbGUgKGlpID4gMCkKKyAgICB7CisgICAgICAgIC8qIEFwcGx5IHBvc3QgZ2FpbiAqLworICAgICAgICBYMCA9ICgoKnBJblNhbXBzKSAqIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zW0JhbmRJbmRleF0pID4+IChMVlBTQV9HQUlOU0hJRlQtMSk7IC8qIC0gMSB0byBjb21wZW5zYXRlIHNjYWxpbmcgaW4gcHJvY2VzcyBmdW5jdGlvbiovCisgICAgICAgIHBJblNhbXBzID0gcEluU2FtcHMgKyBEb3duU2FtcGxpbmdGYWN0b3I7CisKKyAgICAgICAgLyogU2F0dXJhdGUgYW5kIHRha2UgYWJzb2x1dGUgdmFsdWUgKi8KKyAgICAgICAgaWYoWDAgPCAwKQorICAgICAgICAgICAgWDAgPSAtWDA7CisgICAgICAgIGlmIChYMCA+IDB4N0ZGRikKKyAgICAgICAgICAgIFhnMCA9IDB4N0ZGRjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgWGcwID0gKExWTV9JTlQxNikoWDApOworCisKKyAgICAgICAgLyogUXVhc2kgcGVhayBmaWx0ZXIgY2FsY3VsYXRpb24gKi8KKyAgICAgICAgRDAgID0gKExWTV9JTlQxNikoWGcwIC0gVjApOworCisgICAgICAgIHRlbXAyID0gKExWTV9JTlQzMilEMDsKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIodGVtcDIsS3AsYWNjdSwzMSk7CisKKyAgICAgICAgRDAgICAgPSAoTFZNX0lOVDE2KShEMD4+MSk7CisgICAgICAgIGlmIChEMCA8IDApeworICAgICAgICAgICAgRDAgPSAoTFZNX0lOVDE2KSgtRDApOworICAgICAgICB9CisKKyAgICAgICAgdGVtcDIgPSAoTFZNX0lOVDMyKUQwOworICAgICAgICBNVUwzMngzMklOVE8zMigoTFZNX0lOVDMyKUQwLEttLHRlbXAsMzEpOworICAgICAgICBhY2N1ICs9dGVtcCArIFhnMDsKKworICAgICAgICBpZiAoYWNjdSA+IDB4N0ZGRikKKyAgICAgICAgICAgIGFjY3UgPSAweDdGRkY7CisgICAgICAgIGVsc2UgaWYoYWNjdSA8IDApCisgICAgICAgICAgICBhY2N1ID0gMHgwMDAwOworCisgICAgICAgIFYwID0gKExWTV9JTlQxNilhY2N1OworCisgICAgICAgIGlmKCgocExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlIC0gQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50KSA8IERvd25TYW1wbGluZ0ZhY3RvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIExWUFNBX1FQRF9Xcml0ZVBlYWsoIHBMVlBTQV9JbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjApOworICAgICAgICAgICAgQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50IC09IHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZTsKKyAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5Mb2NhbFNhbXBsZXNDb3VudCA9IChMVk1fVUlOVDE2KShudW1TYW1wbGVzIC0gaWkpOworICAgICAgICB9CisgICAgICAgIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCs9RG93blNhbXBsaW5nRmFjdG9yOworCisgICAgICAgIGlpID0gKExWTV9JTlQxNikoaWktRG93blNhbXBsaW5nRmFjdG9yKTsKKworICAgIH0KKworICAgIC8qIFN0b3JlIGxhc3QgdGFwcyBpbiBtZW1vcnkgKi8KKyAgICAqcERlbGF5ID0gKExWTV9JTlQzMikoVjApOworCisgICAgLyogSWYgdGhpcyBpcyB0aGUgbGFzdCBjYWxsIHRvIHRoZSBmdW5jdGlvbiBhZnRlciBsYXN0IGJhbmQgcHJvY2Vzc2luZywKKyAgICAgICB1cGRhdGUgdGhlIHBhcmFtZXRlcnMuICovCisgICAgaWYoQmFuZEluZGV4ID09IChwTFZQU0FfSW5zdC0+blJlbGV2YW50RmlsdGVycy0xKSkKKyAgICB7CisgICAgICAgIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyID0gcFdyaXRlOworICAgICAgICAvKiBBZGp1c3RtZW50IGZvciAxMTAyNUh6IGlucHV0LCAyMjAsNSBpcyBub3JtYWxseQorICAgICAgICAgICB0aGUgZXhhY3QgbnVtYmVyIG9mIHNhbXBsZXMgZm9yIDIwbXMuKi8KKyAgICAgICAgaWYoKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyICE9IHBXcml0ZSkmJihwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5GcyA9PSBMVk1fRlNfMTEwMjUpKQorICAgICAgICB7CisgICAgICAgICAgICBpZihwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgPT0gMjIwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSA9IDIyMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgPSAyMjA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgPSBwV3JpdGU7CisgICAgICAgIHBMVlBTQV9JbnN0LT5CdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQgPSBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQ7CisgICAgICAgIHBMVlBTQV9JbnN0LT5Eb3duU2FtcGxpbmdDb3VudCA9IChMVk1fVUlOVDE2KSgtaWkpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9RUERfV3JpdGVQZWFrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV3JpdGUgYSBsZXZlbCB2YWx1ZSBpbiB0aGUgc3BlY3RydW0gZGF0YSBidWZmZXIgaW4gdGhlIGNvcnJlc3BvbmRpbmcgYmFuZC4gICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcExWUFNBX0luc3QgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBMVlBTQSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBwV3JpdGUgICAgICAgICAgICAgUG9pbnRlciB0byBwb2ludGVyIHRvIHRoZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDYWxsTnVtYmVyICAgICAgICAgIE51bWJlciBvZiB0aGUgYmFuZCB0aGUgdmFsdWUgc2hvdWxkIGJlIHdyaXR0ZW4gaW4gICAgICAgICAgICovCisvKiAgVmFsdWUgICAgICAgICAgICAgICBWYWx1ZSB0byB3cml0ZSBpbiB0aGUgc3BlY3RydW0gZGF0YSBidWZmZXIgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZQU0FfUVBEX1dyaXRlUGVhayggICBwTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgIHBMVlBTQV9JbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAqKnBwV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQmFuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFZhbHVlICAgKQoreworICAgIExWTV9VSU5UOCAqcFdyaXRlID0gKnBwV3JpdGU7CisKKworICAgIC8qIFdyaXRlIHRoZSB2YWx1ZSBhbmQgdXBkYXRlIHRoZSB3cml0ZSBwb2ludGVyICovCisgICAgKihwV3JpdGUgKyBCYW5kSW5kZXgpID0gKExWTV9VSU5UOCkoVmFsdWU+PjcpOworICAgIHBXcml0ZSArPSBwTFZQU0FfSW5zdC0+bkJhbmRzOworICAgIGlmIChwV3JpdGUgPT0gKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQgKyBwTFZQU0FfSW5zdC0+bkJhbmRzICogcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCkpCisgICAgeworICAgICAgICBwV3JpdGUgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0OworICAgIH0KKworICAgICpwcFdyaXRlID0gcFdyaXRlOworCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNGEzNWM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jCkBAIC0wLDAgKzEsMjUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQcm9qZWN0OjogICBQU0FfMDFfQVJNQ18wMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJEF1dGhvcjogYmVxMDc3MTYgJCovCisvKiAgICAgJFJldmlzaW9uOiAxMDA2ICQqLworLyogICAgICREYXRlOiAyMDEwLTA2LTI4IDE0OjAxOjQ3ICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZQU0EuaCIKKyNpbmNsdWRlICJMVlBTQV9RUEQuaCIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNhbXBsZSByYXRlIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogU2FtcGxlIHJhdGUgdGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgYWN0dWFsCisgKiBmcmVxdWVuY3kKKyAqLworY29uc3QgTFZNX1VJTlQxNiAgICBMVlBTQV9TYW1wbGVSYXRlVGFiW10gPSB7ICAgODAwMCwgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMH07ICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNhbXBsZSByYXRlIGludmVyc2UgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogU2FtcGxlIHJhdGUgdGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgYWN0dWFsCisgKiBmcmVxdWVuY3kKKyAqLworY29uc3QgTFZNX1VJTlQzMiAgICBMVlBTQV9TYW1wbGVSYXRlSW52VGFiW10gPSB7ICAgIDI2ODQzNSwgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5NDc4MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzg5NTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM0MjE4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk3MzkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg5NDc4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY3MTA5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4Njk2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0NzM5fTsgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE51bWJlciBvZiBzYW1wbGVzIGluIDIwbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMKKyAqIGR1cmluZyAyMG1zCisgKi8KK2NvbnN0IExWTV9VSU5UMTYgICAgTFZQU0FfblNhbXBsZXNCdWZmZXJVcGRhdGVbXSAgPSB7ICAgMTYwLCAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjB9OyAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRG93biBzYW1wbGluZyBmYWN0b3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUYWJsZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIHRoZSBlbnVtZXJhdGVkIHR5cGUgYW5kIHRoZSBkb3duIHNhbXBsaW5nIGZhY3RvcgorICovCitjb25zdCBMVk1fVUlOVDE2ICAgIExWUFNBX0Rvd25TYW1wbGluZ0ZhY3RvcltdICA9IHsgICAgIDUsICAgICAgICAgICAgICAgICAgICAvKiA4MDAwICBTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsICAgICAgICAgICAgICAgICAgICAvKiAxMTAyNSBTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAvKiAxMjAwMCBTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAvKiAxNjAwMCBTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LCAgICAgICAgICAgICAgICAgICAvKiAyMjA1MCBTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCAgICAgICAgICAgICAgICAgICAvKiAyNDAwMCBTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxLCAgICAgICAgICAgICAgICAgICAvKiAzMjAwMCBTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLCAgICAgICAgICAgICAgICAgICAvKiA0NDEwMCBTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyfTsgICAgICAgICAgICAgICAgICAvKiA0ODAwMCBTL3MgICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29lZmZpY2llbnQgY2FsY3VsYXRpb24gdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUYWJsZSBmb3IgMiAqIFBpIC8gRnMKKyAqLworY29uc3QgTFZNX0lOVDE2ICAgICBMVlBTQV9Ud29QaU9uRnNUYWJsZVtdID0geyAgMjYzNTQsICAgICAgLyogOGtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MTIzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc1NjksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzE3NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NTYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3ODUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU4OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NzgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzOTJ9OyAgICAvKiA0OGtTL3MgKi8KKworLyoKKyAqIEdhaW4gdGFibGUKKyAqLworY29uc3QgTFZNX0lOVDE2ICAgICBMVlBTQV9HYWluVGFibGVbXSA9IHsgICAzNjQsICAgICAgICAgIC8qIC0xNWRCIGdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTc3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExNTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NDksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNDgsICAgICAgICAgLyogMGRCIGdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjI5NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU3OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjg5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI0NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzY0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDU4NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE0NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTc3MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQ3NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzI2NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODE1MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTE0OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExNTc2fTsgICAgICAgIC8qICsxNWRCIGdhaW4gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29zb25lIHBvbHlub21pYWwgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb2VmZmljaWVudHMgZm9yIGNhbGN1bGF0aW5nIHRoZSBjb3NpbmUgd2l0aCB0aGUgZXF1YXRpb246CisgKgorICogIENvcyh4KSA9ICgyXlNoaWZ0cykqKGEwICsgYTEqeCArIGEyKnheMiArIGEzKnheMyArIGE0KnheNCArIGE1KnheNSkKKyAqCisgKiBUaGVzZSBjb2VmZmljaWVudHMgZXhwZWN0IHRoZSBpbnB1dCwgeCwgdG8gYmUgaW4gdGhlIHJhbmdlIDAgdG8gMzI3NjggcmVzcHJlc2VudGluZworICogYSByYW5nZSBvZiAwIHRvIFBpLiBUaGUgb3V0cHV0IGlzIGluIHRoZSByYW5nZSAzMjc2NyB0byAtMzI3NjggcmVwcmVzZW50aW5nIHRoZSByYW5nZQorICogKzEuMCB0byAtMS4wCisgKi8KK2NvbnN0IExWTV9JTlQxNiAgICAgTFZQU0FfQ29zQ29lZltdID0geyAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hpZnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5NiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEwICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTM2LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGExICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE5NzI1LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTI2NzEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjM3MzAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGE0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTk0OTB9OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGE1ICovCisKKy8qCisgKiBDb2VmZmljaWVudHMgZm9yIGNhbGN1bGF0aW5nIHRoZSBjb3NpbmUgZXJyb3Igd2l0aCB0aGUgZXF1YXRpb246CisgKgorICogIENvc0Vycih4KSA9ICgyXlNoaWZ0cykqKGEwICsgYTEqeCArIGEyKnheMiArIGEzKnheMykKKyAqCisgKiBUaGVzZSBjb2VmZmljaWVudHMgZXhwZWN0IHRoZSBpbnB1dCwgeCwgdG8gYmUgaW4gdGhlIHJhbmdlIDAgdG8gMzI3NjggcmVzcHJlc2VudGluZworICogYSByYW5nZSBvZiAwIHRvIFBpLzI1LiBUaGUgb3V0cHV0IGlzIGluIHRoZSByYW5nZSAwIHRvIDMyNzY3IHJlcHJlc2VudGluZyB0aGUgcmFuZ2UKKyAqIDAuMCB0byAwLjAwNzg4NTI5ODYKKyAqCisgKiBUaGlzIGlzIHVzZWQgdG8gZ2l2ZSBhIGRvdWJsZSBwcmVjaXNpb24gY29zaW5lIG92ZXIgdGhlIHJhbmdlIDAgdG8gUGkvMjUgdXNpbmcgdGhlCisgKiB0aGUgZXF1YXRpb246CisgKgorICogQ29zKHgpID0gMS4wIC0gQ29zRXJyKHgpCisgKi8KK2NvbnN0IExWTV9JTlQxNiAgICAgTFZQU0FfRFBDb3NDb2VmW10gPSB7ICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGExICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2NTg2LCAgICAgICAgICAgICAgICAgICAgICAgLyogYTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTQ0fTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBRdWFzaSBwZWFrIGZpbHRlciBjb2VmZmljaWVudHMgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NvbnN0IFFQRF9DMzJfQ29lZnMgICAgIExWUFNBX1FQRF9Db2Vmc1tdID0geworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDgwQ0VGRDJCLDB4MDBDQjlCMTd9LCAgLyogOGtTL3MgICovICAgIC8qIExWUFNBX1NQRUVEX0xPVyAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDgwRDI0MkU3LDB4MDBDRUQxMUR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4MERDQkFGNSwweDAwRDkxNjc5fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODBDRUZEMkIsMHgwMENCOUIxN30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDgwRTEzNzM5LDB4MDBERDdDRDN9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4MERDQkFGNSwweDAwRDkxNjc5fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODBEOTRCQUYsMHgwMEQ1QjdFN30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDgwRTEzNzM5LDB4MDBERDdDRDN9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4MERDQkFGNSwweDAwRDkxNjc5fSwgIC8qIDQ4a1MvcyAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDg1ODc1MTNELDB4MDU1QzIyQ0Z9LCAgLyogOGtTL3MgICovICAgIC8qIExWUFNBX1NQRUVEX01FRElVTSAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDg1OUQyOTY3LDB4MDU3MEYwMDd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4NUUyRUZBQywweDA1QjM0RDc5fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODU4NzUxM0QsMHgwNTVDMjJDRn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDg2MDBDN0I5LDB4MDVDRkE2Q0Z9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4NUUyRUZBQywweDA1QjM0RDc5fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODVDQzEwMTgsMHgwNTlEOEY2OX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDg2MDBDN0I5LDB4MDVDRkE2Q0Z9LC8vezB4ODYwMEM3QjksMHgwNUNGQTZDRn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDg1RTJFRkFDLDB4MDVCMzRENzl9LCAgLyogNDhrUy9zICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4QTExNUVBN0EsMHgxQ0RCM0Y1Q30sICAvKiA4a1MvcyAgKi8gICAvKiBMVlBTQV9TUEVFRF9ISUdIICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4QTE4NDc1RjAsMHgxRDJDODNBMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweEEyRTFFOTUwLDB4MUUyQTUzMkV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHhBMTE1RUE3QSwweDFDREIzRjVDfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4QTM3NUIyQzYsMHgxRTk0M0JCQ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweEEyRTFFOTUwLDB4MUUyQTUzMkV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHhBMjZGRjZCRCwweDFERDgxNTMwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4QTM3NUIyQzYsMHgxRTk0M0JCQ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweEEyRTFFOTUwLDB4MUUyQTUzMkV9fTsgLyogNDhrUy9zICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWFiNDVjYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oCkBAIC0wLDAgKzEsMzk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDAxICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MjM6MDIgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSGVhZGVyIGZpbGUgZm9yIHRoZSBhcHBsaWNhdGlvbiBsYXllciBpbnRlcmZhY2Ugb2YgQ29uY2VydCBTb3VuZCBhbmQgQ29uY2VydCAgICAgICAgKi8KKy8qICBTb3VuZCBFWC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlcyBpbmNsdWRlcyBhbGwgZGVmaW5pdGlvbnMsIHR5cGVzLCBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KKy8qICBwcm90b3R5cGVzIHJlcXVpcmVkIGJ5IHRoZSBjYWxsaW5nIGxheWVyLiBBbGwgb3RoZXIgdHlwZXMsIHN0cnVjdHVyZXMgYW5kICAgICAgICAgICAqLworLyogIGZ1bmN0aW9ucyBhcmUgcHJpdmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTm90ZTogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICA9PT09PT09ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBhbGdvcml0aG0gY2FuIGV4ZWN1dGUgZWl0aGVyIHdpdGggc2VwYXJhdGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG9yIHdpdGggICAgICovCisvKiAgYSBjb21tb24gYnVmZmVyLCBpLmUuIHRoZSBkYXRhIGlzIHByb2Nlc3NlZCBpbi1wbGFjZS4gSWYgdGhlIGJ1ZmZlcnMgYXJlIHRoZSAgICAgICAgKi8KKy8qICBzYW1lIHRoZW4gdGhlIE1JUHMgd2lsbCBiZSBzbGlnaHRseSBoaWdoZXIgYW5kIGFuIGV4dHJhIHN0ZXJlbyBzY3JhdGNoIGJ1ZmZlciBpcyAgICAqLworLyogIHJlcXVpcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTm90ZTogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICA9PT09PT09ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFR3byBkYXRhIGZvcm1hdHMgYXJlIHN1cHBvcnQgU3RlcmVvIGFuZCBNb25vLUluLVN0ZXJlby4gVGhlIGRhdGEgaXMgaW50ZXJsZWF2ZWQgYXMgICovCisvKiAgZm9sbG93czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICBCeXRlIE9mZnNldCAgICAgICAgIFN0ZXJlbyBJbnB1dCAgICAgICAgIE1vbm8tSW4tU3RlcmVvIElucHV0ICAgICAgICAgICAqLworLyogICAgICAgICAgICAgID09PT09PT09PT09ICAgICAgICAgPT09PT09PT09PT09ICAgICAgICAgPT09PT09PT09PT09PT09PT09PT0gICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICBMZWZ0IFNhbXBsZSAjMSAgICAgICAgICBNb25vIFNhbXBsZSAjMSAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIFJpZ2h0IFNhbXBsZSAjMSAgICAgICAgIE1vbm8gU2FtcGxlICMxICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICAgTGVmdCBTYW1wbGUgIzIgICAgICAgICAgTW9ubyBTYW1wbGUgIzIgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIDYgICAgICAgICAgICAgICBSaWdodCBTYW1wbGUgIzIgICAgICAgICBNb25vIFNhbXBsZSAjMiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb25vIGZvcm1hdCBkYXRhIGlzIG5vdCBzdXBwb3J0ZWQsIHRoZSBjYWxsaW5nIHJvdXRpbmUgbXVzdCBjb252ZXJ0IGEgTW9ubyBzdHJlYW0gICAqLworLyogIGluIHRvIE1vbm8tSW4tU3RlcmVvIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIExWQ1NfSAorI2RlZmluZSBMVkNTX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKyNpbmNsdWRlICJMVk1fQ29tbW9uLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTWVtb3J5IHRhYmxlICovCisjZGVmaW5lIExWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBICAgIDAgICAgLyogT2Zmc2V0IHRvIHRoZSBpbnN0YW5jZSBtZW1vcnkgcmVnaW9uICovCisjZGVmaW5lIExWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBICAgIDEgICAgLyogT2Zmc2V0IHRvIHRoZSBwZXJzaXN0ZW50IGRhdGEgbWVtb3J5IHJlZ2lvbiAqLworI2RlZmluZSBMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRiAgICAyICAgIC8qIE9mZnNldCB0byB0aGUgcGVyc2lzdGVudCBjb2VmZmljaWVudCBtZW1vcnkgcmVnaW9uICovCisjZGVmaW5lIExWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUICAgICAgICAgIDMgICAgLyogT2Zmc2V0IHRvIHRlbXBvcmFyeSBtZW1vcnkgcmVnaW9uICovCisjZGVmaW5lIExWQ1NfTlJfTUVNT1JZX1JFR0lPTlMgICAgICAgICAgICAgICAgIDQgICAgLyogTnVtYmVyIG9mIG1lbW9yeSByZWdpb25zICovCisKKy8qIEVmZmVjdCBMZXZlbCAqLworI2RlZmluZSBMVkNTX0VGRkVDVF9MT1cgICAgICAgICAgICAgICAgICAgIDE2Mzg0ICAgIC8qIEVmZmVjdCBzY2FsaW5nIDUwJSAqLworI2RlZmluZSBMVkNTX0VGRkVDVF9NRURJVU0gICAgICAgICAgICAgICAgIDI0NTc2ICAgIC8qIEVmZmVjdCBzY2FsaW5nIDc1JSAqLworI2RlZmluZSBMVkNTX0VGRkVDVF9ISUdIICAgICAgICAgICAgICAgICAgIDMyNzY3ICAgIC8qIEVmZmVjdCBTY2FsaW5nIDEwMCUgKi8KKworLyogQ2FsbGJhY2sgZXZlbnRzICovCisjZGVmaW5lIExWQ1NfRVZFTlRfTk9ORSAgICAgICAgICAgICAgICAgICAweDAwMDAgICAgLyogTm90IGEgdmFsaWQgZXZlbnQgKi8KKyNkZWZpbmUgTFZDU19FVkVOVF9BTEdPRkYgICAgICAgICAgICAgICAgIDB4MDAwMSAgICAvKiBDUyBoYXMgY29tcGxldGVkIHN3aXRjaCBvZmYgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbnN0YW5jZSBoYW5kbGUgKi8KK3R5cGVkZWYgdm9pZCAqTFZDU19IYW5kbGVfdDsKKworCisvKiBPcGVyYXRpbmcgbW9kZXMgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWQ1NfT0ZGID0gMCwKKyAgICBMVkNTX09OICA9IDE1LAorICAgIExWQ1NfTUFYID0gTFZNX01BWEVOVU0KK30gTFZDU19Nb2Rlc19lbjsKKworCisvKiBNZW1vcnkgVHlwZXMgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWQ1NfU0NSQVRDSCAgICAgICAgPSAwLAorICAgIExWQ1NfREFUQSAgICAgICAgICAgPSAxLAorICAgIExWQ1NfQ09FRkZJQ0lFTlQgICAgPSAyLAorICAgIExWQ1NfUEVSU0lTVEVOVCAgICAgPSAzLAorICAgIExWQ1NfTUVNT1JZVFlQRV9NQVggPSBMVk1fTUFYRU5VTQorfSBMVkNTX01lbW9yeVR5cGVzX2VuOworCisKKy8qIEZ1bmN0aW9uIHJldHVybiBzdGF0dXMgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWQ1NfU1VDQ0VTUyAgICAgICAgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gYSByb3V0aW5lICovCisgICAgTFZDU19BTElHTk1FTlRFUlJPUiA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgLyogTWVtb3J5IGFsaWdubWVudCBlcnJvciAqLworICAgIExWQ1NfTlVMTEFERFJFU1MgICAgPSAyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5VTEwgYWxsb2NhdGlvbiBhZGRyZXNzICovCisgICAgTFZDU19UT09NQU5ZU0FNUExFUyA9IDMsICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBibG9jayBzaXplIGV4Y2VlZGVkICovCisgICAgTFZDU19JTlZBTElEQlVGRkVSICA9IDQsICAgICAgICAgICAgICAgICAgICAgICAgLyogSW52YWxpZCBidWZmZXIgcHJvY2Vzc2luZyByZXF1ZXN0ICovCisgICAgTFZDU19TVEFUVVNNQVggICAgICA9IExWTV9NQVhFTlVNCit9IExWQ1NfUmV0dXJuU3RhdHVzX2VuOworCisKKy8qCisgKiBTb3VyY2UgZGF0YSBmb3JtYXRzCisgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWQ1NfU1RFUkVPICAgICAgID0gMCwKKyAgICBMVkNTX01PTk9JTlNURVJFTyA9IDEsCisgICAgTFZDU19TT1VSQ0VNQVggICAgPSBMVk1fTUFYRU5VTQorfSBMVkNTX1NvdXJjZUZvcm1hdF9lbjsKKworCisvKgorICogU3VwcG9ydGVkIG91dHB1dCBkZXZpY2VzCisgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWQ1NfSEVBRFBIT05FUyAgICAgICAgICAgICA9IDAsCisgICAgTFZDU19FWF9IRUFEUEhPTkVTICAgICAgICAgID0gMSwKKyAgICBMVkNTX1NQRUFLRVJUWVBFX01BWCAgICAgICAgPSBMVk1fTUFYRU5VTQorfSBMVkNTX1NwZWFrZXJUeXBlX2VuOworCisvKgorICogU3BlYWtlciBDb2VmZmljaWVudHMgVGFibGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB2b2lkICAgICpwVGFibGUxOworICAgIHZvaWQgICAgKnBUYWJsZTI7CisgICAgdm9pZCAgICAqcFRhYmxlMzsKKyAgICB2b2lkICAgICpwVGFibGU0OworICAgIHZvaWQgICAgKnBUYWJsZTU7CisgICAgdm9pZCAgICAqcFRhYmxlNjsKKyAgICB2b2lkICAgICpwVGFibGU3OworICAgIHZvaWQgICAgKnBUYWJsZTg7Cit9IExWQ1NfQ1NNU19Db2VmX1RhYmxlc190OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1lbW9yeSByZWdpb24gZGVmaW5pdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gc2l6ZSBpbiBieXRlcyAqLworICAgIExWQ1NfTWVtb3J5VHlwZXNfZW4gICAgIFR5cGU7ICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiB0eXBlICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnBCYXNlQWRkcmVzczsgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgcmVnaW9uIGJhc2UgYWRkcmVzcyAqLworfSBMVkNTX01lbW9yeVJlZ2lvbl90OworCisKKy8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZDU19NZW1vcnlSZWdpb25fdCBSZWdpb25bTFZDU19OUl9NRU1PUllfUkVHSU9OU107IC8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAqLworfSBMVkNTX01lbVRhYl90OworCisKKy8qIENvbmNlcnQgU291bmQgcGFyYW1ldGVyIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVkNTX01vZGVzX2VuICAgICAgICAgICBPcGVyYXRpbmdNb2RlOyAgICAgICAgICAvKiBBbGdvcml0aG0gbW9kZSAqLworICAgIExWQ1NfU3BlYWtlclR5cGVfZW4gICAgIFNwZWFrZXJUeXBlOyAgICAgICAgICAgIC8qIE91dHB1dCBkZXZpY2UgdHlwZSAqLworICAgIExWQ1NfU291cmNlRm9ybWF0X2VuICAgIFNvdXJjZUZvcm1hdDsgICAgICAgICAgIC8qIFNvdXJjZSBkYXRhIGZvcm1hdCAqLworICAgIExWTV9Nb2RlX2VuICAgICAgICAgICAgIENvbXByZXNzb3JNb2RlOyAgICAgICAgIC8qIE5vbi1MaW5lYXIgQ29tcHJlc3NvciBNb2RlICovCisgICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgU2FtcGxlUmF0ZTsgICAgICAgICAgICAgLyogU2FtcGxpbmcgcmF0ZSAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEVmZmVjdExldmVsOyAgICAgICAgICAgIC8qIEVmZmVjdCBsZXZlbCAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIFJldmVyYkxldmVsOyAgICAgICAgICAgIC8qIFJldmVyYiBsZXZlbCBpbiAlICovCit9IExWQ1NfUGFyYW1zX3Q7CisKKworLyogQ29uY2VydCBTb3VuZCBDYXBhYmlsaXR5IHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBNYXhCbG9ja1NpemU7ICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgaW4gc2FtcGxlIHBhaXJzICovCisKKyAgICAvKiBDYWxsYmFjayBwYXJhbWV0ZXJzICovCisgICAgTFZNX0NhbGxiYWNrICAgICAgICAgICAgQ2FsbEJhY2s7ICAgICAgICAgICAgICAgLyogQnVuZGxlIGNhbGxiYWNrICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnBCdW5kbGVJbnN0YW5jZTsgICAgICAgLyogQnVuZGxlIGluc3RhbmNlIGhhbmRsZSAqLworCit9IExWQ1NfQ2FwYWJpbGl0aWVzX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgICAqLworLyogIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAqLworLyogICAgICBoSW5zdGFuY2UgPSBJbnN0YW5jZSBoYW5kbGUgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGJhc2UgYWRkcmVzc2VzIGZvciB0aGUgaW5zdGFuY2UgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIChoSW5zdGFuY2U9TlVMTCkgaXQgaXMgICAgICAgICAgICovCisvKiAgcGFzc2VkIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGllcywgb2YgdGhlc2Ugb25seSB0aGUgYnVmZmVyIHByb2Nlc3Npbmcgc2V0dGluZyBpcyAgICAgKi8KKy8qICB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIHRoZSBtZW1vcnkgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uICAgICAgKi8KKy8qICByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSAgICAgICAgICAgICAgKi8KKy8qICBjYXBhYmlsaXRpZXMgYXJlIGlnbm9yZWQgYW5kIHRoZSBtZW1vcnkgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgICAgICAqLworLyogIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19NZW1vcnkoTFZDU19IYW5kbGVfdCAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX01lbVRhYl90ICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0NhcGFiaWxpdGllc190ICAgICpwQ2FwYWJpbGl0aWVzKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENyZWF0ZSBhbmQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBDb25jZXJ0IFNvdW5kIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBhbGdvcml0aG0gaW5zdGFuY2UgYnkgY2FsbGluZyB3aXRoICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSBzZXQgdG8gTlVMTC4gSW4gdGhpcyBjYXNlIHRoZSBhbGdvcml0aG0gcmV0dXJucyB0aGUgbmV3IGluc3RhbmNlICAgICAgICAgICovCisvKiAgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZm9yY2UgYSBmdWxsIHJlLWluaXRpYWxpc2F0aW9uIG9mIHRoZSBhbGdvcml0aG0gICAgICAgICovCisvKiAgYnkgY2FsbGluZyB3aXRoIGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZS4gSW4gdGhpcyBjYXNlIHRoZSBtZW1vcnkgdGFibGUgICAgICAgICAgKi8KKy8qICBzaG91bGQgYmUgY29ycmVjdCBmb3IgdGhlIGluc3RhbmNlLCB0aGlzIGNhbiBiZSBlbnN1cmVkIGJ5IGNhbGxpbmcgdGhlIGZ1bmN0aW9uICAgICAqLworLyogIExWQ1NfTWVtb3J5IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfQWxpZ25tZW50RXJyb3IgICAgIEluc3RhbmNlIG9yIHNjcmF0Y2ggbWVtb3J5IG9uIGluY29ycmVjdCBhbGlnbm1lbnQgICAgICAgICAgICovCisvKiAgTFZDU19OdWxsQWRkcmVzcyAgICAgICAgSW5zdGFuY2Ugb3Igc2NyYXRjaCBtZW1vcnkgaGFzIGEgTlVMTCBwb2ludGVyICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoZSBpbnN0YW5jZSBoYW5kbGUgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWVtb3J5ICAgICAgKi8KKy8qICAgICAgcmVnaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDIuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkNTX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0luaXQoTFZDU19IYW5kbGVfdCAgICAgICAgICAgICpwaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfTWVtVGFiX3QgICAgICAgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgICAgICAqcENhcGFiaWxpdGllcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZDU19HZXRQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXF1ZXN0IHRoZSBDb25jZXJ0IFNvdW5kIHBhcmFtZXRlcnMuIFRoZSBjdXJyZW50IHBhcmFtZXRlciBzZXQgaXMgcmV0dXJuZWQgICAgICAgICAqLworLyogIHZpYSB0aGUgcGFyYW1ldGVyIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkNTX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfR2V0UGFyYW1ldGVycyhMVkNTX0hhbmRsZV90ICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAqcFBhcmFtcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX0NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTZXRzIG9yIGNoYW5nZXMgdGhlIENvbmNlcnQgU291bmQgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkNTX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0NvbnRyb2woTFZDU19IYW5kbGVfdCAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICpwUGFyYW1zKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFByb2Nlc3MgZnVuY3Rpb24gZm9yIHRoZSBDb25jZXJ0IFNvdW5kIG1vZHVsZS4gVGhlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHR3byAgICAgICovCisvKiAgdmFyaWFudHMgb2YgdGhlIGFsZ29yaXRobSwgb25lIGZvciBoZWFkcGhvbmVzIGFuZCBvbmUgZm9yIG1vYmlsZSBzcGVha2Vycy4gICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5EYXRhICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBPdXREYXRhICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnVtU2FtcGxlcyAgICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1Rvb01hbnlTYW1wbGVzICAgICBOdW1TYW1wbGVzIHdhcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSBibG9jayBzaXplICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2VzcyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAvKiBMVkNTX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYTgzZTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5jCkBAIC0wLDAgKzEsMzAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogbnhwMDA3NzUzICQKKyAgICAgJFJldmlzaW9uOiAxMjQ2ICQKKyAgICAgJERhdGU6IDIwMTAtMDctMTYgMTE6MDc6MTAgKzAyMDAgKEZyaSwgMTYgSnVsIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNTLmgiCisjaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZDU19CeXBhc3NNaXguaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiTFZDU19UYWJsZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWTV9JTlQzMiBMVkNTX01peGVyQ2FsbGJhY2soICAgTFZDU19IYW5kbGVfdCAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICpwR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBDYWxsYmFja1BhcmFtKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19CeXBhc3NNaXhJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5pdGlhbGlzZXMgdGhlIGJ5cGFzcyBtaXhlciBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgb3ZlcmFsbCBnYWluIG9mIHRoZSBwcm9jZXNzZWQgcGF0aCBpcyBzZXQgYnkgdGhlIGdhaW5zIGluIHRoZSBpbmRpdmlkdWFsICAgICovCisvKiAgcHJvY2Vzc2luZyBibG9ja3MgYW5kIGJ5IHRoZSBlZmZlY3QgbGV2ZWwgZ2Fpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgdW5wcm9jZXNzZWQgcGF0aCBtdXN0IGhhdmUgbWF0Y2hpbmcgZ2FpbiBmb3IgdGhlIHByb2Nlc3NlZCBwYXRoIHRvIGVuc3VyZSAgICovCisvKiAgYXMgdGhleSBhcmUgbWl4ZWQgdG9nZXRoZXIgdGhlIGNvcnJlY3QgZWZmZWN0IGlzIGFjaGlldmVkLCB0aGlzIGlzIHRoZSB2YWx1ZSAgICAqLworLyogIFVucHJvY0xvc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIG92ZXJhbGwgZ2FpbiBpcyBjb3JyZWN0ZWQgYnkgYSBjb21iaW5hdGlvbiBvZiBhIHNoaWZ0IHdpdGggc2F0dXJhdGlvbiBhbmQgYSAqLworLyogIGxpbmVhciBzY2FsZXIsIGxvc3MuIFRoZSBsb3NzIGVuc3VyZXMgdGhlIHN1bSBpbiB0aGUgbWl4ZXIgZG9lcyBub3Qgc2F0dXJhdGUgICAgKi8KKy8qICBhbmQgYWxzbyBjb3JyZWN0cyBmb3IgYW55IGV4Y2VzcyBnYWluIGluIHRoZSBzaGlmdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19CeXBhc3NNaXhJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCit7CisKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIE9mZnNldDsKKyAgICBMVk1fVUlOVDMyICAgICAgICAgIEdhaW47CisgICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19CeXBhc3NNaXhfdCAgICAqcENvbmZpZyAgID0gKExWQ1NfQnlwYXNzTWl4X3QgKikmcEluc3RhbmNlLT5CeXBhc3NNaXg7CisgICAgY29uc3QgR2Fpbl90ICAgICAgICAqcE91dHB1dEdhaW5UYWJsZTsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEN1cnJlbnQ7CisKKworICAgIC8qCisgICAgICogU2V0IHRoZSB0cmFuc2l0aW9uIGdhaW4KKyAgICAgKi8KKyAgICBpZiAoKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgPT0gTFZDU19PTikgJiYKKyAgICAgICAgKHBJbnN0YW5jZS0+YlRpbWVyRG9uZSA9PSBMVk1fVFJVRSkKKyAgICAgICAgJiYgKExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+TVNCeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSkgIT0gMHg3RkZGKSAvKiB0aGlzIGluZGljYXRlcyBhbiBvZmYtPm9uIHRyYW5zdGlvbiAqLworICAgICAgICApCisgICAgeworICAgICAgICBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluID0gcFBhcmFtcy0+RWZmZWN0TGV2ZWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFNlbGVjdCBubyBlZmZlY3QgbGV2ZWwgKi8KKyAgICAgICAgcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbiA9IDA7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIG91dHB1dCBnYWluIHRhYmxlIG9mZnNldAorICAgICAqLworICAgIE9mZnNldCA9IChMVk1fVUlOVDE2KShwUGFyYW1zLT5TcGVha2VyVHlwZSArIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQqKDErTFZDU19FWF9IRUFEUEhPTkVTKSkpOworICAgIHBPdXRwdXRHYWluVGFibGUgPSAoR2Fpbl90KikmTFZDU19PdXRwdXRHYWluVGFibGVbMF07CisKKyAgICAvKgorICAgICAqIFNldHVwIHRoZSBtaXhlciBnYWluIGZvciB0aGUgcHJvY2Vzc2VkIHBhdGgKKyAgICAgKi8KKyAgICBHYWluID0gKExWTV9VSU5UMzIpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzICogcEluc3RhbmNlLT5UcmFuc2l0aW9uR2Fpbik7CisKKyAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtID0gMDsKKyAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKKyAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgPSBMVk1fTlVMTDsKKyAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldD0xOworICAgIEN1cnJlbnQgPSBMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0pOworICAgIExWQ19NaXhlcl9Jbml0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwoTFZNX0lOVDMyKShHYWluID4+IDE1KSxDdXJyZW50KTsKKyAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSxMVkNTX0JZUEFTU19NSVhFUl9UQyxwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworICAgIC8qCisgICAgICogU2V0dXAgdGhlIG1peGVyIGdhaW4gZm9yIHRoZSB1bnByb2Nlc3NlZCBwYXRoCisgICAgICovCisgICAgR2FpbiA9IChMVk1fVUlOVDMyKShwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uTG9zcyAqICgweDdGRkYgLSBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKSk7CisgICAgR2FpbiA9IChMVk1fVUlOVDMyKXBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5VbnByb2NMb3NzICogKEdhaW4gPj4gMTUpOworICAgIEN1cnJlbnQgPSBMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0pOworICAgIExWQ19NaXhlcl9Jbml0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwoTFZNX0lOVDMyKShHYWluID4+IDE1KSxDdXJyZW50KTsKKyAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSxMVkNTX0JZUEFTU19NSVhFUl9UQyxwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gPSAwOworICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSA9IGhJbnN0YW5jZTsKKyAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldD0xOworICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayA9IExWQ1NfTWl4ZXJDYWxsYmFjazsKKworICAgIC8qCisgICAgICogU2V0dXAgdGhlIG91dHB1dCBnYWluIHNoaWZ0CisgICAgICovCisgICAgcENvbmZpZy0+T3V0cHV0X1NoaWZ0ID0gcE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLlNoaWZ0OworCisKKyAgICAvKgorICAgICAqIENvcnJlY3QgZ2FpbiBmb3IgdGhlIGVmZmVjdCBsZXZlbAorICAgICAqLworICAgIHsKKworICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIEdhaW5Db3JyZWN0OworICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIEdhaW4xOworICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIEdhaW4yOworCisgICAgICAgIEdhaW4xID0gTFZDX01peGVyX0dldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0pOworICAgICAgICBHYWluMiA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBnYWluIGNvcnJlY3Rpb24KKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5Db21wcmVzc29yTW9kZSA9PSBMVk1fTU9ERV9PTikKKyAgICAgICAgeworICAgICAgICBHYWluQ29ycmVjdCA9IChMVk1fSU5UMTYpKCAgcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5NaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKCgoTFZNX0lOVDMyKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5HYWluTWluICogKExWTV9JTlQzMilwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKSA+PiAxNSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCgoTFZNX0lOVDMyKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5HYWluRnVsbCAqIChMVk1fSU5UMzIpcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbikgPj4gMTUpICk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgdGhlIGdhaW4gY29ycmVjdGlvbiBhbmQgc2hpZnQsIG5vdGUgdGhlIHJlc3VsdCBpcyBpbiBRMy4xMyBmb3JtYXQKKyAgICAgICAgICovCisgICAgICAgIEdhaW4xID0gKEdhaW4xICogR2FpbkNvcnJlY3QpIDw8IDQ7CisgICAgICAgIEdhaW4yID0gKEdhaW4yICogR2FpbkNvcnJlY3QpIDw8IDQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBHYWluMSA9IEdhaW4xIDw8IDE2OworICAgICAgICAgICAgR2FpbjIgPSBHYWluMiA8PCAxNjsKKyAgICAgICAgfQorCisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGdhaW4gdmFsdWVzCisgICAgICAgICAqLworICAgICAgICBwQ29uZmlnLT5PdXRwdXRfU2hpZnQgPSBwQ29uZmlnLT5PdXRwdXRfU2hpZnQ7CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLEdhaW4xPj4xNik7CisgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLEdhaW4yPj4xNik7CisgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19CeXBhc3NNaXhlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQXBwbHkgQnlwYXNzIE1peC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIG1peGVzIHRoZSBwcm9jZXNzZWQgYW5kIHVucHJvY2Vzc2VkIGRhdGEgc3RyZWFtcyB0b2dldGhlciB0byBjb3JyZWN0IHRoZSAgICovCisvKiAgb3ZlcmFsbCBzeXN0ZW0gZ2FpbiBhbmQgYWxsb3cgcHJvZ3Jlc3NpdmUgY29udHJvbCBvZiB0aGUgQ29uY2VydCBTb3VuZCBlZmZlY3QuICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoZSBieXBhc3MgbWl4ZXIgaXMgZW5hYmxlZCB0aGUgb3V0cHV0IGlzIHRoZSBwcm9jZXNzZWQgc2lnbmFsIG9ubHkgYW5kICAgICovCisvKiAgd2l0aG91dCBnYWluIGNvcnJlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQcm9jZXNzZWQgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIHByb2Nlc3NlZCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwVW5wcm9jZXNzZWQgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSB1bnByb2Nlc3NlZCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4ZXIoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBVbnByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CisKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgICAgICA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfQnlwYXNzTWl4X3QgICAgKnBDb25maWcgICAgICAgID0gKExWQ1NfQnlwYXNzTWl4X3QgKikmcEluc3RhbmNlLT5CeXBhc3NNaXg7CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBieXBhc3MgbWl4ZXIgaXMgZW5hYmxlZAorICAgICAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfQllQQVNTTUlYU1dJVENIKSAhPSAwKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgdGhlIGJ5cGFzcyBtaXgKKyAgICAgICAgICovCisgICAgICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKikgcFVucHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcykpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IG91dHB1dCBnYWluIGNvcnJlY3Rpb24gc2hpZnQKKyAgICAgICAgICovCisgICAgICAgIFNoaWZ0X1NhdF92MTZ4djE2ICgoTFZNX0lOVDE2KXBDb25maWctPk91dHB1dF9TaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiopcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYqKXBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpKTsgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQqLworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfTWl4ZXJDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZNX0lOVDMyIExWQ1NfTWl4ZXJDYWxsYmFjayhMVkNTX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgKnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIENhbGxiYWNrUGFyYW0pCit7CisgICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBUYXJnZXQxOworCisgICAgVGFyZ2V0MSA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+TVNCeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSk7CisgICAgKHZvaWQpcEdlbmVyYWxQdXJwb3NlOworCisgICAgLyoKKyAgICAgKiBPZmYgdHJhbnNpdGlvbiBoYXMgY29tcGxldGVkIGluIEhlYWRwaG9uZSBtb2RlCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPk91dHB1dERldmljZSA9PSBMVkNTX0hFQURQSE9ORSkgJiYKKyAgICAgICAgKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24pICAgICAmJgorICAgICAgICAoVGFyZ2V0MSA9PSAweDAwMDApJiYgIC8qIHRoaXMgaW5kaWNhdGVzIGFuIG9uLT5vZmYgdHJhbnNpdGlvbiAqLworICAgICAgICAoQ2FsbGJhY2tQYXJhbSA9PSAwKSkKKyAgICB7CisgICAgICAgIC8qIFNldCBvcGVyYXRpbmcgbW9kZSB0byBPRkYgKi8KKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWQ1NfT0ZGOworCisgICAgICAgIC8qIEV4aXQgdHJhbnNpdGlvbiBzdGF0ZSAqLworICAgICAgICBwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID0gTFZNX0ZBTFNFOworCisgICAgICAgIC8qIFNpZ25hbCB0byB0aGUgYnVuZGxlICovCisgICAgICAgIGlmKCgqcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuQ2FsbEJhY2spICE9IExWTV9OVUxMKXsKKyAgICAgICAgICAgICgqcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuQ2FsbEJhY2spKHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLnBCdW5kbGVJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFMR09SSVRITV9DU19JRCB8IExWQ1NfRVZFTlRfQUxHT0ZGKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIGlmICgocEluc3RhbmNlLT5PdXRwdXREZXZpY2UgPT0gTFZDU19IRUFEUEhPTkUpICAmJgorICAgICAgICAoVGFyZ2V0MSA9PSAxKSAmJgorICAgICAgICAocEluc3RhbmNlLT5iVGltZXJEb25lID09IExWTV9UUlVFKSl7CisKKyAgICAgICAgLyogRXhpdCB0cmFuc2l0aW9uIHN0YXRlICovCisgICAgICAgIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPSBMVk1fRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzlkZmY0MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogYmVxMDc3MTYgJAorICAgICAkUmV2aXNpb246IDEwMDEgJAorICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzoyMzowMiArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fTFZDU19CWVBBU1NNSVhfSF9fCisjZGVmaW5lIF9fTFZDU19CWVBBU1NNSVhfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWQ19NaXhlci5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgU3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBCeXBhc3MgbWl4ZXIgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIE1peGVyIHNldHRpbmdzICovCisgICAgTFZNaXhlcjNfMlN0X3N0ICAgICAgICAgTWl4ZXJfSW5zdGFuY2U7ICAgICAgICAgICAgIC8qIE1peGVyIGluc3RhbmNlICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgT3V0cHV0X1NoaWZ0OyAgICAgICAgICAgICAgIC8qIENvcnJlY3RpbmcgZ2FpbiBvdXRwdXQgc2hpZnQgKi8KKworfSBMVkNTX0J5cGFzc01peF90OworCisKKy8qIE91dHB1dCBnYWluIHR5cGUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogT3V0cHV0IGdhaW4gc2V0dGluZ3MsIEdhaW4gPSAoTG9zcy8zMjc2OCkgKiAyXlNoaWZ0ICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgU2hpZnQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgc2hpZnRzIHJlcXVpcmVkICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgTG9zczsgICAgICAgICAgICAgICAgICAgICAgIC8qIExvc3MgcmVxdWlyZWQgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBVbnByb2NMb3NzOyAgICAgICAgICAgICAgICAgLyogVW5wcm9jZXNzZWQgcGF0aCBsb3NzICovCit9IEdhaW5fdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnVuY3Rpb24gcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19CeXBhc3NNaXhJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgKnBQYXJhbXMpOworCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4ZXIoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnVuUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgTnVtU2FtcGxlcyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAgLyogQllQQVNTTUlYX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Db250cm9sLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQ29udHJvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVkZmNhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQ29udHJvbC5jCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogbnhwMDA3NzUzICQKKyAgICAgJFJldmlzaW9uOiAxMjQ2ICQKKyAgICAgJERhdGU6IDIwMTAtMDctMTYgMTE6MDc6MTAgKzAyMDAgKEZyaSwgMTYgSnVsIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNTLmgiCisjaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZDU19UYWJsZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWQ1NfR2V0UGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmVxdWVzdCB0aGUgQ29uY2VydCBTb3VuZCBwYXJhbWV0ZXJzLiBUaGUgY3VycmVudCBwYXJhbWV0ZXIgc2V0IGlzIHJldHVybmVkICAgICAqLworLyogIHZpYSB0aGUgcGFyYW1ldGVyIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19HZXRQYXJhbWV0ZXJzKExWQ1NfSGFuZGxlX3QgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICpwUGFyYW1zKQoreworCisgICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0oTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKworICAgICpwUGFyYW1zID0gcEluc3RhbmNlLT5QYXJhbXM7CisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX0NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTZXRzIG9yIGNoYW5nZXMgdGhlIENvbmNlcnQgU291bmQgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBhIHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQ29udHJvbChMVkNTX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAqcFBhcmFtcykKK3sKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgT2Zmc2V0OworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgICAgICAqcEluc3RhbmNlID0oTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX1JldHVyblN0YXR1c19lbiAgICAgICAgZXJyOworICAgIExWQ1NfTW9kZXNfZW4gICAgICAgICAgICAgICBPcGVyYXRpbmdNb2RlU2F2ZSA9IHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGU7CisKKyAgICBpZiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlKQorICAgIHsKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5NU0J5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5NU0J5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisgICAgICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMuU2FtcGxpbmdSYXRlID0gTFZDU19TYW1wbGVSYXRlVGFibGVbcFBhcmFtcy0+U2FtcGxlUmF0ZV07CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiB0aGUgcmV2ZXJiIGxldmVsIGhhcyBjaGFuZ2VkCisgICAgICovCisgICAgaWYocEluc3RhbmNlLT5QYXJhbXMuUmV2ZXJiTGV2ZWwgIT0gcFBhcmFtcy0+UmV2ZXJiTGV2ZWwpCisgICAgeworICAgICAgICBlcnI9TFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KGhJbnN0YW5jZSxwUGFyYW1zKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHRoZSBzYW1wbGUgcmF0ZSBvciBzcGVha2VyIGhhcyBjaGFuZ2VkIHRoZW4gcGVyZm9ybSBhIGZ1bGwgcmUtaW5pdGlhbGlzYXRpb24KKyAgICAgKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgfHwKKyAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgIT0gcFBhcmFtcy0+U3BlYWtlclR5cGUpKQorICAgIHsKKyAgICAgICAgY29uc3QgTFZDU19Wb2xDb3JyZWN0X3QgKnBMVkNTX1ZvbENvcnJlY3RUYWJsZTsKKworICAgICAgICAvKgorICAgICAgICAgKiBPdXRwdXQgZGV2aWNlCisgICAgICAgICAqLworICAgICAgICBwSW5zdGFuY2UtPk91dHB1dERldmljZSA9IExWQ1NfSEVBRFBIT05FOworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgdm9sdW1lIGNvcnJlY3Rpb24gcGFyYW1ldGVycworICAgICAgICAgKi8KKyAgICAgICAgLyogVXNlIGludGVybmFsIGNvZWZmaWNpZW50IHRhYmxlICovCisgICAgICAgIHBMVkNTX1ZvbENvcnJlY3RUYWJsZSA9IChMVkNTX1ZvbENvcnJlY3RfdCopJkxWQ1NfVm9sQ29ycmVjdFRhYmxlWzBdOworICAgICAgICBPZmZzZXQgPSAoTFZNX0lOVDE2KShwUGFyYW1zLT5TcGVha2VyVHlwZSArIHBQYXJhbXMtPlNvdXJjZUZvcm1hdCooMStMVkNTX0VYX0hFQURQSE9ORVMpKTsKKworICAgICAgICBwSW5zdGFuY2UtPlZvbENvcnJlY3QgPSBwTFZDU19Wb2xDb3JyZWN0VGFibGVbT2Zmc2V0XTsKKworICAgICAgICBlcnI9TFZDU19TRW5oYW5jZXJJbml0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOworCisgICAgICAgIGVycj1MVkNTX1JldmVyYkdlbmVyYXRvckluaXQoaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7CisKKyAgICAgICAgZXJyPUxWQ1NfRXF1YWxpc2VySW5pdChoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsKKworICAgICAgICBlcnI9TFZDU19CeXBhc3NNaXhJbml0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOworCisgICAgfQorCisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBlZmZlY3QgbGV2ZWwgb3Igc291cmNlIGZvcm1hdCBoYXMgY2hhbmdlZAorICAgICAqLworICAgIGVsc2UgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5FZmZlY3RMZXZlbCAhPSBwUGFyYW1zLT5FZmZlY3RMZXZlbCkgfHwKKyAgICAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgIT0gcFBhcmFtcy0+U291cmNlRm9ybWF0KSkKKyAgICB7CisgICAgICAgIGNvbnN0IExWQ1NfVm9sQ29ycmVjdF90ICpwTFZDU19Wb2xDb3JyZWN0VGFibGU7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSB2b2x1bWUgY29ycmVjdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgICAqLworICAgICAgICAvKiBVc2UgaW50ZXJuYWwgY29lZmZpY2llbnQgdGFibGUgKi8KKyAgICAgICAgcExWQ1NfVm9sQ29ycmVjdFRhYmxlID0gKExWQ1NfVm9sQ29ycmVjdF90KikmTFZDU19Wb2xDb3JyZWN0VGFibGVbMF07CisgICAgICAgIE9mZnNldCA9IChMVk1fSU5UMTYpKHBQYXJhbXMtPlNwZWFrZXJUeXBlICsgcFBhcmFtcy0+U291cmNlRm9ybWF0KigxK0xWQ1NfRVhfSEVBRFBIT05FUykpOworCisgICAgICAgIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdCA9IHBMVkNTX1ZvbENvcnJlY3RUYWJsZVtPZmZzZXRdOworCisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZWZmZWN0IGxldmVsIGFuZCBhbHBoYS1taXhlciBnYWlucyAqLworICAgICAgICBlcnI9TFZDU19CeXBhc3NNaXhJbml0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOworCisgICAgICAgIGlmKGVyciAhPSBMVkNTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMgPSAqcFBhcmFtczsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycworICAgICAqLworICAgIHBJbnN0YW5jZS0+UGFyYW1zID0gKnBQYXJhbXM7CisKKyAgICAvKiBTdGF5IG9uIHRoZSBjdXJyZW50IG9wZXJhdGluZyBtb2RlIHVudGlsIHRoZSB0cmFuc2l0aW9uIGlzIGRvbmUgKi8KKyAgICBpZigocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBPcGVyYXRpbmdNb2RlU2F2ZSkgfHwKKyAgICAgICAocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSkpeworCisgICAgICAgIC8qIFNldCB0aGUgcmV2ZXJiIGRlbGF5IHRpbWVvdXQgKi8KKyAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiAhPSBMVk1fVFJVRSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPmJUaW1lckRvbmUgPSBMVk1fRkFMU0U7CisgICAgICAgICAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLlRpbWVJbk1zID0gKExWTV9JTlQxNikoKChwSW5zdGFuY2UtPlJldmVyYmVyYXRpb24uRGVsYXlTaXplIDw8IDIpL3BJbnN0YW5jZS0+VGltZXJQYXJhbXMuU2FtcGxpbmdSYXRlKSArIDEpOworICAgICAgICAgICAgTFZNX1RpbWVyX0luaXQgKCAmcEluc3RhbmNlLT5UaW1lckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5UaW1lclBhcmFtcyk7CisgICAgICAgIH0KKworICAgICAgICAvKiBVcGRhdGUgdGhlIGVmZmVjdCBsZXZlbCBhbmQgYWxwaGEtbWl4ZXIgZ2FpbnMgKi8KKyAgICAgICAgZXJyPUxWQ1NfQnlwYXNzTWl4SW5pdChoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsKKworICAgICAgICAvKiBDaGFuZ2UgdHJhbnNpdGlvbiBieXBhc3MgbWl4ZXIgc2V0dGluZ3MgaWYgbmVlZGVkIGRlcGVuZGluZyBvbiB0cmFuc2l0aW9uIHR5cGUgKi8KKyAgICAgICAgaWYocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVkNTX09GRil7CisgICAgICAgICAgICBMVk1fSU5UMzIgQ3VycmVudDE7CisgICAgICAgICAgICBMVk1fSU5UMzIgQ3VycmVudDI7CisKKyAgICAgICAgICAgIEN1cnJlbnQxID0gTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+TVNCeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSk7CisgICAgICAgICAgICBDdXJyZW50MiA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPk1TQnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0pOworCisgICAgICAgICAgICBpZihwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uICE9IExWTV9UUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN1cnJlbnQxID0gMHgwMDAwMDAwMDsKKyAgICAgICAgICAgICAgICBDdXJyZW50MiA9IExWTV9NQVhJTlRfMTY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwSW5zdGFuY2UtPk1TQnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSAxOworICAgICAgICAgICAgcEluc3RhbmNlLT5NU0J5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID0gMTsKKworICAgICAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+TVNCeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSxMVk1fTUFYSU5UXzE2LEN1cnJlbnQxKTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPk1TQnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sMCxDdXJyZW50Mik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBMVk1fSU5UMzIgQ3VycmVudDE7CisgICAgICAgICAgICBMVk1fSU5UMzIgQ3VycmVudDI7CisKKyAgICAgICAgICAgIEN1cnJlbnQxID0gTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+TVNCeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSk7CisgICAgICAgICAgICBDdXJyZW50MiA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPk1TQnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0pOworCisgICAgICAgICAgICBpZihwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uICE9IExWTV9UUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN1cnJlbnQxID0gTFZNX01BWElOVF8xNjsKKyAgICAgICAgICAgICAgICBDdXJyZW50MiA9IDB4MDAwMDAwMDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwSW5zdGFuY2UtPk1TQnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSAxOworICAgICAgICAgICAgcEluc3RhbmNlLT5NU0J5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID0gMTsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBPcGVyYXRpbmdNb2RlU2F2ZTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPk1TQnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMHgwMDAwMDAwMCxDdXJyZW50MSk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5NU0J5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLExWTV9NQVhJTlRfMTYsQ3VycmVudDIpOworICAgICAgICB9CisgICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+TVNCeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSxMVkNTX0JZUEFTU19NSVhFUl9UQyxwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPk1TQnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sTFZDU19CWVBBU1NfTUlYRVJfVEMscFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKworCisgICAgICAgIC8qIFNldCB0cmFuc2l0aW9uIGZsYWcgKi8KKyAgICAgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9UUlVFOworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfVGltZXJDYWxsQmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENhbGxCYWNrIGZ1bmN0aW9uIG9mIHRoZSBUaW1lci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVkNTX1RpbWVyQ2FsbEJhY2sgKHZvaWQqIGhJbnN0YW5jZSwgdm9pZCogcENhbGxCYWNrUGFyYW1zLCBMVk1fSU5UMzIgQ2FsbGJhY2tQYXJhbSkKK3sKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisKKyAgICAvKiBBdm9pZCB3YXJuaW5ncyBiZWNhdXNlIHBDYWxsQmFja1BhcmFtcyBhbmQgQ2FsbGJhY2tQYXJhbSBhcmUgbm90IHVzZWQqLworICAgIGlmKChwQ2FsbEJhY2tQYXJhbXMgIT0gTFZNX05VTEwpIHx8IChDYWxsYmFja1BhcmFtICE9IDApKXsKKyAgICAgICAgcENhbGxCYWNrUGFyYW1zID0gaEluc3RhbmNlOworICAgICAgICBDYWxsYmFja1BhcmFtID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBJbnN0YW5jZS0+YlRpbWVyRG9uZSA9IExWTV9UUlVFOworCisKKyAgICByZXR1cm47Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYTYxNWIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5jCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogYmVxMDc3MTYgJAorICAgICAkUmV2aXNpb246IDEwMDEgJAorICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzoyMzowMiArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWQ1MuaCIKKyNpbmNsdWRlICJMVkNTX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVkNTX0VxdWFsaXNlci5oIgorI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJMVkNTX1RhYmxlcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX0VxdWFsaXNlckluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbml0aWFsaXNlcyB0aGUgZXF1YWxpc2VyIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBmdW5jdGlvbiBzZWxlY3RzIHRoZSBjb2VmZmljaWVudHMgZm9yIHRoZSBmaWx0ZXJzIGFuZCBjbGVhcnMgdGhlIGRhdGEgICAgICAgKi8KKy8qICBoaXN0b3J5LiBJdCBpcyBhbHNvIHVzZWQgZm9yIHJlLWluaXRpYWxpc2F0aW9uIHdoZW4gb25lIG9mIHRoZSBzeXN0ZW0gY29udHJvbCAgICovCisvKiAgcGFyYW1ldGVycyBjaGFuZ2VzIGJ1dCB3aWxsIG9ubHkgY2hhbmdlIHRoZSBjb2VmZmljaWVudHMgYW5kIGNsZWFyIHRoZSBoaXN0b3J5ICAqLworLyogIGlmIHRoZSBzYW1wbGUgcmF0ZSBvciBzcGVha2VyIHR5cGUgaGFzIGNoYW5nZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVG8gYXZvaWQgZXhjZXNzaXZlIHRlc3RpbmcgZHVyaW5nIHRoZSBzYW1wbGUgcHJvY2Vzc2luZyB0aGUgYmlxdWFkIHR5cGUgaXMgICAgICAqLworLyogIHNldCBhcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGluIHRoZSBpbml0IHJvdXRpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlckluaXQoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKK3sKKworICAgIExWTV9VSU5UMTYgICAgICAgICAgT2Zmc2V0OworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfRXF1YWxpc2VyX3QgICAgKnBDb25maWcgICA9IChMVkNTX0VxdWFsaXNlcl90ICopJnBJbnN0YW5jZS0+RXF1YWxpc2VyOworICAgIExWQ1NfRGF0YV90ICAgICAgICAgKnBEYXRhICAgICA9IChMVkNTX0RhdGFfdCAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7CisgICAgTFZDU19Db2VmZmljaWVudF90ICAqcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworICAgIEJRX0MxNl9Db2Vmc190ICAgICAgQ29lZmZzOworICAgIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgKnBFcXVhbGlzZXJDb2VmVGFibGU7CisKKyAgICAvKgorICAgICAqIElmIHRoZSBzYW1wbGUgcmF0ZSBjaGFuZ2VzIHJlLWluaXRpYWxpc2UgdGhlIGZpbHRlcnMKKyAgICAgKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlICE9IHBQYXJhbXMtPlNwZWFrZXJUeXBlKSkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFNldHVwIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFuZCBjbGVhciB0aGUgaGlzdG9yeQorICAgICAgICAgKi8KKyAgICAgICAgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKHBQYXJhbXMtPlNhbXBsZVJhdGUgKyAocFBhcmFtcy0+U3BlYWtlclR5cGUgKiAoMStMVk1fRlNfNDgwMDApKSk7CisgICAgICAgIHBFcXVhbGlzZXJDb2VmVGFibGUgPSAoQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCopJkxWQ1NfRXF1YWxpc2VyQ29lZlRhYmxlWzBdOworCisgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0IGZpbHRlcnMgKi8KKyAgICAgICAgLyogQ29udmVydCBpbmNvbWluZyBjb2VmZmljaWVudHMgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdC9vcmRlcmluZyAqLworICAgICAgICBDb2VmZnMuQTAgPSAoTFZNX0lOVDE2KSBwRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQTA7CisgICAgICAgIENvZWZmcy5BMSA9IChMVk1fSU5UMTYpIHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5BMTsKKyAgICAgICAgQ29lZmZzLkEyID0gKExWTV9JTlQxNikgcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkEyOworICAgICAgICBDb2VmZnMuQjEgPSAoTFZNX0lOVDE2KS1wRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQjE7CisgICAgICAgIENvZWZmcy5CMiA9IChMVk1fSU5UMTYpLXBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5CMjsKKworICAgICAgICBMb2FkQ29uc3RfMTYoKExWTV9JTlQxNikwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKikmcERhdGEtPkVxdWFsaXNlckJpcXVhZFRhcHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBEYXRhLT5FcXVhbGlzZXJCaXF1YWRUYXBzKS9zaXplb2YoTFZNX0lOVDE2KSkpOyAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKworICAgICAgICBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnRzLT5FcXVhbGlzZXJCaXF1YWRJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPkVxdWFsaXNlckJpcXVhZFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmcyk7CisKKyAgICAgICAgLyogQ2FsbGJhY2tzICovCisgICAgICAgIHN3aXRjaChwRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uU2NhbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX0VxdWFsaXNlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBcHBseSB0aGUgZXF1YWxpc2VyIGZpbHRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcElucHV0T3V0cHV0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQvb3V0cHV0IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBBbHdheXMgcHJvY2Vzc2VzIGluIHBsYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlcihMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBJbnB1dE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgTnVtU2FtcGxlcykKK3sKKworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfRXF1YWxpc2VyX3QgICAgKnBDb25maWcgICA9IChMVkNTX0VxdWFsaXNlcl90ICAqKSZwSW5zdGFuY2UtPkVxdWFsaXNlcjsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QgICpwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIGVxdWFsaXNlciBpcyByZXF1aXJlZAorICAgICAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfRVFVQUxJU0VSU1dJVENIKSAhPSAwKQorICAgIHsKKyAgICAgICAgLyogQXBwbHkgZmlsdGVyIHRvIHRoZSBsZWZ0IGFuZCByaWdodCBjaGFubmVscyAqLworICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrKSgoQmlxdWFkX0luc3RhbmNlX3QqKSZwQ29lZmZpY2llbnRzLT5FcXVhbGlzZXJCaXF1YWRJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBJbnB1dE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBJbnB1dE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICB9CisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEwYjAyY2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDAxICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MjM6MDIgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0xWQ1NfRVFVQUxJU0VSX0hfXworI2RlZmluZSBfX0xWQ1NfRVFVQUxJU0VSX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBTdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEVxdWFsaXNlciBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdm9pZCAoKnBCaXF1YWRDYWxsQmFjaykgKEJpcXVhZF9JbnN0YW5jZV90KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KTsKKworfSBMVkNTX0VxdWFsaXNlcl90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnVuY3Rpb24gcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlckluaXQoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAqcFBhcmFtcyk7CisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VyKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgKnBJbnB1dE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAvKiBFUVVBTElTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWQ1NTI4MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgKQEAgLTAsMCArMSwzOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19MVkNTX0hFQURQSE9ORV9DT0VGRlNfSF9fCisjZGVmaW5lIF9fTFZDU19IRUFEUEhPTkVfQ09FRkZTX0hfXworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlIFN0ZXJlbyBFbmhhbmNlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MTI1OCAqLworI2RlZmluZSBDU19NSURETEVfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNzQ2MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjI3NzIwICovCisjZGVmaW5lIENTX01JRERMRV84MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgIC03MDQ5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE1MTI1ICovCisjZGVmaW5lIENTX01JRERMRV84MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMzAyMDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC45MjE4OTkgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19NSURETEVfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAzNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjExNDQxICovCisjZGVmaW5lIENTX1NJREVfODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEyNDYzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzgwMzQ0ICovCisjZGVmaW5lIENTX1NJREVfODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIC03NTczICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjMxMDk3ICovCisjZGVmaW5lIENTX1NJREVfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIwMzk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNjIyNDcwICovCisjZGVmaW5lIENTX1NJREVfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIC00Mjg1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTMwNzU5ICovCisjZGVmaW5lIENTX1NJREVfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDExMDI1SHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYyOTQzICovCisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICA3NTY0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yMzA4MzggKi8KKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAgICAgLTcyNjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMjE1NTkgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19NSURETEVfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0zMDkwMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjk0MzA1NiAqLworI2RlZmluZSBDU19NSURETEVfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfMTEwMjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4MjY0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NTczNzIgKi8KKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMTI4MjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zOTE0OTAgKi8KKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTU0MzYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xNjU4ODEgKi8KKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMjg4NTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC44ODA2MDggKi8KKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAzMjM5NyAqLworI2RlZmluZSBDU19TSURFXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxMjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MjE5MSAqLworI2RlZmluZSBDU19NSURETEVfMTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgNzUzNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjI5OTMyICovCisjZGVmaW5lIENTX01JRERMRV8xMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC03MjU2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjIxNDM2ICovCisjZGVmaW5lIENTX01JRERMRV8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMzEwNTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC45NDc2MTYgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19NSURETEVfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzEyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxODI5OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTU4Mzk4ICovCisjZGVmaW5lIENTX1NJREVfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTEyODUyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzkyMjExICovCisjZGVmaW5lIENTX1NJREVfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC01NDQ2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTY2MTg3ICovCisjZGVmaW5lIENTX1NJREVfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTI5MjQ3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuODkyNTUwICovCisjZGVmaW5lIENTX1NJREVfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDc3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMzI4NTYgKi8KKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTYwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjIzNzEgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDc1NTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjIzMDYzOCAqLworI2RlZmluZSBDU19NSURETEVfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtNzM0OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIyNDIzMiAqLworI2RlZmluZSBDU19NSURETEVfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTMxNDc1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuOTYwNTUwICovCisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDgxODcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQ5OTY5NSAqLworI2RlZmluZSBDU19TSURFXzE2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtNTgyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjM1NTU0MyAqLworI2RlZmluZSBDU19TSURFXzE2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtMjM2MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE0NDE1MiAqLworI2RlZmluZSBDU19TSURFXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0xNzIxNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjA1MDc4OCAqLworI2RlZmluZSBDU19TSURFXzE2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMjM2MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMTQ0MTA0ICovCisjZGVmaW5lIENTX1NJREVfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDIyMDUwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYwNzgxICovCisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICA3NDk2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yMjg3NDkgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgICAgICAgLTczNDQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMjQxMjggKi8KKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19NSURETEVfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0zMTgyNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjk3MTI2MiAqLworI2RlZmluZSBDU19NSURETEVfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjExICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40NDAxMTIgKi8KKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTQyNzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjEwOTYgKi8KKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTI5MzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xNzkwMTYgKi8KKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMTgyOTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS4xMTY3ODYgKi8KKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5OTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjE4MjUwNyAqLworI2RlZmluZSBDU19TSURFXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAyNDAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MTg4MiAqLworI2RlZmluZSBDU19NSURETEVfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgNzU1MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjMwMzk1ICovCisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC03NDA5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjI2MTE3ICovCisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMzE5MDIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC45NzM1NzMgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19NSURETEVfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgNjc5NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDE0NzcwICovCisjZGVmaW5lIENTX1NJREVfMjQwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC00NzA1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjg3MTgyICovCisjZGVmaW5lIENTX1NJREVfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0yMDkwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTI3NTg4ICovCisjZGVmaW5lIENTX1NJREVfMjQwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTIwMTQ3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuMjI5NjQ4ICovCisjZGVmaW5lIENTX1NJREVfMjQwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICA0NjIzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yODIxNzcgKi8KKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMzIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjAzMjIgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDc0ODQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjIyODQwMCAqLworI2RlZmluZSBDU19NSURETEVfMzIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtNzM4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIyNTIxNCAqLworI2RlZmluZSBDU19NSURETEVfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTMyMTE3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuOTgwMTI2ICovCisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5NzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM2NDU3OSAqLworI2RlZmluZSBDU19TSURFXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMzM5NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIwNzM1NSAqLworI2RlZmluZSBDU19TSURFXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtMjU3NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE1NzIyNCAqLworI2RlZmluZSBDU19TSURFXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0yMDg3NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjI3NDIzMSAqLworI2RlZmluZSBDU19TSURFXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEyMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzEyNDk1ICovCisjZGVmaW5lIENTX1NJREVfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDQ0MTAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYzODM0ICovCisjZGVmaW5lIENTX01JRERMRV80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICA3NjU0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yMzM1OTMgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgLTc1NzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMzEyMjUgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19NSURETEVfNDQxMDBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0zMjI5NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjk4NTU0NSAqLworI2RlZmluZSBDU19NSURETEVfNDQxMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX01JRERMRV80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfNDQxMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NjYyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yODQ1NzMgKi8KKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTQyNDIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNTg5MTAgKi8KKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIC00MjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMjU2NjIgKi8KKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMjU3NjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS41NzIyNDggKi8KKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2NDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjU4ODM5OSAqLworI2RlZmluZSBDU19TSURFXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciA0ODAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2NDQwMiAqLworI2RlZmluZSBDU19NSURETEVfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgNzY4MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjM0NDQ1ICovCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC03NjExICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjMyMjYxICovCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMzIzMzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC45ODY3MTMgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19NSURETEVfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQ2NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjcyNjA2ICovCisjZGVmaW5lIENTX1NJREVfNDgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC00Mzc0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjY2OTUyICovCisjZGVmaW5lIENTX1NJREVfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTkzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA1NjU0ICovCisjZGVmaW5lIENTX1NJREVfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTI2NDk1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuNjE3MTQxICovCisjZGVmaW5lIENTX1NJREVfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMzI5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC42MzA0MDUgKi8KKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoZSBSZXZlcmIgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUmV2ZXJiIGRlbGF5IHNldHRpbmdzIGluIHNhbXBsZXMgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU184S0haICAgICAgICAgICAgICAgICAgICAgOTMgICAgICAgICAvKiBTYW1wbGUgcmF0ZSA4a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzExS0haICAgICAgICAgICAgICAgICAgIDEyOCAgICAgICAgIC8qIFNhbXBsZSByYXRlIDExa1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzEyS0haICAgICAgICAgICAgICAgICAgIDEzOSAgICAgICAgIC8qIFNhbXBsZSByYXRlIDEya1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzE2S0haICAgICAgICAgICAgICAgICAgIDE4NiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDE2a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzIyS0haICAgICAgICAgICAgICAgICAgIDI1NiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDIya1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzI0S0haICAgICAgICAgICAgICAgICAgIDI3OSAgICAgICAgIC8qIFNhbXBsZSByYXRlIDI0a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzMyS0haICAgICAgICAgICAgICAgICAgIDM3MiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDMya1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzQ0S0haICAgICAgICAgICAgICAgICAgIDUxMiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDQ0a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haICAgICAgICAgICAgICAgICAgIDUxMiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDQ4a1MvcyAqLworCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAyMTg2NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjY3MjcxICovCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgLTIxODY1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNjY3MjcxICovCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMjE4OTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC42NjgxNzkgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19SRVZFUkJfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxMTAyNUh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAyMjkyNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjk5NjM4ICovCisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIyOTI2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNjk5NjM4ICovCisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjQ1NDYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC43NDkwOTYgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxMjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAyMzE2NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNzA2OTMxICovCisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIzMTY1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNzA2OTMxICovCisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMjUxNDQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC43NjczMjcgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxNjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAyMzg2NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNzI4MjcyICovCisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIzODY0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNzI4MjcyICovCisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMjY4OTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC44MjA2NzkgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAyMjA1MEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAxNjkyMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTE2Mzk2ICovCisjZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAgICAtMTY5MjEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC41MTYzOTYgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMTY5OTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC41MTg1MTIgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgICAgICAgLTk1MzUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yOTA5OTAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMjQwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMTU3MTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQ3OTU2NSAqLworI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgLTE1NzE0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDc5NTY1ICovCisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIwODk4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNjM3NzQ1ICovCisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgIC02NTE4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTk4OTEyICovCisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDMyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEyNDYzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zODAzNDkgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgIC0xMjQ2MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjM4MDM0OSAqLworI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0zMTE1OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjk1MDg3MyAqLworI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMTYxMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDQ5MTI3ICovCisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDQ0MTAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICA0ODcyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yOTczODkgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAtNDg3MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI5NzM4OSAqLworI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xOTY2OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjIwMDQyMyAqLworI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgNDIwMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjU2NTI5ICovCisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDQ4MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICA0NTY2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNzg2NjEgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAtNDU2NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI3ODY2MSAqLworI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMDU2MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjI1NDk5MyAqLworI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgNDk3MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzAzMzQ3ICovCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFJldmVyYiBHYWluIFNldHRpbmdzICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX0RFTEFZR0FJTiAgICAgICAgICAgICAgIDAuODAwMDAwICAgICAgICAgLyogQWxnb3JpdGhtIGRlbGF5IHBhdGggZ2FpbiAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9PVVRQVVRHQUlOICAgICAgICAgICAgICAxLjAwMDAwMCAgICAgICAgIC8qIEFsZ29yaXRobSBvdXRwdXQgZ2FpbiAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9QUk9DR0FJTiAgICAgICAgICAgICAgICAgICAxODQwMyAgICAgICAgIC8qIFByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfVU5QUk9DR0FJTiAgICAgICAgICAgICAgICAgMTg0MDMgICAgICAgICAvKiBVbnByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfR0FJTkNPUlJFQ1QgICAgICAgICAgICAgMS4wMDkzNDMgICAgICAgICAvKiBEZWxheSBtaXhlciBnYWluIGNvcnJlY3Rpb24gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoZSBFcXVhbGlzZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgODAwMCBIeiBzYW1wbGUgcmF0ZSwgQ1Mgc2NhbGVkIHdpdGggMS4wMzg0OTcgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NzU0ODAgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgMjA2OTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjI2MzMxMiAqLworI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAtOTg1OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjYwMTc0OCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAtNDU5OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI4MDY4MSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAtNzc5NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjQ3NTg2NSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAtNjY4NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjQwODE1NCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX0EwICAgICAgICAgICAgICAgICAgICAzMDkxMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTQzMzU3ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgLTE0NzI0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDQ5MzQ1ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgIC02ODY4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjA5NTk0ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgLTE1NTkzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDc1ODY1ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgLTEzMzc0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDA4MTU0ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDExMDI1SHogc2FtcGxlIHJhdGUsIENTIHNjYWxlZCB3aXRoIDEuMDI3NzYxIGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzY3NDYzICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgIDE4MDQxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4xMDExNDUgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAgIDIyNzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjEzOTAyMCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgIC0xNDE2MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjg2NDQyMyAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgICAgIDQwMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDI0NTQxICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAgLTE0ODkyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuOTA4OTMwICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0EwICAgICAgICAgICAgICAgICAgIDMxOTgzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzYwNTggKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAtMjI3ODQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC42OTUzMjYgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgLTI5NzYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wOTA4MDkgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAtMjAwMDggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC42MTA1OTQgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAtMTAxOTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zMTExNDkgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAgMTUKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMTIwMDBIeiBzYW1wbGUgcmF0ZSwgQ1Mgc2NhbGVkIHdpdGggMS4wMzI1MjEgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NzEwMTcgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgMjA5MTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjI3NjY2MSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAgIC0xNjY3MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjAxNzUxOSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgLTcyMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjA0NDEyOCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0xMTk1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjcyOTYxNiAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAtMzM1MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIwNDUzMiAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMCAgICAgICAgICAgICAgICAgICAxNjUwMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMDA3MDk1ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgLTE0Mjg1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuODcxOTEyICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgMzgxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMjMyMzIgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAtMTIyMjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC43NDU4NTcgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgLTMwOTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xODkxNzEgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTQKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMTYwMDBIeiBzYW1wbGUgcmF0ZSwgQ1Mgc2NhbGVkIHdpdGggMS4wMzEzNzggYW5kIENTRVggc2NhbGVkIHdpdGggMC43NzAxNjQgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMjA5OTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjI4MTYyOSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgIC0xNzYyNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjA3NTg3MiAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgLTY3OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjA0MTM2NSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0xMTg4MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjcyNTIzOSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAtMzY3NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIyNDM1OCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMCAgICAgICAgICAgICAgICAgICAxNzcxMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMDgxMDkxICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0ExICAgICAgICAgICAgICAgICAgLTE0MjA4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuODY3MTgzICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0EyICAgICAgICAgICAgICAgICAgIC0xMTUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDcwMjQ3ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgIC04NDQwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNTE1MTIxICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IyICAgICAgICAgICAgICAgICAgIC02OTc4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDI1ODkzICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDIyMDUwSHogc2FtcGxlIHJhdGUsIENTIHNjYWxlZCB3aXRoIDEuMDQxNTc2IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzc3Nzc5ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAgIDIyNzUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4zODg2MDUgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgICAtMjEzOTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS4zMDU3OTkgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAgICA2NTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAzOTkyMiAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAgIC0xMTc4OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjcxOTQ5NCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAgICAtMzk4NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI0MzI0NSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAyMDg1NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMjcyOTEwICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgLTIxOTcxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuMzQxMDE0ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAyNzQ0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4xNjc0NjIgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAtMTAwNjMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC42MTQyMTkgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAgLTU2NTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zNDUzODQgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTQKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMjQwMDBIeiBzYW1wbGUgcmF0ZSwgQ1Mgc2NhbGVkIHdpdGggMS4wMzQ0OTUgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NzI0OTEgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMjMwOTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjQwOTgzMiAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQTEgICAgICAgICAgICAgICAgICAgIC0yMzg2MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjQ1NjUwNiAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgMjQ4MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMTUxNDEwICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTEzMTc2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuODA0MjAxICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAgIC0yNjgzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTYzNzgzICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgIDIxMjg2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4yOTkxOTggKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTEgICAgICAgICAgICAgICAgICAtMjM3OTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS40NTI0NDcgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgIDM5NDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI0MDQ4OSAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgIC0xMDk2NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjY2OTMwMyAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAtNDgzMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI5NDk4NCAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNAorCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAzMjAwMEh6IHNhbXBsZSByYXRlLCBDUyBzY2FsZWQgd2l0aCAxLjA0NDU1OSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc4MDAwNiAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAyNTU3NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuNTYwOTg4ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTMwNzY1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuODc3NzI0ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICA2Mzg2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zODk3NDEgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAtMTQ4NjcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC45MDc0MTAgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgLTExNTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wNzA0ODkgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAgMTQ2MjMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjc4NTA0OSAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMSAgICAgICAgICAgICAgICAgIC0xODI5NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0yLjIzMzQ5NyAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgNDMxMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTI2NDMxICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgIC0zNjUzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDQ1OTM5ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgIC00MjgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNTIyNDQ2ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDQ0MTAwSHogc2FtcGxlIHJhdGUsIENTIHNjYWxlZCB3aXRoIDEuMDIyMTcwIGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzYzMjg4ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAgIDEzMzA0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS42MjM5OTMgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgICAtMTg2MDIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMi4yNzA3NDMgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgICAgIDU2NDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjY4ODgyOSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQjEgICAgICAgICAgICAgICAgICAgICAtOTE1MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjExNzE5MCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQjIgICAgICAgICAgICAgICAgICAgICAgMTA2NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMTMwMjA4ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgIDE2NjE2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMi4wMjgzMTUgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTEgICAgICAgICAgICAgICAgICAtMjM2MTMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMi44ODI0NTkgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAgIDc0MTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkwNDUzNSAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAtNDg2MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjU5MzMwOCAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9CMiAgICAgICAgICAgICAgICAgICAtMzE2MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjM4NTgxNiAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMworCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciA0ODAwMEh6IHNhbXBsZSByYXRlLCBDUyBzY2FsZWQgd2l0aCAxLjAxODYzNSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc2MDY0OCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAxMzQ0NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuNjQxMTc3ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTE5MzcyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTIuMzY0Njg3ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICA2MjI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC43NTk5MTAgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAgICAgLTk1NTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS4xNjY3NzQgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAgICAgIDE0NTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjE3ODA3NCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAxNzIwMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDIuMDk5NjU1ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgLTI1MTEwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTMuMDY1MjIwICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgICA4Mjc3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMTA0MTcgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgLTUxOTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC42MzQwMjEgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgLTI4NDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zNDczMzIgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTMKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoZSBPdXRwdXQgR2FpbiBDb3JyZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgLyogT3V0cHV0IFNoaWZ0ICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX1NISUZUTE9TUyAgICAgICAgICAgICAgICAgIDI3Nzc5ICAgICAgICAgICAgICAvKiBPdXRwdXQgU2hpZnQgbG9zcyAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9HQUlOICAgICAgICAgICAgICAgICAgICAgICAgNjg0MCAgICAgICAgICAgICAgLyogVW5wcm9jZXNzZWQgcGF0aCBnYWluICovCisjZGVmaW5lIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgICAgICAvKiBFWCBPdXRwdXQgU2hpZnQgKi8KKyNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfU0hJRlRMT1NTICAgICAgICAgICAgICAgMTg2MDAgICAgICAgICAgICAgIC8qIEVYIE91dHB1dCBTaGlmdCBsb3NzICovCisjZGVmaW5lIExWQ1NfRVhfSEVBRFBIT05FX0dBSU4gICAgICAgICAgICAgICAgICAgICA1MTA4ICAgICAgICAgICAgICAvKiBFWCBVbnByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YWE5NWQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0luaXQuYwpAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDAxICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MjM6MDIgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNTLmgiCisjaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZDU19UYWJsZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgICAqLworLyogIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAqLworLyogICAgICBoSW5zdGFuY2UgPSBJbnN0YW5jZSBoYW5kbGUgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGJhc2UgYWRkcmVzc2VzIGZvciB0aGUgaW5zdGFuY2UgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIChoSW5zdGFuY2U9TlVMTCkgaXQgaXMgICAgICAgICAgICovCisvKiAgcGFzc2VkIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGllcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZW4gY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiB0aGUgbWVtb3J5IGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiAgICAgICovCisvKiAgcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZnJlZSAoaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlKSB0aGUgICAgICAgICAgICAgICovCisvKiAgY2FwYWJpbGl0aWVzIGFyZSBpZ25vcmVkIGFuZCB0aGUgbWVtb3J5IHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kICAgICAgKi8KKy8qICBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICovCisvKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZGVmYXVsdCBjYXBhYmlsaXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkNTX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfTWVtb3J5KExWQ1NfSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19NZW1UYWJfdCAgICAgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICAqcENhcGFiaWxpdGllcykKK3sKKworICAgIExWTV9VSU5UMzIgICAgICAgICAgU2NyYXRjaFNpemU7CisgICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKKworCisgICAgLyoKKyAgICAgKiBGaWxsIGluIHRoZSBtZW1vcnkgdGFibGUKKyAgICAgKi8KKyAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogSW5zdGFuY2UgbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSAgICAgICAgID0gKExWTV9VSU5UMzIpc2l6ZW9mKExWQ1NfSW5zdGFuY2VfdCk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5UeXBlICAgICAgICAgPSBMVkNTX1BFUlNJU1RFTlQ7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBEYXRhIG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUgICAgICAgICA9IChMVk1fVUlOVDMyKXNpemVvZihMVkNTX0RhdGFfdCk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVkNTX0RBVEE7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBDb2VmZmljaWVudCBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplICAgICAgICAgPSAoTFZNX1VJTlQzMilzaXplb2YoTFZDU19Db2VmZmljaWVudF90KTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlR5cGUgICAgICAgICA9IExWQ1NfQ09FRkZJQ0lFTlQ7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBTY3JhdGNoIG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgU2NyYXRjaFNpemUgPSAoTFZNX1VJTlQzMikoTFZDU19TQ1JBVENIQlVGRkVSUypzaXplb2YoTFZNX0lOVDE2KSpwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpOyAgICAgLyogSW5wbGFjZSBwcm9jZXNzaW5nICovCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplICAgICAgICAgPSBTY3JhdGNoU2l6ZTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlR5cGUgICAgICAgICA9IExWQ1NfU0NSQVRDSDsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBSZWFkIGJhY2sgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KKyAgICAgICAgKnBNZW1vcnlUYWJsZSA9IHBJbnN0YW5jZS0+TWVtb3J5VGFibGU7CisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ3JlYXRlIGFuZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIENvbmNlcnQgU291bmQgbW9kdWxlICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBhbGdvcml0aG0gaW5zdGFuY2UgYnkgY2FsbGluZyB3aXRoICAgICAgICovCisvKiAgaEluc3RhbmNlIHNldCB0byBMVk1fTlVMTC4gSW4gdGhpcyBjYXNlIHRoZSBhbGdvcml0aG0gcmV0dXJucyB0aGUgbmV3IGluc3RhbmNlICAqLworLyogIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBmb3JjZSBhIGZ1bGwgcmUtaW5pdGlhbGlzYXRpb24gb2YgdGhlIGFsZ29yaXRobSAgICAqLworLyogIGJ5IGNhbGxpbmcgd2l0aCBoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUuIEluIHRoaXMgY2FzZSB0aGUgbWVtb3J5IHRhYmxlICAgICAgKi8KKy8qICBzaG91bGQgYmUgY29ycmVjdCBmb3IgdGhlIGluc3RhbmNlLCB0aGlzIGNhbiBiZSBlbnN1cmVkIGJ5IGNhbGxpbmcgdGhlIGZ1bmN0aW9uICovCisvKiAgTFZDU19NZW1vcnkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBjYXBhYmlsaXRpZXMgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhlIGluc3RhbmNlIGhhbmRsZSBpcyB0aGUgcG9pbnRlciB0byB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBtZW1vcnkgICovCisvKiAgICAgIHJlZ2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDIuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkNTX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgKi8KKy8qICAzLiAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBzYW1lIGNhcGFiaWxpdGllcyBhcyB1c2VkIGZvciB0aGUgICAgICovCisvKiAgICAgIGNhbGwgdG8gdGhlIG1lbW9yeSBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfSW5pdChMVkNTX0hhbmRsZV90ICAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19NZW1UYWJfdCAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICpwQ2FwYWJpbGl0aWVzKQoreworCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQ7CisgICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgICAgICAgICAqcEluc3RhbmNlOworICAgIExWQ1NfVm9sQ29ycmVjdF90ICAgICAgICAgICAgICAgKnBMVkNTX1ZvbENvcnJlY3RUYWJsZTsKKworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIGluc3RhbmNlIGhhbmRsZSBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXNlZAorICAgICAqLworICAgIGlmICgqcGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgICpwaEluc3RhbmNlID0gKExWQ1NfSGFuZGxlX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzczsKKyAgICB9CisgICAgcEluc3RhbmNlID0oTFZDU19JbnN0YW5jZV90ICAqKSpwaEluc3RhbmNlOworCisKKyAgICAvKgorICAgICAqIFNhdmUgdGhlIGNhcGFiaWxpdGllcyBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlCisgICAgICovCisgICAgcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMgPSAqcENhcGFiaWxpdGllczsKKworICAgIC8qCisgICAgICogU2F2ZSB0aGUgbWVtb3J5IHRhYmxlIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlID0gKnBNZW1vcnlUYWJsZTsKKworCisgICAgLyoKKyAgICAgKiBTZXQgYWxsIGluaXRpYWwgcGFyYW1ldGVycyB0byBpbnZhbGlkIHRvIGZvcmNlIGEgZnVsbCBpbml0aWFsaXNhdGlvbgorICAgICAqLworICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgID0gTFZDU19PRkY7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgICAgPSBMVkNTX1NQRUFLRVJUWVBFX01BWDsKKyAgICBwSW5zdGFuY2UtPk91dHB1dERldmljZSAgICAgICAgICA9IExWQ1NfSEVBRFBIT05FOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCAgID0gTFZDU19TT1VSQ0VNQVg7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuQ29tcHJlc3Nvck1vZGUgPSBMVk1fTU9ERV9PRkY7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAgICAgPSBMVk1fRlNfSU5WQUxJRDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5FZmZlY3RMZXZlbCAgICA9IDA7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuUmV2ZXJiTGV2ZWwgICAgPSAoTFZNX1VJTlQxNikweDgwMDA7CisgICAgcExWQ1NfVm9sQ29ycmVjdFRhYmxlICAgICAgICAgICAgPSAoTFZDU19Wb2xDb3JyZWN0X3QqKSZMVkNTX1ZvbENvcnJlY3RUYWJsZVswXTsKKyAgICBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlICsgKHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCooMStMVkNTX0VYX0hFQURQSE9ORVMpKSk7CisgICAgcEluc3RhbmNlLT5Wb2xDb3JyZWN0ICAgICAgICAgICAgPSBwTFZDU19Wb2xDb3JyZWN0VGFibGVbT2Zmc2V0XTsKKyAgICBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluICAgICAgICA9IDA7CisgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLDAsMCk7CisgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLDAsMCk7CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIGJ5cGFzcyB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPk1TQnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPk1TQnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlICAgID0gTFZNX05VTEw7CisgICAgcEluc3RhbmNlLT5NU0J5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAgICAgICAgICA9IExWTV9OVUxMOworICAgIHBJbnN0YW5jZS0+TVNCeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAwOworICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPk1TQnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMCwwKTsKKyAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPk1TQnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMCxMVk1fRlNfNDQxMDAsMik7CisKKworICAgIHBJbnN0YW5jZS0+TVNCeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtICAgICAgPSAwOworICAgIHBJbnN0YW5jZS0+TVNCeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSBMVk1fTlVMTDsKKyAgICBwSW5zdGFuY2UtPk1TQnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrICAgICAgICAgID0gTFZNX05VTEw7CisgICAgcEluc3RhbmNlLT5NU0J5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ICAgICAgICA9IDA7CisgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+TVNCeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwwLDApOworICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+TVNCeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwwLExWTV9GU180NDEwMCwyKTsKKworICAgIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gICAgICAgICAgPSBMVk1fRkFMU0U7CisgICAgcEluc3RhbmNlLT5iVGltZXJEb25lICAgICAgICAgICAgICAgICAgICAgICAgPSBMVk1fRkFMU0U7CisgICAgcEluc3RhbmNlLT5UaW1lclBhcmFtcy5DYWxsQmFja1BhcmFtICAgICAgICAgPSAwOworICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMucENhbGxCYWNrICAgICAgICAgICAgID0gTFZDU19UaW1lckNhbGxCYWNrOworICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMucENhbGxiYWNrSW5zdGFuY2UgICAgID0gcEluc3RhbmNlOworICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMucENhbGxCYWNrUGFyYW1zICAgICAgID0gTFZNX05VTEw7CisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmUzMDgyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkCisgICAgICRSZXZpc2lvbjogMTAwMSAkCisgICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjIzOjAyICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEhlYWRlciBmaWxlIGZvciB0aGUgcHJpdmF0ZSBsYXllciBpbnRlcmZhY2Ugb2YgY29uY2VydCBzb3VuZC4gICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlcyBpbmNsdWRlcyBhbGwgZGVmaW5pdGlvbnMsIHR5cGVzLCBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiAgICAgICAgICAgICAqLworLyogIHByb3RvdHlwZXMgcmVxdWlyZWQgYnkgdGhlIGV4ZWN1dGlvbiBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fTFZDU19QUklWQVRFX0hfXworI2RlZmluZSBfX0xWQ1NfUFJJVkFURV9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDUy5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYWxsaW5nIG9yIEFwcGxpY2F0aW9uIGxheWVyIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiTFZDU19TdGVyZW9FbmhhbmNlci5oIiAgICAgICAgICAgICAgICAvKiBTdGVyZW8gZW5oYW5jZXIgbW9kdWxlIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiTFZDU19SZXZlcmJHZW5lcmF0b3IuaCIgICAgICAgICAgICAgICAvKiBSZXZlcmJlcmF0aW9uIG1vZHVsZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkxWQ1NfRXF1YWxpc2VyLmgiICAgICAgICAgICAgICAgICAgICAgLyogRXF1YWxpc2VyIG1vZHVsZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkxWQ1NfQnlwYXNzTWl4LmgiICAgICAgICAgICAgICAgICAgICAgLyogQnlwYXNzIE1peGVyIG1vZHVsZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkxWTV9UaW1lci5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlZmluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb25maWd1cmF0aW9uIHN3aXRjaCBjb250cm9scyAqLworI2RlZmluZSBMVkNTX1NURVJFT0VOSEFOQ0VTV0lUQ0ggICAgMHgwMDAxICAgICAgLyogU3RlcmVvIGVuaGFuY2VtZW50IGVuYWJsZSBjb250cm9sICovCisjZGVmaW5lIExWQ1NfUkVWRVJCU1dJVENIICAgICAgICAgICAweDAwMDIgICAgICAvKiBSZXZlcmJlcmF0aW9uIGVuYWJsZSBjb250cm9sICovCisjZGVmaW5lIExWQ1NfRVFVQUxJU0VSU1dJVENIICAgICAgICAweDAwMDQgICAgICAvKiBFcXVhbGlzZXIgZW5hYmxlIGNvbnRyb2wgKi8KKyNkZWZpbmUgTFZDU19CWVBBU1NNSVhTV0lUQ0ggICAgICAgIDB4MDAwOCAgICAgIC8qIEJ5cGFzcyBtaXhlciBlbmFibGUgY29udHJvbCAqLworCisvKiBNZW1vcnkgKi8KKyNkZWZpbmUgTFZDU19TQ1JBVENIQlVGRkVSUyAgICAgICAgICAgICAgNiAgICAgIC8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KKworLyogR2VuZXJhbCAqLworI2RlZmluZSBMVkNTX0lOVkFMSUQgICAgICAgICAgICAgICAgMHhGRkZGICAgICAgLyogSW52YWxpZCBpbml0IHBhcmFtZXRlciAqLworI2RlZmluZSBMVkNTX0JZUEFTU19NSVhFUl9UQyAgICAgICAgMTAwICAgICAgICAgLyogQnlwYXNzIG1peGVyIHRpbWUgKi8KKworLyogQWNjZXNzIHRvIGV4dGVybmFsIGNvZWZmaWNpZW50cyB0YWJsZSAqLworI2RlZmluZSBMVkNTX05SX09GX0ZTICAgICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIExWQ1NfTlJfT0ZfQ0hBTl9DRkcgICAgICAgICAgICAgIDIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBMVk1fVUlOVDE2ICBMVkNTX0NvbmZpZ3VyYXRpb25fdDsgICAgICAgLyogSW50ZXJuYWwgYWxnb3JpdGhtIGNvbmZpZ3VyYXRpb24gKi8KKwordHlwZWRlZiBlbnVtCit7CisgICAgTFZDU19IRUFEUEhPTkUgID0gMCwKKyAgICBMVkNTX0RFVklDRV9NQVggPSBMVk1fTUFYRU5VTQorfSBMVkNTX091dHB1dERldmljZV9lbjsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVm9sdW1lIGNvcnJlY3Rpb24gc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQxNiAgIENvbXBGdWxsOyAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAxMDAlIGVmZmVjdCAqLworICAgIExWTV9JTlQxNiAgIENvbXBNaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAwJSBlZmZlY3QgKi8KKyAgICBMVk1fSU5UMTYgICBHYWluRnVsbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIENTIGdhaW4gY29ycmVjdCAxMDAlIGVmZmVjdCAqLworICAgIExWTV9JTlQxNiAgIEdhaW5NaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogQ1MgZ2FpbiBjb3JyZWN0IDAlIGVmZmVjdCAqLworfSBMVkNTX1ZvbENvcnJlY3RfdDsKKworLyogSW5zdGFuY2Ugc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIFB1YmxpYyBwYXJhbWV0ZXJzICovCisgICAgTFZDU19NZW1UYWJfdCAgICAgICAgICAgTWVtb3J5VGFibGU7ICAgICAgICAvKiBJbnN0YW5jZSBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLworICAgIExWQ1NfUGFyYW1zX3QgICAgICAgICAgIFBhcmFtczsgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLworICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgICAgIENhcGFiaWxpdGllczsgICAgICAgLyogSW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzICovCisKKyAgICAvKiBQcml2YXRlIHBhcmFtZXRlcnMgKi8KKyAgICBMVkNTX091dHB1dERldmljZV9lbiAgICBPdXRwdXREZXZpY2U7ICAgICAgIC8qIFNlbGVjdGVkIG91dHB1dCBkZXZpY2UgdHlwZSAqLworICAgIExWQ1NfVm9sQ29ycmVjdF90ICAgICAgIFZvbENvcnJlY3Q7ICAgICAgICAgLyogVm9sdW1lIGNvcnJlY3Rpb24gc2V0dGluZ3MgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBUcmFuc2l0aW9uR2FpbjsgICAgIC8qIFRyYW5zaXRpb24gZ2FpbiAqLworCisgICAgLyogU3ViLWJsb2NrIGNvbmZpZ3VyYXRpb25zICovCisgICAgTFZDU19TdGVyZW9FbmhhbmNlcl90ICAgU3RlcmVvRW5oYW5jZXI7ICAgICAvKiBTdGVyZW8gZW5oYW5jZXIgY29uZmlndXJhdGlvbiAqLworICAgIExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QgIFJldmVyYmVyYXRpb247ICAgICAgLyogUmV2ZXJiZXJhdGlvbiBjb25maWd1cmF0aW9uICovCisgICAgTFZDU19FcXVhbGlzZXJfdCAgICAgICAgRXF1YWxpc2VyOyAgICAgICAgICAvKiBFcXVhbGlzZXIgY29uZmlndXJhdGlvbiAqLworICAgIExWQ1NfQnlwYXNzTWl4X3QgICAgICAgIEJ5cGFzc01peDsgICAgICAgICAgLyogQnlwYXNzIG1peGVyIGNvbmZpZ3VyYXRpb24gKi8KKworICAgIC8qIEJ5cGFzcyB2YXJpYWJsZSAqLworICAgIExWTWl4ZXIzXzJTdF9zdCAgICAgICAgIE1TQnlwYXNzTWl4ZXI7ICAgICAgICAgICAgICAgICAgICAgIC8qIEJ5cGFzcyBtaXhlciB1c2VkIGluIHRyYW5zaXRpb25zIGluIE1TIG1vZGUgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBiSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbjsgICAgICAgICAvKiBPcGVyYXRpbmcgbW9kZSB0cmFuc2l0aW9uIGZsYWcgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBiVGltZXJEb25lOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lciBjb21wbGV0aW9uIGZsYWcgKi8KKyAgICBMVk1fVGltZXJfUGFyYW1zX3QgICAgICBUaW1lclBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lciBwYXJhbWV0ZXJzICovCisgICAgTFZNX1RpbWVyX0luc3RhbmNlX3QgICAgVGltZXJJbnN0YW5jZTsgICAgICAgICAgICAgICAgICAgICAgLyogVGltZXIgaW5zdGFuY2UgKi8KKworfSBMVkNTX0luc3RhbmNlX3Q7CisKKy8qIENvZWZmaWNpZW50IFN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBFcXVhbGlzZXJCaXF1YWRJbnN0YW5jZTsKKyAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBSZXZlcmJCaXF1YWRJbnN0YW5jZTsKKyAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBTRUJpcXVhZEluc3RhbmNlTWlkOworICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgIFNFQmlxdWFkSW5zdGFuY2VTaWRlOworCit9IExWQ1NfQ29lZmZpY2llbnRfdDsKKworLyogRGF0YSBTdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgRXF1YWxpc2VyQmlxdWFkVGFwczsKKyAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCBSZXZlcmJCaXF1YWRUYXBzOworICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190IFNFQmlxdWFkVGFwc01pZDsKKyAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCBTRUJpcXVhZFRhcHNTaWRlOworCit9IExWQ1NfRGF0YV90OworCisKK3ZvaWQgTFZDU19UaW1lckNhbGxCYWNrICggICB2b2lkKiBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcENhbGxCYWNrUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBDYWxsYmFja1BhcmFtKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgICAgICAvKiBQUklWQVRFX0ggKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45OTliOGJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYwpAQCAtMCwwICsxLDI3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDAxICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MjM6MDIgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWQ1MuaCIKKyNpbmNsdWRlICJMVkNTX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiQ29tcExpbS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1Byb2Nlc3NfQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQcm9jZXNzIGZ1bmN0aW9uIGZvciB0aGUgQ29uY2VydCBTb3VuZCBtb2R1bGUgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBibG9jayAgICAgICovCisvKiAgZGlhZ3JhbTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICBfX19fX19fX18gICAgX19fX19fX18gICAgX19fX18gICAgX19fX19fXyAgICAgX19fICAgX19fX19fICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICB8ICAgICAgICAgfCAgfCAgICAgICAgfCAgfCAgICAgfCAgfCAgICAgICB8ICAgfCAgIHwgfCAgICAgIHwgICAgICAgICAgICovCisvKiAgICAgLS0tLS0+fCBTdGVyZW8gIHwtPnwgUmV2ZXJiIHwtPnwgRXF1IHwtPnwgQWxwaGEgfC0tPnwgKyB8LXwgR2FpbiB8LS0tLT4gICAgICAqLworLyogICAgICAgIHwgIHwgRW5oYW5jZSB8ICB8X19fX19fX198ICB8X19fX198ICB8X19fX19fX3wgICB8X19ffCB8X19fX19ffCAgICAgICAgICAgKi8KKy8qICAgICAgICB8ICB8X19fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fX19fX19fICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgIHwgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT58IDEgLSBBbHBoYSB8LS0tLS18ICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgU3RlcmVvIEVuaGFuY2VyLCBSZXZlcmIgYW5kIEVxdWFsaXNlciBibG9ja3MgYXJlIGVhY2ggY29uZmlndXJlZCB0byBoYXZlICAgICovCisvKiAgdGhlaXIgZ2FpbiB0byBnaXZlIGEgbmVhciBwZWFrIHRvIHBlYWsgb3V0cHV0ICgtMC4xZEJGUykgd2l0aCBhIHdvcnN0IGNhc2UgICAgICAqLworLyogIGlucHV0IHNpZ25hbC4gVGhlIGdhaW5zIG9mIHRoZXNlIGJsb2NrcyBhcmUgcmUtY29tYmluZWQgaW4gdGhlIEFscGhhIG1peGVyIGFuZCAgKi8KKy8qICB0aGUgZ2FpbiBibG9jayBmb2xsb2luZyB0aGUgc3VtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBwcm9jZXNzaW5nIHVzZXMgdGhlIG91dHB1dCBidWZmZXIgZm9yIGRhdGEgc3RvcmFnZSBhZnRlciBlYWNoIHByb2Nlc3NpbmcgICAgKi8KKy8qICBibG9jay4gV2hlbiBwcm9jZXNzaW5nIGlzIGlucGxhY2UgYSBjb3B5IG9mIHRoZSBpbnB1dCBzaWduYWwgaXMgbWFkZSBpbiBzY3JhdGNoICovCisvKiAgbWVtb3J5IGZvciB0aGUgMS1BbHBoYSBwYXRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5EYXRhICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBidWZmZXIgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2Vzc19DUyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CisgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqcElucHV0OworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBTY3JhdGNoICA9IChMVk1fSU5UMTYgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOworICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuIGVycjsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIHByb2Nlc3NpbmcgaXMgaW5wbGFjZQorICAgICAqLworICAgIGlmIChwSW5EYXRhID09IHBPdXREYXRhKQorICAgIHsKKyAgICAgICAgLyogUHJvY2Vzc2luZyBpbnBsYWNlICovCisgICAgICAgIHBJbnB1dCA9IHBTY3JhdGNoICsgKDIqTnVtU2FtcGxlcyk7CisgICAgICAgIENvcHlfMTYoKExWTV9JTlQxNiAqKXBJbkRhdGEsICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcElucHV0LCAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBQcm9jZXNzaW5nIG91dHBsYWNlICovCisgICAgICAgIHBJbnB1dCA9IHBJbkRhdGE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYWxsIHRoZSBzdGVyZW8gZW5oYW5jZXIKKyAgICAgKi8KKyAgICBlcnI9TFZDU19TdGVyZW9FbmhhbmNlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisKKyAgICAvKgorICAgICAqIENhbGwgdGhlIHJldmVyYiBnZW5lcmF0b3IKKyAgICAgKi8KKyAgICBlcnI9TFZDU19SZXZlcmJHZW5lcmF0b3IoaEluc3RhbmNlLCAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisKKyAgICAvKgorICAgICAqIENhbGwgdGhlIGVxdWFsaXNlcgorICAgICAqLworICAgIGVycj1MVkNTX0VxdWFsaXNlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisKKyAgICAvKgorICAgICAqIENhbGwgdGhlIGJ5cGFzcyBtaXhlcgorICAgICAqLworICAgIGVycj1MVkNTX0J5cGFzc01peGVyKGhJbnN0YW5jZSwgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHByb2Nlc3NlZCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICBwSW5wdXQsICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgKHVucHJvY2Vzc2VkKSBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisKKyAgICBpZihlcnIgIT1MVkNTX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQcm9jZXNzIGZ1bmN0aW9uIGZvciB0aGUgQ29uY2VydCBTb3VuZCBtb2R1bGUuIFRoZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB0d28gICovCisvKiAgdmFyaWFudHMgb2YgdGhlIGFsZ29yaXRobSwgb25lIGZvciBoZWFkcGhvbmVzIGFuZCBvbmUgZm9yIG1vYmlsZSBzcGVha2Vycy4gICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRhIGNhbiBiZSBwcm9jZXNzZWQgaW4gdHdvIGZvcm1hdHMsIHN0ZXJlbyBvciBtb25vLWluLXN0ZXJlby4gRGF0YSBpbiBtb25vICAgICovCisvKiAgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQsIHRoZSBjYWxsaW5nIHJvdXRpbmUgbXVzdCBjb252ZXJ0IHRoZSBtb25vIHN0cmVhbSB0byAgICAqLworLyogIG1vbm8taW4tc3RlcmVvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluRGF0YSAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBPdXREYXRhICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1TYW1wbGVzICAgICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19Ub29NYW55U2FtcGxlcyAgICAgTnVtU2FtcGxlcyB3YXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gYmxvY2sgc2l6ZSAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKQoreworCisgICAgTFZDU19JbnN0YW5jZV90ICpwSW5zdGFuY2UgPShMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuIGVycjsKKworICAgIC8qCisgICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICAgKi8KKyAgICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybihMVkNTX1RPT01BTllTQU1QTEVTKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBhbGdvcml0aG0gaXMgZW5hYmxlZAorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICE9IExWQ1NfT0ZGKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2FsbCBDUyBwcm9jZXNzIGZ1bmN0aW9uCisgICAgICAgICAqLworICAgICAgICAgICAgZXJyPUxWQ1NfUHJvY2Vzc19DUyhoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDb21wcmVzcyB0byByZWR1Y2UgZXhwYW5zaW9uIGVmZmVjdCBvZiBDb25jZXJ0IFNvdW5kIGFuZCBjb3JyZWN0IHZvbHVtZQorICAgICAgICAgKiBkaWZmZXJlbmNlcyBmb3IgZGlmZmVyZW5jZSBzZXR0aW5ncy4gTm90IGFwcGxpZWQgaW4gdGVzdCBtb2RlcworICAgICAgICAgKi8KKyAgICAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWQ1NfT04pJiYocEluc3RhbmNlLT5QYXJhbXMuQ29tcHJlc3Nvck1vZGUgPT0gTFZNX01PREVfT04pKQorICAgICAgICB7CisgICAgICAgICAgICBMVk1fSU5UMTYgR2FpbiA9IHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluOworICAgICAgICAgICAgTFZNX0lOVDMyIEN1cnJlbnQxOworCisgICAgICAgICAgICBDdXJyZW50MSA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSk7CisgICAgICAgICAgICBHYWluID0gKExWTV9JTlQxNikoICBwSW5zdGFuY2UtPlZvbENvcnJlY3QuQ29tcE1pbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKCgoTFZNX0lOVDMyKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluICAqIChDdXJyZW50MSkpID4+IDE1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCgoTFZNX0lOVDMyKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wRnVsbCAqIChDdXJyZW50MSkpID4+IDE1KSApOworCisgICAgICAgICAgICBOb25MaW5Db21wX0QxNihHYWluLCAgICAgICAgICAgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKSgyKk51bVNhbXBsZXMpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSl7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSZS1pbml0IGJ5cGFzcyBtaXggd2hlbiB0aW1lciBoYXMgY29tcGxldGVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5iVGltZXJEb25lID09IExWTV9UUlVFKSAmJgorICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCA9PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnI9TFZDU19CeXBhc3NNaXhJbml0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UGFyYW1zKTsKKworICAgICAgICAgICAgICAgIGlmKGVyciAhPSBMVkNTX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICBMVk1fVGltZXIgKCAmcEluc3RhbmNlLT5UaW1lckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIHNvIGp1c3QgY29weSB0aGUgZGF0YQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb3B5XzE2KChMVk1fSU5UMTYgKilwSW5EYXRhLCAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgICAgICB9CisgICAgfQorCisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJlZmVmODQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmMKQEAgLTAsMCArMSwyNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkCisgICAgICRSZXZpc2lvbjogMTAwMSAkCisgICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjIzOjAyICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDUy5oIgorI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgiCisjaW5jbHVkZSAiTFZDX01peGVyLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkxWQ1NfVGFibGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluaXRpYWxpc2VzIHRoZSByZXZlcmIgbW9kdWxlLiBUaGUgZGVsYXkgYnVmZmVyIHNpemUgaXMgY29uZmlndXJlZCBmb3IgdGhlICAgICAgKi8KKy8qICBzYW1wbGUgcmF0ZSBhbmQgdGhlIHNwZWFrZXIgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSByb3V0aW5lIG1heSBhbHNvIGJlIGNhbGxlZCBmb3IgcmUtaW5pdGlhbGlzYXRpb24sIGkuZS4gd2hlbiBvbmUgb2YgdGhlICAgICAgKi8KKy8qICBjb250cm9sIHBhcmFtZXRlcnMgaGFzIGNoYW5nZWQuIEluIHRoaXMgY2FzZSB0aGUgZGVsYXkgYW5kIGZpbHRlcnMgYXJlIG9ubHkgICAgICovCisvKiAgcmUtaW5pdGlhbGlzZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGNvbmRpdGlvbnMgaXMgbWV0OiAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtICAgdGhlIHNhbXBsZSByYXRlIGhhcyBjaGFuZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSAgIHRoZSBzcGVha2VyIHR5cGUgY2hhbmdlcyB0by9mcm9tIHRoZSBtb2JpbGUgc3BlYWtlciAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluaWFsaXNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBJbiB0aGUgZGVsYXkgc2V0dGluZ3MgJ1NhbXBsZXMnIGlzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byB0aGUgZW5kIG9mIHRoZSAgKi8KKy8qICAgICAgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMi4gIFRoZSBudW1lcmF0b3IgY29lZmZpY2llbnRzIG9mIHRoZSBmaWx0ZXIgYXJlIG5lZ2F0ZWQgdG8gY2F1c2UgYW4gaW52ZXJzaW9uLiAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdChMVkNTX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgKnBQYXJhbXMpCit7CisKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBEZWxheTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBPZmZzZXQ7CisgICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QgICpwQ29uZmlnICAgPSAoTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAqKSZwSW5zdGFuY2UtPlJldmVyYmVyYXRpb247CisgICAgTFZDU19EYXRhX3QgICAgICAgICAgICAgKnBEYXRhICAgICA9IChMVkNTX0RhdGFfdCAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7CisgICAgTFZDU19Db2VmZmljaWVudF90ICAgICAgKnBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKyAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICBDb2VmZnM7CisgICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgKnBSZXZlcmJDb2VmVGFibGU7CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIGRlbGF5IGFuZCBmaWx0ZXJzIGlmOgorICAgICAqICAtIHRoZSBzYW1wbGUgcmF0ZSBoYXMgY2hhbmdlZAorICAgICAqICAtIHRoZSBzcGVha2VyIHR5cGUgaGFzIGNoYW5nZWQgdG8gb3IgZnJvbSB0aGUgbW9iaWxlIHNwZWFrZXIKKyAgICAgKi8KKyAgICBpZihwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUgKSAgICAgIC8qIFNhbXBsZSByYXRlIGNoYW5nZSB0ZXN0ICovCisKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFNldHVwIHRoZSBkZWxheQorICAgICAgICAgKi8KKyAgICAgICAgRGVsYXkgPSAoTFZNX1VJTlQxNilMVkNTX1N0ZXJlb0RlbGF5Q1NbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07CisKKworICAgICAgICBwQ29uZmlnLT5EZWxheVNpemUgICAgICA9IChMVk1fSU5UMTYpKDIgKiBEZWxheSk7CisgICAgICAgIHBDb25maWctPkRlbGF5T2Zmc2V0ICAgID0gMDsKKyAgICAgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKSZwQ29uZmlnLT5TdGVyZW9TYW1wbGVzWzBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBDb25maWctPlN0ZXJlb1NhbXBsZXMpL3NpemVvZihMVk1fSU5UMTYpKSk7ICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0dXAgdGhlIGZpbHRlcnMKKyAgICAgICAgICovCisgICAgICAgIE9mZnNldCA9IChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGU7CisgICAgICAgIHBSZXZlcmJDb2VmVGFibGUgPSAoQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCopJkxWQ1NfUmV2ZXJiQ29lZlRhYmxlWzBdOworCisgICAgICAgIC8qIENvbnZlcnQgaW5jb21pbmcgY29lZmZpY2llbnRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQvb3JkZXJpbmcgKi8KKyAgICAgICAgQ29lZmZzLkEwID0gKExWTV9JTlQxNilwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQTA7CisgICAgICAgIENvZWZmcy5BMSA9IChMVk1fSU5UMTYpcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkExOworICAgICAgICBDb2VmZnMuQTIgPSAoTFZNX0lOVDE2KXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5BMjsKKyAgICAgICAgQ29lZmZzLkIxID0gKExWTV9JTlQxNiktcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkIxOworICAgICAgICBDb2VmZnMuQjIgPSAoTFZNX0lOVDE2KS1wUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQjI7CisKKyAgICAgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKSZwRGF0YS0+UmV2ZXJiQmlxdWFkVGFwcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBEYXRhLT5SZXZlcmJCaXF1YWRUYXBzKS9zaXplb2YoTFZNX0lOVDE2KSkpOyAgLyogTnVtYmVyIG9mIHdvcmRzICovCisKKyAgICAgICAgQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50cy0+UmV2ZXJiQmlxdWFkSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5SZXZlcmJCaXF1YWRUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnMpOworCisgICAgICAgIC8qIENhbGxiYWNrcyAqLworICAgICAgICBzd2l0Y2gocFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLlNjYWxlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXR1cCB0aGUgbWl4ZXIKKyAgICAgICAgICovCisgICAgICAgIHBDb25maWctPlByb2NHYWluID0gKExWTV9VSU5UMTYpKEhFQURQSE9ORUdBSU5QUk9DKTsKKyAgICAgICAgcENvbmZpZy0+VW5wcm9jR2FpbiAgPSAoTFZNX1VJTlQxNikoSEVBRFBIT05FR0FJTlVOUFJPQyk7CisgICAgfQorCisgICAgaWYocEluc3RhbmNlLT5QYXJhbXMuUmV2ZXJiTGV2ZWwgIT0gcFBhcmFtcy0+UmV2ZXJiTGV2ZWwpCisgICAgeworICAgICAgICBMVk1fSU5UMzIgICBSZXZlcmJQZXJjZW50YWdlPTgzODg2OyAgICAgICAgICAgICAgICAgICAgIC8vIDEgUGVyY2VudCBSZXZlcmIgaS5lIDEvMTAwIGluIFEgMjMgZm9ybWF0CisgICAgICAgIFJldmVyYlBlcmNlbnRhZ2UqPXBQYXJhbXMtPlJldmVyYkxldmVsOyAgICAgICAgICAgICAgICAgLy8gQWN0dWFsIFJldmVyYiBMZXZlbCBpbiBRIDIzIGZvcm1hdAorICAgICAgICBwQ29uZmlnLT5SZXZlcmJMZXZlbD0oTFZNX0lOVDE2KShSZXZlcmJQZXJjZW50YWdlPj44KTsgIC8vIFJldmVyYiBMZXZlbCBpbiBRIDE1IGZvcm1hdAorICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1JldmVyYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDcmVhdGUgcmV2ZXJiIHVzaW5nIHRoZSBibG9jayBvZiBpbnB1dCBzYW1wbGVzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgYmxvY2sgICAgICovCisvKiAgZGlhZ3JhbTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICBfX19fX19fXyAgICAgICAgICAgICAgX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgX19fX18gICAgIF9fX19fX18gICAgfCAgICAgICAgfC0tLS0tLS0tLS0tPnwgICAgICAgIHwgICAgX19fX19fICAgICBfX18gICAgICAqLworLyogICAgfCAgICAgfCAgIHwgICAgICAgfCAgIHwgU3RlcmVvIHwgICAgICAgICAgICB8IEwgJiBSICB8ICAgfCAgICAgIHwgICB8ICAgfCAgICAgKi8KKy8qIC0tPnwgTFBGIHwtLT58IERlbGF5IHwtLT58ICAgdG8gICB8ICAgIF9fX18gICAgfCAgIHRvICAgfC0tPnwgR2FpbiB8LS0+fCArIHwtLT4gICovCisvKiAgfCB8X19fX198ICAgfF9fX19fX198ICAgfCBMICYgUiAgfCAgIHwgICAgfCAgIHwgU3RlcmVvIHwgICB8X19fX19ffCAgIHxfX198ICAgICAqLworLyogIHwgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIHwtLT58IC0xIHwtLT58ICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgKi8KKy8qICB8ICAgICAgICAgICAgICAgICAgICAgICB8X19fX19fX198ICAgfF9fX198ICAgfF9fX19fX19ffCAgICAgICAgICAgICAgICB8ICAgICAgICovCisvKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAqLworLyogIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIGlucHV0IGJ1ZmZlciBpcyBicm9rZW4gaW4gdG8gc3ViLWJsb2NrcyBvZiB0aGUgc2l6ZSBvZiB0aGUgZGVsYXkgb3IgbGVzcy4gICAqLworLyogIFRoaXMgYWxsb3dzIHRoZSBkZWxheSBidWZmZXIgdG8gYmUgdHJlYXRlZCBhcyBhIGNpcmN1bGFyIGJ1ZmZlciBidXQgcHJvY2Vzc2VkICAgKi8KKy8qICBhcyBhIGxpbmVhciBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbkRhdGEgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwT3V0RGF0YSAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnVtU2FtcGxlcyAgICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFByb2Nlc3MgaW4gYmxvY2tzIG9mIHNhbXBsZXMgdGhlIHNpemUgb2YgdGhlIGRlbGF5IHdoZXJlIHBvc3NpYmxlLCBpZiBub3QgICAqLworLyogICAgICB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgbGVmdCBvdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAyLiAgVGhlIEdhaW4gaXMgY29tYmluZWQgd2l0aCB0aGUgTFBGIGFuZCBpbmNvcnBvcmF0ZWQgaW4gdG8gdGhlIGNvZWZmaWNpZW50cyAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3IoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcykKK3sKKworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX1JldmVyYkdlbmVyYXRvcl90ICAqcENvbmZpZyAgID0gKExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QgKikmcEluc3RhbmNlLT5SZXZlcmJlcmF0aW9uOworICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgICAgICpwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBTY3JhdGNoICA9IChMVk1fSU5UMTYgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOworCisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIGRhdGEgdG8gdGhlIG91dHB1dCBpbiBvdXRwbGFjZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBSZXZlcmIgbm90IHJlcXVpcmVkIHNvIGp1c3QgY29weSB0aGUgZGF0YQorICAgICAgICAgKi8KKyAgICAgICAgQ29weV8xNigoTFZNX0lOVDE2ICopcEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisgICAgfQorCisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSByZXZlcmIgaXMgcmVxdWlyZWQKKyAgICAgKi8KKyAgICBpZiAoKChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSA9PSBMVkNTX0hFQURQSE9ORSkgfHwgICAgICAgICAgIC8qIERpc2FibGUgd2hlbiBDUzRNUyBpbiBzdGVyZW8gbW9kZSAqLworICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlID09IExWQ1NfRVhfSEVBRFBIT05FUykgfHwKKyAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgIT0gTFZDU19TVEVSRU8pKSAgJiYKKyAgICAgICAgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19SRVZFUkJTV0lUQ0gpICE9MCkpICAgIC8qIEZvciB2YWxpZGF0aW9uIHRlc3RpbmcgKi8KKyAgICB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiBDb3B5IHRoZSBpbnB1dCBkYXRhIHRvIHNjcmF0Y2ggbWVtb3J5IGFuZCBmaWx0ZXIgaXQgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgIC8qCisgICAgICAgICAqIENvcHkgdGhlIGlucHV0IGRhdGEgdG8gdGhlIHNjcmF0Y2ggbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBDb3B5XzE2KChMVk1fSU5UMTYgKilwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KKworCisgICAgICAgIC8qCisgICAgICAgICAqIEZpbHRlciB0aGUgZGF0YQorICAgICAgICAgKi8KKyAgICAgICAgKHBDb25maWctPnBCaXF1YWRDYWxsQmFjaykoKEJpcXVhZF9JbnN0YW5jZV90KikmcENvZWZmaWNpZW50cy0+UmV2ZXJiQmlxdWFkSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgIE11bHQzc18xNngxNiggKExWTV9JTlQxNiAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgIHBDb25maWctPlJldmVyYkxldmVsLAorICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpKTsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBkZWxheSBtaXgKKyAgICAgICAgICovCisgICAgICAgIERlbGF5TWl4XzE2eDE2KChMVk1fSU5UMTYgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgJnBDb25maWctPlN0ZXJlb1NhbXBsZXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWctPkRlbGF5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICZwQ29uZmlnLT5EZWxheU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworCisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisKKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjExNjRiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDAxICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MjM6MDIgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0xWQ1NfUkVWRVJCR0VORVJBVE9SX0hfXworI2RlZmluZSBfX0xWQ1NfUkVWRVJCR0VORVJBVE9SX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNfTWl4ZXIuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIERlZmluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSAgICAgSEVBRFBIT05FR0FJTlBST0MgICAgICAgICAgIExWQ1NfSEVBRFBIT05FX1BST0NHQUlOCisjZGVmaW5lICAgICBIRUFEUEhPTkVHQUlOVU5QUk9DICAgICAgICAgTFZDU19IRUFEUEhPTkVfVU5QUk9DR0FJTgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgU3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIFJldmVyYmVyYXRpb24gbW9kdWxlIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKworICAgIC8qIFN0ZXJlbyBkZWxheSAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBEZWxheVNpemU7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIERlbGF5T2Zmc2V0OworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBQcm9jR2FpbjsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgVW5wcm9jR2FpbjsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIFN0ZXJlb1NhbXBsZXNbMipMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haXTsKKworICAgIC8qIFJldmVyYiBMZXZlbCAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBSZXZlcmJMZXZlbDsKKworICAgIC8qIEZpbHRlciAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFjaykgKEJpcXVhZF9JbnN0YW5jZV90KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KTsKKworfSBMVkNTX1JldmVyYkdlbmVyYXRvcl90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGdW5jdGlvbiBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvckluaXQoTFZDU19IYW5kbGVfdCAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICpwUGFyYW1zKTsKKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3IoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgIC8qIFJFVkVSQl9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmZjQ3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuYwpAQCAtMCwwICsxLDI2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICRBdXRob3I6IGJlcTA3NzE2ICQKKyAgICAgJFJldmlzaW9uOiAxMDAxICQKKyAgICAgJERhdGU6IDIwMTAtMDYtMjggMTM6MjM6MDIgKzAyMDAgKE1vbiwgMjggSnVuIDIwMTApICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNTLmgiCisjaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZDU19TdGVyZW9FbmhhbmNlci5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJMVkNTX1RhYmxlcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1N0ZXJlb0VuaGFuY2VJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbml0aWFsaXNlcyB0aGUgc3RlcmVvIGVuaGFuY2VtZW50IG1vZHVsZSBiYXNlZCBvbiB0aGUgc2FtcGxlIHJhdGUuICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBmdW5jdGlvbiBzZWxlY3RzIHRoZSBjb2VmZmljaWVudHMgZm9yIHRoZSBmaWx0ZXJzIGFuZCBjbGVhcnMgdGhlIGRhdGEgICAgICAgKi8KKy8qICBoaXN0b3J5LiBJdCBpcyBhbHNvIHVzZWQgZm9yIHJlLWluaXRpYWxpc2F0aW9uIHdoZW4gb25lIG9mIHRoZSBzeXN0ZW0gY29udHJvbCAgICovCisvKiAgcGFyYW1ldGVycyBjaGFuZ2VzIGJ1dCB3aWxsIG9ubHkgY2hhbmdlIHRoZSBjb2VmZmljaWVudHMgYW5kIGNsZWFyIHRoZSBoaXN0b3J5ICAqLworLyogIGlmIHRoZSBzYW1wbGUgcmF0ZSBvciBzcGVha2VyIHR5cGUgaGFzIGNoYW5nZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1NFbmhhbmNlckluaXQoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKK3sKKworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE9mZnNldDsKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19TdGVyZW9FbmhhbmNlcl90ICAgKnBDb25maWcgICA9IChMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgKikmcEluc3RhbmNlLT5TdGVyZW9FbmhhbmNlcjsKKyAgICBMVkNTX0RhdGFfdCAgICAgICAgICAgICAqcERhdGEgICAgID0gKExWQ1NfRGF0YV90ICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzczsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50ID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisgICAgRk9fQzE2X0NvZWZzX3QgICAgICAgICAgQ29lZmZzTWlkOworICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgIENvZWZmc1NpZGU7CisgICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAqcFNFU2lkZUNvZWZzOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgc2FtcGxlIHJhdGUgb3Igc3BlYWtlciB0eXBlIGhhcyBjaGFuZ2VkIHVwZGF0ZSB0aGUgZmlsdGVycworICAgICAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgIT0gcFBhcmFtcy0+U3BlYWtlclR5cGUpKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0IHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGJhc2VkIG9uIHRoZSBzYW1wbGUgcmF0ZQorICAgICAgICAgKi8KKyAgICAgICAgLyogTWlkIGZpbHRlciAqLworICAgICAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlOworCisgICAgICAgIC8qIENvbnZlcnQgaW5jb21pbmcgY29lZmZpY2llbnRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQvb3JkZXJpbmcgKi8KKyAgICAgICAgQ29lZmZzTWlkLkEwID0gKExWTV9JTlQxNikgTFZDU19TRU1pZENvZWZUYWJsZVtPZmZzZXRdLkEwOworICAgICAgICBDb2VmZnNNaWQuQTEgPSAoTFZNX0lOVDE2KSBMVkNTX1NFTWlkQ29lZlRhYmxlW09mZnNldF0uQTE7CisgICAgICAgIENvZWZmc01pZC5CMSA9IChMVk1fSU5UMTYpLUxWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5CMTsKKworICAgICAgICAvKiBDbGVhciB0aGUgdGFwcyAqLworICAgICAgICBMb2FkQ29uc3RfMTYoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopJnBEYXRhLT5TRUJpcXVhZFRhcHNNaWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocERhdGEtPlNFQmlxdWFkVGFwc01pZCkvc2l6ZW9mKExWTV9VSU5UMTYpKSk7ICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKworICAgICAgICBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VNaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5TRUJpcXVhZFRhcHNNaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmc01pZCk7CisKKyAgICAgICAgLyogQ2FsbGJhY2tzICovCisgICAgICAgIGlmKExWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5TY2FsZT09MTUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFja19NaWQgID0gRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDE7CisgICAgICAgIH0KKworICAgICAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNikocFBhcmFtcy0+U2FtcGxlUmF0ZSk7CisgICAgICAgIHBTRVNpZGVDb2VmcyA9IChCaXF1YWRBMDEyQjEyQ29lZnNTUF90KikmTFZDU19TRVNpZGVDb2VmVGFibGVbMF07CisKKyAgICAgICAgLyogU2lkZSBmaWx0ZXIgKi8KKyAgICAgICAgLyogQ29udmVydCBpbmNvbWluZyBjb2VmZmljaWVudHMgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdC9vcmRlcmluZyAqLworICAgICAgICBDb2VmZnNTaWRlLkEwID0gKExWTV9JTlQxNikgcFNFU2lkZUNvZWZzW09mZnNldF0uQTA7CisgICAgICAgIENvZWZmc1NpZGUuQTEgPSAoTFZNX0lOVDE2KSBwU0VTaWRlQ29lZnNbT2Zmc2V0XS5BMTsKKyAgICAgICAgQ29lZmZzU2lkZS5BMiA9IChMVk1fSU5UMTYpIHBTRVNpZGVDb2Vmc1tPZmZzZXRdLkEyOworICAgICAgICBDb2VmZnNTaWRlLkIxID0gKExWTV9JTlQxNiktcFNFU2lkZUNvZWZzW09mZnNldF0uQjE7CisgICAgICAgIENvZWZmc1NpZGUuQjIgPSAoTFZNX0lOVDE2KS1wU0VTaWRlQ29lZnNbT2Zmc2V0XS5CMjsKKworICAgICAgICAvKiBDbGVhciB0aGUgdGFwcyAqLworICAgICAgICBMb2FkQ29uc3RfMTYoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopJnBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocERhdGEtPlNFQmlxdWFkVGFwc1NpZGUpL3NpemVvZihMVk1fVUlOVDE2KSkpOyAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKworCisgICAgICAgIC8qIENhbGxiYWNrcyAqLworICAgICAgICBzd2l0Y2gocFNFU2lkZUNvZWZzW09mZnNldF0uU2NhbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlU2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+U0VCaXF1YWRUYXBzU2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnNTaWRlKTsKKworICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFja19TaWRlICA9IEJRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VTaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmc1NpZGUpOworCisgICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX1NpZGUgID0gQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfU3RlcmVvRW5oYW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEVuaGFuY2UgdGhlIHN0ZXJlbyBpbWFnZSBpbiB0aGUgaW5wdXQgc2FtcGxlcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGJsb2NrICAgICAgKi8KKy8qICBkaWFncmFtOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIF9fX19fX19fICAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICBfX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIHwgICAgICAgIHwgIE1pZGRsZSAgIHwgVHJlYmxlIHwgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICB8ICAgICAgICB8LS0tLS0tLS0tLT58IEJvb3N0ICB8LS0tLS0tLS0+fCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgfCBTdGVyZW8gfCAgICAgICAgICAgfF9fX19fX19ffCAgICAgICAgIHwgTSAmIFMgIHwgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0tPnwgICB0byAgIHwgICAgICAgICAgICBfX19fX19fXyAgICAgICAgICB8ICAgdG8gICB8LS0+ICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICB8IE0gJiBTICB8ICBTaWRlICAgICB8ICAgICAgICB8ICAgICAgICAgfCBTdGVyZW8gfCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgfCAgICAgICAgfC0tLS0tLS0tLS0+fCBTaWRlICAgfC0tLS0tLS0tPnwgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIHxfX19fX19fX3wgICAgICAgICAgIHwgQm9vc3QgIHwgICAgICAgICB8X19fX19fX198ICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX19fX198ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIElmIHRoZSBpbnB1dCBzaWduYWwgaXMgYSBtb25vIHNpZ25hbCB0aGVyZSB3aWxsIGJlIG5vIHNpZGUgc2lnbmFsIGFuZCBoZW5jZSAgICAgKi8KKy8qICB0aGUgc2lkZSBmaWx0ZXIgd2lsbCBub3QgYmUgcnVuLiBJbiBtb2JpbGUgc3BlYWtlciBtb2RlIHRoZSBtaWRkbGUgZmlsdGVyIGlzICAgICovCisvKiAgbm90IHJlcXVpcmVkIGFuZCB0aGUgVHJlYmJsZSBib29zdCBmaWx0ZXIgaXMgcmVwbGFjZWQgYnkgYSBzaW1wbGUgZ2FpbiBibG9jay4gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5EYXRhICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGUgc2lkZSBmaWx0ZXIgaXMgbm90IHVzZWQgaW4gTW9iaWxlIFNwZWFrZXIgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1N0ZXJlb0VuaGFuY2VyKExWQ1NfSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICBOdW1TYW1wbGVzKQoreworCisgICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAgICpwQ29uZmlnICAgPSAoTFZDU19TdGVyZW9FbmhhbmNlcl90ICopJnBJbnN0YW5jZS0+U3RlcmVvRW5oYW5jZXI7CisgICAgTFZDU19Db2VmZmljaWVudF90ICAgICAgKnBDb2VmZmljaWVudCA9IChMVkNTX0NvZWZmaWNpZW50X3QgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwU2NyYXRjaCAgPSAoTFZNX0lOVDE2ICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIFN0ZXJlbyBFbmhhbmNlciBpcyBlbmFibGVkCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19TVEVSRU9FTkhBTkNFU1dJVENIKSAhPSAwKQorICAgICAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIENvbnZlcnQgZnJvbSBzdGVyZW8gdG8gbWlkZGxlIGFuZCBzaWRlCisgICAgICAgICAqLworICAgICAgICBGcm9tMmlUb01TXzE2eDE2KHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2grTnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IGZpbHRlciB0byB0aGUgbWlkZGxlIHNpZ25hbAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+T3V0cHV0RGV2aWNlID09IExWQ1NfSEVBRFBIT05FKQorICAgICAgICB7CisgICAgICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX01pZCkoKEJpcXVhZF9JbnN0YW5jZV90KikmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlTWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIE11bHQzc18xNngxNihwU2NyYXRjaCwgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpcENvbmZpZy0+TWlkR2FpbiwgICAgICAvKiBHYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgdGhlIGZpbHRlciB0aGUgc2lkZSBzaWduYWwgb25seSBpbiBzdGVyZW8gbW9kZSBmb3IgaGVhZHBob25lcworICAgICAgICAgKiBhbmQgaW4gYWxsIG1vZGVzIGZvciBtb2JpbGUgc3BlYWtlcnMKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZDU19TVEVSRU8pCisgICAgICAgIHsKKyAgICAgICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfU2lkZSkoKEJpcXVhZF9JbnN0YW5jZV90KikmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlU2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKShwU2NyYXRjaCArIE51bVNhbXBsZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopKHBTY3JhdGNoICsgTnVtU2FtcGxlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBDb252ZXJ0IGZyb20gbWlkZGxlIGFuZCBzaWRlIHRvIHN0ZXJlbworICAgICAgICAgKi8KKyAgICAgICAgTVNUbzJpX1NhdF8xNngxNihwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCtOdW1TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIHN0ZXJlbyBlbmhhbmNlciBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKKyAgICAgICAgICovCisgICAgICAgIENvcHlfMTYoKExWTV9JTlQxNiAqKXBJbkRhdGEsICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcE91dERhdGEsICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworCisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzNmNjI5NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAkQXV0aG9yOiBiZXEwNzcxNiAkCisgICAgICRSZXZpc2lvbjogMTAwMSAkCisgICAgICREYXRlOiAyMDEwLTA2LTI4IDEzOjIzOjAyICswMjAwIChNb24sIDI4IEp1biAyMDEwKSAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19MVkNTX1NURVJFT0VOSEFOQ0VSX0hfXworI2RlZmluZSBfX0xWQ1NfU1RFUkVPRU5IQU5DRVJfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkZpbHRlcnMuaCIgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJMVkNTX0hlYWRwaG9uZV9Db2VmZnMuaCIgICAgICAgICAgLyogSGVhZHBob25lIGNvZWZmaWNpZW50cyAqLworI2luY2x1ZGUgIkJJUVVBRC5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgU3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTdGVyZW8gZW5oYW5jZXIgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qCisgICAgICogTWlkZGxlIGZpbHRlcgorICAgICAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrX01pZCkoQmlxdWFkX0luc3RhbmNlX3QqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYpOworCisgICAgLyoKKyAgICAgKiBTaWRlIGZpbHRlcgorICAgICAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrX1NpZGUpKEJpcXVhZF9JbnN0YW5jZV90KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KTsKKworICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgTWlkR2FpbjsgICAgICAgICAgICAvKiBNaWRkbGUgZ2FpbiBpbiBtb2JpbGUgc3BlYWtlciBtb2RlICovCisKK30gTFZDU19TdGVyZW9FbmhhbmNlcl90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnVuY3Rpb24gcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1NFbmhhbmNlckluaXQoTFZDU19IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgICpwUGFyYW1zKTsKKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TdGVyZW9FbmhhbmNlcihMVkNTX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcyk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAvKiBTVEVSRU9FTkhBTkNFX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZDRlYjFlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jCkBAIC0wLDAgKzEsNDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogYmVxMDc3MTYgJAorICAgICAkUmV2aXNpb246IDEwMDEgJAorICAgICAkRGF0ZTogMjAxMC0wNi0yOCAxMzoyMzowMiArMDIwMCAoTW9uLCAyOCBKdW4gMjAxMCkgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiCisjaW5jbHVkZSAiRmlsdGVycy5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJCSVFVQUQuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJpcXVhZCBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkxWQ1NfSGVhZHBob25lX0NvZWZmcy5oIiAgICAgICAgICAgICAgLyogSGVhZHBob25lIGNvZWZmaWNpZW50cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudCBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb2VmZmljaWVudCB0YWJsZSBmb3IgdGhlIG1pZGRsZSBmaWx0ZXIgKi8KK2NvbnN0IEJpcXVhZEEwMUIxQ29lZnNTUF90IExWQ1NfU0VNaWRDb2VmVGFibGVbXSA9IHsKKyAgICB7Q1NfTUlERExFXzgwMDBfQTAsICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV84MDAwX0ExLAorICAgICBDU19NSURETEVfODAwMF9CMSwKKyAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV84MDAwX1NDQUxFfSwKKyAgICB7Q1NfTUlERExFXzExMDI1X0EwLCAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfMTEwMjVfQTEsCisgICAgIENTX01JRERMRV8xMTAyNV9CMSwKKyAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV8xMTAyNV9TQ0FMRX0sCisgICAge0NTX01JRERMRV8xMjAwMF9BMCwgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfTUlERExFXzEyMDAwX0ExLAorICAgICBDU19NSURETEVfMTIwMDBfQjEsCisgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfMTIwMDBfU0NBTEV9LAorICAgIHtDU19NSURETEVfMTYwMDBfQTAsICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV8xNjAwMF9BMSwKKyAgICAgQ1NfTUlERExFXzE2MDAwX0IxLAorICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzE2MDAwX1NDQUxFfSwKKyAgICB7Q1NfTUlERExFXzIyMDUwX0EwLCAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfMjIwNTBfQTEsCisgICAgIENTX01JRERMRV8yMjA1MF9CMSwKKyAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV8yMjA1MF9TQ0FMRX0sCisgICAge0NTX01JRERMRV8yNDAwMF9BMCwgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfTUlERExFXzI0MDAwX0ExLAorICAgICBDU19NSURETEVfMjQwMDBfQjEsCisgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfMjQwMDBfU0NBTEV9LAorICAgIHtDU19NSURETEVfMzIwMDBfQTAsICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV8zMjAwMF9BMSwKKyAgICAgQ1NfTUlERExFXzMyMDAwX0IxLAorICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzMyMDAwX1NDQUxFfSwKKyAgICB7Q1NfTUlERExFXzQ0MTAwX0EwLCAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfNDQxMDBfQTEsCisgICAgIENTX01JRERMRV80NDEwMF9CMSwKKyAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV80NDEwMF9TQ0FMRX0sCisgICAge0NTX01JRERMRV80ODAwMF9BMCwgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfTUlERExFXzQ4MDAwX0ExLAorICAgICBDU19NSURETEVfNDgwMDBfQjEsCisgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfNDgwMDBfU0NBTEV9fTsKKworLyogQ29lZmZpY2llbnQgdGFibGUgZm9yIHRoZSBzaWRlIGZpbHRlciAqLworY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX1NFU2lkZUNvZWZUYWJsZVtdID0geworICAgIC8qIEhlYWRwaG9uZSBTaWRlIGNvZWZmaWNpZW50cyAqLworICAgIHtDU19TSURFXzgwMDBfQTAsICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV84MDAwX0ExLAorICAgICBDU19TSURFXzgwMDBfQTIsCisgICAgIENTX1NJREVfODAwMF9CMSwKKyAgICAgQ1NfU0lERV84MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV84MDAwX1NDQUxFfSwKKyAgICB7Q1NfU0lERV8xMTAyNV9BMCwgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19TSURFXzExMDI1X0ExLAorICAgICBDU19TSURFXzExMDI1X0EyLAorICAgICBDU19TSURFXzExMDI1X0IxLAorICAgICBDU19TSURFXzExMDI1X0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV8xMTAyNV9TQ0FMRX0sCisgICAge0NTX1NJREVfMTIwMDBfQTAsICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV8xMjAwMF9BMSwKKyAgICAgQ1NfU0lERV8xMjAwMF9BMiwKKyAgICAgQ1NfU0lERV8xMjAwMF9CMSwKKyAgICAgQ1NfU0lERV8xMjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfMTIwMDBfU0NBTEV9LAorICAgIHtDU19TSURFXzE2MDAwX0EwLCAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfMTYwMDBfQTEsCisgICAgIENTX1NJREVfMTYwMDBfQTIsCisgICAgIENTX1NJREVfMTYwMDBfQjEsCisgICAgIENTX1NJREVfMTYwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzE2MDAwX1NDQUxFfSwKKyAgICB7Q1NfU0lERV8yMjA1MF9BMCwgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19TSURFXzIyMDUwX0ExLAorICAgICBDU19TSURFXzIyMDUwX0EyLAorICAgICBDU19TSURFXzIyMDUwX0IxLAorICAgICBDU19TSURFXzIyMDUwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV8yMjA1MF9TQ0FMRX0sCisgICAge0NTX1NJREVfMjQwMDBfQTAsICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV8yNDAwMF9BMSwKKyAgICAgQ1NfU0lERV8yNDAwMF9BMiwKKyAgICAgQ1NfU0lERV8yNDAwMF9CMSwKKyAgICAgQ1NfU0lERV8yNDAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfMjQwMDBfU0NBTEV9LAorICAgIHtDU19TSURFXzMyMDAwX0EwLCAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfMzIwMDBfQTEsCisgICAgIENTX1NJREVfMzIwMDBfQTIsCisgICAgIENTX1NJREVfMzIwMDBfQjEsCisgICAgIENTX1NJREVfMzIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzMyMDAwX1NDQUxFfSwKKyAgICB7Q1NfU0lERV80NDEwMF9BMCwgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19TSURFXzQ0MTAwX0ExLAorICAgICBDU19TSURFXzQ0MTAwX0EyLAorICAgICBDU19TSURFXzQ0MTAwX0IxLAorICAgICBDU19TSURFXzQ0MTAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV80NDEwMF9TQ0FMRX0sCisgICAge0NTX1NJREVfNDgwMDBfQTAsICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV80ODAwMF9BMSwKKyAgICAgQ1NfU0lERV80ODAwMF9BMiwKKyAgICAgQ1NfU0lERV80ODAwMF9CMSwKKyAgICAgQ1NfU0lERV80ODAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfNDgwMDBfU0NBTEV9Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEVxdWFsaXNlciBjb2VmZmljaWVudCBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90IExWQ1NfRXF1YWxpc2VyQ29lZlRhYmxlW10gPSB7CisgICAgLyogSGVhZHBob25lIGNvZWZmaWNpZW50cyAqLworICAgIHtDU19FUVVBTElTRVJfODAwMF9BMCwgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzgwMDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl84MDAwX0EyLAorICAgICBDU19FUVVBTElTRVJfODAwMF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzgwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfODAwMF9TQ0FMRX0sCisgICAge0NTX0VRVUFMSVNFUl8xMTAyNV9BMCwgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzExMDI1X0ExLAorICAgICBDU19FUVVBTElTRVJfMTEwMjVfQTIsCisgICAgIENTX0VRVUFMSVNFUl8xMTAyNV9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzExMDI1X0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzExMDI1X1NDQUxFfSwKKyAgICB7Q1NfRVFVQUxJU0VSXzEyMDAwX0EwLCAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19FUVVBTElTRVJfMTIwMDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl8xMjAwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzEyMDAwX0IxLAorICAgICBDU19FUVVBTElTRVJfMTIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfMTIwMDBfU0NBTEV9LAorICAgIHtDU19FUVVBTElTRVJfMTYwMDBfQTAsICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX0VRVUFMSVNFUl8xNjAwMF9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzE2MDAwX0EyLAorICAgICBDU19FUVVBTElTRVJfMTYwMDBfQjEsCisgICAgIENTX0VRVUFMSVNFUl8xNjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl8xNjAwMF9TQ0FMRX0sCisgICAge0NTX0VRVUFMSVNFUl8yMjA1MF9BMCwgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzIyMDUwX0ExLAorICAgICBDU19FUVVBTElTRVJfMjIwNTBfQTIsCisgICAgIENTX0VRVUFMSVNFUl8yMjA1MF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzIyMDUwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzIyMDUwX1NDQUxFfSwKKyAgICB7Q1NfRVFVQUxJU0VSXzI0MDAwX0EwLCAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19FUVVBTElTRVJfMjQwMDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl8yNDAwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzI0MDAwX0IxLAorICAgICBDU19FUVVBTElTRVJfMjQwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfMjQwMDBfU0NBTEV9LAorICAgIHtDU19FUVVBTElTRVJfMzIwMDBfQTAsICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX0VRVUFMSVNFUl8zMjAwMF9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzMyMDAwX0EyLAorICAgICBDU19FUVVBTElTRVJfMzIwMDBfQjEsCisgICAgIENTX0VRVUFMSVNFUl8zMjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl8zMjAwMF9TQ0FMRX0sCisgICAge0NTX0VRVUFMSVNFUl80NDEwMF9BMCwgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzQ0MTAwX0ExLAorICAgICBDU19FUVVBTElTRVJfNDQxMDBfQTIsCisgICAgIENTX0VRVUFMSVNFUl80NDEwMF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzQ0MTAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzQ0MTAwX1NDQUxFfSwKKyAgICB7Q1NfRVFVQUxJU0VSXzQ4MDAwX0EwLCAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19FUVVBTElTRVJfNDgwMDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl80ODAwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IxLAorICAgICBDU19FUVVBTElTRVJfNDgwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfNDgwMDBfU0NBTEV9LAorCisgICAgLyogQ29uY2VydCBTb3VuZCBFWCBIZWFkcGhvbmUgY29lZmZpY2llbnRzICovCisgICAge0NTRVhfRVFVQUxJU0VSXzgwMDBfQTAsICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU0VYX0VRVUFMSVNFUl84MDAwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl84MDAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl84MDAwX0IxLAorICAgICBDU0VYX0VRVUFMSVNFUl84MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfODAwMF9TQ0FMRX0sCisgICAge0NTRVhfRVFVQUxJU0VSXzExMDI1X0EwLCAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzExMDI1X0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl8xMTAyNV9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRX0sCisgICAge0NTRVhfRVFVQUxJU0VSXzEyMDAwX0EwLCAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzEyMDAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl8xMjAwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8xMjAwMF9TQ0FMRX0sCisgICAge0NTRVhfRVFVQUxJU0VSXzE2MDAwX0EwLCAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzE2MDAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl8xNjAwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8xNjAwMF9TQ0FMRX0sCisgICAge0NTRVhfRVFVQUxJU0VSXzIyMDUwX0EwLCAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzIyMDUwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl8yMjA1MF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRX0sCisgICAge0NTRVhfRVFVQUxJU0VSXzI0MDAwX0EwLCAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzI0MDAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl8yNDAwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8yNDAwMF9TQ0FMRX0sCisgICAge0NTRVhfRVFVQUxJU0VSXzMyMDAwX0EwLCAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzMyMDAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl8zMjAwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8zMjAwMF9TQ0FMRX0sCisgICAge0NTRVhfRVFVQUxJU0VSXzQ0MTAwX0EwLCAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl80NDEwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl80NDEwMF9TQ0FMRX0sCisgICAge0NTRVhfRVFVQUxJU0VSXzQ4MDAwX0EwLCAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl80ODAwMF9TQ0FMRX0KK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV2ZXJiIGRlbGF5IGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFN0ZXJlbyBkZWxheSB0YWJsZSBmb3IgQ29uY2VydCBTb3VuZCAqLworY29uc3QgTFZNX1VJTlQxNiAgICBMVkNTX1N0ZXJlb0RlbGF5Q1NbXSA9IHsKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzhLSFosCisgICAgTFZDU19TVEVSRU9ERUxBWV9DU18xMUtIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzEyS0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTZLSFosCisgICAgTFZDU19TVEVSRU9ERUxBWV9DU18yMktIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzI0S0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMzJLSFosCisgICAgTFZDU19TVEVSRU9ERUxBWV9DU180NEtIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0hafTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV2ZXJiIGNvZWZmaWNpZW50cyBjb25zdGFudCB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2NvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19SZXZlcmJDb2VmVGFibGVbXSA9IHsKKyAgICAvKiBIZWFkcGhvbmUgY29lZmZpY2llbnRzICovCisgICAge0NTX1JFVkVSQl84MDAwX0EwLCAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfUkVWRVJCXzgwMDBfQTEsCisgICAgIENTX1JFVkVSQl84MDAwX0EyLAorICAgICBDU19SRVZFUkJfODAwMF9CMSwKKyAgICAgQ1NfUkVWRVJCXzgwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfODAwMF9TQ0FMRX0sCisgICAge0NTX1JFVkVSQl8xMTAyNV9BMCwgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl8xMTAyNV9BMSwKKyAgICAgQ1NfUkVWRVJCXzExMDI1X0EyLAorICAgICBDU19SRVZFUkJfMTEwMjVfQjEsCisgICAgIENTX1JFVkVSQl8xMTAyNV9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl8xMTAyNV9TQ0FMRX0sCisgICAge0NTX1JFVkVSQl8xMjAwMF9BMCwgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl8xMjAwMF9BMSwKKyAgICAgQ1NfUkVWRVJCXzEyMDAwX0EyLAorICAgICBDU19SRVZFUkJfMTIwMDBfQjEsCisgICAgIENTX1JFVkVSQl8xMjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl8xMjAwMF9TQ0FMRX0sCisgICAge0NTX1JFVkVSQl8xNjAwMF9BMCwgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl8xNjAwMF9BMSwKKyAgICAgQ1NfUkVWRVJCXzE2MDAwX0EyLAorICAgICBDU19SRVZFUkJfMTYwMDBfQjEsCisgICAgIENTX1JFVkVSQl8xNjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl8xNjAwMF9TQ0FMRX0sCisgICAge0NTX1JFVkVSQl8yMjA1MF9BMCwgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl8yMjA1MF9BMSwKKyAgICAgQ1NfUkVWRVJCXzIyMDUwX0EyLAorICAgICBDU19SRVZFUkJfMjIwNTBfQjEsCisgICAgIENTX1JFVkVSQl8yMjA1MF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl8yMjA1MF9TQ0FMRX0sCisgICAge0NTX1JFVkVSQl8yNDAwMF9BMCwgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl8yNDAwMF9BMSwKKyAgICAgQ1NfUkVWRVJCXzI0MDAwX0EyLAorICAgICBDU19SRVZFUkJfMjQwMDBfQjEsCisgICAgIENTX1JFVkVSQl8yNDAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl8yNDAwMF9TQ0FMRX0sCisgICAge0NTX1JFVkVSQl8zMjAwMF9BMCwgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl8zMjAwMF9BMSwKKyAgICAgQ1NfUkVWRVJCXzMyMDAwX0EyLAorICAgICBDU19SRVZFUkJfMzIwMDBfQjEsCisgICAgIENTX1JFVkVSQl8zMjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl8zMjAwMF9TQ0FMRX0sCisgICAge0NTX1JFVkVSQl80NDEwMF9BMCwgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl80NDEwMF9BMSwKKyAgICAgQ1NfUkVWRVJCXzQ0MTAwX0EyLAorICAgICBDU19SRVZFUkJfNDQxMDBfQjEsCisgICAgIENTX1JFVkVSQl80NDEwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl80NDEwMF9TQ0FMRX0sCisgICAge0NTX1JFVkVSQl80ODAwMF9BMCwgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl80ODAwMF9BMSwKKyAgICAgQ1NfUkVWRVJCXzQ4MDAwX0EyLAorICAgICBDU19SRVZFUkJfNDgwMDBfQjEsCisgICAgIENTX1JFVkVSQl80ODAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl80ODAwMF9TQ0FMRX0KK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQnlwYXNzIG1peGVyIGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2NvbnN0IEdhaW5fdCBMVkNTX091dHB1dEdhaW5UYWJsZVtdID0geworICAgIHtMVkNTX0hFQURQSE9ORV9TSElGVCwgICAgICAgICAvKiBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCisgICAgIExWQ1NfSEVBRFBIT05FX1NISUZUTE9TUywKKyAgICAgTFZDU19IRUFEUEhPTkVfR0FJTn0sCisgICAge0xWQ1NfRVhfSEVBRFBIT05FX1NISUZULCAgICAgIC8qIEVYIEhlYWRwaG9uZSwgc3RlcmVvIG1vZGUgKi8KKyAgICAgTFZDU19FWF9IRUFEUEhPTkVfU0hJRlRMT1NTLAorICAgICBMVkNTX0VYX0hFQURQSE9ORV9HQUlOfSwKKyAgICB7TFZDU19IRUFEUEhPTkVfU0hJRlQsICAgICAgICAgLyogSGVhZHBob25lLCBtb25vIG1vZGUgKi8KKyAgICAgTFZDU19IRUFEUEhPTkVfU0hJRlRMT1NTLAorICAgICBMVkNTX0hFQURQSE9ORV9HQUlOfSwKKyAgICB7TFZDU19FWF9IRUFEUEhPTkVfU0hJRlQsICAgICAgLyogRVggSGVhZHBob25lLCBtb25vIG1vZGUgKi8KKyAgICAgTFZDU19FWF9IRUFEUEhPTkVfU0hJRlRMT1NTLAorICAgICBMVkNTX0VYX0hFQURQSE9ORV9HQUlOfQorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBWb2x1bWUgY29ycmVjdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvZWZmaWNpZW50IG9yZGVyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQ29tcHJlc3Npb24gMTAwJSBlZmZlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENvbXByZXNzaW9uIDAlIGVmZmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBHYWluIDEwMCUgZWZmZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgR2FpbiAwJSBlZmZlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBDb21wcmVzc2lvbiBnYWluIGlzIHJlcHJlc2VudGVkIGJ5IGEgUTEuMTUgbnVtYmVyIHRvIGdpdmUgYSByYW5nZSBvZiAwZEIgICAgKi8KKy8qICB0byArNmRCLCBFLmcuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAwICAgICAgIGlzIDBkQiBjb21wcmVzc2lvbiAobm8gZWZmZWN0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgNTQ2MSAgICBpcyAxZEIgY29tcHJlc3Npb24gZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIDEwOTIzICAgaXMgMmRCIGNvbXByZXNzaW9uIGdhaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAzMjc2NyAgIGlzIDZkQiBjb21wcmVzc2lvbiBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgR2FpbiBpcyByZXByZXNlbnRlZCBhcyBhIFEzLjEzIG51bWJlciB0byBnaXZlIGEgcmFuZ2Ugb2YgKzggdG8gLWluZmluaXR5ICAgICovCisvKiAgRS5nLjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgMCAgICAgICBpcyAtaW5maW5pdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIDMyNzY3ICAgaXMgKzE4ZEIgKHg4KSBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICA0MDk2ICAgIGlzIDBkQiBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgMTAyNCAgICBpcyAtMTJkQiBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY29uc3QgTFZDU19Wb2xDb3JyZWN0X3QgTFZDU19Wb2xDb3JyZWN0VGFibGVbXSA9IHsKKyAgICB7MTQyMDAsICAgICAgICAgIC8qIEhlYWRwaG9uZSwgc3RlcmVvIG1vZGUgKi8KKyAgICAgMCwKKyAgICAgNDA5NiwKKyAgICAgNTc4Nn0sCisgICAgezE0MjAwLCAgICAgICAgICAvKiBFWCBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCisgICAgIDAsCisgICAgIDQwOTYsCisgICAgIDU3ODZ9LAorICAgIHszMjc2NywgICAgICAgICAvKiBIZWFkcGhvbmUsIG1vbm8gbW9kZSAqLworICAgICAwLAorICAgICA0MDk2LAorICAgICA1Nzg2fSwKKyAgICB7MzI3NjcsICAgICAgICAgLyogRVggSGVhZHBob25lLCBtb25vIG1vZGUgKi8KKyAgICAgMCwKKyAgICAgNDA5NiwKKyAgICAgNTc4Nn0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1peGVyIHRpbWUgY29uc3RhbnRzLCAxMDBtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzODAwMCAgICAgIDMyNTgwICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk0MjYyNjk1ICovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMTEwMjUgICAgIDMyNjMyICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk1ODQ5NjA5ICovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMTIwMDAgICAgIDMyNjQzICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk2MTg1MzAzICovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMTYwMDAgICAgIDMyNjc0ICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk3MTMxMzQ4ICovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMjIwNTAgICAgIDMyNzAwICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk3OTI0ODA1ICovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMjQwMDAgICAgIDMyNzA1ICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4MDc3MzkzICovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMzIwMDAgICAgIDMyNzIxICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4NTY1Njc0ICovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzNDQxMDAgICAgIDMyNzM0ICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4OTYyNDAyICovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzNDgwMDAgICAgIDMyNzM3ICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5MDUzOTU1ICovCisKKworY29uc3QgTFZNX0lOVDE2IExWQ1NfVm9sdW1lVENUYWJsZVs5XSA9IHtMVkNTX1ZPTF9UQ19GczgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMTAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczEyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMyMjA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczI0MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM0NDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczQ4MDAwfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2FtcGxlIHJhdGUgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2NvbnN0IExWTV9JTlQzMiAgIExWQ1NfU2FtcGxlUmF0ZVRhYmxlWzldID0gezgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMH07CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MmQ2ODU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5oCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJEF1dGhvcjogbnhwMjcwNzggJAorICAgICAkUmV2aXNpb246IDY3MiAkCisgICAgICREYXRlOiAyMDEwLTA2LTA4IDE5OjM5OjM4ICswMjAwIChUdWUsIDA4IEp1biAyMDEwKSAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9fTFZDU19UQUJMRVNfSF9fCisjZGVmaW5lIF9fTFZDU19UQUJMRVNfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJpcXVhZCBkZWZpbml0aW9ucyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnQgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29lZmZpY2llbnQgdGFibGUgZm9yIHRoZSBtaWRkbGUgZmlsdGVyICovCitleHRlcm4gY29uc3QgQmlxdWFkQTAxQjFDb2Vmc1NQX3QgTFZDU19TRU1pZENvZWZUYWJsZVtdOworCisvKiBDb2VmZmljaWVudCB0YWJsZSBmb3IgdGhlIHNpZGUgZmlsdGVyICovCitleHRlcm4gY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX1NFU2lkZUNvZWZUYWJsZVtdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBFcXVhbGlzZXIgY29lZmZpY2llbnQgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19FcXVhbGlzZXJDb2VmVGFibGVbXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV2ZXJiIGRlbGF5IGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFN0ZXJlbyBkZWxheSB0YWJsZSBmb3IgQ29uY2VydCBTb3VuZCAqLworZXh0ZXJuIGNvbnN0IExWTV9VSU5UMTYgTFZDU19TdGVyZW9EZWxheUNTW107CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldmVyYiBjb2VmZmljaWVudHMgY29uc3RhbnQgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitleHRlcm4gY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX1JldmVyYkNvZWZUYWJsZVtdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBCeXBhc3MgbWl4ZXIgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIGNvbnN0IEdhaW5fdCBMVkNTX091dHB1dEdhaW5UYWJsZVtdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBWb2x1bWUgY29ycmVjdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvZWZmaWNpZW50IG9yZGVyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQ29tcHJlc3Npb24gMTAwJSBlZmZlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENvbXByZXNzaW9uIDAlIGVmZmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBHYWluIDEwMCUgZWZmZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgR2FpbiAwJSBlZmZlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBDb21wcmVzc2lvbiBnYWluIGlzIHJlcHJlc2VudGVkIGJ5IGEgUTEuMTUgbnVtYmVyIHRvIGdpdmUgYSByYW5nZSBvZiAwZEIgICAgKi8KKy8qICB0byArNmRCLCBFLmcuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAwICAgICAgIGlzIDBkQiBjb21wcmVzc2lvbiAobm8gZWZmZWN0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgNTQ2MSAgICBpcyAxZEIgY29tcHJlc3Npb24gZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIDEwOTIzICAgaXMgMmRCIGNvbXByZXNzaW9uIGdhaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAzMjc2NyAgIGlzIDZkQiBjb21wcmVzc2lvbiBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgR2FpbiBpcyByZXByZXNlbnRlZCBhcyBhIFEzLjEzIG51bWJlciB0byBnaXZlIGEgcmFuZ2Ugb2YgKzggdG8gLWluZmluaXR5ICAgICovCisvKiAgRS5nLjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgMCAgICAgICBpcyAtaW5maW5pdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIDMyNzY3ICAgaXMgKzE4ZEIgKHg4KSBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICA0MDk2ICAgIGlzIDBkQiBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgMTAyNCAgICBpcyAtMTJkQiBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitleHRlcm4gY29uc3QgTFZDU19Wb2xDb3JyZWN0X3QgTFZDU19Wb2xDb3JyZWN0VGFibGVbXTsKK2V4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZDU19Wb2x1bWVUQ1RhYmxlW107CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2FtcGxlIHJhdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2V4dGVybiBMVk1fSU5UMzIgICAgICAgICAgICAgICAgTFZDU19TYW1wbGVSYXRlVGFibGVbXTsKKworCisvKlNwZWFrZXIgY29lZmZpZW50IHRhYmxlcyovCitleHRlcm4gTFZNX1VJTlQxNiAgICAgICAgICAgICAgIExWQ1NfTVNfU21hbGxfU0VNaWRkbGVHYWluVGFibGVbXTsKK2V4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19TbWFsbF9TRVNpZGVDb2VmVGFibGVbXTsKK2V4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19TbWFsbF9FcXVhbGlzZXJDb2VmVGFibGVbXTsKK2V4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19TbWFsbF9SZXZlcmJDb2VmVGFibGVbXSA7CitleHRlcm4gTFZNX1VJTlQxNiAgICAgICAgICAgICAgIExWQ1NfTVNfU21hbGxfU3RlcmVvRGVsYXlDUzRNU1tdOworZXh0ZXJuIEdhaW5fdCAgICAgICAgICAgICAgICAgICBMVkNTX01TX1NtYWxsX091dHB1dEdhaW5UYWJsZVtdOworZXh0ZXJuIExWQ1NfVm9sQ29ycmVjdF90ICAgICAgICBMVkNTX01TX1NtYWxsX1ZvbENvcnJlY3RUYWJsZVtdOworZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgICAgICAgICBMVkNTX01TX1NtYWxsX1JldmVyYkdhaW5UYWJsZVtdOworCitleHRlcm4gTFZNX1VJTlQxNiAgICAgICAgICAgICAgIExWQ1NfTVNfTWVkaXVtX1NFTWlkZGxlR2FpblRhYmxlW107CitleHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgIExWQ1NfTVNfTWVkaXVtX1NFU2lkZUNvZWZUYWJsZVtdOworZXh0ZXJuIEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgICBMVkNTX01TX01lZGl1bV9FcXVhbGlzZXJDb2VmVGFibGVbXTsKK2V4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19NZWRpdW1fUmV2ZXJiQ29lZlRhYmxlW10gOworZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgICAgICAgICBMVkNTX01TX01lZGl1bV9TdGVyZW9EZWxheUNTNE1TW107CitleHRlcm4gR2Fpbl90ICAgICAgICAgICAgICAgICAgIExWQ1NfTVNfTWVkaXVtX091dHB1dEdhaW5UYWJsZVtdOworZXh0ZXJuIExWQ1NfVm9sQ29ycmVjdF90ICAgICAgICBMVkNTX01TX01lZGl1bV9Wb2xDb3JyZWN0VGFibGVbXTsKK2V4dGVybiBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgTFZDU19NU19NZWRpdW1fUmV2ZXJiR2FpblRhYmxlW107CisKK2V4dGVybiBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgTFZDU19NU19MYXJnZV9TRU1pZGRsZUdhaW5UYWJsZVtdOworZXh0ZXJuIEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgICBMVkNTX01TX0xhcmdlX1NFU2lkZUNvZWZUYWJsZVtdOworZXh0ZXJuIEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgICBMVkNTX01TX0xhcmdlX0VxdWFsaXNlckNvZWZUYWJsZVtdOworZXh0ZXJuIEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgICBMVkNTX01TX0xhcmdlX1JldmVyYkNvZWZUYWJsZVtdIDsKK2V4dGVybiBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgTFZDU19NU19MYXJnZV9TdGVyZW9EZWxheUNTNE1TW107CitleHRlcm4gR2Fpbl90ICAgICAgICAgICAgICAgICAgIExWQ1NfTVNfTGFyZ2VfT3V0cHV0R2FpblRhYmxlW107CitleHRlcm4gTFZDU19Wb2xDb3JyZWN0X3QgICAgICAgIExWQ1NfTVNfTGFyZ2VfVm9sQ29ycmVjdFRhYmxlW107CitleHRlcm4gTFZNX1VJTlQxNiAgICAgICAgICAgICAgIExWQ1NfTVNfTGFyZ2VfUmV2ZXJiR2FpblRhYmxlW107CisKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX19MVkNTX1RBQkxFU19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYmM0NDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMCBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpDQorDQorIyBtdXNpYyBidW5kbGUgd3JhcHBlcg0KK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQ0KK2luY2x1ZGUgJChDTEVBUl9WQVJTKQ0KKw0KK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQ0KKw0KK0xPQ0FMX1NSQ19GSUxFUzo9IFwNCisJQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHANCisNCitMT0NBTF9NT0RVTEU6PSBsaWJidW5kbGV3cmFwcGVyDQorDQorTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL3NvdW5kZngNCisNCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQ0KKw0KK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGlibXVzaWNidW5kbGUNCisNCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwNCisgICAgIGxpYmN1dGlscyBcDQorICAgICBsaWJkbA0KKw0KK0xPQ0FMX0NfSU5DTFVERVMgKz0gXA0KKwkkKExPQ0FMX1BBVEgpL0J1bmRsZSBcDQorCSQoTE9DQUxfUEFUSCkvLi4vbGliL0NvbW1vbi9saWIvIFwNCisJJChMT0NBTF9QQVRIKS8uLi9saWIvQnVuZGxlL2xpYi8NCisNCisNCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JiY2Y1NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKQEAgLTAsMCArMSwyNjA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJ1bmRsZSIKKyNkZWZpbmUgQVJSQVlfU0laRShhcnJheSkgKHNpemVvZiBhcnJheSAvIHNpemVvZiBhcnJheVswXSkKKyNkZWZpbmUgTFZNX0JVTkRMRSAgICAgICAgICAgICAgICAvLyBJbmNsdWRlIGFsbCB0aGUgYnVuZGxlIGNvZGUKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPEVmZmVjdEJ1bmRsZS5oPgorCisjaWZkZWYgTFZNX0JVTkRMRQorI2RlZmluZSBMVk1fTUFYX1NFU1NJT05TICAgICAgICAzMgorI2RlZmluZSBNQVhfTlVNX0JBTkRTICAgICAgICAgICA1CisjZGVmaW5lIE1BWF9DQUxMX1NJWkUgICAgICAgICAgIDI1NgorI2VuZGlmICAvKiBlbmQgTFZNX0JVTkRMRSAqLworCisKK2ludCBmcmFtZWNvdW50YWcgPSAwOworLy8gZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgYmFzcyBib29zdAorZXh0ZXJuICJDIiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdMdm1FZmZlY3RJbnRlcmZhY2U7CisKKyNkZWZpbmUgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpe1wKKyAgICAgICAgaWYgKEx2bVN0YXR1cyA9PSBMVk1fTlVMTEFERFJFU1Mpe1wKKyAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIlwKKyAgICAgICAgICAgICAgICAgICAgIm51bGwgcG9pbnRlciByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpO1wKKyAgICAgICAgfVwKKyAgICAgICAgaWYgKEx2bVN0YXR1cyA9PSBMVk1fQUxJR05NRU5URVJST1Ipe1wKKyAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIlwKKyAgICAgICAgICAgICAgICAgICAgImJhZCBhbGlnbm1lbnQgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTtcCisgICAgICAgIH1cCisgICAgICAgIGlmIChMdm1TdGF0dXMgPT0gTFZNX0lOVkFMSUROVU1TQU1QTEVTKXtcCisgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICJcCisgICAgICAgICAgICAgICAgICAgICJiYWQgbnVtYmVyIG9mIHNhbXBsZXMgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTtcCisgICAgICAgIH1cCisgICAgICAgIGlmIChMdm1TdGF0dXMgPT0gTFZNX09VVE9GUkFOR0Upe1wKKyAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIlwKKyAgICAgICAgICAgICAgICAgICAgIm91dCBvZiByYW5nZSByZXR1cm5lZCBieSAlcyBpbiAlc1xuIiwgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpO1wKKyAgICAgICAgfVwKKyAgICB9CisKKworCisKKworLy8gTmFtZXNwYWNlcworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHsKKworLyogbG9jYWwgZnVuY3Rpb25zICovCisjZGVmaW5lIENIRUNLX0FSRyhjb25kKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghKGNvbmQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBJbnZhbGlkIGFyZ3VtZW50OiAiI2NvbmQpOyAgICAgIFwKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitpbnQgTHZtSW5pdEZsYWcgPSBMVk1fRkFMU0U7CitTZXNzaW9uQ29udGV4dCBHbG9iYWxTZXNzaW9uTWVtb3J5WzMyXTsKKworLy8gTlhQIFNXIEJhc3NCb29zdCBVVUlECitjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdCYXNzQm9vc3REZXNjcmlwdG9yID0geworICAgICAgICB7MHgwNjM0ZjIyMCwgMHhkZGQ0LCAweDExZGIsIDB4YTBmYywgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH19LAorICAgICAgICB7MHg4NjMxZjMwMCwgMHg3MmUyLCAweDExZGYsIDB4YjU3ZSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgLy8gdXVpZAorICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUKSwKKyAgICAgICAgMCwgLy8gVE9ETworICAgICAgICAxLAorICAgICAgICAiRHluYW1pYyBCYXNzIEJvb3N0IiwKKyAgICAgICAgIk5YUCBTb2Z0d2FyZSBMdGQuIiwKK307CisKKy8vIE5YUCBTVyBWaXJ0dWFsaXplciBVVUlECitjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdWaXJ0dWFsaXplckRlc2NyaXB0b3IgPSB7CisgICAgICAgIHsweDM3Y2MyYzAwLCAweGRkZGQsIDB4MTFkYiwgMHg4NTc3LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAvLyBWaXJ0dWFsaXplciBJRAorICAgICAgICB7MHgxZDQwMzNjMCwgMHg4NTU3LCAweDExZGYsIDB4OWYyZCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgLy8gTlhQIFNXIFVVSUQgZ2VuIGp1bHkgMDEgMjAxMAorICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUKSwKKyAgICAgICAgMCwgLy8gVE9ETworICAgICAgICAxLAorICAgICAgICAiVmlydHVhbGl6ZXIiLAorICAgICAgICAiTlhQIFNvZnR3YXJlIEx0ZC4iLAorfTsKKworLy8gTlhQIFNXIEVxdWFsaXplciBVVUlECitjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdFcXVhbGl6ZXJEZXNjcmlwdG9yID0geworICAgICAgICB7MHgwYmVkNDMwMCwgMHhkZGQ2LCAweDExZGIsIDB4OGYzNCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgLy8gdHlwZQorICAgICAgICB7MHhjZTc3MmYyMCwgMHg4NDdkLCAweDExZGYsIDB4YmIxNywgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgLy8gdXVpZCBFcSBOWFAKKyAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgfCBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVCksCisgICAgICAgIDAsIC8vIFRPRE8KKyAgICAgICAgMSwKKyAgICAgICAgIkVxdWFsaXplciIsCisgICAgICAgICJOWFAgU29mdHdhcmUgTHRkLiIsCit9OworCisvLyBOWFAgU1cgVm9sdW1lIFVVSUQKK2NvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ1ZvbHVtZURlc2NyaXB0b3IgPSB7CisgICAgICAgIHsweDA5ZThlZGUwLCAweGRkZGUsIDB4MTFkYiwgMHhiNGY2LCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfX0sCisgICAgICAgIC8vezB4ODYzMWYzMDAsIDB4NzJlMiwgMHgxMWRmLCAweGI1N2UsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9fSwgLy8gdXVpZAorICAgICAgICB7MHgxMTkzNDFhMCwgMHg4NDY5LCAweDExZGYsIDB4ODFmOSwgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH19LCAvL3V1aWQgVk9MIE5YUAorICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUKSwKKyAgICAgICAgMCwgLy8gVE9ETworICAgICAgICAxLAorICAgICAgICAiVm9sdW1lIiwKKyAgICAgICAgIk5YUCBTb2Z0d2FyZSBMdGQuIiwKK307CisKKy8vLS0tIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKK3ZvaWQgTHZtR2xvYmFsQnVuZGxlX2luaXQgICAgICAodm9pZCk7CitpbnQgIEx2bUJ1bmRsZV9pbml0ICAgICAgICAgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KTsKK2ludCAgTHZtRWZmZWN0X2VuYWJsZSAgICAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpOworaW50ICBMdm1FZmZlY3RfZGlzYWJsZSAgICAgICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCk7Cit2b2lkIEx2bUVmZmVjdF9mcmVlICAgICAgICAgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KTsKK2ludCAgRWZmZWN0X2NvbmZpZ3VyZSAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGVmZmVjdF9jb25maWdfdCAqcENvbmZpZyk7CitpbnQgIEJhc3NCb29zdF9zZXRQYXJhbWV0ZXIgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBpbnQzMl90ICpwUGFyYW0sIHZvaWQgKnBWYWx1ZSk7CitpbnQgIEJhc3NCb29zdF9nZXRQYXJhbWV0ZXIgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAqcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpwVmFsdWUpOworaW50ICBWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50MzJfdCAqcFBhcmFtLCB2b2lkICpwVmFsdWUpOworaW50ICBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAqcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpwVmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK2ludCAgRXF1YWxpemVyX3NldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGludDMyX3QgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKK2ludCAgRXF1YWxpemVyX2dldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgKnBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKTsKK2ludCAgVm9sdW1lX3NldFBhcmFtZXRlciAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGludDMyX3QgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKK2ludCAgVm9sdW1lX2dldFBhcmFtZXRlciAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgKnBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKTsKKworCisKKworCisKKworCisKKworCisKKworCisKKworLyogRWZmZWN0IExpYnJhcnkgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uICovCitleHRlcm4gIkMiIGludCBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKXsKKyAgICBMT0dWKCJcblx0RWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzIHN0YXJ0Iik7CisgICAgKnBOdW1FZmZlY3RzID0gNDsKKyAgICBMT0dWKCJcdEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyBjcmVhdGluZyAlZCBlZmZlY3RzIiwgKnBOdW1FZmZlY3RzKTsgIAorICAgIExPR1YoIlx0RWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzIGVuZFxuIik7ICAgICAgCisgICAgcmV0dXJuIDA7Cit9ICAgICAvKiBlbmQgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzICovCisKKworZXh0ZXJuICJDIiBpbnQgRWZmZWN0UXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKXsKKyAgICBMT0dWKCJcblx0RWZmZWN0UXVlcnlFZmZlY3Qgc3RhcnQiKTsKKyAgICBMT0dWKCJcdEVmZmVjdFF1ZXJ5RWZmZWN0IHByb2Nlc3NpbmcgaW5kZXggJWQiLCBpbmRleCk7CisgICAgCisgICAgaWYgKHBEZXNjcmlwdG9yID09IE5VTEwpeworICAgIAlMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdFF1ZXJ5RWZmZWN0IHdhcyBwYXNzZWQgTlVMTCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoaW5kZXggPiAzKXsKKyAgICAJTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RRdWVyeUVmZmVjdCBpbmRleCBvdXQgb2YgcmFuZ2UgJWQiLCBpbmRleCk7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKyAgICBpZihpbmRleCA9PSBMVk1fQkFTU19CT09TVCl7CisgICAgICAgIExPR1YoIlx0RWZmZWN0UXVlcnlFZmZlY3QgcHJvY2Vzc2luZyBMVk1fQkFTU19CT09TVCIpOworICAgICAgICBtZW1jcHkocERlc2NyaXB0b3IsICZnQmFzc0Jvb3N0RGVzY3JpcHRvciwgICBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgIH1lbHNlIGlmKGluZGV4ID09IExWTV9WSVJUVUFMSVpFUil7CisgICAgICAgIExPR1YoIlx0RWZmZWN0UXVlcnlFZmZlY3QgcHJvY2Vzc2luZyBMVk1fVklSVFVBTElaRVIiKTsKKyAgICAgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCAmZ1ZpcnR1YWxpemVyRGVzY3JpcHRvciwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICB9IGVsc2UgaWYoaW5kZXggPT0gTFZNX0VRVUFMSVpFUil7CisgICAgICAgIExPR1YoIlx0RWZmZWN0UXVlcnlFZmZlY3QgcHJvY2Vzc2luZyBMVk1fRVFVQUxJWkVSIik7CisgICAgICAgIG1lbWNweShwRGVzY3JpcHRvciwgJmdFcXVhbGl6ZXJEZXNjcmlwdG9yLCAgIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgfSBlbHNlIGlmKGluZGV4ID09IExWTV9WT0xVTUUpeworICAgICAgICBMT0dWKCJcdEVmZmVjdFF1ZXJ5RWZmZWN0IHByb2Nlc3NpbmcgTFZNX1ZPTFVNRSIpOworICAgICAgICBtZW1jcHkocERlc2NyaXB0b3IsICZnVm9sdW1lRGVzY3JpcHRvciwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICB9ICAgICAgIAorICAgIExPR1YoIlx0RWZmZWN0UXVlcnlFZmZlY3QgZW5kXG4iKTsKKyAgICByZXR1cm4gMDsKK30gICAgIC8qIGVuZCBFZmZlY3RRdWVyeUVmZmVjdCAqLworCisKK2V4dGVybiAiQyIgaW50IEVmZmVjdENyZWF0ZShlZmZlY3RfdXVpZF90ICAgICAgICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgaW9JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfaW50ZXJmYWNlX3QgICpwSW50ZXJmYWNlKXsKKyAgICBpbnQgcmV0OworICAgIGludCBpOworICAgIEVmZmVjdENvbnRleHQgKnBDb250ZXh0ID0gbmV3IEVmZmVjdENvbnRleHQ7CisKKyAgICBMT0dWKCJcblx0RWZmZWN0Q3JlYXRlIHN0YXJ0IHNlc3Npb24gJWQiLCBzZXNzaW9uSWQpOworCisgICAgaWYgKHBJbnRlcmZhY2UgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpeworICAgIAlMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdENyZWF0ZSgpIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZigoc2Vzc2lvbklkIDwgMCl8fChzZXNzaW9uSWQgPj0gTFZNX01BWF9TRVNTSU9OUykpeworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdENyZWF0ZSBzZXNzaW9uSWQgaXMgbGVzcyB0aGFuIDAiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7ICAKKyAgICB9CisKKyAgICBpZihMdm1Jbml0RmxhZyA9PSBMVk1fRkFMU0UpeworICAgICAgICBMdm1Jbml0RmxhZyA9IExWTV9UUlVFOworICAgICAgICBMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIEluaXRpYWxpemluZyBhbGwgZ2xvYmFsIG1lbW9yeSIpOworICAgICAgICBMdm1HbG9iYWxCdW5kbGVfaW5pdCgpOworICAgIH0KKworICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IGNyZWF0ZSBpbiB0aGlzIHNlc3Npb24KKyAgICBpZihHbG9iYWxTZXNzaW9uTWVtb3J5W3Nlc3Npb25JZF0uYkJ1bmRsZWRFZmZlY3RzRW5hYmxlZCA9PSBMVk1fRkFMU0UpeworICAgICAgICBMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIFRoaXMgaXMgdGhlIGZpcnN0IGVmZmVjdCBpbiBjdXJyZW50IHNlc3Npb24gJWQiLCBzZXNzaW9uSWQpOworICAgICAgICBMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIFNldHRpbmcgdXAgQnVuZGxlZCBFZmZlY3RzIEluc3RhbmNlIGZvciBzZXNzaW9uICVkIiwgc2Vzc2lvbklkKTsKKyAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtzZXNzaW9uSWRdLmJCdW5kbGVkRWZmZWN0c0VuYWJsZWQgPSBMVk1fVFJVRTsKKyAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtzZXNzaW9uSWRdLnBCdW5kbGVkQ29udGV4dCAgICAgICAgPSBuZXcgQnVuZGxlZEVmZmVjdENvbnRleHQ7CisKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCA9IEdsb2JhbFNlc3Npb25NZW1vcnlbc2Vzc2lvbklkXS5wQnVuZGxlZENvbnRleHQ7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25ObyAgICAgICAgICAgID0gc2Vzc2lvbklkOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgICAgICAgICAgICA9IE5VTEw7ICAgICAgICAKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgICAgICAgPSBMVk1fRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkICAgID0gTFZNX0ZBTFNFOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgICAgICAgICA9IExWTV9GQUxTRTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCAgPSBMVk1fRkFMU0U7ICAgICAgICAKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQgPSAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkICA9IDA7ICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8qIFNhdmVkIHN0cmVuZ3RoIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBleGFjdCBzdHJlbmd0aCB0aGF0IHdhcyB1c2VkIGluIHRoZSBzZXQgdG8gdGhlIGdldAorICAgICAgICAgKiBiZWNhdXNlIHdlIG1hcCB0aGUgb3JpZ2luYWwgc3RyZW5ndGggcmFuZ2Ugb2YgMDoxMDAwIHRvIDE6MTUsIGFuZCB0aGlzIHdpbGwgYXZvaWQKKyAgICAgICAgICogcXVhbnRpc2F0aW9uIGxpa2UgZWZmZWN0IHdoZW4gcmV0dXJuaW5nCisgICAgICAgICAqLworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCAgICA9IDA7ICAKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+VmlydFN0cmVuZ3RoU2F2ZWQgICAgPSAwOyAKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q3VyUHJlc2V0ICAgICAgICAgICAgPSBQUkVTRVRfQ1VTVE9NOyAgCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmxldmVsU2F2ZWQgICAgICAgICAgID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkICAgICAgICAgPSBMVk1fRkFMU0U7IAorICAgICAgICAgCisgICAgICAgIExPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gQ2FsbGluZyBMdm1CdW5kbGVfaW5pdCIpOworICAgICAgICByZXQgPSBMdm1CdW5kbGVfaW5pdChwQ29udGV4dCk7CisKKyAgICAgICAgaWYgKHJldCA8IDApeworICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RDcmVhdGUoKSBCdW5kbGUgaW5pdCBmYWlsZWQiKTsKKyAgICAgICAgICAgIGRlbGV0ZSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0OworICAgICAgICAgICAgZGVsZXRlIHBDb250ZXh0OworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNleworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0ID0gR2xvYmFsU2Vzc2lvbk1lbW9yeVtzZXNzaW9uSWRdLnBCdW5kbGVkQ29udGV4dDsKKyAgICB9CisgICAgCisgICAgTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBwQnVuZGxlZENvbnRleHQgaXMgJXAiLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0KTsKKworICAgIC8vIENyZWF0ZSBlYWNoIEVmZmVjdAorICAgIGlmIChtZW1jbXAodXVpZCwgJmdCYXNzQm9vc3REZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCl7CisgICAgICAgIC8vIENyZWF0ZSBCYXNzIEJvb3N0CisgICAgICAgIExPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gRWZmZWN0IHRvIGJlIGNyZWF0ZWQgaXMgTFZNX0JBU1NfQk9PU1QiKTsKKyAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtzZXNzaW9uSWRdLmJCYXNzSW5zdGFudGlhdGVkID0gTFZNX1RSVUU7CisgICAgICAgIAorICAgICAgICBwQ29udGV4dC0+aXRmZSAgICAgICA9ICZnTHZtRWZmZWN0SW50ZXJmYWNlOyAgICAgICAgCisgICAgICAgIHBDb250ZXh0LT5FZmZlY3RUeXBlID0gTFZNX0JBU1NfQk9PU1Q7CisgICAgfSBlbHNlIGlmIChtZW1jbXAodXVpZCwgJmdWaXJ0dWFsaXplckRlc2NyaXB0b3IudXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKXsKKyAgICAgICAgLy8gQ3JlYXRlIFZpcnR1YWxpemVyCisgICAgICAgIExPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gRWZmZWN0IHRvIGJlIGNyZWF0ZWQgaXMgTFZNX1ZJUlRVQUxJWkVSIik7ICAgICAgICAKKyAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtzZXNzaW9uSWRdLmJWaXJ0dWFsaXplckluc3RhbnRpYXRlZCA9IExWTV9UUlVFOworICAgICAgICAKKyAgICAgICAgcENvbnRleHQtPml0ZmUgICAgICAgPSAmZ0x2bUVmZmVjdEludGVyZmFjZTsKKyAgICAgICAgcENvbnRleHQtPkVmZmVjdFR5cGUgPSBMVk1fVklSVFVBTElaRVI7CisgICAgfSBlbHNlIGlmIChtZW1jbXAodXVpZCwgJmdFcXVhbGl6ZXJEZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCl7CisgICAgICAgIC8vIENyZWF0ZSBFcXVhbGl6ZXIKKyAgICAgICAgTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBFZmZlY3QgdG8gYmUgY3JlYXRlZCBpcyBMVk1fRVFVQUxJWkVSIik7ICAgICAgICAKKyAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtzZXNzaW9uSWRdLmJFcXVhbGl6ZXJJbnN0YW50aWF0ZWQgPSBMVk1fVFJVRTsKKyAgICAgICAgCisgICAgICAgIHBDb250ZXh0LT5pdGZlICAgICAgID0gJmdMdm1FZmZlY3RJbnRlcmZhY2U7CisgICAgICAgIHBDb250ZXh0LT5FZmZlY3RUeXBlID0gTFZNX0VRVUFMSVpFUjsKKyAgICB9IGVsc2UgaWYgKG1lbWNtcCh1dWlkLCAmZ1ZvbHVtZURlc2NyaXB0b3IudXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKXsKKyAgICAgICAgLy8gQ3JlYXRlIFZvbHVtZQorICAgICAgICBMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIEVmZmVjdCB0byBiZSBjcmVhdGVkIGlzIExWTV9WT0xVTUUiKTsgICAgICAgIAorICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W3Nlc3Npb25JZF0uYlZvbHVtZUluc3RhbnRpYXRlZCA9IExWTV9UUlVFOworICAgICAgICAKKyAgICAgICAgcENvbnRleHQtPml0ZmUgICAgICAgPSAmZ0x2bUVmZmVjdEludGVyZmFjZTsKKyAgICAgICAgcENvbnRleHQtPkVmZmVjdFR5cGUgPSBMVk1fVk9MVU1FOworICAgIH0gICAgICAgCisgICAgZWxzZXsKKyAgICAgCUxPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0Q3JlYXRlKCkgaW52YWxpZCBVVUlEIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOyAgIAorICAgIH0KKworICAgICpwSW50ZXJmYWNlID0gKGVmZmVjdF9pbnRlcmZhY2VfdClwQ29udGV4dDsKKyAgICBMT0dWKCJcdEVmZmVjdENyZWF0ZSBlbmQuLlxuXG4iKTsgICAgCisgICAgcmV0dXJuIDA7Cit9IC8qIGVuZCBFZmZlY3RDcmVhdGUgKi8KKworCisKK2V4dGVybiAiQyIgaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSl7CisgICAgTE9HVigiXG5cdEVmZmVjdFJlbGVhc2Ugc3RhcnQgJXAiLCBpbnRlcmZhY2UpOworICAgIEVmZmVjdENvbnRleHQgKiBwQ29udGV4dCA9IChFZmZlY3RDb250ZXh0ICopaW50ZXJmYWNlOworCisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpeworICAgIAlMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdFJlbGVhc2UgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0gCisKKyAgICAvLyBDbGVhciB0aGUgaW5zdGFudGlhdGVkIGZsYWcgZm9yIHRoZSBlZmZlY3QKKyAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkgeworICAgICAgICBMT0dWKCJcdEVmZmVjdFJlbGVhc2UgTFZNX0JBU1NfQk9PU1QgQ2xlYXJpbmcgZ2xvYmFsIGludHN0YW50aWF0ZWQgZmxhZyIpOworICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25Ob10uYkJhc3NJbnN0YW50aWF0ZWQgPSBMVk1fRkFMU0U7ICAgICAgICAKKyAgICB9IGVsc2UgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSB7CisgICAgICAgIExPR1YoIlx0RWZmZWN0UmVsZWFzZSBMVk1fVklSVFVBTElaRVIgQ2xlYXJpbmcgZ2xvYmFsIGludHN0YW50aWF0ZWQgZmxhZyIpOworICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25Ob10uYlZpcnR1YWxpemVySW5zdGFudGlhdGVkID0gTFZNX0ZBTFNFOyAgICAgICAgCisgICAgfSBlbHNlIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpIHsKKyAgICAgICAgTE9HVigiXHRFZmZlY3RSZWxlYXNlIExWTV9FUVVBTElaRVIgQ2xlYXJpbmcgZ2xvYmFsIGludHN0YW50aWF0ZWQgZmxhZyIpOworICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25Ob10uYkVxdWFsaXplckluc3RhbnRpYXRlZCA9IExWTV9GQUxTRTsgICAgICAgIAorICAgIH0gZWxzZSBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKSB7CisgICAgICAgIExPR1YoIlx0RWZmZWN0UmVsZWFzZSBMVk1fVk9MVU1FIENsZWFyaW5nIGdsb2JhbCBpbnRzdGFudGlhdGVkIGZsYWciKTsKKyAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uTm9dLmJWb2x1bWVJbnN0YW50aWF0ZWQgPSBMVk1fRkFMU0U7ICAgICAgICAKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdFJlbGVhc2UgOiBVbnN1cHBvcnRlZCBlZmZlY3RcblxuXG5cblxuXG5cbiIpOworICAgIH0KKyAgICAKKyAgICAvLyBpZiBhbGwgZWZmZWN0cyBhcmUgbm8gbG9uZ2VyIGluc3RhbnRpYWVkIGZyZWUgdGhlIGx2bSBtZW1vcnkgYW5kIGRlbGV0ZSBCdW5kbGVkRWZmZWN0Q29udGV4dAorICAgIGlmKChHbG9iYWxTZXNzaW9uTWVtb3J5W3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25Ob10uYkJhc3NJbnN0YW50aWF0ZWQgPT0gTFZNX0ZBTFNFKSYmCisgICAgICAgKEdsb2JhbFNlc3Npb25NZW1vcnlbcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vXS5iVm9sdW1lSW5zdGFudGlhdGVkID09IExWTV9GQUxTRSkmJgorICAgICAgIChHbG9iYWxTZXNzaW9uTWVtb3J5W3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25Ob10uYkVxdWFsaXplckluc3RhbnRpYXRlZCA9PSBMVk1fRkFMU0UpJiYKKyAgICAgICAoR2xvYmFsU2Vzc2lvbk1lbW9yeVtwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uTm9dLmJWaXJ0dWFsaXplckluc3RhbnRpYXRlZCA9PSBMVk1fRkFMU0UpKSAgICAgICAgCisgICAgeworICAgICAgIExPR1YoIlx0RWZmZWN0UmVsZWFzZTogQWxsIGVmZmVjdHMgYXJlIG5vIGxvbmdlciBpbnN0YW50aWF0ZWRcbiIpOworICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vXS5iQnVuZGxlZEVmZmVjdHNFbmFibGVkID0gTFZNX0ZBTFNFOworICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vXS5wQnVuZGxlZENvbnRleHQgPSBMVk1fTlVMTDsKKyAgICAgICBMT0dWKCJcdEVmZmVjdFJlbGVhc2U6IEZyZWVpbmcgTFZNIEJ1bmRsZSBtZW1vcnlcbiIpOworICAgICAgIEx2bUVmZmVjdF9mcmVlKHBDb250ZXh0KTsKKyAgICAgICBMT0dWKCJcdEVmZmVjdFJlbGVhc2U6IERlbGV0aW5nIExWTSBCdW5kbGUgY29udGV4dFxuIik7ICAgICAgIAorICAgICAgIGRlbGV0ZSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0OworICAgIH0KKyAgICAKKyAgICAvLyBmcmVlIHRoZSBlZmZlY3QgY29udGV4dCBmb3IgY3VycmVudCBlZmZlY3QKKyAgICBkZWxldGUgcENvbnRleHQ7CisKKyAgICBMT0dWKCJcdEVmZmVjdFJlbGVhc2UgZW5kXG4iKTsKKyAgICByZXR1cm4gMDsKKworfSAvKiBlbmQgRWZmZWN0UmVsZWFzZSAqLworCisKKworCisKKworCisKKworCisKKworCisKKworCit2b2lkIEx2bUdsb2JhbEJ1bmRsZV9pbml0KCl7CisgICAgTE9HVigiXHRMdm1HbG9iYWxCdW5kbGVfaW5pdCBzdGFydCIpOworICAgIGZvcihpbnQgaT0wOyBpPExWTV9NQVhfU0VTU0lPTlM7IGkrKyl7CisgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbaV0uYkJ1bmRsZWRFZmZlY3RzRW5hYmxlZCAgID0gTFZNX0ZBTFNFOworICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W2ldLmJWb2x1bWVJbnN0YW50aWF0ZWQgICAgICA9IExWTV9GQUxTRTsKKyAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtpXS5iRXF1YWxpemVySW5zdGFudGlhdGVkICAgPSBMVk1fRkFMU0U7CisgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbaV0uYkJhc3NJbnN0YW50aWF0ZWQgICAgICAgID0gTFZNX0ZBTFNFOworICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W2ldLmJWaXJ0dWFsaXplckluc3RhbnRpYXRlZCA9IExWTV9GQUxTRTsKKyAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtpXS5wQnVuZGxlZENvbnRleHQgICAgICAgICAgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgcmV0dXJuOworfQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMdm1CdW5kbGVfaW5pdCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IEluaXRpYWxpemUgZW5naW5lIHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uLCBjcmVhdGVzIGluc3RhbmNlCisvLyB3aXRoIGFsbCBlZmZlY3RzIGRpc2FibGVkLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgTHZtQnVuZGxlX2luaXQoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpeworICAgIGludCBzdGF0dXM7CisKKyAgICBMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IHN0YXJ0Iik7CisKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBDSEFOTkVMX1NURVJFTzsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ0MTAwOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICAgICAgICAgICAgID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgICAgICAgICA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgICAgICAgICAgICAgICAgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcubWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0NPTkZJR19BTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQ0hBTk5FTF9TVEVSRU87CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlICAgICAgICAgICAgICAgICAgICAgICAgPSA0NDEwMDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgICAgICAgICAgICA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAgICAgICAgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSAgICAgICAgICAgICAgID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5tYXNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9DT05GSUdfQUxMOworCisgICAgQ0hFQ0tfQVJHKHBDb250ZXh0ICE9IE5VTEwpOworCisgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSAhPSBOVUxMKXsKKyAgICAgICAgTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBwQ29udGV4dC0+cEJhc3NCb29zdCAhPSBOVUxMICIKKyAgICAgICAgICAgICAgICAiLT4gQ2FsbGluZyBwQ29udGV4dC0+cEJhc3NCb29zdC0+ZnJlZSgpIik7CisKKyAgICAgICAgTHZtRWZmZWN0X2ZyZWUocENvbnRleHQpOworCisgICAgICAgIExPR1YoIlx0THZtQnVuZGxlX2luaXQgcENvbnRleHQtPnBCYXNzQm9vc3QgIT0gTlVMTCAiCisgICAgICAgICAgICAgICAgIi0+IENhbGxlZCBwQ29udGV4dC0+cEJhc3NCb29zdC0+ZnJlZSgpIik7CisgICAgfQorCisgICAgI2lmZGVmIExWTV9CVU5ETEUKKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZNX1NVQ0NFU1M7ICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgcGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fSW5zdFBhcmFtc190ICAgICAgICBJbnN0UGFyYW1zOyAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fRVFOQl9CYW5kRGVmX3QgICAgICBCYW5kRGVmc1tNQVhfTlVNX0JBTkRTXTsgICAgICAgIC8qIEVxdWFsaXNlciBiYW5kIGRlZmluaXRpb25zICovCisgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgSGVhZHJvb21QYXJhbXM7ICAgICAgICAgICAgICAgICAvKiBIZWFkcm9vbSBwYXJhbWV0ZXJzICovCisgICAgTFZNX0hlYWRyb29tQmFuZERlZl90ICAgSGVhZHJvb21CYW5kRGVmW0xWTV9IRUFEUk9PTV9NQVhfTkJBTkRTXTsKKyAgICBMVk1fTWVtVGFiX3QgICAgICAgICAgICBNZW1UYWI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgYk1hbGxvY0ZhaWx1cmUgPSBMVk1fRkFMU0U7CisKKyAgICAvKiBTZXQgdGhlIGNhcGFiaWxpdGllcyAqLworICAgIEluc3RQYXJhbXMuQnVmZmVyTW9kZSAgICAgICA9IExWTV9NQU5BR0VEX0JVRkZFUlM7CisgICAgSW5zdFBhcmFtcy5NYXhCbG9ja1NpemUgICAgID0gTUFYX0NBTExfU0laRTsKKyAgICBJbnN0UGFyYW1zLkVRTkJfTnVtQmFuZHMgICAgPSBNQVhfTlVNX0JBTkRTOworICAgIEluc3RQYXJhbXMuUFNBX0luY2x1ZGVkICAgICA9IExWTV9QU0FfT047CisKKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnksIGZvcmNpbmcgYWxpZ25tZW50ICovCisgICAgTHZtU3RhdHVzID0gTFZNX0dldE1lbW9yeVRhYmxlKExWTV9OVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkluc3RQYXJhbXMpOworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRNZW1vcnlUYWJsZSIsICJMdm1CdW5kbGVfaW5pdCIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIExPR1YoIlx0Q3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9HZXRNZW1vcnlUYWJsZVxuIik7CisKKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgKi8KKyAgICBmb3IgKGludCBpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspeworICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5TaXplICE9IDApeworICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPSBtYWxsb2MoTWVtVGFiLlJlZ2lvbltpXS5TaXplKTsKKworICAgICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID09IExWTV9OVUxMKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlbGQgYnl0ZXMgZm9yIHJlZ2lvbiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSApOworICAgICAgICAgICAgICAgIGJNYWxsb2NGYWlsdXJlID0gTFZNX1RSVUU7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdENyZWF0ZUluc3RhbmNlIGFsbG9jYXRlZCAlbGQgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogSWYgb25lIG9yIG1vcmUgb2YgdGhlIG1lbW9yeSByZWdpb25zIGZhaWxlZCB0byBhbGxvY2F0ZSwgZnJlZSB0aGUgcmVnaW9ucyB0aGF0IHdlcmUKKyAgICAgKiBzdWNjZXNmdWxseSBhbGxvY2F0ZWQgYW5kIHJldHVybiB3aXRoIGFuIGVycm9yCisgICAgICovCisgICAgaWYoYk1hbGxvY0ZhaWx1cmUgPT0gTFZNX1RSVUUpeworICAgICAgICBmb3IgKGludCBpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspeworICAgICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID09IExWTV9OVUxMKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlbGQgYnl0ZXMgZm9yIHJlZ2lvbiAldSAtIE5vdCBmcmVlaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IENyZWF0ZUluc3RhbmNlIEZhaWxlZDogYnV0IGFsbG9jYXRlZCAlbGQgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcC0gZnJlZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgICAgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBMT0dWKCJcdENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IG1hbGxvYydkIG1lbW9yeVxuIik7CisKKyAgICAvKiBJbml0aWFsaXNlICovCisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlID0gTFZNX05VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0byBOVUxMICovCisKKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0SW5zdGFuY2VIYW5kbGUoJnBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwvKiBJbml0IHNldHMgdGhlIGluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSW5zdFBhcmFtcyk7CisKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldEluc3RhbmNlSGFuZGxlIiwgIkx2bUJ1bmRsZV9pbml0IikKKyAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgICAgTE9HVigiXHRDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX0dldEluc3RhbmNlSGFuZGxlXG4iKTsKKworICAgIC8qIFNldCB0aGUgaW5pdGlhbCBwcm9jZXNzIHBhcmFtZXRlcnMgKi8KKyAgICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KKyAgICBwYXJhbXMuT3BlcmF0aW5nTW9kZSAgICAgICAgICA9IExWTV9NT0RFX09OOworICAgIHBhcmFtcy5TYW1wbGVSYXRlICAgICAgICAgICAgID0gTFZNX0ZTXzQ0MTAwOworICAgIHBhcmFtcy5Tb3VyY2VGb3JtYXQgICAgICAgICAgID0gTFZNX1NURVJFTzsKKyAgICBwYXJhbXMuU3BlYWtlclR5cGUgICAgICAgICAgICA9IExWTV9IRUFEUEhPTkVTOworCisgICAgLyogQ29uY2VydCBTb3VuZCBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSAgID0gTFZNX01PREVfT0ZGOworICAgIHBhcmFtcy5WaXJ0dWFsaXplclR5cGUgICAgICAgICAgICA9IExWTV9DT05DRVJUU09VTkQ7CisgICAgcGFyYW1zLlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgICAgID0gMTAwOworICAgIHBhcmFtcy5DU19FZmZlY3RMZXZlbCAgICAgICAgICAgICA9IExWTV9DU19FRkZFQ1RfSElHSDsKKworICAgIC8qIE4tQmFuZCBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy5FUU5CX09wZXJhdGluZ01vZGUgICAgID0gTFZNX0VRTkJfT0ZGOworICAgIHBhcmFtcy5FUU5CX05CYW5kcyAgICAgICAgICAgID0gRklWRUJBTkRfTlVNQkFORFM7CisgICAgcGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uICAgPSAmQmFuZERlZnNbMF07CisgICAgZm9yIChpbnQgaT0wOyBpPEZJVkVCQU5EX05VTUJBTkRTOyBpKyspCisgICAgeworICAgICAgICBCYW5kRGVmc1tpXS5GcmVxdWVuY3kgPSBFUU5CXzVCYW5kUHJlc2V0c0ZyZXF1ZW5jaWVzW2ldOworICAgICAgICBCYW5kRGVmc1tpXS5RRmFjdG9yICAgPSBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW2ldOworICAgICAgICBCYW5kRGVmc1tpXS5HYWluICAgICAgPSBFUU5CXzVCYW5kTm9ybWFsUHJlc2V0c1tpXTsKKyAgICB9CisKKyAgICAvKiBWb2x1bWUgQ29udHJvbCBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLlZDX0VmZmVjdExldmVsICAgICAgICAgPSAwOworICAgIHBhcmFtcy5WQ19CYWxhbmNlICAgICAgICAgICAgID0gMDsKKworICAgIC8qIFRyZWJsZSBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLlRFX09wZXJhdGluZ01vZGUgICAgICAgPSBMVk1fVEVfT0ZGOworICAgIHBhcmFtcy5URV9FZmZlY3RMZXZlbCAgICAgICAgID0gMDsKKworICAgIC8qIFBTQSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgICBwYXJhbXMuUFNBX0VuYWJsZSAgICAgICAgICAgICA9IExWTV9QU0FfT0ZGOworICAgIHBhcmFtcy5QU0FfUGVha0RlY2F5UmF0ZSAgICAgID0gKExWTV9QU0FfRGVjYXlTcGVlZF9lbikwOworCisgICAgLyogQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLkJFX09wZXJhdGluZ01vZGUgICAgICAgPSBMVk1fQkVfT0ZGOworICAgIHBhcmFtcy5CRV9FZmZlY3RMZXZlbCAgICAgICAgID0gMDsKKyAgICBwYXJhbXMuQkVfQ2VudHJlRnJlcSAgICAgICAgICA9IExWTV9CRV9DRU5UUkVfOTBIejsKKyAgICBwYXJhbXMuQkVfSFBGICAgICAgICAgICAgICAgICA9IExWTV9CRV9IUEZfT047CisKKyAgICAvKiBQU0EgQ29udHJvbCBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLlBTQV9FbmFibGUgICAgICAgICAgICAgPSBMVk1fUFNBX09GRjsKKyAgICBwYXJhbXMuUFNBX1BlYWtEZWNheVJhdGUgICAgICA9IExWTV9QU0FfU1BFRURfTUVESVVNOworCisgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpOworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJMdm1CdW5kbGVfaW5pdCIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIExPR1YoIlx0Q3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisKKyAgICAvKiBTZXQgdGhlIGhlYWRyb29tIHBhcmFtZXRlcnMgKi8KKyAgICBIZWFkcm9vbUJhbmREZWZbMF0uTGltaXRfTG93ICAgICAgICAgID0gMjA7CisgICAgSGVhZHJvb21CYW5kRGVmWzBdLkxpbWl0X0hpZ2ggICAgICAgICA9IDQ5OTk7CisgICAgSGVhZHJvb21CYW5kRGVmWzBdLkhlYWRyb29tX09mZnNldCAgICA9IDM7CisgICAgSGVhZHJvb21CYW5kRGVmWzFdLkxpbWl0X0xvdyAgICAgICAgICA9IDUwMDA7CisgICAgSGVhZHJvb21CYW5kRGVmWzFdLkxpbWl0X0hpZ2ggICAgICAgICA9IDI0MDAwOworICAgIEhlYWRyb29tQmFuZERlZlsxXS5IZWFkcm9vbV9PZmZzZXQgICAgPSA0OworICAgIEhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb24gICAgPSAmSGVhZHJvb21CYW5kRGVmWzBdOworICAgIEhlYWRyb29tUGFyYW1zLkhlYWRyb29tX09wZXJhdGluZ01vZGUgPSBMVk1fSEVBRFJPT01fT047CisgICAgSGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHMgICAgICAgICA9IDI7CisKKyAgICBMdm1TdGF0dXMgPSBMVk1fU2V0SGVhZHJvb21QYXJhbXMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSGVhZHJvb21QYXJhbXMpOworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRIZWFkcm9vbVBhcmFtcyIsICJMdm1CdW5kbGVfaW5pdCIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIExPR1YoIlx0Q3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRIZWFkcm9vbVBhcmFtc1xuIik7CisgICAgI2VuZGlmICAgIC8qIGVuZCBMVk1fQlVORExFICovCisKKyAgICBMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IEVuZCIpOworICAgIHJldHVybiAwOworfSAgIC8qIGVuZCBMdm1CdW5kbGVfaW5pdCAqLworCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMdm1CdW5kbGVfcHJvY2VzcygpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBBcHBseSBMVk0gQnVuZGxlIGVmZmVjdHMKKy8vCisvLyBJbnB1dHM6CisvLyAgcEluOiAgICAgICAgcG9pbnRlciB0byBzdGVyZW8gMTYgYml0IGlucHV0IGRhdGEKKy8vICBwT3V0OiAgICAgICBwb2ludGVyIHRvIHN0ZXJlbyAxNiBiaXQgb3V0cHV0IGRhdGEKKy8vICBmcmFtZUNvdW50OiBGcmFtZXMgdG8gcHJvY2VzcworLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIHN0cmVuZ3RoICAgIHN0cmVuZ3RoIHRvIGJlIGFwcGxpZWQKKy8vCisvLyAgT3V0cHV0czoKKy8vICBwT3V0OiAgICAgICBwb2ludGVyIHRvIHVwZGF0ZWQgc3RlcmVvIDE2IGJpdCBvdXRwdXQgZGF0YQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgTHZtQnVuZGxlX3Byb2Nlc3MoTFZNX0lOVDE2ICAgICAgICAqcEluLAorICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBPdXQsCisgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgIEVmZmVjdENvbnRleHQgKnBDb250ZXh0KXsKKworICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisKKyAgICAjaWZkZWYgTFZNX0JVTkRMRQorCUxWTV9JTlQxNgkJCQkqcE91dFRtcDsKKwlpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSl7CisJCS8vTE9HVigiXHRwcm9jZXNzOiBtQmVoYXZpb3IgaXMgRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUgJWRcbiIsCisJCS8vCQlwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlKTsKKwkJcE91dFRtcCA9IHBPdXQ7CisJfWVsc2UgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSl7CisJCS8vTE9HVigiXHRwcm9jZXNzOiBtQmVoYXZpb3IgaXMgRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSAlZFxuIiwKKwkJLy8JCXBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUpOworCQlwT3V0VG1wID0gKExWTV9JTlQxNiAqKW1hbGxvYyhmcmFtZUNvdW50ICogc2l6ZW9mKExWTV9JTlQxNikgKiAyKTsKKwkJaWYocE91dFRtcCA9PSBOVUxMKXsKKwkJCUxPR1YoIlx0TFZNX0VSUk9SIDogTHZtQnVuZGxlX3Byb2Nlc3MgZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSBtb2RlIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX1lbHNleworCQlMT0dWKCJMVk1fRVJST1IgOiBMdm1CdW5kbGVfcHJvY2VzcyBpbnZhbGlkIGFjY2VzcyBtb2RlIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKwkvKiBQcm9jZXNzIHRoZSBzYW1wbGVzICovCisgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWN0aXZlUGFyYW1zKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtRWZmZWN0X2VuYWJsZSIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICBMT0dWKCJcdCVkICVkICVkXG4iLEFjdGl2ZVBhcmFtcy5CRV9PcGVyYXRpbmdNb2RlLCBBY3RpdmVQYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlLCBBY3RpdmVQYXJhbXMuRVFOQl9PcGVyYXRpbmdNb2RlKTsKKworCQorICAgIEx2bVN0YXR1cyA9IExWTV9Qcm9jZXNzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0VG1wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNilmcmFtZUNvdW50LCAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF1ZG8gVGltZSAqLworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fUHJvY2VzcyIsICJMdm1CdW5kbGVfcHJvY2VzcyIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworCWlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpeworCQlmb3IgKGludCBpPTA7IGk8ZnJhbWVDb3VudCoyOyBpKyspeworCQkJcE91dFtpXSArPSAgcE91dFRtcFtpXTsKKwkJfQorCQlmcmVlKHBPdXRUbXApOworCX0KKyAgICAjZWxzZQorICAgIG1lbWNweShwT3V0LCBwSW4sIGZyYW1lQ291bnQqc2l6ZW9mKExWTV9JTlQxNikqMik7IC8vIDIgaXMgZm9yIHN0ZXJlbyBpbnB1dAorICAgICNlbmRpZiAgICAvKiBlbmQgTFZNX0JVTkRMRSAqLworICAgIHJldHVybiAwOworfSAgICAvKiBlbmQgTHZtQnVuZGxlX3Byb2Nlc3MgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMdm1FZmZlY3RfZW5hYmxlKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogRW5hYmxlIHRoZSBlZmZlY3QgaW4gdGhlIGJ1bmRsZQorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgTHZtRWZmZWN0X2VuYWJsZShFZmZlY3RDb250ZXh0ICpwQ29udGV4dCl7CisgICAgTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIHN0YXJ0Iik7CisgICAKKyAgICAjaWZkZWYgTFZNX0JVTkRMRQorICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWN0aXZlUGFyYW1zKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtRWZmZWN0X2VuYWJsZSIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICBMT0dWKCJcdEx2bUVmZmVjdF9lbmFibGUgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisKKyAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkgeworICAgICAgICBMT0dWKCJcdEx2bUVmZmVjdF9lbmFibGUgOiBFbmFibGluZyBMVk1fQkFTU19CT09TVCIpOyAgICAKKyAgICAgICAgQWN0aXZlUGFyYW1zLkJFX09wZXJhdGluZ01vZGUgICAgICAgPSBMVk1fQkVfT047CisgICAgfQorICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUikgeworICAgICAgICBMT0dWKCJcdEx2bUVmZmVjdF9lbmFibGUgOiBFbmFibGluZyBMVk1fVklSVFVBTElaRVIiKTsgICAgCisgICAgICAgIEFjdGl2ZVBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgICA9IExWTV9NT0RFX09OOworICAgIH0KKyAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKSB7CisgICAgICAgIExPR1YoIlx0THZtRWZmZWN0X2VuYWJsZSA6IEVuYWJsaW5nIExWTV9FUVVBTElaRVIiKTsgICAgCisgICAgICAgIEFjdGl2ZVBhcmFtcy5FUU5CX09wZXJhdGluZ01vZGUgICAgID0gTFZNX0VRTkJfT047CisgICAgfQorICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpIHsKKyAgICAgICAgTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIDogRW5hYmxpbmcgTFZNX1ZPTFVNRSIpOyAgICAKKyAgICB9ICAgIAorICAgIAorICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtRWZmZWN0X2VuYWJsZSIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICBMT0dWKCJcdEx2bUVmZmVjdF9lbmFibGUgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7ICAgIAorICAgICNlbmRpZiAgICAvKiBlbmQgTFZNX0JVTkRMRSAqLyAgICAKKyAgICAKKyAgICBMT0dWKCJcdEx2bUVmZmVjdF9lbmFibGUgZW5kIik7ICAgIAorICAgIHJldHVybiAwOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTHZtRWZmZWN0X2Rpc2FibGUoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOiBEaXNhYmxlIHRoZSBlZmZlY3QgaW4gdGhlIGJ1bmRsZQorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgTHZtRWZmZWN0X2Rpc2FibGUoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpeworICAgIExPR1YoIlx0THZtRWZmZWN0X2Rpc2FibGUgc3RhcnQiKTsKKyAgIAorICAgICNpZmRlZiBMVk1fQlVORExFCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7ICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBY3RpdmVQYXJhbXMpOworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJMdm1FZmZlY3RfZGlzYWJsZSIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICBMT0dWKCJcdEx2bUVmZmVjdF9kaXNhYmxlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworCisgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpIHsKKyAgICAgICAgTE9HVigiXHRMdm1FZmZlY3RfZGlzYWJsZSA6IERpc2FibGluZyBMVk1fQkFTU19CT09TVCIpOyAgICAKKyAgICAgICAgQWN0aXZlUGFyYW1zLkJFX09wZXJhdGluZ01vZGUgICAgICAgPSBMVk1fQkVfT0ZGOworICAgIH0KKyAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpIHsKKyAgICAgICAgTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIDogRW5hYmxpbmcgTFZNX1ZJUlRVQUxJWkVSIik7ICAgIAorICAgICAgICBBY3RpdmVQYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlICAgPSBMVk1fTU9ERV9PRkY7CisgICAgfQorICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpIHsKKyAgICAgICAgTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIDogRW5hYmxpbmcgTFZNX0VRVUFMSVpFUiIpOyAgICAKKyAgICAgICAgQWN0aXZlUGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZSAgICAgPSBMVk1fRVFOQl9PRkY7CisgICAgfQorICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpIHsKKyAgICAgICAgTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIDogRW5hYmxpbmcgTFZNX1ZPTFVNRSIpOyAgICAKKyAgICB9IAorICAgIAorICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtRWZmZWN0X2Rpc2FibGUiKQorICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOyAgICAKKyAgICAjZW5kaWYgICAgLyogZW5kIExWTV9CVU5ETEUgKi8gICAgCisgICAgCisgICAgTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIGVuZCIpOyAgICAKKyAgICByZXR1cm4gMDsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEx2bUVmZmVjdF9mcmVlKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogRnJlZSBhbGwgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgQnVuZGxlLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIEx2bUVmZmVjdF9mcmVlKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KXsKKyAgICAjaWZkZWYgTFZNX0JVTkRMRQorICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVk1fU1VDQ0VTUzsgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIHBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fTWVtVGFiX3QgICAgICAgICAgICBNZW1UYWI7CisKKyAgICAvKiBGcmVlIHRoZSBhbGdvcml0aG0gbWVtb3J5ICovCisgICAgTHZtU3RhdHVzID0gTFZNX0dldE1lbW9yeVRhYmxlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lbVRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRNZW1vcnlUYWJsZSIsICJMdm1FZmZlY3RfZnJlZSIpCisKKyAgICBmb3IgKGludCBpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspeworICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5TaXplICE9IDApeworICAgICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzICE9IE5VTEwpeworICAgICAgICAgICAgICAgIExPR1YoIlx0ZnJlZSgpIC0gU1RBUlQgZnJlZWluZyAlbGQgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworCisgICAgICAgICAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisKKyAgICAgICAgICAgICAgICBMT0dWKCJcdGZyZWUoKSAtIEVORCAgIGZyZWVpbmcgJWxkIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogZnJlZSgpIC0gdHJ5aW5nIHRvIGZyZWUgd2l0aCBOVUxMIHBvaW50ZXIgJWxkIGJ5dGVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgcmVnaW9uICV1IGF0ICVwIEVSUk9SXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgI2VuZGlmICAgIC8qIGVuZCBMVk1fQlVORExFICovCit9ICAgIC8qIGVuZCBMdm1FZmZlY3RfZnJlZSAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVmZmVjdF9jb25maWd1cmUoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOiBTZXQgaW5wdXQgYW5kIG91dHB1dCBhdWRpbyBjb25maWd1cmF0aW9uLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vICBwQ29uZmlnOiAgICBwb2ludGVyIHRvIGVmZmVjdF9jb25maWdfdCBzdHJ1Y3R1cmUgaG9sZGluZyBpbnB1dCBhbmQgb3V0cHV0CisvLyAgICAgIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBFZmZlY3RfY29uZmlndXJlKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpeworICAgIExPR1YoIlx0RWZmZWN0X2NvbmZpZ3VyZSBzdGFydCIpOworCisgICAgQ0hFQ0tfQVJHKHBDb250ZXh0ICE9IE5VTEwpOworICAgIENIRUNLX0FSRyhwQ29uZmlnICE9IE5VTEwpOworCisgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlKTsKKyAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQpOworICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBDSEFOTkVMX1NURVJFTyk7CisgICAgQ0hFQ0tfQVJHKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFCisgICAgICAgICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpOworICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1KTsKKworICAgIExPR1YoIlx0RWZmZWN0X2NvbmZpZ3VyZSBjYWxsaW5nIG1lbWNweSIpOworICAgIG1lbWNweSgmcENvbnRleHQtPmNvbmZpZywgcENvbmZpZywgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkpOworICAgIExPR1YoIlx0RWZmZWN0X2NvbmZpZ3VyZSBFbmQiKTsKKyAgICByZXR1cm4gMDsKK30gICAvKiBlbmQgRWZmZWN0X2NvbmZpZ3VyZSAqLworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJhc3NHZXRTdHJlbmd0aCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBnZXQgdGhlIGVmZmVjdCBzdHJlbmd0aCBjdXJyZW50bHkgYmVpbmcgdXNlZCwgd2hhdCBpcyBhY3R1YWxseSByZXR1cm5lZCBpcyB0aGUgc3RyZW5naCB0aGF0IHdhcworLy8gcHJldmlvdXNseSB1c2VkIGluIHRoZSBzZXQsIHRoaXMgaXMgYmVjYXVzZSB0aGUgYXBwIHVzZXMgYSBzdHJlbmd0aCBpbiB0aGUgcmFuZ2UgMC0xMDAwIHdoaWxlCisvLyB0aGUgYmFzc2Jvb3N0IHVzZXMgMS0xNSwgc28gdG8gYXZvaWQgYSBxdWFudGlzYXRpb24gdGhlIG9yaWdpbmFsIHNldCB2YWx1ZSBpcyB1c2VkLiBIb3dldmVyIHRoZQorLy8gYWN0dWFsIHVzZWQgdmFsdWUgaXMgY2hlY2tlZCB0byBtYWtlIHN1cmUgaXQgY29ycmVzcG9uZHMgdG8gdGhlIG9uZSBiZWluZyByZXR1cm5lZAorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordWludDMyX3QgQmFzc0dldFN0cmVuZ3RoKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KXsKKyAgICBMT0dWKCJcdEJhc3NHZXRTdHJlbmd0aCgpICgwLTEwMDApIC0+ICVkXG4iLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCk7CisKKyAgICAjaWZkZWYgTFZNX0JVTkRMRQorICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWN0aXZlUGFyYW1zKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiQmFzc0dldFN0cmVuZ3RoIikKKyAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgICAgTE9HVigiXHRCYXNzR2V0U3RyZW5ndGggU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworCisgICAgLyogQ2hlY2sgdGhhdCB0aGUgc3RyZW5ndGggcmV0dXJuZWQgbWF0Y2hlcyB0aGUgc3RyZW5ndGggdGhhdCB3YXMgc2V0IGVhcmxpZXIgKi8KKyAgICBpZihBY3RpdmVQYXJhbXMuQkVfRWZmZWN0TGV2ZWwgIT0gKExWTV9JTlQxNikoKDE1KnBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkKS8xMDAwKSl7CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogQmFzc0dldFN0cmVuZ3RoIG1vZHVsZSBzdHJlbmd0aCBkb2VzIG5vdCBtYXRjaCBzYXZlZFN0cmVuZ3RoICVkICVkXG4iLAorICAgICAgICAgICAgICAgIEFjdGl2ZVBhcmFtcy5CRV9FZmZlY3RMZXZlbCwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBMT0dWKCJcdEJhc3NHZXRTdHJlbmd0aCgpICgwLTE1KSAgIC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuQkVfRWZmZWN0TGV2ZWwgKTsKKyAgICAjZW5kaWYgICAgLyogZW5kIExWTV9CVU5ETEUgKi8KKworICAgIExPR1YoIlx0QmFzc0dldFN0cmVuZ3RoKCkgKHNhdmVkKSAgLT4gJWRcbiIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkICk7CisgICAgcmV0dXJuIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkOworfSAgICAvKiBlbmQgQmFzc0dldFN0cmVuZ3RoICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQmFzc1NldFN0cmVuZ3RoKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIEFwcGx5IHRoZSBzdHJlbmd0aCB0byB0aGUgQmFzc0Jvc3N0LiBNdXN0IGZpcnN0IGJlIGNvbnZlcnRlZCBmcm9tIHRoZSByYW5nZSAwLTEwMDAgdG8gMS0xNQorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vICBzdHJlbmd0aCAgICBzdHJlbmd0aCB0byBiZSBhcHBsaWVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgQmFzc1NldFN0cmVuZ3RoKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB1aW50MzJfdCBzdHJlbmd0aCl7CisgICAgTE9HVigiXHRCYXNzU2V0U3RyZW5ndGgoJWQpIiwgc3RyZW5ndGgpOworCisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQgPSAoaW50KXN0cmVuZ3RoOworCisgICAgI2lmZGVmIExWTV9CVU5ETEUKKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVk1fU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWN0aXZlUGFyYW1zKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiQmFzc1NldFN0cmVuZ3RoIikKKyAgICBMT0dWKCJcdHNldFN0cmVuZ3RoIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKworICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLworLy8gICAgQWN0aXZlUGFyYW1zLkJFX09wZXJhdGluZ01vZGUgID0gTFZNX0JFX09OOworICAgIEFjdGl2ZVBhcmFtcy5CRV9FZmZlY3RMZXZlbCAgICA9IChMVk1fSU5UMTYpKCgxNSpzdHJlbmd0aCkvMTAwMCk7CisgICAgQWN0aXZlUGFyYW1zLkJFX0NlbnRyZUZyZXEgICAgID0gTFZNX0JFX0NFTlRSRV85MEh6OworCisgICAgTE9HVigiXHRCYXNzU2V0U3RyZW5ndGgoKSAoMC0xNSkgICAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkJFX0VmZmVjdExldmVsICk7CisKKyAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJCYXNzU2V0U3RyZW5ndGgiKQorICAgIExPR1YoIlx0QmFzc1NldFN0cmVuZ3RoIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgICNlbmRpZiAgICAvKiBlbmQgTFZNX0JVTkRMRSAqLworfSAgICAvKiBlbmQgQmFzc1NldFN0cmVuZ3RoICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmlydHVhbGl6ZXJHZXRTdHJlbmd0aCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBnZXQgdGhlIGVmZmVjdCBzdHJlbmd0aCBjdXJyZW50bHkgYmVpbmcgdXNlZCwgd2hhdCBpcyBhY3R1YWxseSByZXR1cm5lZCBpcyB0aGUgc3RyZW5naCB0aGF0IHdhcworLy8gcHJldmlvdXNseSB1c2VkIGluIHRoZSBzZXQsIHRoaXMgaXMgYmVjYXVzZSB0aGUgYXBwIHVzZXMgYSBzdHJlbmd0aCBpbiB0aGUgcmFuZ2UgMC0xMDAwIHdoaWxlCisvLyB0aGUgVmlydHVhbGl6ZXIgdXNlcyAxLTEwMCwgc28gdG8gYXZvaWQgYSBxdWFudGlzYXRpb24gdGhlIG9yaWdpbmFsIHNldCB2YWx1ZSBpcyB1c2VkLiBIb3dldmVyIHRoZQorLy8gYWN0dWFsIHVzZWQgdmFsdWUgaXMgY2hlY2tlZCB0byBtYWtlIHN1cmUgaXQgY29ycmVzcG9uZHMgdG8gdGhlIG9uZSBiZWluZyByZXR1cm5lZAorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordWludDMyX3QgVmlydHVhbGl6ZXJHZXRTdHJlbmd0aChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCl7CisgICAgTE9HVigiXHRWaXJ0dWFsaXplckdldFN0cmVuZ3RoKCkgKDAtMTAwMCkgLT4gJWRcbiIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlZpcnRTdHJlbmd0aFNhdmVkICk7CisKKyAgICAjaWZkZWYgTFZNX0JVTkRMRQorICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZpcnR1YWxpemVyR2V0U3RyZW5ndGgiKQorICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBMT0dWKCJcdFZpcnR1YWxpemVyR2V0U3RyZW5ndGggU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIExPR1YoIlx0VmlydHVhbGl6ZXJHZXRTdHJlbmd0aCgpICgwLTEwMCkgICAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwqMTApOworICAgICNlbmRpZiAgICAvKiBlbmQgTFZNX0JVTkRMRSAqLworCisgICAgcmV0dXJuIEFjdGl2ZVBhcmFtcy5WaXJ0dWFsaXplclJldmVyYkxldmVsKjEwOworfSAgICAvKiBlbmQgZ2V0U3RyZW5ndGggKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWaXJ0dWFsaXplclNldFN0cmVuZ3RoKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIEFwcGx5IHRoZSBzdHJlbmd0aCB0byB0aGUgVmlydHVhbGl6ZXIuIE11c3QgZmlyc3QgYmUgY29udmVydGVkIGZyb20gdGhlIHJhbmdlIDAtMTAwMCB0byAxLTE1CisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIHN0cmVuZ3RoICAgIHN0cmVuZ3RoIHRvIGJlIGFwcGxpZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBWaXJ0dWFsaXplclNldFN0cmVuZ3RoKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB1aW50MzJfdCBzdHJlbmd0aCl7CisgICAgTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoKCVkKSIsIHN0cmVuZ3RoKTsKKworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlZpcnRTdHJlbmd0aFNhdmVkID0gKGludClzdHJlbmd0aDsKKworICAgICNpZmRlZiBMVk1fQlVORExFCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZNX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwmQWN0aXZlUGFyYW1zKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVmlydHVhbGl6ZXJTZXRTdHJlbmd0aCIpCisgICAgTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKworICAgIC8qIFZpcnR1YWxpemVyIHBhcmFtZXRlcnMgKi8KKyAgICBBY3RpdmVQYXJhbXMuVmlydHVhbGl6ZXJSZXZlcmJMZXZlbCAgICA9IChMVk1fSU5UMTYpKHN0cmVuZ3RoLzEwKTsKKworICAgIExPR1YoIlx0VmlydHVhbGl6ZXJTZXRTdHJlbmd0aCgpICgwLTEwMDApICAgLT4gJWRcbiIsIHN0cmVuZ3RoICk7CisgICAgTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoKCkgKDAtIDEwMCkgICAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgKTsKKworICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJWaXJ0dWFsaXplclNldFN0cmVuZ3RoIikKKyAgICBMT0dWKCJcdFZpcnR1YWxpemVyU2V0U3RyZW5ndGggU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgI2VuZGlmICAgIC8qIGVuZCBMVk1fQlVORExFICovCit9ICAgIC8qIGVuZCBzZXRTdHJlbmd0aCAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVxdWFsaXplckdldEJhbmRMZXZlbCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IFJldHJpZXZlIHRoZSBnYWluIGN1cnJlbnRseSBiZWluZyB1c2VkIGZvciB0aGUgYmFuZCBwYXNzZWQgaW4KKy8vCisvLyBJbnB1dHM6CisvLyAgYmFuZDogICAgICAgYmFuZCBudW1iZXIKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50MzJfdCBFcXVhbGl6ZXJHZXRCYW5kTGV2ZWwoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGludDMyX3QgYmFuZCl7CisKKwlpbnQzMl90IEdhaW4gPTA7CisKKwkjaWZkZWYgTFZNX0JVTkRMRQorCUxWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworCUxWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCUxWTV9FUU5CX0JhbmREZWZfdCAgICAgICpCYW5kRGVmOworCisJTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworCQkJCQkJCQkJCSAmQWN0aXZlUGFyYW1zKTsKKworCUxWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiZ2V0QmFuZExldmVsIikKKworCUJhbmREZWYgPSBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb247CisJR2FpbiAgICA9IChpbnQzMl90KUJhbmREZWZbYmFuZF0uR2FpbioxMDA7ICAgIC8vIENvbnZlcnQgdG8gbWlsbGliZWxzCisKKwlMT0dWKCJcdGdldEJhbmRMZXZlbCgpIC0+ICVkXG4iLCBHYWluICk7CisJTE9HVigiXHRnZXRCYW5kTGV2ZWwgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworCSNlbmRpZiAgICAvKiBlbmQgTFZNX0JVTkRMRSAqLworCisJcmV0dXJuIEdhaW47Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRXF1YWxpemVyU2V0QmFuZExldmVsKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vICBTZXRzIGdhaW4gdmFsdWUgZm9yIHRoZSBnaXZlbiBiYW5kLgorLy8KKy8vIElucHV0czoKKy8vICBiYW5kOiAgICAgICBiYW5kIG51bWJlcgorLy8gIEdhaW46ICAgICAgIEdhaW4gdG8gYmUgYXBwbGllZCBpbiBtaWxsaWJlbHMKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIEVxdWFsaXplclNldEJhbmRMZXZlbChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50IGJhbmQsIGludCBHYWluKXsKKwlpbnQgZ2FpblJvdW5kZWQ7CisJaWYoR2FpbiA+IDApeworCQlnYWluUm91bmRlZCA9IChpbnQpKChHYWluKzUwKS8xMDApOworCX1lbHNleworCQlnYWluUm91bmRlZCA9IChpbnQpKChHYWluLTUwKS8xMDApOworCX0KKyAgICBMT0dWKCJcdHNldEJhbmRMZXZlbCglZCktPiglZCkiLCBHYWluLCBnYWluUm91bmRlZCk7CisKKyAgICAjaWZkZWYgTFZNX0JVTkRMRQorICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWTV9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKwlMVk1fRVFOQl9CYW5kRGVmX3QgICAgICAqQmFuZERlZjsKKworICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAic2V0QmFuZExldmVsIikKKyAgICBMT0dWKCJcdHNldEJhbmRMZXZlbCBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgTE9HVigiXHRzZXRCYW5kTGV2ZWwoKSBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uW2JhbmRdLkdhaW4pOworCisgICAgLyogU2V0IGxvY2FsIEVRIHBhcmFtZXRlcnMgKi8KKwlCYW5kRGVmID0gQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uOworCUFjdGl2ZVBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbltiYW5kXS5HYWluID0gZ2FpblJvdW5kZWQ7CisKKyAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAic2V0QmFuZExldmVsIikKKyAgICBMT0dWKCJcdHNldEJhbmRMZXZlbCgpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb25bYmFuZF0uR2Fpbik7CisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgdG8gY2hlY2sgdGhleSB3ZXJlIGFwcGxpZWQgb2ssIG1pZ2h0IG5vdCB3b3JrIGFzIHByb2Nlc3Mgbm90IGNhbGxlZCovCisgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJzZXRCYW5kTGV2ZWwiKQorICAgIExPR1YoIlx0TFZNX0VSUk9SIDogcmVtb3ZlIHRoaXMgdGVzdCBzZXRCYW5kTGV2ZWwgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIExPR1YoIlx0c2V0QmFuZExldmVsKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbltiYW5kXS5HYWluKTsKKyAgICBMT0dWKCJcdHNldEJhbmRMZXZlbCBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAjZW5kaWYgICAgLyogZW5kIExWTV9CVU5ETEUgKi8KKworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkN1clByZXNldCA9IFBSRVNFVF9DVVNUT007CisgICAgcmV0dXJuOworfQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFcXVhbGl6ZXJHZXRDZW50cmVGcmVxdWVuY3koKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOiBSZXRyaWV2ZSB0aGUgZnJlcXVlbmN5IGJlaW5nIHVzZWQgZm9yIHRoZSBiYW5kIHBhc3NlZCBpbgorLy8KKy8vIElucHV0czoKKy8vICBiYW5kOiAgICAgICBiYW5kIG51bWJlcgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQzMl90IEVxdWFsaXplckdldENlbnRyZUZyZXF1ZW5jeShFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50MzJfdCBiYW5kKXsKKwlpbnQzMl90IEZyZXF1ZW5jeSA9MDsKKworCSNpZmRlZiBMVk1fQlVORExFCisJTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisJTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7ICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisJTFZNX0VRTkJfQmFuZERlZl90ICAgICAgKkJhbmREZWY7CisKKwlMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisJCQkJCQkJCQkJICZBY3RpdmVQYXJhbXMpOworCisJTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJnZXRDZW50cmVGcmVxdWVuY3kiKQorCisJQmFuZERlZiAgID0gQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uOworCUZyZXF1ZW5jeSA9IChpbnQzMl90KUJhbmREZWZbYmFuZF0uRnJlcXVlbmN5KjEwMDA7ICAgICAvLyBDb252ZXJ0IHRvIG1pbGxpYmVscworCisJTE9HVigiXHRnZXRDZW50cmVGcmVxdWVuY3koKSAtPiAlZFxuIiwgRnJlcXVlbmN5ICk7CisJTE9HVigiXHRnZXRDZW50cmVGcmVxdWVuY3kgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworCSNlbmRpZiAgICAvKiBlbmQgTFZNX0JVTkRMRSAqLworCisJcmV0dXJuIEZyZXF1ZW5jeTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFcXVhbGl6ZXJHZXRCYW5kRnJlcVJhbmdlKAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8KKy8vIEdldHMgbG93ZXIgYW5kIHVwcGVyIGJvdW5kYXJpZXMgb2YgYSBiYW5kLgorLy8gRm9yIHRoZSBoaWdoIHNoZWxmLCB0aGUgbG93IGJvdW5kIGlzIHRoZSBiYW5kIGZyZXF1ZW5jeSBhbmQgdGhlIGhpZ2gKKy8vIGJvdW5kIGlzIE55cXVpc3QuCisvLyBGb3IgdGhlIHBlYWtpbmcgZmlsdGVycywgdGhleSBhcmUgdGhlIGdhaW5bZEJdLzIgcG9pbnRzLgorLy8KKy8vIElucHV0czoKKy8vICBiYW5kOiAgICAgICBiYW5kIG51bWJlcgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vIE91dHB1dHM6CisvLyAgcExvdzogICAgICAgbG93ZXIgYmFuZCByYW5nZQorLy8gIHBMb3c6ICAgICAgIHVwcGVyIGJhbmQgcmFuZ2UKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50MzJfdCBFcXVhbGl6ZXJHZXRCYW5kRnJlcVJhbmdlKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBpbnQzMl90IGJhbmQsIHVpbnQzMl90ICpwTG93LCB1aW50MzJfdCAqcEhpKXsKKwkqcExvdyA9IGJhbmRGcmVxUmFuZ2VbYmFuZF1bMF07CisJKnBIaSAgPSBiYW5kRnJlcVJhbmdlW2JhbmRdWzFdOworCXJldHVybiAwOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVxdWFsaXplckdldEJhbmQoCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLworLy8gUmV0dXJucyB0aGUgYmFuZCB3aXRoIHRoZSBtYXhpbXVtIGluZmx1ZW5jZSBvbiBhIGdpdmVuIGZyZXF1ZW5jeS4KKy8vIFJlc3VsdCBpcyB1bmFmZmVjdGVkIGJ5IHdoZXRoZXIgRVEgaXMgZW5hYmxlZCBvciBub3QsIG9yIGJ5IHdoZXRoZXIKKy8vIGNoYW5nZXMgaGF2ZSBiZWVuIGNvbW1pdHRlZCBvciBub3QuCisvLworLy8gSW5wdXRzOgorLy8gIHRhcmdldEZyZXEgICBUaGUgdGFyZ2V0IGZyZXF1ZW5jeSwgaW4gbWlsbGloZXJ0ei4KKy8vICBwQ29udGV4dDogICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8gT3V0cHV0czoKKy8vICBwTG93OiAgICAgICBsb3dlciBiYW5kIHJhbmdlCisvLyAgcExvdzogICAgICAgdXBwZXIgYmFuZCByYW5nZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQzMl90IEVxdWFsaXplckdldEJhbmQoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHVpbnQzMl90IHRhcmdldEZyZXEpeworICAgIGludCBiYW5kID0gMDsKKworCWlmKHRhcmdldEZyZXEgPCBiYW5kRnJlcVJhbmdlWzBdWzBdKXsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfWVsc2UgaWYodGFyZ2V0RnJlcSA9PSBiYW5kRnJlcVJhbmdlWzBdWzBdKXsKKwkJcmV0dXJuIDA7CisJfQorCWZvcihpbnQgaT0wOyBpPEZJVkVCQU5EX05VTUJBTkRTO2krKyl7CisJCWlmKCh0YXJnZXRGcmVxID4gYmFuZEZyZXFSYW5nZVtpXVswXSkmJih0YXJnZXRGcmVxIDw9IGJhbmRGcmVxUmFuZ2VbaV1bMV0pKXsKKwkJCWJhbmQgPSBpOworCQl9CisJfQorICAgIHJldHVybiBiYW5kOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVxdWFsaXplckdldFByZXNldCgKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vCisvLyBHZXRzIHRoZSBjdXJyZW50bHkgc2V0IHByZXNldCBJRC4KKy8vIFdpbGwgcmV0dXJuIFBSRVNFVF9DVVNUT00gaW4gY2FzZSB0aGUgRVEgcGFyYW1ldGVycyBoYXZlIGJlZW4gbW9kaWZpZWQKKy8vIG1hbnVhbGx5IHNpbmNlIGEgcHJlc2V0IHdhcyBzZXQuCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludDMyX3QgRXF1YWxpemVyR2V0UHJlc2V0KEVmZmVjdENvbnRleHQgKnBDb250ZXh0KXsKKwlyZXR1cm4gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q3VyUHJlc2V0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVxdWFsaXplclNldFByZXNldCgKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vCisvLyBTZXRzIHRoZSBjdXJyZW50IHByZXNldCBieSBJRC4KKy8vIEFsbCB0aGUgYmFuZCBwYXJhbWV0ZXJzIHdpbGwgYmUgb3ZlcnJpZGRlbi4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIHByZXNldCAgICAgICBUaGUgcHJlc2V0IElELgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBFcXVhbGl6ZXJTZXRQcmVzZXQoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGludCBwcmVzZXQpeworCisgICAgTE9HVigiXHRzZXRQcmVzZXQoJWQpIiwgcHJlc2V0KTsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DdXJQcmVzZXQgPSBwcmVzZXQ7CisKKyAgICAjaWZkZWYgTFZNX0JVTkRMRQorICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWTV9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKworICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAic2V0UHJlc2V0IikKKyAgICBMT0dWKCJcdHNldFByZXNldCBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisKKyAgICAvL0FjdGl2ZVBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9ICZCYW5kRGVmc1swXTsKKyAgICBmb3IgKGludCBpPTA7IGk8RklWRUJBTkRfTlVNQkFORFM7IGkrKykKKyAgICB7CisgICAgCUFjdGl2ZVBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXS5GcmVxdWVuY3kgPSBFUU5CXzVCYW5kUHJlc2V0c0ZyZXF1ZW5jaWVzW2ldOworICAgIAlBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb25baV0uUUZhY3RvciAgID0gRVFOQl81QmFuZFByZXNldHNRRmFjdG9yc1tpXTsKKyAgICAJQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkdhaW4KKyAgICAJPSBFUU5CXzVCYW5kTm9ybWFsUHJlc2V0c1tpICsgcHJlc2V0ICogRklWRUJBTkRfTlVNQkFORFNdOworICAgIH0KKyAgICAvKiBBY3RpdmF0ZSB0aGUgbmV3IHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJzZXRQcmVzZXQiKQorICAgIExPR1YoIlx0c2V0UHJlc2V0IFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgICNlbmRpZiAgICAvKiBlbmQgTFZNX0JVTkRMRSAqLworCisgICAgcmV0dXJuOworfQoraW50MzJfdCBFcXVhbGl6ZXJHZXROdW1QcmVzZXRzKCl7CisJcmV0dXJuIDEwOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVxdWFsaXplckdldFByZXNldE5hbWUoCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBHZXRzIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgYSBwcmVzZXQgSUQuIFdpbGwgcmV0dXJuICJDdXN0b20iIGlmCisvLyBQUkVTRVRfQ1VTVE9NIGlzIHBhc3NlZC4KKy8vCisvLyBJbnB1dHM6CisvLyBwcmVzZXQgICAgICAgVGhlIHByZXNldCBJRC4gTXVzdCBiZSBsZXNzIHRoYW4gbnVtYmVyIG9mIHByZXNldHMuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjb25zdCBjaGFyICogRXF1YWxpemVyR2V0UHJlc2V0TmFtZShpbnQzMl90IHByZXNldCl7CisgICAgTE9HVigiXHRFcXVhbGl6ZXJHZXRQcmVzZXROYW1lIHN0YXJ0KCVkKSIsIHByZXNldCk7CisgICAgaWYgKHByZXNldCA9PSBQUkVTRVRfQ1VTVE9NKSB7CisgICAgICAgIHJldHVybiAiQ3VzdG9tIjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZ0VxdWFsaXplclByZXNldHNbcHJlc2V0XS5uYW1lOworICAgIH0KKyAgICBMT0dWKCJcdEVxdWFsaXplckdldFByZXNldE5hbWUgZW5kKCVkKSIsIHByZXNldCk7CisJcmV0dXJuIDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVm9sdW1lU2V0Vm9sdW1lTGV2ZWwoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vICBsZXZlbCAgICAgICBsZXZlbCB0byBiZSBhcHBsaWVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBWb2x1bWVTZXRWb2x1bWVMZXZlbChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50MTZfdCBsZXZlbCl7CisgICAgTE9HVigiXHRWb2x1bWVTZXRWb2x1bWVMZXZlbCBzdGFydCglZCkiLCBsZXZlbCk7CisKKyAgICAjaWZkZWYgTFZNX0JVTkRMRQorICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWTV9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKworICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVm9sdW1lU2V0Vm9sdW1lTGV2ZWwiKQorICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgTE9HVigiXHRWb2x1bWVTZXRWb2x1bWVMZXZlbCBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisKKyAgICAvKiBWb2x1bWUgcGFyYW1ldGVycyAqLworICAgIEFjdGl2ZVBhcmFtcy5WQ19FZmZlY3RMZXZlbCAgPSAoTFZNX0lOVDE2KShsZXZlbC8xMDApOworICAgIExPR1YoIlx0Vm9sdW1lU2V0Vm9sdW1lTGV2ZWwoKSAoLTk2ZEIgLT4gMGRCKSAgIC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuVkNfRWZmZWN0TGV2ZWwgKTsKKworICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJWb2x1bWVTZXRWb2x1bWVMZXZlbCIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIExPR1YoIlx0Vm9sdW1lU2V0Vm9sdW1lTGV2ZWwgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgTE9HVigiXHRWb2x1bWVTZXRWb2x1bWVMZXZlbCBlbmQiKTsKKyAgICAjZW5kaWYgICAgLyogZW5kIExWTV9CVU5ETEUgKi8KKyAgICByZXR1cm4gMDsKK30gICAgLyogZW5kIHNldFZvbHVtZUxldmVsICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVm9sdW1lR2V0Vm9sdW1lTGV2ZWwoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFZvbHVtZUdldFZvbHVtZUxldmVsKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBpbnQxNl90ICpsZXZlbCl7CisKKyAgICBMT0dWKCJcdFZvbHVtZUdldFZvbHVtZUxldmVsIHN0YXJ0Iik7CisgICAgI2lmZGVmIExWTV9CVU5ETEUKKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKworICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVm9sdW1lR2V0Vm9sdW1lTGV2ZWwiKQorICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBMT0dWKCJcdFZvbHVtZUdldFZvbHVtZUxldmVsKCkgKC05NmRCIC0+IDBkQikgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5WQ19FZmZlY3RMZXZlbCApOworICAgIExPR1YoIlx0Vm9sdW1lR2V0Vm9sdW1lTGV2ZWwgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgICNlbmRpZiAgICAvKiBlbmQgTFZNX0JVTkRMRSAqLworCisgICAgKmxldmVsID0gQWN0aXZlUGFyYW1zLlZDX0VmZmVjdExldmVsKjEwMDsgICAgIC8vIENvbnZlcnQgZEIgdG8gbWlsbGliZWxzCisgICAgTE9HVigiXHRWb2x1bWVHZXRWb2x1bWVMZXZlbCBlbmQiKTsKKyAgICByZXR1cm4gMDsKK30gICAgLyogZW5kIFZvbHVtZUdldFZvbHVtZUxldmVsICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVm9sdW1lU2V0TXV0ZSgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIG11dGU6ICAgICAgIGVuYWJsZS9kaXNhYmxlIGZsYWcKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50MzJfdCBWb2x1bWVTZXRNdXRlKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB1aW50MzJfdCBtdXRlKXsKKyAgICBMT0dWKCJcdFZvbHVtZVNldE11dGUgc3RhcnQoKSIpOworCisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkID0gbXV0ZTsKKworICAgICNpZmRlZiBMVk1fQlVORExFCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZNX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJWb2x1bWVTZXRNdXRlIikKKyAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgICAgTE9HVigiXHRWb2x1bWVTZXRNdXRlIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICBMT0dWKCJcdFZvbHVtZVNldE11dGUoKSB0byAlZCwgbGV2ZWwgd2FzICVkXG4iLCBtdXRlLCBBY3RpdmVQYXJhbXMuQkVfRWZmZWN0TGV2ZWwgKTsKKworICAgIC8qIFNldCBhcHByb3ByaWF0ZSB2b2x1bWUgbGV2ZWwgKi8KKyAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQgPT0gTFZNX1RSVUUpeworICAgIAlwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5sZXZlbFNhdmVkID0gQWN0aXZlUGFyYW1zLlZDX0VmZmVjdExldmVsOworICAgIAlBY3RpdmVQYXJhbXMuVkNfRWZmZWN0TGV2ZWwgICAgICAgICAgID0gLTk2OworICAgIH1lbHNleworICAgIAlBY3RpdmVQYXJhbXMuVkNfRWZmZWN0TGV2ZWwgID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bGV2ZWxTYXZlZDsKKyAgICB9CisKKyAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVm9sdW1lU2V0TXV0ZSIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIExPR1YoIlx0Vm9sdW1lU2V0TXV0ZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAjZW5kaWYgICAgLyogZW5kIExWTV9CVU5ETEUgKi8KKyAgICBMT0dWKCJcdFZvbHVtZVNldE11dGUgc3RhcnQoKSIpOworICAgIHJldHVybiAwOworfSAgICAvKiBlbmQgc2V0TXV0ZSAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZvbHVtZVNldE11dGUoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXJwdXRzOgorLy8gIG11dGU6ICAgICAgIGVuYWJsZS9kaXNhYmxlIGZsYWcKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQzMl90IFZvbHVtZUdldE11dGUoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHVpbnQzMl90ICptdXRlKXsKKyAgICBMT0dWKCJcdFZvbHVtZUdldE11dGUgc3RhcnQiKTsKKyAgICBpZigocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkID09IExWTV9GQUxTRSl8fChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQgPT0gTFZNX1RSVUUpKXsKKyAgICAJKm11dGUgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQ7CisgICAgCXJldHVybiAwOworICAgIH1lbHNleworICAgIAlMT0dWKCJcdExWTV9FUlJPUiA6IFZvbHVtZUdldE11dGUgcmVhZCBhbiBpbnZhbGlkIHZhbHVlIGZyb20gY29udGV4dCAlZCIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZCk7CisgICAgCXJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBMT0dWKCJcdFZvbHVtZUdldE11dGUgc3RhcnQiKTsKK30gICAgLyogZW5kIGdldE11dGUgKi8KKworCisKKworCisKKworCisKKworCisKKworCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIEdldCBhIEJhc3NCb29zdCBwYXJhbWV0ZXIKKy8vCisvLyBJbnB1dHM6CisvLyAgcEJhc3NCb29zdCAgICAgICAtIGhhbmRsZSB0byBpbnN0YW5jZSBkYXRhCisvLyAgcFBhcmFtICAgICAgICAgICAtIHBvaW50ZXIgdG8gcGFyYW1ldGVyCisvLyAgcFZhbHVlICAgICAgICAgICAtIHBvaW50ZXIgdG8gdmFyaWFibGUgdG8gaG9sZCByZXRyaWV2ZWQgdmFsdWUKKy8vICBwVmFsdWVTaXplICAgICAgIC0gcG9pbnRlciB0byB2YWx1ZSBzaXplOiBtYXhpbXVtIHNpemUgYXMgaW5wdXQKKy8vCisvLyBPdXRwdXRzOgorLy8gICpwVmFsdWUgdXBkYXRlZCB3aXRoIHBhcmFtZXRlciB2YWx1ZQorLy8gICpwVmFsdWVTaXplIHVwZGF0ZWQgd2l0aCBhY3R1YWwgdmFsdWUgc2l6ZQorLy8KKy8vCisvLyBTaWRlIEVmZmVjdHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgICAgICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICpwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICpwVmFsdWUpeworICAgIGludCBzdGF0dXMgPSAwOworICAgIGludDMyX3QgcGFyYW0gPSAqcFBhcmFtKys7CisgICAgaW50MzJfdCBwYXJhbTI7CisgICAgY2hhciAqbmFtZTsKKworICAgIExPR1YoIlx0QmFzc0Jvb3N0X2dldFBhcmFtZXRlciBzdGFydCIpOworCisgICAgc3dpdGNoIChwYXJhbSl7CisgICAgICAgIGNhc2UgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIX1NVUDoKKyAgICAgICAgICAgIC8vaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZih1aW50MzJfdCkpeworICAgICAgICAgICAgLy8gICAgTE9HVigiXHRMVk1fRVJST1IgOiBCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplMSAlZCIsICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgIC8vICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgLy99CisgICAgICAgICAgICAvLypwVmFsdWVTaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgICAgIC8vYnJlYWs7CisgICAgICAgIGNhc2UgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplMiAlZCIsICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgCUxPR1YoIlx0TFZNX0VSUk9SIDogQmFzc0Jvb3N0X2dldFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHBhcmFtKXsKKyAgICAgICAgY2FzZSBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEhfU1VQOgorICAgICAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSA9IDE7CisKKyAgICAgICAgICAgIExPR1YoIlx0QmFzc0Jvb3N0X2dldFBhcmFtZXRlcigpIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSF9TVVAgVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAqKHVpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIOgorICAgICAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gQmFzc0dldFN0cmVuZ3RoKHBDb250ZXh0KTsKKworICAgICAgICAgICAgTE9HVigiXHRCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKCkgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIIFZhbHVlIGlzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgKihpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEJhc3NCb29zdF9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIExPR1YoIlx0QmFzc0Jvb3N0X2dldFBhcmFtZXRlciBlbmQiKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBlbmQgQmFzc0Jvb3N0X2dldFBhcmFtZXRlciAqLworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQmFzc0Jvb3N0X3NldFBhcmFtZXRlcigpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBTZXQgYSBCYXNzQm9vc3QgcGFyYW1ldGVyCisvLworLy8gSW5wdXRzOgorLy8gIHBCYXNzQm9vc3QgICAgICAgLSBoYW5kbGUgdG8gaW5zdGFuY2UgZGF0YQorLy8gIHBQYXJhbSAgICAgICAgICAgLSBwb2ludGVyIHRvIHBhcmFtZXRlcgorLy8gIHBWYWx1ZSAgICAgICAgICAgLSBwb2ludGVyIHRvIHZhbHVlCisvLworLy8gT3V0cHV0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IEJhc3NCb29zdF9zZXRQYXJhbWV0ZXIgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBpbnQzMl90ICpwUGFyYW0sIHZvaWQgKnBWYWx1ZSl7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgaW50MTZfdCBzdHJlbmd0aDsKKworICAgIExPR1YoIlx0QmFzc0Jvb3N0X3NldFBhcmFtZXRlciBzdGFydCIpOworCisgICAgc3dpdGNoICgqcFBhcmFtKXsKKyAgICAgICAgY2FzZSBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEg6CisgICAgICAgICAgICBzdHJlbmd0aCA9ICooaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICAgICAgIExPR1YoIlx0QmFzc0Jvb3N0X3NldFBhcmFtZXRlcigpIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSCB2YWx1ZSBpcyAlZCIsIHN0cmVuZ3RoKTsKKyAgICAgICAgICAgIExPR1YoIlx0QmFzc0Jvb3N0X3NldFBhcmFtZXRlcigpIENhbGxpbmcgcEJhc3NCb29zdC0+QmFzc1NldFN0cmVuZ3RoIik7CisgICAgICAgICAgICBCYXNzU2V0U3RyZW5ndGgocENvbnRleHQsIChpbnQzMl90KXN0cmVuZ3RoKTsKKyAgICAgICAgICAgIExPR1YoIlx0QmFzc0Jvb3N0X3NldFBhcmFtZXRlcigpIENhbGxlZCBwQmFzc0Jvb3N0LT5CYXNzU2V0U3RyZW5ndGgiKTsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEJhc3NCb29zdF9zZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtICVkIiwgKnBQYXJhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBMT0dWKCJcdEJhc3NCb29zdF9zZXRQYXJhbWV0ZXIgZW5kIik7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogZW5kIEJhc3NCb29zdF9zZXRQYXJhbWV0ZXIgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gR2V0IGEgVmlydHVhbGl6ZXIgcGFyYW1ldGVyCisvLworLy8gSW5wdXRzOgorLy8gIHBWaXJ0dWFsaXplciAgICAgLSBoYW5kbGUgdG8gaW5zdGFuY2UgZGF0YQorLy8gIHBQYXJhbSAgICAgICAgICAgLSBwb2ludGVyIHRvIHBhcmFtZXRlcgorLy8gIHBWYWx1ZSAgICAgICAgICAgLSBwb2ludGVyIHRvIHZhcmlhYmxlIHRvIGhvbGQgcmV0cmlldmVkIHZhbHVlCisvLyAgcFZhbHVlU2l6ZSAgICAgICAtIHBvaW50ZXIgdG8gdmFsdWUgc2l6ZTogbWF4aW11bSBzaXplIGFzIGlucHV0CisvLworLy8gT3V0cHV0czoKKy8vICAqcFZhbHVlIHVwZGF0ZWQgd2l0aCBwYXJhbWV0ZXIgdmFsdWUKKy8vICAqcFZhbHVlU2l6ZSB1cGRhdGVkIHdpdGggYWN0dWFsIHZhbHVlIHNpemUKKy8vCisvLworLy8gU2lkZSBFZmZlY3RzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgICAgICAgICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgKnBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgKnBWYWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICpwVmFsdWUpeworICAgIGludCBzdGF0dXMgPSAwOworICAgIGludDMyX3QgcGFyYW0gPSAqcFBhcmFtKys7CisgICAgaW50MzJfdCBwYXJhbTI7CisgICAgY2hhciAqbmFtZTsKKworICAgIExPR1YoIlx0VmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyIHN0YXJ0Iik7CisKKyAgICBzd2l0Y2ggKHBhcmFtKXsKKyAgICAgICAgY2FzZSBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSF9TVVA6CisgICAgICAgICAgICAvL2lmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKXsKKyAgICAgICAgICAgIC8vICAgIExPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplMSAlZCIsICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgIC8vICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgLy99CisgICAgICAgICAgICAvLypwVmFsdWVTaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgICAgIC8vYnJlYWs7CisgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEg6CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTIgJWQiLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX2dldFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHBhcmFtKXsKKyAgICAgICAgY2FzZSBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSF9TVVA6CisgICAgICAgICAgICAqKHVpbnQzMl90ICopcFZhbHVlID0gMTsKKworICAgICAgICAgICAgTE9HVigiXHRWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSF9TVVAgVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAqKHVpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEg6CisgICAgICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSBWaXJ0dWFsaXplckdldFN0cmVuZ3RoKHBDb250ZXh0KTsKKworICAgICAgICAgICAgTE9HVigiXHRWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSCBWYWx1ZSBpcyAlZCIsCisgICAgICAgICAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIExPR1YoIlx0VmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyIGVuZCIpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIGVuZCBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIgKi8KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZpcnR1YWxpemVyX3NldFBhcmFtZXRlcigpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBTZXQgYSBWaXJ0dWFsaXplciBwYXJhbWV0ZXIKKy8vCisvLyBJbnB1dHM6CisvLyAgcFZpcnR1YWxpemVyICAgICAtIGhhbmRsZSB0byBpbnN0YW5jZSBkYXRhCisvLyAgcFBhcmFtICAgICAgICAgICAtIHBvaW50ZXIgdG8gcGFyYW1ldGVyCisvLyAgcFZhbHVlICAgICAgICAgICAtIHBvaW50ZXIgdG8gdmFsdWUKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgVmlydHVhbGl6ZXJfc2V0UGFyYW1ldGVyIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50MzJfdCAqcFBhcmFtLCB2b2lkICpwVmFsdWUpeworICAgIGludCBzdGF0dXMgPSAwOworICAgIGludDE2X3Qgc3RyZW5ndGg7CisKKyAgICBMT0dWKCJcdFZpcnR1YWxpemVyX3NldFBhcmFtZXRlciBzdGFydCIpOworCisgICAgc3dpdGNoICgqcFBhcmFtKXsKKyAgICAgICAgY2FzZSBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSDoKKyAgICAgICAgICAgIHN0cmVuZ3RoID0gKihpbnQxNl90ICopcFZhbHVlOworICAgICAgICAgICAgTE9HVigiXHRWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIoKSBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSCB2YWx1ZSBpcyAlZCIsIHN0cmVuZ3RoKTsKKyAgICAgICAgICAgIExPR1YoIlx0VmlydHVhbGl6ZXJfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBwVmlydHVhbGl6ZXItPnNldFN0cmVuZ3RoIik7CisgICAgICAgICAgICBWaXJ0dWFsaXplclNldFN0cmVuZ3RoKHBDb250ZXh0LCAoaW50MzJfdClzdHJlbmd0aCk7CisgICAgICAgICAgICBMT0dWKCJcdFZpcnR1YWxpemVyX3NldFBhcmFtZXRlcigpIENhbGxlZCBwVmlydHVhbGl6ZXItPnNldFN0cmVuZ3RoIik7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtICVkIiwgKnBQYXJhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBMT0dWKCJcdFZpcnR1YWxpemVyX3NldFBhcmFtZXRlciBlbmQiKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBlbmQgVmlydHVhbGl6ZXJfc2V0UGFyYW1ldGVyICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRXF1YWxpemVyX2dldFBhcmFtZXRlcigpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBHZXQgYSBFcXVhbGl6ZXIgcGFyYW1ldGVyCisvLworLy8gSW5wdXRzOgorLy8gIHBFcXVhbGl6ZXIgICAgICAgLSBoYW5kbGUgdG8gaW5zdGFuY2UgZGF0YQorLy8gIHBQYXJhbSAgICAgICAgICAgLSBwb2ludGVyIHRvIHBhcmFtZXRlcgorLy8gIHBWYWx1ZSAgICAgICAgICAgLSBwb2ludGVyIHRvIHZhcmlhYmxlIHRvIGhvbGQgcmV0cmlldmVkIHZhbHVlCisvLyAgcFZhbHVlU2l6ZSAgICAgICAtIHBvaW50ZXIgdG8gdmFsdWUgc2l6ZTogbWF4aW11bSBzaXplIGFzIGlucHV0CisvLworLy8gT3V0cHV0czoKKy8vICAqcFZhbHVlIHVwZGF0ZWQgd2l0aCBwYXJhbWV0ZXIgdmFsdWUKKy8vICAqcFZhbHVlU2l6ZSB1cGRhdGVkIHdpdGggYWN0dWFsIHZhbHVlIHNpemUKKy8vCisvLworLy8gU2lkZSBFZmZlY3RzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCAgICAgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgKnBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBWYWx1ZSl7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgaW50IGJNdXRlID0gMDsKKyAgICBpbnQzMl90IHBhcmFtID0gKnBQYXJhbSsrOworICAgIGludDMyX3QgcGFyYW0yOworICAgIGNoYXIgKm5hbWU7CisKKyAgICBMT0dWKCJcdEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIgc3RhcnQiKTsKKworICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICBjYXNlIEVRX1BBUkFNX05VTV9CQU5EUzoKKyAgICBjYXNlIEVRX1BBUkFNX0NVUl9QUkVTRVQ6CisgICAgY2FzZSBFUV9QQVJBTV9HRVRfTlVNX09GX1BSRVNFVFM6CisgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAJTE9HVigiXHRMVk1fRVJST1IgOiBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplIDEgICVkIiwgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9MRVZFTF9SQU5HRToKKyAgICBjYXNlIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRToKKyAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgMiAqIHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAJTE9HVigiXHRMVk1fRVJST1IgOiBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplIDIgICVkIiwgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKnBWYWx1ZVNpemUgPSAyICogc2l6ZW9mKGludDMyX3QpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVRX1BBUkFNX0JBTkRfTEVWRUw6CisgICAgY2FzZSBFUV9QQVJBTV9HRVRfQkFORDoKKyAgICBjYXNlIEVRX1BBUkFNX0NFTlRFUl9GUkVROgorICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgCUxPR1YoIlx0TFZNX0VSUk9SIDogRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZSAxICAlZCIsICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDMyX3QpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRVFfUEFSQU1fR0VUX1BSRVNFVF9OQU1FOgorICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgCUxPR1YoIlx0TFZNX0VSUk9SIDogRXF1YWxpemVyX2dldFBhcmFtZXRlciB1bmtub3duIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBFUV9QQVJBTV9OVU1fQkFORFM6CisgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IEZJVkVCQU5EX05VTUJBTkRTOworICAgICAgICBMT0dWKCJcdEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9OVU1fQkFORFMgJWQiLCAqKGludDE2X3QgKilwVmFsdWUpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRVFfUEFSQU1fTEVWRUxfUkFOR0U6CisgICAgICAgICooaW50MzJfdCAqKXBWYWx1ZSA9IC0xNTAwOworICAgICAgICAqKChpbnQzMl90ICopcFZhbHVlICsgMSkgPSAxNTAwOworICAgICAgICBMT0dWKCJcdEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9MRVZFTF9SQU5HRSBtaW4gJWQsIG1heCAlZCIsICooaW50MzJfdCAqKXBWYWx1ZSwgKigoaW50MzJfdCAqKXBWYWx1ZSArIDEpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX0JBTkRfTEVWRUw6CisgICAgICAgIHBhcmFtMiA9ICpwUGFyYW07CisgICAgICAgIGlmIChwYXJhbTIgPj0gRklWRUJBTkRfTlVNQkFORFMpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAqKGludDMyX3QgKilwVmFsdWUgPSBFcXVhbGl6ZXJHZXRCYW5kTGV2ZWwocENvbnRleHQsIHBhcmFtMik7CisgICAgICAgIExPR1YoIlx0RXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0JBTkRfTEVWRUwgYmFuZCAlZCwgbGV2ZWwgJWQiLCBwYXJhbTIsICooaW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9DRU5URVJfRlJFUToKKyAgICAgICAgcGFyYW0yID0gKnBQYXJhbTsKKyAgICAgICAgaWYgKHBhcmFtMiA+PSBGSVZFQkFORF9OVU1CQU5EUykgeworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICooaW50MzJfdCAqKXBWYWx1ZSA9IEVxdWFsaXplckdldENlbnRyZUZyZXF1ZW5jeShwQ29udGV4dCwgcGFyYW0yKTsKKyAgICAgICAgTE9HVigiXHRFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fQ0VOVEVSX0ZSRVEgYmFuZCAlZCwgZnJlcXVlbmN5ICVkIiwgcGFyYW0yLCAqKGludDMyX3QgKilwVmFsdWUpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFOgorICAgICAgICBwYXJhbTIgPSAqcFBhcmFtOworICAgICAgICBpZiAocGFyYW0yID49IEZJVkVCQU5EX05VTUJBTkRTKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgRXF1YWxpemVyR2V0QmFuZEZyZXFSYW5nZShwQ29udGV4dCwgcGFyYW0yLCAodWludDMyX3QgKilwVmFsdWUsICgodWludDMyX3QgKilwVmFsdWUgKyAxKSk7CisgICAgICAgIExPR1YoIlx0RXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRSBiYW5kICVkLCBtaW4gJWQsIG1heCAlZCIsIHBhcmFtMiwgKihpbnQzMl90ICopcFZhbHVlLCAqKChpbnQzMl90ICopcFZhbHVlICsgMSkpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRVFfUEFSQU1fR0VUX0JBTkQ6CisgICAgICAgIHBhcmFtMiA9ICpwUGFyYW07CisgICAgICAgICooaW50MzJfdCAqKXBWYWx1ZSA9IEVxdWFsaXplckdldEJhbmQocENvbnRleHQsIHBhcmFtMik7CisgICAgICAgIExPR1YoIlx0RXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0dFVF9CQU5EIGZyZXF1ZW5jeSAlZCwgYmFuZCAlZCIsIHBhcmFtMiwgKihpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX0NVUl9QUkVTRVQ6CisgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IEVxdWFsaXplckdldFByZXNldChwQ29udGV4dCk7CisgICAgICAgIExPR1YoIlx0RXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0NVUl9QUkVTRVQgJWQiLCAqKGludDMyX3QgKilwVmFsdWUpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRVFfUEFSQU1fR0VUX05VTV9PRl9QUkVTRVRTOgorICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSBFcXVhbGl6ZXJHZXROdW1QcmVzZXRzKCk7CisgICAgICAgIExPR1YoIlx0RXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0dFVF9OVU1fT0ZfUFJFU0VUUyAlZCIsICooaW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9HRVRfUFJFU0VUX05BTUU6CisgICAgICAgIHBhcmFtMiA9ICpwUGFyYW07CisgICAgICAgIGlmIChwYXJhbTIgPj0gRXF1YWxpemVyR2V0TnVtUHJlc2V0cygpKSB7CisgICAgICAgIC8vaWYgKHBhcmFtMiA+PSAyMCkgeyAgICAgLy8gQUdPIEZJWAorICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG5hbWUgPSAoY2hhciAqKXBWYWx1ZTsKKyAgICAgICAgc3RybmNweShuYW1lLCBFcXVhbGl6ZXJHZXRQcmVzZXROYW1lKHBhcmFtMiksICpwVmFsdWVTaXplIC0gMSk7CisgICAgICAgIG5hbWVbKnBWYWx1ZVNpemUgLSAxXSA9IDA7CisgICAgICAgICpwVmFsdWVTaXplID0gc3RybGVuKG5hbWUpICsgMTsKKyAgICAgICAgTE9HVigiXHRFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fR0VUX1BSRVNFVF9OQU1FIHByZXNldCAlZCwgbmFtZSAlcyBsZW4gJWQiLCBwYXJhbTIsIGdFcXVhbGl6ZXJQcmVzZXRzW3BhcmFtMl0ubmFtZSwgKnBWYWx1ZVNpemUpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIExPR1YoIlx0RXF1YWxpemVyX2dldFBhcmFtZXRlciBlbmQiKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBlbmQgRXF1YWxpemVyX2dldFBhcmFtZXRlciAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVxdWFsaXplcl9zZXRQYXJhbWV0ZXIoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gU2V0IGEgRXF1YWxpemVyIHBhcmFtZXRlcgorLy8KKy8vIElucHV0czoKKy8vICBwRXF1YWxpemVyICAgIC0gaGFuZGxlIHRvIGluc3RhbmNlIGRhdGEKKy8vICBwUGFyYW0gICAgICAgIC0gcG9pbnRlciB0byBwYXJhbWV0ZXIKKy8vICBwVmFsdWUgICAgICAgIC0gcG9pbnRlciB0byB2YWx1ZQorLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgRXF1YWxpemVyX3NldFBhcmFtZXRlciAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGludDMyX3QgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKXsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBpbnQzMl90IHByZXNldDsKKyAgICBpbnQzMl90IGJhbmQ7CisgICAgaW50MzJfdCBsZXZlbDsKKyAgICBpbnQzMl90IHBhcmFtID0gKnBQYXJhbSsrOworCisgICAgTE9HVigiXHRFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyIHN0YXJ0Iik7CisgICAgc3dpdGNoIChwYXJhbSkgeworICAgIGNhc2UgRVFfUEFSQU1fQ1VSX1BSRVNFVDoKKyAgICAgICAgcHJlc2V0ID0gKihpbnQxNl90ICopcFZhbHVlOworCisgICAgICAgIExPR1YoIlx0RXF1YWxpemVyX3NldFBhcmFtZXRlcigpIEVRX1BBUkFNX0NVUl9QUkVTRVQgJWQiLCBwcmVzZXQpOworICAgICAgICBpZiAoKHByZXNldCA+PSBFcXVhbGl6ZXJHZXROdW1QcmVzZXRzKCkpfHwocHJlc2V0IDwgMCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBFcXVhbGl6ZXJTZXRQcmVzZXQocENvbnRleHQsIHByZXNldCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRVFfUEFSQU1fQkFORF9MRVZFTDoKKyAgICAgICAgYmFuZCA9ICAqcFBhcmFtOworICAgICAgICBsZXZlbCA9ICooaW50MzJfdCAqKXBWYWx1ZTsKKyAgICAgICAgTE9HVigiXHRFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fQkFORF9MRVZFTCBiYW5kICVkLCBsZXZlbCAlZCIsIGJhbmQsIGxldmVsKTsKKyAgICAgICAgaWYgKGJhbmQgPj0gRklWRUJBTkRfTlVNQkFORFMpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBFcXVhbGl6ZXJTZXRCYW5kTGV2ZWwocENvbnRleHQsIGJhbmQsIGxldmVsKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBzZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBMT0dWKCJcdEVxdWFsaXplcl9zZXRQYXJhbWV0ZXIgZW5kIik7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogZW5kIEVxdWFsaXplcl9zZXRQYXJhbWV0ZXIgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWb2x1bWVfZ2V0UGFyYW1ldGVyKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIEdldCBhIFZvbHVtZSBwYXJhbWV0ZXIKKy8vCisvLyBJbnB1dHM6CisvLyAgcFZvbHVtZSAgICAgICAgICAtIGhhbmRsZSB0byBpbnN0YW5jZSBkYXRhCisvLyAgcFBhcmFtICAgICAgICAgICAtIHBvaW50ZXIgdG8gcGFyYW1ldGVyCisvLyAgcFZhbHVlICAgICAgICAgICAtIHBvaW50ZXIgdG8gdmFyaWFibGUgdG8gaG9sZCByZXRyaWV2ZWQgdmFsdWUKKy8vICBwVmFsdWVTaXplICAgICAgIC0gcG9pbnRlciB0byB2YWx1ZSBzaXplOiBtYXhpbXVtIHNpemUgYXMgaW5wdXQKKy8vCisvLyBPdXRwdXRzOgorLy8gICpwVmFsdWUgdXBkYXRlZCB3aXRoIHBhcmFtZXRlciB2YWx1ZQorLy8gICpwVmFsdWVTaXplIHVwZGF0ZWQgd2l0aCBhY3R1YWwgdmFsdWUgc2l6ZQorLy8KKy8vCisvLyBTaWRlIEVmZmVjdHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBWb2x1bWVfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgICAgICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICpwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwVmFsdWUpeworICAgIGludCBzdGF0dXMgPSAwOworICAgIGludCBiTXV0ZSA9IDA7CisgICAgaW50MzJfdCBwYXJhbSA9ICpwUGFyYW0rKzsKKyAgICBpbnQzMl90IHBhcmFtMjsKKyAgICBjaGFyICpuYW1lOworCisgICAgTE9HVigiXHRWb2x1bWVfZ2V0UGFyYW1ldGVyIHN0YXJ0Iik7CisKKyAgICBzd2l0Y2ggKHBhcmFtKXsKKyAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fTEVWRUw6CisgICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX01BWExFVkVMOgorICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9TVEVSRU9QT1NJVElPTjoKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZihpbnQxNl90KSl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBWb2x1bWVfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplIDEgICVkIiwgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9NVVRFOgorICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTjoKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZihpbnQzMl90KSl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBWb2x1bWVfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplIDIgICVkIiwgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MzJfdCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAJTE9HVigiXHRMVk1fRVJST1IgOiBFVm9sdW1lX2dldFBhcmFtZXRlciB1bmtub3duIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgc3dpdGNoIChwYXJhbSl7CisgICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX0xFVkVMOgorICAgICAgICAgICAgc3RhdHVzID0gVm9sdW1lR2V0Vm9sdW1lTGV2ZWwocENvbnRleHQsIChpbnQxNl90ICopKHBWYWx1ZSkpOworCQkJTE9HVigiXHRWb2x1bWVfZ2V0UGFyYW1ldGVyKCkgVk9MVU1FX1BBUkFNX0xFVkVMIFZhbHVlIGlzICVkIiwKKwkJCQkJKihpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX01BWExFVkVMOgorICAgICAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gMDsKKyAgICAgICAgICAgIExPR1YoIlx0Vm9sdW1lX2dldFBhcmFtZXRlcigpIFZPTFVNRV9QQVJBTV9NQVhMRVZFTCBWYWx1ZSBpcyAlZCIsCisgICAgICAgICAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9TVEVSRU9QT1NJVElPTjoKKyAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IDA7CisgICAgICAgICAgICBMT0dWKCJcdFZvbHVtZV9nZXRQYXJhbWV0ZXIoKSBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT04gVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAqKGludDE2X3QgKilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fTVVURToKKyAgICAgICAgCXN0YXR1cyA9IFZvbHVtZUdldE11dGUocENvbnRleHQsICh1aW50MzJfdCAqKXBWYWx1ZSk7CisJCQlMT0dWKCJcdFZvbHVtZV9nZXRQYXJhbWV0ZXIoKSBWT0xVTUVfUEFSQU1fTVVURSBWYWx1ZSBpcyAlZCIsCisJCQkJCSoodWludDMyX3QgKilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fRU5BQkxFU1RFUkVPUE9TSVRJT046CisgICAgICAgICAgICAqKGludDMyX3QgKilwVmFsdWUgPSAwOworICAgICAgICAgICAgTE9HVigiXHRWb2x1bWVfZ2V0UGFyYW1ldGVyKCkgVk9MVU1FX1BBUkFNX0VOQUJMRVNURVJFT1BPU0lUSU9OIFZhbHVlIGlzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBWb2x1bWVfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbSAlZCIsIHBhcmFtKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBMT0dWKCJcdFZvbHVtZV9nZXRQYXJhbWV0ZXIgZW5kIik7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogZW5kIFZvbHVtZV9nZXRQYXJhbWV0ZXIgKi8KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZvbHVtZV9zZXRQYXJhbWV0ZXIoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gU2V0IGEgVm9sdW1lIHBhcmFtZXRlcgorLy8KKy8vIElucHV0czoKKy8vICBwVm9sdW1lICAgICAgIC0gaGFuZGxlIHRvIGluc3RhbmNlIGRhdGEKKy8vICBwUGFyYW0gICAgICAgIC0gcG9pbnRlciB0byBwYXJhbWV0ZXIKKy8vICBwVmFsdWUgICAgICAgIC0gcG9pbnRlciB0byB2YWx1ZQorLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBWb2x1bWVfc2V0UGFyYW1ldGVyIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50MzJfdCAqcFBhcmFtLCB2b2lkICpwVmFsdWUpeworICAgIGludCAgICAgIHN0YXR1cyA9IDA7CisgICAgaW50MTZfdCAgbGV2ZWw7CisgICAgdWludDMyX3QgbXV0ZTsKKworICAgIExPR1YoIlx0Vm9sdW1lX3NldFBhcmFtZXRlciBzdGFydCIpOworCisgICAgc3dpdGNoICgqcFBhcmFtKXsKKyAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fTEVWRUw6CisgICAgICAgICAgICBsZXZlbCA9ICooaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICAgICAgIExPR1YoIlx0Vm9sdW1lX3NldFBhcmFtZXRlcigpIFZPTFVNRV9QQVJBTV9MRVZFTCB2YWx1ZSBpcyAlZCIsIGxldmVsKTsKKyAgICAgICAgICAgIExPR1YoIlx0Vm9sdW1lX3NldFBhcmFtZXRlcigpIENhbGxpbmcgcFZvbHVtZS0+c2V0Vm9sdW1lTGV2ZWwiKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFZvbHVtZVNldFZvbHVtZUxldmVsKHBDb250ZXh0LCAoaW50MTZfdClsZXZlbCk7CisgICAgICAgICAgICBMT0dWKCJcdFZvbHVtZV9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgcFZvbHVtZS0+c2V0Vm9sdW1lTGV2ZWwiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX01VVEU6CisgICAgICAgIAltdXRlID0gKih1aW50MzJfdCAqKXBWYWx1ZTsKKyAgICAgICAgCUxPR1YoIlx0Vm9sdW1lX3NldFBhcmFtZXRlcigpIENhbGxpbmcgcFZvbHVtZS0+c2V0TXV0ZSwgbXV0ZSBpcyAlZCIsIG11dGUpOworICAgICAgICAJTE9HVigiXHRWb2x1bWVfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBwVm9sdW1lLT5zZXRNdXRlIik7CisgICAgICAgIAlzdGF0dXMgPSBWb2x1bWVTZXRNdXRlKHBDb250ZXh0LCBtdXRlKTsKKyAgICAgICAgCUxPR1YoIlx0Vm9sdW1lX3NldFBhcmFtZXRlcigpIENhbGxlZCBwVm9sdW1lLT5zZXRNdXRlIik7CisgICAgICAgIAlicmVhazsKKworICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTjoKKyAgICAgICAgCUxPR1YoIlx0Vm9sdW1lX3NldFBhcmFtZXRlcigpIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTiBjYWxsZWQiKTsKKyAgICAgICAgCWJyZWFrOworCisgICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX1NURVJFT1BPU0lUSU9OOgorICAgICAgICAJTE9HVigiXHRWb2x1bWVfc2V0UGFyYW1ldGVyKCkgVk9MVU1FX1BBUkFNX1NURVJFT1BPU0lUSU9OIGNhbGxlZCIpOworICAgICAgICAJYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogVm9sdW1lX3NldFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW0gJWQiLCAqcFBhcmFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIExPR1YoIlx0Vm9sdW1lX3NldFBhcmFtZXRlciBlbmQiKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBlbmQgVm9sdW1lX3NldFBhcmFtZXRlciAqLworfSAvLyBuYW1lc3BhY2UKK30gLy8gbmFtZXNwYWNlCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisvKiBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb246IFByb2Nlc3MgKi8KK2V4dGVybiAiQyIgaW50IEVmZmVjdF9wcm9jZXNzKGVmZmVjdF9pbnRlcmZhY2VfdCAgICAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICAgICAgICAgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgICAgICAgICAqb3V0QnVmZmVyKXsKKyAgICBFZmZlY3RDb250ZXh0ICogcENvbnRleHQgPSAoRWZmZWN0Q29udGV4dCAqKSBzZWxmOworICAgIGludCAgICBzdGF0dXMgPSAwOworCisgICAgLy9MT0dWKCJcdEluIEVmZmVjdF9wcm9jZXNzIik7CisKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCl7CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0X3Byb2Nlc3MoKSBFUlJPUiBwQ29udGV4dCA9PSBOVUxMIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoaW5CdWZmZXIgPT0gTlVMTCAgfHwgaW5CdWZmZXItPnJhdyA9PSBOVUxMICB8fAorICAgICAgICAgICAgb3V0QnVmZmVyID09IE5VTEwgfHwgb3V0QnVmZmVyLT5yYXcgPT0gTlVMTCB8fAorICAgICAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQgIT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50KXsKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RfcHJvY2VzcygpIEVSUk9SIE5VTEwgSU5QVVQgUE9JTlRFUiBPUiBGUkFNRSBDT1VOVCBJUyBXUk9ORyIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzRW5hYmxlZCA9PSBMVk1fRkFMU0UpJiYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpKXsKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RfcHJvY2VzcygpIEVSUk9SIExWTV9CQVNTX0JPT1NUIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOworICAgICAgICByZXR1cm4gLUVOT0RBVEE7CisgICAgfQorICAgIGlmICgocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgPT0gTFZNX0ZBTFNFKSYmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpKXsKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RfcHJvY2VzcygpIEVSUk9SIExWTV9WT0xVTUUgRWZmZWN0IGlzIG5vdCBlbmFibGVkIik7CisgICAgICAgIHJldHVybiAtRU5PREFUQTsKKyAgICB9CisgICAgaWYgKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iRXF1YWxpemVyRW5hYmxlZCA9PSBMVk1fRkFMU0UpJiYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUikpeworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdF9wcm9jZXNzKCkgRVJST1IgTFZNX0VRVUFMSVpFUiBFZmZlY3QgaXMgbm90IGVuYWJsZWQiKTsKKyAgICAgICAgcmV0dXJuIC1FTk9EQVRBOworICAgIH0KKyAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX0ZBTFNFKSYmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUikpeworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdF9wcm9jZXNzKCkgRVJST1IgTFZNX1ZJUlRVQUxJWkVSIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOworICAgICAgICByZXR1cm4gLUVOT0RBVEE7CisgICAgfQorCisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCsrOworCisgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCA9PSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCl7CisgICAgICAgIExPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBDYWxsaW5nIHByb2Nlc3Mgd2l0aCAlZCBmcmFtZXMsICVkIGVmZmVjdHMgZW5hYmxlZCwgICAgJWQgY2FsbGVkOiBFZmZlY3QgJWQiLCBvdXRCdWZmZXItPmZyYW1lQ291bnQsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkLCBwQ29udGV4dC0+RWZmZWN0VHlwZSk7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQgPSAwOworICAgICAgICAvKiBQcm9jZXNzIGFsbCB0aGUgYXZhaWxhYmxlIGZyYW1lcywgYmxvY2sgcHJvY2Vzc2luZyBpcyBoYW5kbGVkIGludGVybmFsTFkgYnkgdGhlIExWTSBidW5kbGUgKi8KKyAgICAgICAgc3RhdHVzID0gYW5kcm9pZDo6THZtQnVuZGxlX3Byb2Nlc3MoICAgIChMVk1fSU5UMTYgKilpbkJ1ZmZlci0+cmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKW91dEJ1ZmZlci0+cmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQpOworICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBDYWxsZWQgIHByb2Nlc3Mgd2l0aCAlZCBmcmFtZXMsICVkIGVmZmVjdHMgZW5hYmxlZCwgICAgJWQgY2FsbGVkOiBFZmZlY3QgJWQiLCBvdXRCdWZmZXItPmZyYW1lQ291bnQsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkLCBwQ29udGV4dC0+RWZmZWN0VHlwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfWVsc2V7CisgICAgICAgIExPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBOb3QgQ2FsbGluZyBwcm9jZXNzIHdpdGggJWQgZnJhbWVzLCAlZCBlZmZlY3RzIGVuYWJsZWQsICVkIGNhbGxlZDogRWZmZWN0ICVkIiwgb3V0QnVmZmVyLT5mcmFtZUNvdW50LCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCwgcENvbnRleHQtPkVmZmVjdFR5cGUpOworICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5yYXcsIGluQnVmZmVyLT5yYXcsIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCpzaXplb2YoTFZNX0lOVDE2KSoyKTsgLy8gMiBpcyBmb3Igc3RlcmVvIGlucHV0CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9ICAgLyogZW5kIEVmZmVjdF9wcm9jZXNzICovCisKKy8qIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbjogQ29tbWFuZCAqLworZXh0ZXJuICJDIiBpbnQgRWZmZWN0X2NvbW1hbmQoZWZmZWN0X2ludGVyZmFjZV90ICBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBjbWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAqcENtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICpyZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICpwUmVwbHlEYXRhKXsKKyAgICBFZmZlY3RDb250ZXh0ICogcENvbnRleHQgPSAoRWZmZWN0Q29udGV4dCAqKSBzZWxmOworICAgIGludCByZXRzaXplOworICAgIGludCBzdGF0dXMgPSAwOworCisgICAgTE9HVigiXHRcbkVmZmVjdF9jb21tYW5kIHN0YXJ0Iik7CisKKyAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCl7CisgICAgICAgIExPR1YoIlx0RWZmZWN0X2NvbW1hbmQgc2V0dGluZyBjb21tYW5kIGZvciBMVk1fQkFTU19CT09TVCIpOworICAgIH0KKyAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpeworICAgICAgICBMT0dWKCJcdEVmZmVjdF9jb21tYW5kIHNldHRpbmcgY29tbWFuZCBmb3IgTFZNX1ZJUlRVQUxJWkVSIik7CisgICAgfSAKKyAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKXsKKyAgICAgICAgTE9HVigiXHRFZmZlY3RfY29tbWFuZCBzZXR0aW5nIGNvbW1hbmQgZm9yIExWTV9FUVVBTElaRVIiKTsKKyAgICB9IAorICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpeworICAgICAgICBMT0dWKCJcdEVmZmVjdF9jb21tYW5kIHNldHRpbmcgY29tbWFuZCBmb3IgTFZNX1ZPTFVNRSIpOworICAgIH0gICAgICAgICAKKworICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKXsKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RfY29tbWFuZCBFUlJPUiBwQ29udGV4dCA9PSBOVUxMIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIExPR1YoIlx0RWZmZWN0X2NvbW1hbmQgSU5QVVRTIGFyZTogY29tbWFuZCAlZCBjbWRTaXplICVkIixjbWRDb2RlLCBjbWRTaXplKTsKKworICAgIC8vIEluY2FzZSB3ZSBkaXNhYmxlIGFuIGVmZmVjdCwgbmV4dCB0aW1lIHByb2Nlc3MgaXMgY2FsbGVkIHRoZSBudW1iZXIgb2YgZWZmZWN0IGNhbGxlZCBjb3VsZCBiZSBncmVhdGVyCisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCA9IDA7CisKKyAgICBMT0dWKCJcdEVmZmVjdF9jb21tYW5kIE51bWJlckVmZmVjdHNDYWxsZWQgPSAlZCwgTnVtYmVyRWZmZWN0c0VuYWJsZWQgPSAlZCIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkKTsKKworICAgIHN3aXRjaCAoY21kQ29kZSl7CisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9JTklUOgorICAgICAgICAgICAgTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfSU5JVCBzdGFydCIpOworICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpeworICAgICAgICAgICAgICAgIExPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0lOSVQgZm9yIExWTV9CQVNTX0JPT1NUIik7CisKKyAgICAgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEJhc3NCb29zdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0lOSVQ6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGFuZHJvaWQ6OkJhc3NTZXRTdHJlbmd0aChwQ29udGV4dCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpeworICAgICAgICAgICAgICAgIExPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0lOSVQgZm9yIExWTV9WSVJUVUFMSVpFUiIpOworCisgICAgICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKXsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBWaXJ0dWFsaXplcl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0lOSVQ6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGFuZHJvaWQ6OlZpcnR1YWxpemVyU2V0U3RyZW5ndGgocENvbnRleHQsIDApOyAgCisgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9JTklUIGZvciBMVk1fRVFVQUxJWkVSIik7CisKKyAgICAgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVxdWFsaXplcl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0lOSVQ6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGFuZHJvaWQ6OkVxdWFsaXplclNldFByZXNldChwQ29udGV4dCwgMCk7ICAKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpeworICAgICAgICAgICAgICAgIExPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9JTklUIHN0YXJ0Iik7CisKKyAgICAgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFZvbHVtZV9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0lOSVQ6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGFuZHJvaWQ6OlZvbHVtZVNldFZvbHVtZUxldmVsKHBDb250ZXh0LCAwKTsKKyAgICAgICAgICAgICAgICBpZihzdGF0dXMgPT0gLUVJTlZBTCl7CisgICAgICAgICAgICAgICAgCXJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9DT05GSUdVUkU6CisgICAgICAgICAgICBMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9DT05GSUdVUkUgc3RhcnQiKTsKKyAgICAgICAgICAgIGlmIChwQ21kRGF0YSAgICA9PSBOVUxMfHwKKyAgICAgICAgICAgICAgICBjbWRTaXplICAgICAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KXx8CisgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSAgPT0gTlVMTHx8CisgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSAgIT0gc2l6ZW9mKGludCkpeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9DT05GSUdVUkU6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqKGludCAqKSBwUmVwbHlEYXRhID0gYW5kcm9pZDo6RWZmZWN0X2NvbmZpZ3VyZShwQ29udGV4dCwgKGVmZmVjdF9jb25maWdfdCAqKSBwQ21kRGF0YSk7CisgICAgICAgICAgICBMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9DT05GSUdVUkUgZW5kIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfUkVTRVQ6CisgICAgICAgICAgICBMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9SRVNFVCBzdGFydCIpOworICAgICAgICAgICAgYW5kcm9pZDo6RWZmZWN0X2NvbmZpZ3VyZShwQ29udGV4dCwgJnBDb250ZXh0LT5jb25maWcpOworICAgICAgICAgICAgTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfUkVTRVQgZW5kIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfR0VUX1BBUkFNOnsKKyAgICAgICAgICAgIExPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBzdGFydCIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCl7CisgICAgICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwqcmVwbHlTaXplIDwgKGludCkgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpKXsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBCYXNzQm9vc3RfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9HRVRfUEFSQU06IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhOworCisgICAgICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsIHBDbWREYXRhLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpOworCisgICAgICAgICAgICAgICAgcCA9IChlZmZlY3RfcGFyYW1fdCAqKXBSZXBseURhdGE7CisKKyAgICAgICAgICAgICAgICBpbnQgdm9mZnNldCA9ICgocC0+cHNpemUgLSAxKSAvIHNpemVvZihpbnQzMl90KSArIDEpICogc2l6ZW9mKGludDMyX3QpOworCisgICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6QmFzc0Jvb3N0X2dldFBhcmFtZXRlcihwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90ICopcC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QgICopJnAtPnZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOworCisgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0ICsgcC0+dnNpemU7CisKKyAgICAgICAgICAgICAgICBMT0dWKCJcdEJhc3NCb29zdF9jb21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIqcENtZERhdGEgJWQsICpyZXBseVNpemUgJWQsICpwUmVwbHlEYXRhICVkICIsCisgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICooaW50MTZfdCAqKSgoY2hhciAqKXBSZXBseURhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpeworICAgICAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgPCAoaW50KShzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8KnJlcGx5U2l6ZSA8IChpbnQpIChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSl7CisgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9HRVRfUEFSQU06IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhOworCisgICAgICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsIHBDbWREYXRhLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpOworCisgICAgICAgICAgICAgICAgcCA9IChlZmZlY3RfcGFyYW1fdCAqKXBSZXBseURhdGE7CisKKyAgICAgICAgICAgICAgICBpbnQgdm9mZnNldCA9ICgocC0+cHNpemUgLSAxKSAvIHNpemVvZihpbnQzMl90KSArIDEpICogc2l6ZW9mKGludDMyX3QpOworCisgICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6VmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90ICopcC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90ICAqKSZwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOworCisgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0ICsgcC0+dnNpemU7CisKKyAgICAgICAgICAgICAgICBMT0dWKCJcdFZpcnR1YWxpemVyX2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gIgorICAgICAgICAgICAgICAgICAgICAgICAgIipwQ21kRGF0YSAlZCwgKnJlcGx5U2l6ZSAlZCwgKnBSZXBseURhdGEgJWQgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSksCisgICAgICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQxNl90ICopKChjaGFyICopcFJlcGx5RGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0KSk7ICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdEVxdWFsaXplcl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNIHN0YXJ0Iik7CisgICAgICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplIDwgKGludCkgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpKSB7CisgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRXF1YWxpemVyX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCBwQ21kRGF0YSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBwID0gKGVmZmVjdF9wYXJhbV90ICopcFJlcGx5RGF0YTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpbnQgdm9mZnNldCA9ICgocC0+cHNpemUgLSAxKSAvIHNpemVvZihpbnQzMl90KSArIDEpICogc2l6ZW9mKGludDMyX3QpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OkVxdWFsaXplcl9nZXRQYXJhbWV0ZXIocENvbnRleHQsIChpbnQzMl90ICopcC0+ZGF0YSwgJnAtPnZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0ICsgcC0+dnNpemU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgTE9HVigiXHRFcXVhbGl6ZXJfY29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAqcENtZERhdGEgJWQsICpyZXBseVNpemUgJWQsICpwUmVwbHlEYXRhICUwOHggJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLCAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcFJlcGx5RGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBSZXBseURhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCArIHNpemVvZihpbnQzMl90KSkpOyAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZPTFVNRSl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRWb2x1bWVfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9QQVJBTSBzdGFydCIpOworICAgICAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgPCAoaW50KShzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8KnJlcGx5U2l6ZSA8IChpbnQpIChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSl7CisgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogVm9sdW1lX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YTsKKworICAgICAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCBwQ21kRGF0YSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKTsKKworICAgICAgICAgICAgICAgIHAgPSAoZWZmZWN0X3BhcmFtX3QgKilwUmVwbHlEYXRhOworCisgICAgICAgICAgICAgICAgaW50IHZvZmZzZXQgPSAoKHAtPnBzaXplIC0gMSkgLyBzaXplb2YoaW50MzJfdCkgKyAxKSAqIHNpemVvZihpbnQzMl90KTsKKworICAgICAgICAgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OlZvbHVtZV9nZXRQYXJhbWV0ZXIocENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCAqKXAtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90ICAqKSZwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKKworICAgICAgICAgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCArIHAtPnZzaXplOworCisgICAgICAgICAgICAgICAgTE9HVigiXHRWb2x1bWVfY29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiKnBDbWREYXRhICVkLCAqcmVwbHlTaXplICVkLCAqcFJlcGx5RGF0YSAlZCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICpyZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAqKGludDE2X3QgKikoKGNoYXIgKilwUmVwbHlEYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHZvZmZzZXQpKTsgICAgICAgICAgCisgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgICAgICBMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9HRVRfUEFSQU0gZW5kIik7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfUEFSQU06eworICAgICAgICAgICAgTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfU0VUX1BBUkFNIHN0YXJ0Iik7CisgICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRCYXNzQm9vc3RfY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBwYXJhbSAlZCwgKnJlcGx5U2l6ZSAlZCwgdmFsdWUgJWQgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSksCisgICAgICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQxNl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoICAgIHBDbWREYXRhICAgPT0gTlVMTHx8CisgICAgICAgICAgICAgICAgICAgICAgICBjbWRTaXplICAgICE9IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkgKyBzaXplb2YoaW50MTZfdCkpfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTHx8CisgICAgICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSl7CisgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogQmFzc0Jvb3N0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKikgcENtZERhdGE7CisKKyAgICAgICAgICAgICAgICBpZiAocC0+cHNpemUgIT0gc2l6ZW9mKGludDMyX3QpKXsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBCYXNzQm9vc3RfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SLCBwc2l6ZSBpcyBub3Qgc2l6ZW9mKGludDMyX3QpIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIExPR1YoIlx0bkJhc3NCb29zdF9jb21tYW5kIGNtZFNpemUgaXMgJWRcbiIKKyAgICAgICAgICAgICAgICAJCSJcdHNpemVvZihlZmZlY3RfcGFyYW1fdCkgaXMgICVkXG4iCisgICAgICAgICAgICAgICAgCQkiXHRwLT5wc2l6ZSBpcyAlZFxuIgorICAgICAgICAgICAgICAgIAkJIlx0cC0+dnNpemUgaXMgJWQiCisgICAgICAgICAgICAgICAgCQkiXG4iLAorICAgICAgICAgICAgICAgIAkJY21kU2l6ZSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSwgcC0+cHNpemUsIHAtPnZzaXplICk7CisKKyAgICAgICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyKHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCAqKXAtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyBwLT5wc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpeworICAgICAgICAgICAgICAgIExPR1YoIlx0VmlydHVhbGl6ZXJfY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBwYXJhbSAlZCwgKnJlcGx5U2l6ZSAlZCwgdmFsdWUgJWQgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSksCisgICAgICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQxNl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoICAgIHBDbWREYXRhICAgPT0gTlVMTHx8CisgICAgICAgICAgICAgICAgICAgICAgICBjbWRTaXplICAgICE9IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkgKyBzaXplb2YoaW50MTZfdCkpfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTHx8CisgICAgICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSl7CisgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKSBwQ21kRGF0YTsKKworICAgICAgICAgICAgICAgIGlmIChwLT5wc2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiwgcHNpemUgaXMgbm90IHNpemVvZihpbnQzMl90KSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBMT0dWKCJcdG5WaXJ0dWFsaXplcl9jb21tYW5kIGNtZFNpemUgaXMgJWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcdHNpemVvZihlZmZlY3RfcGFyYW1fdCkgaXMgICVkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiXHRwLT5wc2l6ZSBpcyAlZFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIlx0cC0+dnNpemUgaXMgJWQiCisgICAgICAgICAgICAgICAgICAgICAgICAiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSwgcC0+cHNpemUsIHAtPnZzaXplICk7CisKKyAgICAgICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIocENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QgKilwLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgcC0+cHNpemUpOyAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUil7CisgICAgICAgICAgICAgICAgTE9HVigiXHRFcXVhbGl6ZXJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTSBzdGFydCIpOworICAgICAgICAgICAgICAgIExPR1YoIlx0RXF1YWxpemVyX2NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfUEFSQU0gcGFyYW0gJWQsICpyZXBseVNpemUgJWQsIHZhbHVlICVkICIsCisgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICooaW50MTZfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkpOworCisgICAgICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVxdWFsaXplcl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopIHBDbWREYXRhOworCisgICAgICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gYW5kcm9pZDo6RXF1YWxpemVyX3NldFBhcmFtZXRlcihwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QgKilwLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHAtPnBzaXplKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpeworICAgICAgICAgICAgICAgIExPR1YoIlx0Vm9sdW1lX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU0gc3RhcnQiKTsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdFZvbHVtZV9jb21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIHBhcmFtICVkLCAqcmVwbHlTaXplICVkLCB2YWx1ZSAlZCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICpyZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAqKGludDE2X3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpKTsKKworICAgICAgICAgICAgICAgIGlmICggICAgcENtZERhdGEgICA9PSBOVUxMfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZFNpemUgICAgPCAoaW50KShzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKXx8CisgICAgICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEx8fAorICAgICAgICAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFZvbHVtZV9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopIHBDbWREYXRhOworCisgICAgICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gYW5kcm9pZDo6Vm9sdW1lX3NldFBhcmFtZXRlcihwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QgKilwLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgcC0+cHNpemUpOyAgICAgICAgICAgIAorICAgICAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICAgICAgTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfU0VUX1BBUkFNIGVuZCIpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9FTkFCTEU6CisgICAgICAgICAgICBMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9FTkFCTEUgc3RhcnQiKTsKKyAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfRU5BQkxFOiBFUlJPUiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfSAgICAgICAgICAgCisgICAgICAgICAgICBzd2l0Y2ggKHBDb250ZXh0LT5FZmZlY3RUeXBlKXsKKyAgICAgICAgICAgICAgICBjYXNlIExWTV9CQVNTX0JPT1NUOgorICAgICAgICAgICAgICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPT0gTFZNX1RSVUUpeworICAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogQmFzc0Jvb3N0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9FTkFCTEU6IEVSUk9SLUVmZmVjdCBpcyBhbHJlYWR5IGVuYWJsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfRU5BQkxFIExWTV9CQVNTX0JPT1NUIGVuYWJsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBMVk1fRVFVQUxJWkVSOgorICAgICAgICAgICAgICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iRXF1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFcXVhbGl6ZXJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0VOQUJMRTogRVJST1ItRWZmZWN0IGlzIGFscmVhZHkgZW5hYmxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID0gTFZNX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0VOQUJMRSBMVk1fRVFVQUxJWkVSIGVuYWJsZWQiKTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2FzZSBMVk1fVklSVFVBTElaRVI6CisgICAgICAgICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpeworICAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0VOQUJMRTogRVJST1ItRWZmZWN0IGlzIGFscmVhZHkgZW5hYmxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfRU5BQkxFIExWTV9WSVJUVUFMSVpFUiBlbmFibGVkIik7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgTFZNX1ZPTFVNRToKKyAgICAgICAgICAgICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgPT0gTFZNX1RSVUUpeworICAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogVm9sdW1lX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9FTkFCTEU6IEVSUk9SLUVmZmVjdCBpcyBhbHJlYWR5IGVuYWJsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVm9sdW1lRW5hYmxlZCA9IExWTV9UUlVFOworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9FTkFCTEUgTFZNX1ZPTFVNRSBlbmFibGVkIik7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0VOQUJMRTogRVJST1IsIGludmFsaWQgRWZmZWN0IFR5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCsrOworICAgICAgICAgICAgYW5kcm9pZDo6THZtRWZmZWN0X2VuYWJsZShwQ29udGV4dCk7ICAKKyAgICAgICAgICAgIExPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0VOQUJMRSBOdW1iZXJFZmZlY3RzRW5hYmxlZCA9ICVkIiwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQpOyAgICAgICAgICAKKyAgICAgICAgICAgIExPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0VOQUJMRSBlbmQiKTsgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9ESVNBQkxFOgorICAgICAgICAgICAgTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfRElTQUJMRSBzdGFydCIpOworICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9ESVNBQkxFOiBFUlJPUiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfSAgICAgICAgCisgICAgICAgICAgICBzd2l0Y2ggKHBDb250ZXh0LT5FZmZlY3RUeXBlKXsKKyAgICAgICAgICAgICAgICBjYXNlIExWTV9CQVNTX0JPT1NUOgorICAgICAgICAgICAgICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPT0gTFZNX0ZBTFNFKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEJhc3NCb29zdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfRElTQUJMRTogRVJST1ItRWZmZWN0IGlzIG5vdCB5ZXQgZW5hYmxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfRElTQUJMRSBMVk1fQkFTU19CT09TVCBkaXNhYmxlZCIpOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTFZNX0VRVUFMSVpFUjoKKyAgICAgICAgICAgICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkVxdWFsaXplckVuYWJsZWQgPT0gTFZNX0ZBTFNFKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVxdWFsaXplcl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfRElTQUJMRTogRVJST1ItRWZmZWN0IGlzIG5vdCB5ZXQgZW5hYmxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID0gTFZNX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9ESVNBQkxFIExWTV9FUVVBTElaRVIgZGlzYWJsZWQiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2FzZSBMVk1fVklSVFVBTElaRVI6CisgICAgICAgICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX0ZBTFNFKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9ESVNBQkxFOiBFUlJPUi1FZmZlY3QgaXMgbm90IHlldCBlbmFibGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfRElTQUJMRSBMVk1fVklSVFVBTElaRVIgZGlzYWJsZWQiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjYXNlIExWTV9WT0xVTUU6CisgICAgICAgICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWb2x1bWVFbmFibGVkID09IExWTV9GQUxTRSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBWb2x1bWVfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0RJU0FCTEU6IEVSUk9SLUVmZmVjdCBpcyBub3QgeWV0IGVuYWJsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVm9sdW1lRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfRElTQUJMRSBMVk1fVk9MVU1FIGRpc2FibGVkIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfRElTQUJMRTogRVJST1IsIGludmFsaWQgRWZmZWN0IFR5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gICAgICAKKyAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZC0tOworICAgICAgICAgICAgYW5kcm9pZDo6THZtRWZmZWN0X2Rpc2FibGUocENvbnRleHQpOyAgIAorICAgICAgICAgICAgTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfRElTQUJMRSBOdW1iZXJFZmZlY3RzRW5hYmxlZCA9ICVkIiwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQpOyAKKyAgICAgICAgICAgIExPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0RJU0FCTEUgZW5kIik7ICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfREVWSUNFOgorICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1ZPTFVNRToKKy8vICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0FVRElPX01PREU6Ly8gQUdPIGFkZCB0aGlzCisgICAgICAgICAgICBMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfREVWSUNFL0VGRkVDVF9DTURfU0VUX1ZPTFVNRS9FRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFIHN0YXJ0Iik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IERFRkFVTFQgc3RhcnQgJWQgRVJST1IiLGNtZENvZGUpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgTE9HVigiXHRFZmZlY3RfY29tbWFuZCBlbmQuLi5cblxuIik7CisgICAgcmV0dXJuIDA7Cit9ICAgIC8qIGVuZCBFZmZlY3RfY29tbWFuZCAqLworCisvLyBlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBlZmZlY3QKK2NvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ0x2bUVmZmVjdEludGVyZmFjZSA9IHsKKyAgICBFZmZlY3RfcHJvY2VzcywKKyAgICBFZmZlY3RfY29tbWFuZAorfTsgICAgLyogZW5kIGdMdm1FZmZlY3RJbnRlcmZhY2UgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MThkZDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaApAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RCVU5ETEVfSF8KKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RCVU5ETEVfSF8KKworI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEFwaS5oPgorI2luY2x1ZGUgPExWTS5oPgorCisjaWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgRklWRUJBTkRfTlVNQkFORFMgICAgICAgNQorI2RlZmluZSBNQVhfTlVNX0JBTkRTICAgICAgICAgICA1CisjZGVmaW5lIE1BWF9DQUxMX1NJWkUgICAgICAgICAgIDI1NgorCisvL1RPRE86IHRoaXMgc2hvdWxkIGJlIGluY2x1ZGVkIGZyb20gZWFjaCBlZmZlY3QgQVBJIGluY2x1ZGUKK3N0YXRpYyBjb25zdCBlZmZlY3RfdXVpZF90IFNMX0lJRF9CQVNTQk9PU1RfID0geyAweDA2MzRmMjIwLCAweGRkZDQsIDB4MTFkYiwgMHhhMGZjLCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfSB9OworY29uc3QgZWZmZWN0X3V1aWRfdCAqIGNvbnN0IFNMX0lJRF9CQVNTQk9PU1QgPSAmU0xfSUlEX0JBU1NCT09TVF87CisKK3N0YXRpYyBjb25zdCBlZmZlY3RfdXVpZF90IFNMX0lJRF9FUVVBTElaRVJfID0geyAweDBiZWQ0MzAwLCAweGRkZDYsIDB4MTFkYiwgMHg4ZjM0LCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfSB9OworY29uc3QgZWZmZWN0X3V1aWRfdCAqIGNvbnN0IFNMX0lJRF9FUVVBTElaRVIgPSAmU0xfSUlEX0VRVUFMSVpFUl87CisKK3N0YXRpYyBjb25zdCBlZmZlY3RfdXVpZF90IFNMX0lJRF9WSVJUVUFMSVpFUl8gPSB7IDB4MzdjYzJjMDAsIDB4ZGRkZCwgMHgxMWRiLCAweDg1NzcsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH07IC8vIHVwZGF0ZWQgbW9uIDI4dGgganVuZSAyMDEwCitjb25zdCBlZmZlY3RfdXVpZF90ICogY29uc3QgU0xfSUlEX1ZJUlRVQUxJWkVSID0gJlNMX0lJRF9WSVJUVUFMSVpFUl87CisKK3N0YXRpYyBjb25zdCBlZmZlY3RfdXVpZF90IFNMX0lJRF9WT0xVTUVfID0geyAweDA5ZThlZGUwLCAweGRkZGUsIDB4MTFkYiwgMHhiNGY2LCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfSB9OyAvLyB1cGRhdGVkIG1vbiAyOHRoIGp1bmUgMjAxMAorY29uc3QgZWZmZWN0X3V1aWRfdCAqIGNvbnN0IFNMX0lJRF9WT0xVTUUgPSAmU0xfSUlEX1ZPTFVNRV87CisKK3R5cGVkZWYgZW51bQoreworICAgIExWTV9CQVNTX0JPT1NULAorICAgIExWTV9WSVJUVUFMSVpFUiwKKyAgICBMVk1fRVFVQUxJWkVSLCAgICAKKyAgICBMVk1fVk9MVU1FCit9IGx2bV9lZmZlY3RfZW47CisKKy8vIFByZXNldCBjb25maWd1cmF0aW9uLgorc3RydWN0IFByZXNldENvbmZpZyB7CisgICAgLy8gSHVtYW4tcmVhZGFibGUgbmFtZS4KKyAgICBjb25zdCBjaGFyICogbmFtZTsKKyAgICAvLyBBbiBhcnJheSBvZiBzaXplIG5CYW5kcyB3aGVyZSBlYWNoIGVsZW1lbnQgaXMgYSBjb25maWd1cmF0aW9uIGZvciB0aGUKKyAgICAvLyBjb3JyZXNwb25kaW5nIGJhbmQuCisgICAgLy9jb25zdCBCYW5kQ29uZmlnICogYmFuZENvbmZpZ3M7Cit9OworCisvKiBCdW5kbGVkRWZmZWN0Q29udGV4dCA6IE9uZSBwZXIgc2Vzc2lvbiAqLworc3RydWN0IEJ1bmRsZWRFZmZlY3RDb250ZXh0eworICAgIExWTV9IYW5kbGVfdCAgICAgICAgICAgICAgICAgICAgaEluc3RhbmNlOyAgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25ObzsgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBzZXNzaW9uIG51bWJlciAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZvbHVtZUVuYWJsZWQ7ICAgICAgICAgICAgICAgICAvKiBGbGFnIGZvciBWb2x1bWUgKi8KKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFcXVhbGl6ZXJFbmFibGVkOyAgICAgICAgICAgICAgLyogRmxhZyBmb3IgRVEgKi8KKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCYXNzRW5hYmxlZDsgICAgICAgICAgICAgICAgICAgLyogRmxhZyBmb3IgQmFzcyAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZpcnR1YWxpemVyRW5hYmxlZDsgICAgICAgICAgICAvKiBGbGFnIGZvciBWaXJ0dWFsaXplciAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyRWZmZWN0c0VuYWJsZWQ7ICAgICAgICAgICAvKiBFZmZlY3RzIGluIHRoaXMgc2Vzc2lvbiAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyRWZmZWN0c0NhbGxlZDsgICAgICAgICAgICAvKiBFZmZlY3RzIGNhbGxlZCBzbyBmYXIgKi8gICAgCisgICAgLy8gU2F2ZWQgcGFyYW1ldGVycyBmb3IgZWFjaCBlZmZlY3QgKi8KKyAgICAvLyBCYXNzIEJvb3N0CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNzU3RyZW5ndGhTYXZlZDsgICAgICAgICAgICAgLyogQ29udmVyc2lvbiBiZXR3ZWVuIEdldC9TZXQgKi8gCisgICAgLy8gRXF1YWxpemVyCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJQcmVzZXQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgcHJlc2V0IGJlaW5nIHVzZWQgKi8KKyAgICAvLyBWaXJ0dWFsemVyCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXJ0U3RyZW5ndGhTYXZlZDsgICAgICAgICAgICAgIC8qIENvbnZlcnNpb24gYmV0d2VlbiBHZXQvU2V0ICovCisgICAgLy8gVm9sdW1lCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFNhdmVkOyAgICAgLyogZm9yIHdoZW4gbXV0ZSBpcyBzZXQsIGxldmVsIG11c3QgYmUgc2F2ZWQgKi8KKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNdXRlRW5hYmxlZDsgICAvKiBNdXN0IHN0b3JlIGFzIG11dGUgPSAtOTZkQiBsZXZlbCAqLyAgICAgICAKK307CisKKy8qIFNlc3Npb25Db250ZXh0IDogT25lIHNlc3Npb24gKi8KK3N0cnVjdCBTZXNzaW9uQ29udGV4dHsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCdW5kbGVkRWZmZWN0c0VuYWJsZWQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVm9sdW1lSW5zdGFudGlhdGVkOyAKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFcXVhbGl6ZXJJbnN0YW50aWF0ZWQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQmFzc0luc3RhbnRpYXRlZDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWaXJ0dWFsaXplckluc3RhbnRpYXRlZDsgCisgICAgQnVuZGxlZEVmZmVjdENvbnRleHQgICAgICAgICAgICAqcEJ1bmRsZWRDb250ZXh0OyAgICAgICAgICAgICAKK307CisKK3N0cnVjdCBFZmZlY3RDb250ZXh0eworICAgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKml0ZmU7CisgICAgZWZmZWN0X2NvbmZpZ190ICAgICAgICAgICAgICAgICBjb25maWc7CisgICAgbHZtX2VmZmVjdF9lbiAgICAgICAgICAgICAgICAgICBFZmZlY3RUeXBlOworICAgIEJ1bmRsZWRFZmZlY3RDb250ZXh0ICAgICAgICAgICAgKnBCdW5kbGVkQ29udGV4dDsgCit9OworCisvL1RPRE86IHRoaXMgc2hvdWxkIGJlIGluY2x1ZGVkIGZyb20gZWFjaCBlZmZlY3QgQVBJIGluY2x1ZGUKKy8qIGVudW1lcmF0ZWQgcGFyYW1ldGVyIHNldHRpbmdzIGZvciBCYXNzQm9vc3QgZWZmZWN0ICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEhfU1VQLCAgICAgICAgLy8gdHlwZSBTTGJvb2xlYW4gID0gdHlwZWRlZiBTTHVpbnQzMgorICAgIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSCAgICAgICAgICAgICAvLyB0eXBlIFNMcGVybWlsbGUgPSB0eXBlZGVmIFNMdWludDE2Cit9IHRfYmFzc2Jvb3N0X3BhcmFtczsKKworLyogZW51bWVyYXRlZCBwYXJhbWV0ZXIgc2V0dGluZ3MgZm9yIFZpcnR1YWxpemVyIGVmZmVjdCAqLwordHlwZWRlZiBlbnVtCit7CisgICAgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEhfU1VQLCAgICAgICAgLy8gdHlwZSBTTGJvb2xlYW4gID0gdHlwZWRlZiBTTHVpbnQzMgorICAgIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIICAgICAgICAgICAgIC8vIHR5cGUgU0xwZXJtaWxsZSA9IHR5cGVkZWYgU0x1aW50MTYKK30gdF92aXJ0dWFsaXplcl9wYXJhbXM7CisKKy8qIGVudW1lcmF0ZWQgcGFyYW1ldGVyIHNldHRpbmdzIGZvciBFcXVhbGl6ZXIgZWZmZWN0ICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBFUV9QQVJBTV9OVU1fQkFORFMsICAgICAgICAgICAgIC8vIEdldHMgdGhlIG51bWJlciBvZiBmcmVxdWVuY3kgYmFuZHMgdGhhdCB0aGUgZXF1YWxpemVyIHN1cHBvcnRzLgorICAgIEVRX1BBUkFNX0xFVkVMX1JBTkdFLCAgICAgICAgICAgLy8gUmV0dXJucyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBiYW5kIGxldmVscyBzdXBwb3J0ZWQuCisgICAgRVFfUEFSQU1fQkFORF9MRVZFTCwgICAgICAgICAgICAvLyBHZXRzL1NldHMgdGhlIGdhaW4gc2V0IGZvciB0aGUgZ2l2ZW4gZXF1YWxpemVyIGJhbmQuCisgICAgRVFfUEFSQU1fQ0VOVEVSX0ZSRVEsICAgICAgICAgICAvLyBHZXRzIHRoZSBjZW50ZXIgZnJlcXVlbmN5IG9mIHRoZSBnaXZlbiBiYW5kLgorICAgIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRSwgICAgICAgLy8gR2V0cyB0aGUgZnJlcXVlbmN5IHJhbmdlIG9mIHRoZSBnaXZlbiBmcmVxdWVuY3kgYmFuZC4KKyAgICBFUV9QQVJBTV9HRVRfQkFORCwgICAgICAgICAgICAgIC8vIEdldHMgdGhlIGJhbmQgdGhhdCBoYXMgdGhlIG1vc3QgZWZmZWN0IG9uIHRoZSBnaXZlbiBmcmVxdWVuY3kuCisgICAgRVFfUEFSQU1fQ1VSX1BSRVNFVCwgICAgICAgICAgICAvLyBHZXRzL1NldHMgdGhlIGN1cnJlbnQgcHJlc2V0LgorICAgIEVRX1BBUkFNX0dFVF9OVU1fT0ZfUFJFU0VUUywgICAgLy8gR2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIHByZXNldHMgdGhlIGVxdWFsaXplciBzdXBwb3J0cy4KKyAgICBFUV9QQVJBTV9HRVRfUFJFU0VUX05BTUUgICAgICAgIC8vIEdldHMgdGhlIHByZXNldCBuYW1lIGJhc2VkIG9uIHRoZSBpbmRleC4KK30gdF9lcXVhbGl6ZXJfcGFyYW1zOworCisvKiBlbnVtZXJhdGVkIHBhcmFtZXRlciBzZXR0aW5ncyBmb3IgVm9sdW1lIGVmZmVjdCAqLwordHlwZWRlZiBlbnVtCit7CisgICAgVk9MVU1FX1BBUkFNX0xFVkVMLCAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSBTTG1pbGxpYmVsID0gdHlwZWRlZiBTTHVpbnQxNiAoc2V0ICYgZ2V0KQorICAgIFZPTFVNRV9QQVJBTV9NQVhMRVZFTCwgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgU0xtaWxsaWJlbCA9IHR5cGVkZWYgU0x1aW50MTYgKGdldCkKKyAgICBWT0xVTUVfUEFSQU1fTVVURSwgICAgICAgICAgICAgICAgICAgICAgICAvLyB0eXBlIFNMYm9vbGVhbiAgPSB0eXBlZGVmIFNMdWludDMyIChzZXQgJiBnZXQpCisgICAgVk9MVU1FX1BBUkFNX0VOQUJMRVNURVJFT1BPU0lUSU9OLCAgICAgICAgLy8gdHlwZSBTTGJvb2xlYW4gID0gdHlwZWRlZiBTTHVpbnQzMiAoc2V0ICYgZ2V0KQorICAgIFZPTFVNRV9QQVJBTV9TVEVSRU9QT1NJVElPTiwgICAgICAgICAgICAgIC8vIHR5cGUgU0xwZXJtaWxsZSA9IHR5cGVkZWYgU0x1aW50MTYgKHNldCAmIGdldCkKK30gdF92b2x1bWVfcGFyYW1zOworCitzdGF0aWMgY29uc3QgaW50IFBSRVNFVF9DVVNUT00gPSAtMTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGJhbmRGcmVxUmFuZ2VbRklWRUJBTkRfTlVNQkFORFNdWzJdID0geworCXszMDAwMCwgMTIwMDAwfSwKKwl7MTIwMDAsIDQ2MDAwMH0sCisJezQ2MDAwLCAxODAwMDAwfSwKKwl7MTgwMDAwLCA3MDAwMDAwfSwKKwl7NzAwMDAwLCAxfQorCX07CisKK3N0YXRpYyBjb25zdCBMVk1fVUlOVDE2ICBFUU5CXzVCYW5kUHJlc2V0c0ZyZXF1ZW5jaWVzW10gPSB7CisJCQkJCQkJCQkJCQkJCQk2MCwgICAgICAgICAgIC8qIEZyZXF1ZW5jaWVzIGluIEh6ICovCisJCQkJCQkJCQkJCQkJCQkyMzAsCisJCQkJCQkJCQkJCQkJCQk5MTAsCisJCQkJCQkJCQkJCQkJCQkzNjAwLAorCQkJCQkJCQkJCQkJCQkJMTQwMDB9OworCitzdGF0aWMgY29uc3QgTFZNX1VJTlQxNiBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW10gPSB7CisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NiwgICAgICAgICAgICAgICAvKiBRIGZhY3RvciBtdWx0aXBsaWVkIGJ5IDEwMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTZ9OworCitzdGF0aWMgY29uc3QgTFZNX0lOVDE2IEVRTkJfNUJhbmROb3JtYWxQcmVzZXRzW10gPSB7CisJCQkJCQkJCQkgICAzLCAwLCAwLCAwLCAzLCAgICAgICAvKiBOb3JtYWwgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCA1LCAtMywgNSwgNiwgICAgICAvKiBDbGFzc2ljYWwgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwgLTYsIDcsIDEzLCAxMCwgICAvKiBEYW5jZSBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsICAgICAgIC8qIEZsYXQgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LCAtMiwgLTIsIDYsIC0zLCAgICAvKiBGb2xrIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgLTgsIDEzLCAtMSwgLTQsICAgLyogSGVhdnkgTWV0YWwgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgNiwgLTQsIDUsIDgsICAgICAvKiBIaXAgSG9wIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgNSwgLTQsIDUsIDksICAgICAgLyogSmF6eiBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYsIDQsIDksIDQsIC01LCAgICAgIC8qIFBvcCBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCA2LCAtMSwgOCwgMTB9OyAgIC8qIFJvY2sgUHJlc2V0ICovCisKK3N0YXRpYyBjb25zdCBQcmVzZXRDb25maWcgZ0VxdWFsaXplclByZXNldHNbXSA9IHsKKyAgICAJCXsiTm9ybWFsIn0sCisgICAgCQl7IkNsYXNzaWNhbCJ9LAorICAgIAkJeyJEYW5jZSJ9LAorICAgIAkJeyJGbGF0In0sCisgICAgCQl7IkZvbGsifSwKKyAgICAJCXsiSGVhdnkgTWV0YWwifSwKKyAgICAJCXsiSGlwIEhvcCJ9LAorICAgIAkJeyJKYXp6In0sCisgICAgCQl7IlBvcCJ9LAorICAgIAkJeyJSb2NrIn0KKyAgICB9OworCisjaWYgX19jcGx1c3BsdXMKK30gIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisKKyNlbmRpZiAvKkFORFJPSURfRUZGRUNUQlVORExFX0hfKi8K