From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Christopher Li" Subject: [2/2] The sparse byte code writer. Date: Wed, 3 Sep 2008 22:34:39 -0700 Message-ID: <70318cbf0809032234v4bb0f526r155a390344db77d9@mail.gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_66870_7724490.1220506479546" Return-path: Received: from fg-out-1718.google.com ([72.14.220.154]:29631 "EHLO fg-out-1718.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752000AbYIDFel (ORCPT ); Thu, 4 Sep 2008 01:34:41 -0400 Received: by fg-out-1718.google.com with SMTP id 19so337535fgg.17 for ; Wed, 03 Sep 2008 22:34:39 -0700 (PDT) Sender: linux-sparse-owner@vger.kernel.org List-Id: linux-sparse@vger.kernel.org To: Linux-Sparse , Alexey Zaytsev , Josh Triplett ------=_Part_66870_7724490.1220506479546 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline To test the writer: $ ./test-write linearize.c export syms 29 internal 72 import 47 struct instruction * size 349524 struct entrypoint * size 2280 struct basic_block * size 39248 pseudo_t size 118632 struct pseudo_user * size 0 struct asm_constraint * size 0 struct symbol * size 358608 struct asm_rules * size 0 struct multijmp * size 1344 struct expression * size 4064 struct ident * size 12596 struct string * size 0 char * size 0 char * (stream) size 191 struct ptr_list * size 114948 toalsize 995359 It generate linearize.b file. Some internal detail: traverse.c is responsible for traverse the pointer in an object. It don't actually convert the pointer. It delegates the actual convertion to the caller. The reader and writer can share the same traverse code to convert the pointer to index, index back to pointer. The writer use a two pass stage to write the object file. The first pass is finding out which object need to write out to the file. It register them into the hash table for later look up. It add a shadow copy of the object with all the pointer inside the object converted into index. This is a recursive process until all the object under dependency has been registered. The second stage is the actual dumping of the registered file. Compare to the one step convert and dump approach (been there done that). The two step write back generate very nice sequential disk IO. It is also much easier to work with. We can optionally apply some compression method before we write it to the disk. It can save the object file size. Currently it is the raw C structure. Known limits: - static string is not saved yet. The linearizer skip the initialization part of the storage type symbol. We should consider generate some initialization node for lay out the static C structure initializer. - I think the linearized instruction does not have the full C type information yet. - A few more I can't remember right now. - Reader is half baked. Not included in this patch series. Too ugly to show on the list. Drop me a line and I can send you what I got. I will be very glad if some one want to adopt this... Comments are welcome. Chris Signed-Off-By: Christopher Li ------=_Part_66870_7724490.1220506479546 Content-Type: application/octet-stream; name=writer-5 Content-Transfer-Encoding: base64 X-Attachment-Id: f_fkohn83u0 Content-Disposition: attachment; filename=writer-5 CgpJbmRleDogc3BhcnNlL3RyYXZlcnNlLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3BhcnNlLm9yaWcvdHJh dmVyc2UuYworKysgc3BhcnNlL3RyYXZlcnNlLmMKQEAgLTAsMCArMSwzMDcgQEAKKy8qCisgKiB0 cmF2ZXJzZS5jCisgKgorICogS2VlcCB0cmFjayBvZiBwb2ludGVycyBpbnNpZGUgdGhlIG9iamVj dHMuIEl0IGNhbiBiZQorICogc2hhcmVkIGJ5IHJlYWRlciBhbmQgd3JpdGVyLgorICoKKyAqIENv cHlyaWdodCAoQykgMjAwOCBDaHJpc3RvcGhlciBMaS4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0 aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4xCisgKi8KKworCisjaW5jbHVkZSA8 c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImFsbG9jYXRlLmgiCisj aW5jbHVkZSAic3ltYm9sLmgiCisjaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgorI2luY2x1ZGUgImxp bmVhcml6ZS5oIgorI2luY2x1ZGUgInRyYXZlcnNlLmgiCisKK2ludCB0cmF2ZXJzZV9sZXZlbCA9 IDA7CisKK3ZvaWQgaW5saW5lIHRyYXZlcnNlX2VudGVyKHZvaWQpCit7CisJdHJhdmVyc2VfbGV2 ZWwgKys7Cit9CisKK3ZvaWQgaW5saW5lIHRyYXZlcnNlX2V4aXQodm9pZCkKK3sKKwl0cmF2ZXJz ZV9sZXZlbCAtLTsKK30KKworY29uc3QgY2hhciogb2JqZWN0X3R5cGVuYW1lKGludCB0eXBlKQor eworCXN0YXRpYyBjb25zdCBjaGFyICpvYmplY3RfbmFtZV90YWJsZVtQVFJfTEFTVF0gPSB7CisJ CVtQVFJfSU5TTl0gPSAic3RydWN0IGluc3RydWN0aW9uICoiLAorCQlbUFRSX0VOVFJZUE9JTlRd ID0gInN0cnVjdCBlbnRyeXBvaW50ICoiLAorCQlbUFRSX0JBU0lDQkxPQ0tdID0gInN0cnVjdCBi YXNpY19ibG9jayAqIiwKKwkJW1BUUl9QU0VVRE9dID0gInBzZXVkb190IiwKKwkJW1BUUl9QU0VV RE9fVVNFUl0gPSAic3RydWN0IHBzZXVkb191c2VyICoiLAorCQlbUFRSX0FTTV9DT05TVFJBSU5U XSA9ICJzdHJ1Y3QgYXNtX2NvbnN0cmFpbnQgKiIsCisJCVtQVFJfU1lNQk9MXSA9ICJzdHJ1Y3Qg c3ltYm9sICoiLAorCQlbUFRSX0FTTV9SVUxFU10gPSAic3RydWN0IGFzbV9ydWxlcyAqIiwKKwkJ W1BUUl9FWFBSXSA9ICJzdHJ1Y3QgZXhwcmVzc2lvbiAqIiwKKwkJW1BUUl9NVUxUSUpNUF0gPSAi c3RydWN0IG11bHRpam1wICoiLAorCisJCVtQVFJfSURFTlRdID0gInN0cnVjdCBpZGVudCAqIiwK KwkJW1BUUl9TVFJJTkddID0gInN0cnVjdCBzdHJpbmcgKiIsCisJCVtQVFJfQ0hBUlNUUklOR10g PSAiY2hhciAqIiwKKwkJW1BUUl9TVFJFQU1fTkFNRV0gPSAiY2hhciAqIChzdHJlYW0pIiwKKwkJ W1BUUl9MSVNUXSA9ICJzdHJ1Y3QgcHRyX2xpc3QgKiIsCisJfTsKKwlyZXR1cm4gb2JqZWN0X25h bWVfdGFibGVbdHlwZV07Cit9CisKKwordm9pZCB0cmF2ZXJzZV9lbnRyeXBvaW50KHN0cnVjdCBj b252ZXJ0X29wICpvcCwgdm9pZCAqcHRyLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBlbnRyeXBv aW50ICplcCA9IChzdHJ1Y3QgZW50cnlwb2ludCopIHB0cjsKKwl0cmF2ZXJzZV9lbnRlcigpOwor CWNvbnZlcnRfc3ltYm9sKG9wLCAmZXAtPm5hbWUsIGRhdGEpOworCWNvbnZlcnRfc3ltYm9sX2xp c3Qob3AsICZlcC0+c3ltcywgZGF0YSk7CisJY29udmVydF9wc2V1ZG9fbGlzdChvcCwgJmVwLT5h Y2Nlc3NlcywgZGF0YSk7CisJY29udmVydF9iYXNpY19ibG9ja19saXN0KG9wLCAmZXAtPmJicywg ZGF0YSk7CisJY29udmVydF9pbnN0cnVjdGlvbihvcCwgJmVwLT5lbnRyeSwgZGF0YSk7CisJdHJh dmVyc2VfZXhpdCgpOworfQorCit2b2lkIHRyYXZlcnNlX2Jhc2ljX2Jsb2NrKHN0cnVjdCBjb252 ZXJ0X29wICpvcCwgdm9pZCAqcHRyLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBiYXNpY19ibG9j ayAqYmIgPSAoc3RydWN0IGJhc2ljX2Jsb2NrKikgcHRyOworCXRyYXZlcnNlX2VudGVyKCk7CisJ b3AtPmNvbnZlcnRfcG9zaXRpb24oJmJiLT5wb3MsIGRhdGEpOworCWNvbnZlcnRfZW50cnlwb2lu dChvcCwgJmJiLT5lcCwgZGF0YSk7CisJY29udmVydF9iYXNpY19ibG9ja19saXN0KG9wLCAmYmIt PnBhcmVudHMsIGRhdGEpOworCWNvbnZlcnRfYmFzaWNfYmxvY2tfbGlzdChvcCwgJmJiLT5jaGls ZHJlbiwgZGF0YSk7CisJY29udmVydF9pbnN0cnVjdGlvbl9saXN0KG9wLCAmYmItPmluc25zLCBk YXRhKTsKKwljb252ZXJ0X3BzZXVkb19saXN0KG9wLCAmYmItPm5lZWRzLCBkYXRhKTsKKwljb252 ZXJ0X3BzZXVkb19saXN0KG9wLCAmYmItPmRlZmluZXMsIGRhdGEpOworCXRyYXZlcnNlX2V4aXQo KTsKK30KKwordm9pZCB0cmF2ZXJzZV9wc2V1ZG8oc3RydWN0IGNvbnZlcnRfb3AgKm9wLCB2b2lk ICpwdHIsIHZvaWQgKmRhdGEpCit7CisJcHNldWRvX3QgcHNldWRvID0gKHBzZXVkb190KSBwdHI7 CisJdHJhdmVyc2VfZW50ZXIoKTsKKwlzd2l0Y2gocHNldWRvLT50eXBlKSB7CisJY2FzZSBQU0VV RE9fU1lNOgorCQljb252ZXJ0X3N5bWJvbChvcCwgJnBzZXVkby0+c3ltLCBkYXRhKTsKKwkJYnJl YWs7CisJY2FzZSBQU0VVRE9fUkVHOgorCWNhc2UgUFNFVURPX1BISToKKwkJb3AtPmNvbnZlcnRf aWRlbnQoJnBzZXVkby0+aWRlbnQsIGRhdGEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVh azsKKwl9CisJdHJhdmVyc2VfZXhpdCgpOworfQorCit2b2lkIHRyYXZlcnNlX3N5bWJvbChzdHJ1 Y3QgY29udmVydF9vcCAqb3AsIHZvaWQgKnB0ciwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3lt Ym9sICpzeW0gPSAoc3RydWN0IHN5bWJvbCopIHB0cjsKKwl0cmF2ZXJzZV9lbnRlcigpOworCW9w LT5jb252ZXJ0X3Bvc2l0aW9uKCZzeW0tPnBvcywgZGF0YSk7CisJb3AtPmNvbnZlcnRfaWRlbnQo JnN5bS0+aWRlbnQsIGRhdGEpOworCXN3aXRjaChzeW0tPnR5cGUpIHsKKwljYXNlIFNZTV9GTjoK KwkJY29udmVydF9zeW1ib2xfbGlzdChvcCwgJnN5bS0+YXJndW1lbnRzLCBkYXRhKTsKKwkJYnJl YWs7CisJY2FzZSBTWU1fU1RSVUNUOgorCWNhc2UgU1lNX1VOSU9OOgorCQljb252ZXJ0X3N5bWJv bF9saXN0KG9wLCAmc3ltLT5zeW1ib2xfbGlzdCwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU1lN X0FSUkFZOgorCQljb252ZXJ0X2V4cHJlc3Npb24ob3AsICZzeW0tPmFycmF5X3NpemUsIGRhdGEp OworCQlicmVhazsKKwljYXNlIFNZTV9CQVNFVFlQRToKKwkJZ290byBkb25lOworCWNhc2UgU1lN X05PREU6CisJY2FzZSBTWU1fUFRSOgorCWNhc2UgU1lNX0JJVEZJRUxEOgorCWNhc2UgU1lNX0VO VU06CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRpZSgidW5pbXBsZW1lbnQgc3ltYm9sICVkXG4i LCBzeW0tPnR5cGUpOworCQlicmVhazsKKwl9CisJY29udmVydF9zeW1ib2wob3AsICZzeW0tPmN0 eXBlLmJhc2VfdHlwZSwgZGF0YSk7CisKKwkvKiBzeW0tPmluaXRpYWxpemVyIGhhcyBhbHJlYWR5 IGJlZW4gdGFrZW4gY2FyZSBieSB0aGUgbGluZWFyaXplIGNvZGUuICovCisKKwkvLyBjb252ZXJ0 X2V4cHJlc3Npb24ob3AsICZzeW0tPmluaXRpYWxpemVyLCBkYXRhKTsKK2RvbmU6CisJdHJhdmVy c2VfZXhpdCgpOworfQorCit2b2lkIHRyYXZlcnNlX2V4cHJlc3Npb24oc3RydWN0IGNvbnZlcnRf b3AgKm9wLCB2b2lkICpwdHIsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGV4cHJlc3Npb24gKmV4 cHIgPSAoc3RydWN0IGV4cHJlc3Npb24qKSBwdHI7CisJdHJhdmVyc2VfZW50ZXIoKTsKKwlzd2l0 Y2goZXhwci0+dHlwZSkgeworCWNhc2UgRVhQUl9TWU1CT0w6CisJCWNvbnZlcnRfc3ltYm9sKG9w LCAmZXhwci0+c3ltYm9sLCBkYXRhKTsKKwkJb3AtPmNvbnZlcnRfaWRlbnQoJmV4cHItPnN5bWJv bF9uYW1lLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBFWFBSX1NUUklORzoKKwkJb3AtPmNvbnZl cnRfc3RyaW5nKCZleHByLT5zdHJpbmcsIGRhdGEpOworCQlicmVhazsKKwljYXNlIEVYUFJfVkFM VUU6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRpZSgidW5pbXBsZW1lbnQgZXhwcmVzc2lvbiAl ZFxuIiwgZXhwci0+dHlwZSk7CisJCWJyZWFrOworCX0KKwl0cmF2ZXJzZV9leGl0KCk7Cit9CisK Kwordm9pZCB0cmF2ZXJzZV9tdWx0aWptcChzdHJ1Y3QgY29udmVydF9vcCAqb3AsIHZvaWQgKnB0 ciwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbXVsdGlqbXAgKm1qID0gKHN0cnVjdCBtdWx0aWpt cCopIHB0cjsKKwl0cmF2ZXJzZV9lbnRlcigpOworCWNvbnZlcnRfYmFzaWNfYmxvY2sob3AsICZt ai0+dGFyZ2V0LCBkYXRhKTsKKwl0cmF2ZXJzZV9leGl0KCk7Cit9CisKK3ZvaWQgdHJhdmVyc2Vf YXNtX2NvbnN0cmFpbnQoc3RydWN0IGNvbnZlcnRfb3AgKm9wLCB2b2lkICpwdHIsIHZvaWQgKmRh dGEpCit7CisJc3RydWN0IGFzbV9jb25zdHJhaW50ICpjdCA9IChzdHJ1Y3QgYXNtX2NvbnN0cmFp bnQqKSBwdHI7CisJdHJhdmVyc2VfZW50ZXIoKTsKKwljb252ZXJ0X3BzZXVkbyhvcCwgJmN0LT5w c2V1ZG8sIGRhdGEpOworCW9wLT5jb252ZXJ0X2NoYXJzdHJpbmcoKGNoYXIqKikmY3QtPmNvbnN0 cmFpbnQsIGRhdGEpOworCW9wLT5jb252ZXJ0X2lkZW50KChzdHJ1Y3QgaWRlbnQqKikmY3QtPmlk ZW50LCBkYXRhKTsKKwl0cmF2ZXJzZV9leGl0KCk7Cit9CisKK3ZvaWQgdHJhdmVyc2VfYXNtX3J1 bGVzKHN0cnVjdCBjb252ZXJ0X29wICpvcCwgdm9pZCAqcHRyLCB2b2lkICpkYXRhKQoreworCXN0 cnVjdCBhc21fcnVsZXMgKnJ1bGVzID0gKHN0cnVjdCBhc21fcnVsZXMqKSBwdHI7CisJdHJhdmVy c2VfZW50ZXIoKTsKKwljb252ZXJ0X2FzbV9jb25zdHJhaW50X2xpc3Qob3AsICZydWxlcy0+aW5w dXRzLCBkYXRhKTsKKwljb252ZXJ0X2FzbV9jb25zdHJhaW50X2xpc3Qob3AsICZydWxlcy0+b3V0 cHV0cywgZGF0YSk7CisJY29udmVydF9hc21fY29uc3RyYWludF9saXN0KG9wLCAmcnVsZXMtPmNs b2JiZXJzLCBkYXRhKTsKKwl0cmF2ZXJzZV9leGl0KCk7Cit9CisKK3ZvaWQgdHJhdmVyc2VfaW5z dHJ1Y3Rpb24oc3RydWN0IGNvbnZlcnRfb3AgKm9wLCB2b2lkICpwdHIsIHZvaWQgKmRhdGEpCit7 CisJc3RydWN0IGluc3RydWN0aW9uICppbnNuID0gKHN0cnVjdCBpbnN0cnVjdGlvbiopIHB0cjsK Kwl0cmF2ZXJzZV9lbnRlcigpOworCW9wLT5jb252ZXJ0X3Bvc2l0aW9uKCZpbnNuLT5wb3MsIGRh dGEpOworCWlmICghaW5zbi0+YmIpCisJCWdvdG8gZXhpdDsKKwljb252ZXJ0X2Jhc2ljX2Jsb2Nr KG9wLCAmaW5zbi0+YmIsIGRhdGEpOworCXN3aXRjaCAoaW5zbi0+b3Bjb2RlKSB7CisJY2FzZSBP UF9FTlRSWToKKwkJY29udmVydF9wc2V1ZG9fbGlzdChvcCwgJmluc24tPmFyZ19saXN0LCBkYXRh KTsKKwkJYnJlYWs7CisJY2FzZSBPUF9SRVQ6CisJCWNvbnZlcnRfcHNldWRvKG9wLCAmaW5zbi0+ c3JjLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBPUF9CUjoKKwkJY29udmVydF9wc2V1ZG8ob3As ICZpbnNuLT5jb25kLCBkYXRhKTsKKwkJY29udmVydF9iYXNpY19ibG9jayhvcCwgJmluc24tPmJi X3RydWUsIGRhdGEpOworCQljb252ZXJ0X2Jhc2ljX2Jsb2NrKG9wLCAmaW5zbi0+YmJfZmFsc2Us IGRhdGEpOworCQlicmVhazsKKworCWNhc2UgT1BfU1dJVENIOgorCWNhc2UgT1BfQ09NUFVURURH T1RPOgorCQljb252ZXJ0X3BzZXVkbyhvcCwgJmluc24tPmNvbmQsIGRhdGEpOworCQljb252ZXJ0 X211bHRpam1wX2xpc3Qob3AsICZpbnNuLT5tdWx0aWptcF9saXN0LCBkYXRhKTsKKwkJYnJlYWs7 CisKKwljYXNlIE9QX1BISVNPVVJDRToKKwkJY29udmVydF9wc2V1ZG8ob3AsICZpbnNuLT50YXJn ZXQsIGRhdGEpOworCQljb252ZXJ0X3BzZXVkbyhvcCwgJmluc24tPnBoaV9zcmMsIGRhdGEpOwor CQljb252ZXJ0X2luc3RydWN0aW9uX2xpc3Qob3AsICZpbnNuLT5waGlfdXNlcnMsIGRhdGEpOwor CQlicmVhazsKKworCWNhc2UgT1BfUEhJOgorCQljb252ZXJ0X3BzZXVkbyhvcCwgJmluc24tPnRh cmdldCwgZGF0YSk7CisJCWNvbnZlcnRfcHNldWRvX2xpc3Qob3AsICZpbnNuLT5waGlfbGlzdCwg ZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBPUF9MTk9QOgorCWNhc2UgT1BfU05PUDoKKwkJY29u dmVydF9wc2V1ZG8ob3AsICZpbnNuLT50YXJnZXQsIGRhdGEpOworCQlicmVhazsKKwljYXNlIE9Q X0xPQUQ6CisJY2FzZSBPUF9TVE9SRToKKwkJY29udmVydF9wc2V1ZG8ob3AsICZpbnNuLT50YXJn ZXQsIGRhdGEpOworCQljb252ZXJ0X3BzZXVkbyhvcCwgJmluc24tPnNyYywgZGF0YSk7CisJCWJy ZWFrOworCWNhc2UgT1BfQ0FMTDoKKwljYXNlIE9QX0lOTElORURfQ0FMTDoKKwkJY29udmVydF9w c2V1ZG8ob3AsICZpbnNuLT50YXJnZXQsIGRhdGEpOworCQljb252ZXJ0X3BzZXVkbyhvcCwgJmlu c24tPmZ1bmMsIGRhdGEpOworCQljb252ZXJ0X3BzZXVkb19saXN0KG9wLCAmaW5zbi0+YXJndW1l bnRzLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBPUF9DQVNUOgorCWNhc2UgT1BfU0NBU1Q6CisJ Y2FzZSBPUF9GUENBU1Q6CisJY2FzZSBPUF9QVFJDQVNUOgorCQljb252ZXJ0X3BzZXVkbyhvcCwg Jmluc24tPnRhcmdldCwgZGF0YSk7CisJCWNvbnZlcnRfc3ltYm9sKG9wLCAmaW5zbi0+b3JpZ190 eXBlLCBkYXRhKTsKKwkJY29udmVydF9wc2V1ZG8ob3AsICZpbnNuLT5zcmMsIGRhdGEpOworCQli cmVhazsKKworCWNhc2UgT1BfQklOQVJZIC4uLiBPUF9CSU5BUllfRU5EOgorCWNhc2UgT1BfQklO Q01QIC4uLiBPUF9CSU5DTVBfRU5EOgorCQljb252ZXJ0X3BzZXVkbyhvcCwgJmluc24tPnRhcmdl dCwgZGF0YSk7CisJCWNvbnZlcnRfcHNldWRvKG9wLCAmaW5zbi0+c3JjMSwgZGF0YSk7CisJCWNv bnZlcnRfcHNldWRvKG9wLCAmaW5zbi0+c3JjMiwgZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBP UF9TRUw6CisJCWNvbnZlcnRfcHNldWRvKG9wLCAmaW5zbi0+dGFyZ2V0LCBkYXRhKTsKKwkJY29u dmVydF9wc2V1ZG8ob3AsICZpbnNuLT5zcmMxLCBkYXRhKTsKKwkJY29udmVydF9wc2V1ZG8ob3As ICZpbnNuLT5zcmMyLCBkYXRhKTsKKwkJY29udmVydF9wc2V1ZG8ob3AsICZpbnNuLT5zcmMzLCBk YXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIE9QX1NMSUNFOgorCQljb252ZXJ0X3BzZXVkbyhvcCwg Jmluc24tPnRhcmdldCwgZGF0YSk7CisJCWNvbnZlcnRfcHNldWRvKG9wLCAmaW5zbi0+YmFzZSwg ZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBPUF9OT1A6CisJCWNvbnZlcnRfcHNldWRvKG9wLCAm aW5zbi0+dGFyZ2V0LCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBPUF9OT1Q6IGNhc2UgT1BfTkVH OgorCQljb252ZXJ0X3BzZXVkbyhvcCwgJmluc24tPnRhcmdldCwgZGF0YSk7CisJCWNvbnZlcnRf cHNldWRvKG9wLCAmaW5zbi0+c3JjMSwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgT1BfQ09OVEVY VDoKKwkJY29udmVydF9leHByZXNzaW9uKG9wLCAmaW5zbi0+Y29udGV4dF9leHByLCBkYXRhKTsK KwkJYnJlYWs7CisJY2FzZSBPUF9SQU5HRToKKwkJY29udmVydF9wc2V1ZG8ob3AsICZpbnNuLT5z cmMxLCBkYXRhKTsKKwkJY29udmVydF9wc2V1ZG8ob3AsICZpbnNuLT5zcmMyLCBkYXRhKTsKKwkJ Y29udmVydF9wc2V1ZG8ob3AsICZpbnNuLT5zcmMzLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBP UF9ERUFUSE5PVEU6CisJCWNvbnZlcnRfcHNldWRvKG9wLCAmaW5zbi0+dGFyZ2V0LCBkYXRhKTsK KwkJYnJlYWs7CisJY2FzZSBPUF9BU006CisJCW9wLT5jb252ZXJ0X2NoYXJzdHJpbmcoKGNoYXIg KiopJmluc24tPnN0cmluZywgZGF0YSk7CisJCWNvbnZlcnRfYXNtX3J1bGVzKG9wLCAmaW5zbi0+ YXNtX3J1bGVzLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBPUF9DT1BZOgorCQljb252ZXJ0X3Bz ZXVkbyhvcCwgJmluc24tPnRhcmdldCwgZGF0YSk7CisJCWNvbnZlcnRfcHNldWRvKG9wLCAmaW5z bi0+c3JjLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBPUF9TWU1BRERSOgorCQljb252ZXJ0X3Bz ZXVkbyhvcCwgJmluc24tPnRhcmdldCwgZGF0YSk7CisJCWNvbnZlcnRfcHNldWRvKG9wLCAmaW5z bi0+c3ltYm9sLCBkYXRhKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGllKCJ1bmltcGxlbWVu dCAlc1xuIiwgc2hvd19pbnN0cnVjdGlvbihpbnNuKSk7CisJfQorZXhpdDoKKwl0cmF2ZXJzZV9l eGl0KCk7Cit9CisKKwpJbmRleDogc3BhcnNlL3Rva2VuaXplLmMKPT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3Bh cnNlLm9yaWcvdG9rZW5pemUuYworKysgc3BhcnNlL3Rva2VuaXplLmMKQEAgLTIzLDYgKzIzLDcg QEAKICNkZWZpbmUgRU9GICgtMSkKIAogaW50IGlucHV0X3N0cmVhbV9uciA9IDA7CitpbnQgZnJl ZV9zdHJlYW1faGVhZCA9IDA7CS8qIGlucHV0X3N0cmVhbSBjYW4gcmVsb2NhdGUsIHVzaW5nIGlu ZGV4ICovCiBzdHJ1Y3Qgc3RyZWFtICppbnB1dF9zdHJlYW1zOwogc3RhdGljIGludCBpbnB1dF9z dHJlYW1zX2FsbG9jYXRlZDsKIApAQCAtMTY3LDExICsxNjgsMjMgQEAgY29uc3QgY2hhciAqc2hv d190b2tlbihjb25zdCBzdHJ1Y3QgdG9rZQogCX0KIH0KIAotaW50IGluaXRfc3RyZWFtKGNvbnN0 IGNoYXIgKm5hbWUsIGludCBmZCwgY29uc3QgY2hhciAqKm5leHRfcGF0aCkKK3ZvaWQgZnJlZV9z dHJlYW0oaW50IHN0cmVhbSkKIHsKLQlpbnQgc3RyZWFtID0gaW5wdXRfc3RyZWFtX25yOwotCXN0 cnVjdCBzdHJlYW0gKmN1cnJlbnQ7CisJaWYgKHN0cmVhbSkgeworCQlpbnB1dF9zdHJlYW1zW3N0 cmVhbV0uZmQgPSBmcmVlX3N0cmVhbV9oZWFkOworCQlmcmVlX3N0cmVhbV9oZWFkID0gc3RyZWFt OworCX0KK30KIAoraW50IGFsbG9jYXRlX3N0cmVhbSh2b2lkKQoreworCWludCBzdHJlYW07CisJ aWYgKGZyZWVfc3RyZWFtX2hlYWQpIHsKKwkJc3RyZWFtID0gZnJlZV9zdHJlYW1faGVhZDsKKwkJ ZnJlZV9zdHJlYW1faGVhZCA9IGlucHV0X3N0cmVhbXNbc3RyZWFtXS5mZDsKKwkJcmV0dXJuIHN0 cmVhbTsKKwl9CisJc3RyZWFtID0gaW5wdXRfc3RyZWFtX25yOwogCWlmIChzdHJlYW0gPj0gaW5w dXRfc3RyZWFtc19hbGxvY2F0ZWQpIHsKIAkJaW50IG5ld2FsbG9jID0gc3RyZWFtICogNCAvIDMg KyAxMDsKIAkJaW5wdXRfc3RyZWFtcyA9IHJlYWxsb2MoaW5wdXRfc3RyZWFtcywgbmV3YWxsb2Mg KiBzaXplb2Yoc3RydWN0IHN0cmVhbSkpOwpAQCAtMTc5LDYgKzE5MiwxNSBAQCBpbnQgaW5pdF9z dHJlYW0oY29uc3QgY2hhciAqbmFtZSwgaW50IGZkCiAJCQlkaWUoIlVuYWJsZSB0byBhbGxvY2F0 ZSBtb3JlIHN0cmVhbXMgc3BhY2UiKTsKIAkJaW5wdXRfc3RyZWFtc19hbGxvY2F0ZWQgPSBuZXdh bGxvYzsKIAl9CisJaW5wdXRfc3RyZWFtX25yID0gc3RyZWFtKzE7CisJcmV0dXJuIHN0cmVhbTsK K30KKworaW50IGluaXRfc3RyZWFtKGNvbnN0IGNoYXIgKm5hbWUsIGludCBmZCwgY29uc3QgY2hh ciAqKm5leHRfcGF0aCkKK3sKKwlpbnQgc3RyZWFtID0gYWxsb2NhdGVfc3RyZWFtKCk7CisJc3Ry dWN0IHN0cmVhbSAqY3VycmVudDsKKwkKIAljdXJyZW50ID0gaW5wdXRfc3RyZWFtcyArIHN0cmVh bTsKIAltZW1zZXQoY3VycmVudCwgMCwgc2l6ZW9mKCpjdXJyZW50KSk7CiAJY3VycmVudC0+bmFt ZSA9IG5hbWU7CkBAIC0xODYsNyArMjA4LDYgQEAgaW50IGluaXRfc3RyZWFtKGNvbnN0IGNoYXIg Km5hbWUsIGludCBmZAogCWN1cnJlbnQtPm5leHRfcGF0aCA9IG5leHRfcGF0aDsKIAljdXJyZW50 LT5wYXRoID0gTlVMTDsKIAljdXJyZW50LT5jb25zdGFudCA9IENPTlNUQU5UX0ZJTEVfTUFZQkU7 Ci0JaW5wdXRfc3RyZWFtX25yID0gc3RyZWFtKzE7CiAJcmV0dXJuIHN0cmVhbTsKIH0KIApJbmRl eDogc3BhcnNlL3N5bWJvbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHNwYXJzZS5vcmlnL3N5bWJvbC5oCisr KyBzcGFyc2Uvc3ltYm9sLmgKQEAgLTEwNyw2ICsxMDcsOCBAQCBleHRlcm4gaW50IGV4cGFuZF9j b25zdGFudF9wKHN0cnVjdCBleHByCiAjZGVmaW5lIFNZTV9BVFRSX05PUk1BTAkJMQogI2RlZmlu ZSBTWU1fQVRUUl9TVFJPTkcJCTIKIAorc3RydWN0IGVudHJ5cG9pbnQ7CisKIHN0cnVjdCBzeW1i b2wgewogCWVudW0gdHlwZSB0eXBlOjg7CiAJZW51bSBuYW1lc3BhY2UgbmFtZXNwYWNlOjk7CkBA IC0xNTksNiArMTYxLDcgQEAgc3RydWN0IHN5bWJvbCB7CiAJfTsKIAl1bmlvbiAvKiBiYWNrZW5k ICovIHsKIAkJc3RydWN0IGJhc2ljX2Jsb2NrICpiYl90YXJnZXQ7CS8qIGxhYmVsICovCisJCXN0 cnVjdCBlbnRyeXBvaW50ICplcDsJCS8qIGZ1bmN0aW9uICovCiAJCXZvaWQgKmF1eDsJCQkvKiBB dXhpbGlhcnkgaW5mbywgZS5nLiBiYWNrZW5kIGluZm9ybWF0aW9uICovCiAJCXN0cnVjdCB7CQkJ Lyogc3BhcnNlIGN0YWdzICovCiAJCQljaGFyIGtpbmQ7CkluZGV4OiBzcGFyc2UvdGVzdC1saW5l YXJpemUuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09CkluZGV4OiBzcGFyc2UvTWFrZWZpbGUKPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g c3BhcnNlLm9yaWcvTWFrZWZpbGUKKysrIHNwYXJzZS9NYWtlZmlsZQpAQCAtMjUsNyArMjUsNyBA QCBJTkNMVURFRElSPSQoUFJFRklYKS9pbmNsdWRlCiBQS0dDT05GSUdESVI9JChMSUJESVIpL3Br Z2NvbmZpZwogCiBQUk9HUkFNUz10ZXN0LWxleGluZyB0ZXN0LXBhcnNpbmcgb2JmdXNjYXRlIGNv bXBpbGUgZ3JhcGggc3BhcnNlIHRlc3QtbGluZWFyaXplIGV4YW1wbGUgXAotCSB0ZXN0LXVuc3Nh IHRlc3QtZGlzc2VjdCBjdGFncworCSB0ZXN0LXVuc3NhIHRlc3QtZGlzc2VjdCBjdGFncyB0ZXN0 LXdyaXRlIAogCiAKIElOU1RfUFJPR1JBTVM9c3BhcnNlIGNnY2MKQEAgLTM4LDEyICszOCwxMyBA QCBlbmRpZgogCiBMSUJfSD0gICAgdG9rZW4uaCBwYXJzZS5oIGxpYi5oIHN5bWJvbC5oIHNjb3Bl LmggZXhwcmVzc2lvbi5oIHRhcmdldC5oIFwKIAkgIGxpbmVhcml6ZS5oIGJpdG1hcC5oIGlkZW50 LWxpc3QuaCBjb21wYXQuaCBmbG93LmggYWxsb2NhdGUuaCBcCi0JICBzdG9yYWdlLmggcHRybGlz dC5oIGRpc3NlY3QuaAorCSAgc3RvcmFnZS5oIHB0cmxpc3QuaCBkaXNzZWN0LmggdHJhdmVyc2Uu aCBieXRlY29kZS5oCiAKIExJQl9PQkpTPSB0YXJnZXQubyBwYXJzZS5vIHRva2VuaXplLm8gcHJl LXByb2Nlc3MubyBzeW1ib2wubyBsaWIubyBzY29wZS5vIFwKIAkgIGV4cHJlc3Npb24ubyBzaG93 LXBhcnNlLm8gZXZhbHVhdGUubyBleHBhbmQubyBpbmxpbmUubyBsaW5lYXJpemUubyBcCiAJICBz b3J0Lm8gYWxsb2NhdGUubyBjb21wYXQtJChPUykubyBwdHJsaXN0Lm8gXAotCSAgZmxvdy5vIGNz ZS5vIHNpbXBsaWZ5Lm8gbWVtb3BzLm8gbGl2ZW5lc3MubyBzdG9yYWdlLm8gdW5zc2EubyBkaXNz ZWN0Lm8KKwkgIGZsb3cubyBjc2UubyBzaW1wbGlmeS5vIG1lbW9wcy5vIGxpdmVuZXNzLm8gc3Rv cmFnZS5vIHVuc3NhLm8gZGlzc2VjdC5vIFwKKwkgIHdyaXRlci5vIHRyYXZlcnNlLm8KIAogTElC X0ZJTEU9IGxpYnNwYXJzZS5hCiBTTElCX0ZJTEU9IGxpYnNwYXJzZS5zbwpAQCAtMTMzLDYgKzEz NCw5IEBAIGN0YWdzOiBjdGFncy5vICQoTElCUykKIGMyeG1sOiBjMnhtbC5vICQoTElCUykKIAkk KFFVSUVUX0xJTkspJChDQykgJChMREZMQUdTKSAgLW8gJEAgJDwgJChMSUJTKSBgcGtnLWNvbmZp ZyAtLWxpYnMgbGlieG1sLTIuMGAKIAordGVzdC13cml0ZTogdGVzdC13cml0ZS5vICQoTElCUykK KwkkKENDKSAkKExERkxBR1MpIC1vICRAICQ8ICQoTElCUykKKwogJChMSUJfRklMRSk6ICQoTElC X09CSlMpCiAJJChRVUlFVF9BUikkKEFSKSByY3MgJEAgJChMSUJfT0JKUykKIApAQCAtMTc3LDYg KzE4MSwxMCBAQCBncmFwaC5vOiAkKExJQl9IKQogCiBjMnhtbC5vOiBjMnhtbC5jICQoTElCX0gp CiAJJChRVUlFVF9DQykkKENDKSBgcGtnLWNvbmZpZyAtLWNmbGFncyBsaWJ4bWwtMi4wYCAtbyAk QCAtYyAkKENGTEFHUykgJDwKK3RyYXZlcnNlLm86ICQoTElCX0gpCit3cml0ZXIubzogJChMSUJf SCkKK3RyYXZlcnNlLm86ICQoTElCX0gpCit0ZXN0LXdyaXRlLm86ICQoTElCX0gpCiAKIGNvbXBh dC1saW51eC5vOiBjb21wYXQvc3RydG9sZC5jIGNvbXBhdC9tbWFwLWJsb2IuYyBcCiAJJChMSUJf SCkKSW5kZXg6IHNwYXJzZS90b2tlbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHNwYXJzZS5vcmlnL3Rva2Vu LmgKKysrIHNwYXJzZS90b2tlbi5oCkBAIC00MCw3ICs0MCw4IEBAIHN0cnVjdCBzdHJlYW0gewog CiAJLyogVXNlIHRoZXNlIHRvIGNoZWNrIGZvciAiYWxyZWFkeSBwYXJzZWQiICovCiAJZW51bSBj b25zdGFudGZpbGUgY29uc3RhbnQ7Ci0JaW50IGRpcnR5OworCXVuc2lnbmVkIGRpcnR5OjE7CisJ dW5zaWduZWQgdXNlZDoxOwogCXN0cnVjdCBpZGVudCAqcHJvdGVjdDsKIAlzdHJ1Y3QgdG9rZW4g KmlmbmRlZjsKIAlzdHJ1Y3QgdG9rZW4gKnRvcF9pZjsKQEAgLTIxMCw0ICsyMTEsNyBAQCBzdGF0 aWMgaW5saW5lIGludCBtYXRjaF9pZGVudChzdHJ1Y3QgdG9rCiAJcmV0dXJuIHRva2VuLT5wb3Mu dHlwZSA9PSBUT0tFTl9JREVOVCAmJiB0b2tlbi0+aWRlbnQgPT0gaWQ7CiB9CiAKK2V4dGVybiB2 b2lkIGZyZWVfc3RyZWFtKGludCBzdHJlYW0pOworZXh0ZXJuIGludCBhbGxvY2F0ZV9zdHJlYW0o dm9pZCk7CisKICNlbmRpZgpJbmRleDogc3BhcnNlL2xpYi5oCj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KSW5kZXg6IHNw YXJzZS9ieXRlY29kZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHNwYXJzZS5vcmlnL2J5dGVjb2RlLmgKKysr IHNwYXJzZS9ieXRlY29kZS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBieXRlY29kZS5oCisg KgorICogQ29weXJpZ2h0IChDKSAyMDA4IENocmlzdG9waGVyIExpLgorICoKKyAqIExpY2Vuc2Vk IHVuZGVyIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjEKKyAqLworCisjaW5j bHVkZSAibGludXgvdHlwZXMuaCIKKyNpbmNsdWRlICJwdHJsaXN0LmgiCisKK0RFQ0xBUkVfUFRS X0xJU1Qoc3RyZWFtX2xpc3QsIHN0cnVjdCBzdHJlYW0pOworREVDTEFSRV9QVFJfTElTVChpZGVu dF9saXN0LCBzdHJ1Y3QgaWRlbnQpOworCitzdHJ1Y3Qgb2JqZWN0X2hlYWRlciB7CisJX191MzIg dHlwZTsKKwlfX3UzMiBvZmZzZXQ7CisJX191MzIgY291bnQ7CisJX191MzIgc2l6ZTsKK307CisK K3N0cnVjdCBieXRlY29kZV9oZHIgeworCV9fdTMyIG1hZ2ljOworCV9fdTE2IG1ham9yX3ZlcnNp b247CisJX191MTYgbWlub3JfdmVyc2lvbjsKKwlfX3UzMiBleHBvcnRfc3ltYm9sczsJCS8vIGZp cnN0IGdyb3VwICMgc3ltYm9scyBpbiBpZGVudCBvYmplY3RzCisJX191MzIgaW50ZXJuYWxfc3lt Ym9sczsJCS8vIHNlY29uZCBncm91cCAjIHN5bWJvbCBpbiBpZGVudCBvYmplY3RzCisJX191MzIg aW1wb3J0X3N5bWJvbHM7CQkvLyBmb2xsb3cgdXAgIyBzeW1ib2xzIGluIGlkZW50IG9iamVjdHMK KwlfX3UzMiBzeW1ib2xfbGlzdDsKKwlfX3UzMiBmdW5jdGlvbl9saXN0OworCV9fdTE2IG9iamVj dF9oZWFkZXJzOworCXN0cnVjdCBvYmplY3RfaGVhZGVyIGhlYWRlcnNbXTsKK307CisKK3ZvaWQg d3JpdGVfYnl0ZWNvZGUoY2hhciAqc3JjLCBzdHJ1Y3Qgc3ltYm9sX2xpc3QgKnN5bXMpOworc3Ry dWN0IGJ5dGVjb2RlX2hkciAqcmVhZF9ieXRlY29kZShjaGFyICpzcmMpOworCitzdGF0aWMgaW5s aW5lIHZvaWQgKiphZGRfaWRlbnQoc3RydWN0IGlkZW50X2xpc3QgKipsaXN0LCBzdHJ1Y3QgaWRl bnQgKmlkZW50KQoreworCXZvaWQgKnAgPSAodm9pZCopIGlkZW50OworCWlmICghcCkKKwkJcmV0 dXJuIE5VTEw7CisJcmV0dXJuIGFkZF9wdHJfbGlzdCgoc3RydWN0IHB0cl9saXN0KiopIGxpc3Qs IHApOworfQpJbmRleDogc3BhcnNlL2xpbmVhcml6ZS5oCj09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHNwYXJzZS5v cmlnL2xpbmVhcml6ZS5oCisrKyBzcGFyc2UvbGluZWFyaXplLmgKQEAgLTgsNyArOCwxMCBAQAog I2luY2x1ZGUgInN5bWJvbC5oIgogCiBzdHJ1Y3QgaW5zdHJ1Y3Rpb247CitzdHJ1Y3QgZW50cnlw b2ludDsKKwogREVDTEFSRV9QVFJfTElTVChwc2V1ZG9fcHRyX2xpc3QsIHBzZXVkb190KTsKK0RF Q0xBUkVfUFRSX0xJU1QoZW50cnlwb2ludF9saXN0LCBzdHJ1Y3QgZW50cnlwb2ludCk7CiAKIHN0 cnVjdCBwc2V1ZG9fdXNlciB7CiAJc3RydWN0IGluc3RydWN0aW9uICppbnNuOwpAQCAtNzEsMTgg Kzc0LDE3IEBAIHN0cnVjdCBpbnN0cnVjdGlvbiB7CiAJCSBzaXplOjI0OwogCXN0cnVjdCBiYXNp Y19ibG9jayAqYmI7CiAJc3RydWN0IHBvc2l0aW9uIHBvczsKLQl1bmlvbiB7Ci0JCXBzZXVkb190 IHRhcmdldDsKLQkJcHNldWRvX3QgY29uZDsJCS8qIGZvciBicmFuY2ggYW5kIHN3aXRjaCAqLwot CX07CisJcHNldWRvX3QgdGFyZ2V0OwogCXVuaW9uIHsKIAkJc3RydWN0IC8qIGVudHJ5cG9pbnQg Ki8gewogCQkJc3RydWN0IHBzZXVkb19saXN0ICphcmdfbGlzdDsKIAkJfTsKIAkJc3RydWN0IC8q IGJyYW5jaCAqLyB7CisJCQlwc2V1ZG9fdCBjb25kOwogCQkJc3RydWN0IGJhc2ljX2Jsb2NrICpi Yl90cnVlLCAqYmJfZmFsc2U7CiAJCX07CiAJCXN0cnVjdCAvKiBzd2l0Y2ggKi8geworCQkJcHNl dWRvX3QgY29uZDsKIAkJCXN0cnVjdCBtdWx0aWptcF9saXN0ICptdWx0aWptcF9saXN0OwogCQl9 OwogCQlzdHJ1Y3QgLyogcGhpX25vZGUgKi8gewpJbmRleDogc3BhcnNlL3dyaXRlci5jCj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0KLS0tIHNwYXJzZS5vcmlnL3dyaXRlci5jCisrKyBzcGFyc2Uvd3JpdGVyLmMKQEAgLTAs MCArMSw0NTYgQEAKKy8qCisgKiB3cml0ZXIuYworICoKKyAqIFdhbGsgdGhlIHNwYXJzZSBzeW1i b2wgdHJlZSBhbmQgbGluZWFyaXplZCBpbnN0cnVjdGlvbi4gU2F2ZQorICogdGhlbSBpbnRvIGZp bGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IENocmlzdG9waGVyIExpLgorICoKKyAqIExp Y2Vuc2VkIHVuZGVyIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjEKKyAqLwor CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0 ZGxpYi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVk ZSA8c3lzL21tYW4uaD4KKworI2luY2x1ZGUgImFsbG9jYXRlLmgiCisjaW5jbHVkZSAibGluZWFy aXplLmgiCisjaW5jbHVkZSAidHJhdmVyc2UuaCIKKyNpbmNsdWRlICJ0b2tlbi5oIgorI2luY2x1 ZGUgImxpYi5oIgorI2luY2x1ZGUgImV4cHJlc3Npb24uaCIKKyNpbmNsdWRlICJieXRlY29kZS5o IgorCitzdHJ1Y3Qgc2hhZG93X3B0ciB7CisJc3RydWN0IHNoYWRvd19wdHIgKm5leHQ7CisJdm9p ZCAqb3JpZzsKKwlpbnQgbnI7CisJaW50IHNpemU7Cit9OworCitzdHJ1Y3Qgb2JqZWN0IHt9Owor CitBTExPQ0FUT1Ioc2hhZG93X3B0ciwgInNoYWRvdyBwdHIiKTsKK0FMTE9DQVRPUihvYmplY3Qs ICJjb252ZXJ0ZWQgb2JqZWN0Iik7CisKK3N0cnVjdCBvYmplY3RfdGFibGUgeworCWludCBjb3Vu dDsKKwlpbnQgc2l6ZTsKKwlpbnQgdG90YWxzaXplOworCXN0cnVjdCBwdHJfbGlzdCAqb2JqZWN0 X2xpc3Q7Cit9IG9iamVjdF90YWJsZVtQVFJfTEFTVF0gPSB7CisJW1BUUl9JTlNOXS5zaXplIAk9 IHNpemVvZihzdHJ1Y3QgaW5zdHJ1Y3Rpb24pLAorCVtQVFJfRU5UUllQT0lOVF0uc2l6ZSAJPSBz aXplb2Yoc3RydWN0IGVudHJ5cG9pbnQpLAorCVtQVFJfQkFTSUNCTE9DS10uc2l6ZQk9IHNpemVv ZihzdHJ1Y3QgYmFzaWNfYmxvY2spLAorCVtQVFJfUFNFVURPXS5zaXplCT0gc2l6ZW9mKHN0cnVj dCBwc2V1ZG8pLAorCVtQVFJfUFNFVURPX1VTRVJdLnNpemUgCT0gc2l6ZW9mKHN0cnVjdCBwc2V1 ZG9fdXNlciksCisJW1BUUl9BU01fQ09OU1RSQUlOVF0uc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXNt X2NvbnN0cmFpbnQpLAorCVtQVFJfU1lNQk9MXS5zaXplCT0gc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9s KSwKKwlbUFRSX0FTTV9SVUxFU10uc2l6ZQk9IHNpemVvZiAoc3RydWN0IGFzbV9ydWxlcyksCisJ W1BUUl9NVUxUSUpNUF0uc2l6ZQk9IHNpemVvZiAoc3RydWN0IG11bHRpam1wKSwKKwlbUFRSX0VY UFJdLnNpemUJCT0gc2l6ZW9mIChzdHJ1Y3QgZXhwcmVzc2lvbiksCit9OworCitzdHJ1Y3QgcHJv Z3JhbSB7CisJc3RydWN0IHN5bWJvbF9saXN0ICpleHBvcnRfc3ltczsKKwlzdHJ1Y3Qgc3ltYm9s X2xpc3QgKmltcG9ydF9zeW1zOworCXN0cnVjdCBzeW1ib2xfbGlzdCAqc3ltYm9sczsKKwlzdHJ1 Y3QgZW50cnlwb2ludF9saXN0ICpmdW5jdGlvbl9saXN0OworfTsKKworI2RlZmluZSBQVFJfSEFT SF9TSVpFICgzODMzMykKKwordm9pZCAqZmlsZV9idWZmZXIgPSBOVUxMOworCitzdGF0aWMgc3Ry dWN0IHNoYWRvd19wdHIgKnB0cl9oYXNoX3RhYmxlW1BUUl9IQVNIX1NJWkVdOworc3RhdGljIHN0 cnVjdCBwdHJfbGlzdCAqcHRyX29mZnNldF9saXN0ID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgcHRy X2xpc3QgKnVzZWRfc3RyZWFtX25hbWUgPSBOVUxMOworCit1bnNpZ25lZCBpbnQgdG90YWxfcHRy ID0gMDsKKworLy8gI2RlZmluZSBERUJVR19XUklURQorI2lmZGVmIERFQlVHX1dSSVRFCitzdGF0 aWMgY29uc3QgY2hhciAqaW5kZW50X3N0cmluZyA9ICIgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKKyNkZWZpbmUgZGJnKGZtdCwgLi4uKSBwcmlu dGYoIiUuKnMiIGZtdCwgdHJhdmVyc2VfbGV2ZWwqMiwgaW5kZW50X3N0cmluZywgIyMgX19WQV9B UkdTX18pCisjZWxzZQorI2RlZmluZSBkYmcoZm10LCAuLi4pCisjZW5kaWYKKworc3RhdGljIHN0 cnVjdCBjb252ZXJ0X29wIHdyaXRlcl9vcDsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5saW5l IHB0cl9oYXNoKHZvaWQgKnB0cikKK3sKKwlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKSBwdHIgPj4g MikgJSBQVFJfSEFTSF9TSVpFOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWdpc3Rlcl9v YmplY3QoaW50IHR5cGUsIHZvaWQgKm9iamVjdCwgaW50IHNpemUsIHN0cnVjdCBzaGFkb3dfcHRy ICpzcCwgdm9pZCAqKnBwdHIpCit7CisJc3RydWN0IG9iamVjdF90YWJsZSAqZW50cnkgPSBvYmpl Y3RfdGFibGUgKyB0eXBlOworCWlmIChzcCAmJiBwcHRyKQorCQkqKHVuc2lnbmVkIGludCopIHBw dHIgPSBzcC0+bnIgPSBlbnRyeS0+Y291bnQ7CisJZW50cnktPmNvdW50ICsrOworCWVudHJ5LT50 b3RhbHNpemUgKz0gc2l6ZTsKKwlhZGRfcHRyX2xpc3Rfbm90YWcoJmVudHJ5LT5vYmplY3RfbGlz dCwgb2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVyX2luaXRfb2JqZWN0X3RhYmxlKHZv aWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IFBUUl9MQVNUOyBpKyspIHsKKwkJc3Ry dWN0IG9iamVjdF90YWJsZSAqZW50cnkgPSBvYmplY3RfdGFibGUgKyBpOworCQllbnRyeS0+Y291 bnQgPSAxOworCQllbnRyeS0+dG90YWxzaXplID0gMDsKKwkJZW50cnktPm9iamVjdF9saXN0ID0g TlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlcl9pbml0KHZvaWQpCit7CisJdG90YWxf cHRyID0gMDsKKwl1c2VkX3N0cmVhbV9uYW1lID0gTlVMTDsKKwlwdHJfb2Zmc2V0X2xpc3QgPSBO VUxMOworCXdyaXRlcl9pbml0X29iamVjdF90YWJsZSgpOworfQorCitzdGF0aWMgaW5saW5lIHN0 cnVjdCBzaGFkb3dfcHRyICpjcmVhdGVfc2hhZG93X3BvaW50ZXIodm9pZCAqcHB0cikKK3sKKwl2 b2lkICpwdHIgPSAqKHZvaWQqKilwcHRyOworCXVuc2lnbmVkIGludCBoYXNoID0gIHB0cl9oYXNo KHB0cik7CisJc3RydWN0IHNoYWRvd19wdHIgKnNwOworCisJaWYgKCFwdHIpIHsKKwkJKih1bnNp Z25lZCBpbnQqKSBwcHRyID0gMDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXNwID0gcHRyX2hhc2hf dGFibGVbaGFzaF07CisJd2hpbGUgKHNwKSB7CisJCWlmIChzcC0+b3JpZyA9PSBwdHIpIHsKKwkJ CSoodW5zaWduZWQgaW50KikgcHB0ciA9IHNwLT5ucjsKKwkJCXJldHVybiBOVUxMOworCQl9CisJ CXNwID0gc3AtPm5leHQ7CisJfQorCisJc3AgPSBfX2FsbG9jX3NoYWRvd19wdHIoMCk7CisJc3At Pm5leHQgPSBwdHJfaGFzaF90YWJsZVtoYXNoXTsKKwlwdHJfaGFzaF90YWJsZVtoYXNoXSA9IHNw OworCXNwLT5vcmlnID0gcHRyOworCXJldHVybiBzcDsKKworfQorCitzdGF0aWMgdm9pZCB3cml0 ZXJfY29udmVydF9vYmplY3QoaW50IHR5cGUsIHZvaWQgKnBwdHIsIGludCBzaXplLCB0cmF2ZXJz ZV90IHRyYXZlcnNlLCB2b2lkICpkYXRhKQoreworCXZvaWQgKnB0ciA9ICoodm9pZCoqKXBwdHI7 CisJc3RydWN0IHNoYWRvd19wdHIgKnNwID0gY3JlYXRlX3NoYWRvd19wb2ludGVyKHBwdHIpOwor CWlmIChzcCkgeworCQl2b2lkICpvYmplY3QgPSBfX2FsbG9jX29iamVjdChzaXplKTsKKwkJbWVt Y3B5KG9iamVjdCwgcHRyLCBzaXplKTsKKwkJcmVnaXN0ZXJfb2JqZWN0KHR5cGUsIG9iamVjdCwg c2l6ZSwgc3AsICh2b2lkKiopIHBwdHIpOworCQl0cmF2ZXJzZSgmd3JpdGVyX29wLCBvYmplY3Qs IGRhdGEpOworCX0KK30KKworc3RhdGljIHZvaWQgd3JpdGVyX2NvbnZlcnRfcHRyX2xpc3QoaW50 IHR5cGUsIHZvaWQgKnBwdHIsIGludCBzaXplLCB0cmF2ZXJzZV90IHRyYXZlcnNlLCB2b2lkICpk YXRhKQoreworCXN0cnVjdCBwdHJfbGlzdCAqbGlzdCA9ICooc3RydWN0IHB0cl9saXN0KiopcHB0 cjsKKwlzdHJ1Y3Qgc2hhZG93X3B0ciAqc3AgPSBjcmVhdGVfc2hhZG93X3BvaW50ZXIocHB0cik7 CisJaWYgKHNwKSB7CisJCWludCBuID0gcHRyX2xpc3Rfc2l6ZShsaXN0KTsKKwkJaW50IGxpc3Rz aXplID0gKG4gKyAxKSAqIHNpemVvZiAodW5zaWduZWQgaW50KTsKKwkJdW5zaWduZWQgaW50ICpj dXIsICpsaXN0X29iamVjdCA9ICh1bnNpZ25lZCBpbnQqKSBfX2FsbG9jX29iamVjdChsaXN0c2l6 ZSk7CisJCSpsaXN0X29iamVjdCA9IG47CisJCWN1ciA9IGxpc3Rfb2JqZWN0ICsgMTsKKwkJcmVn aXN0ZXJfb2JqZWN0KFBUUl9MSVNULCBsaXN0X29iamVjdCwgbGlzdHNpemUsIHNwLCAodm9pZCAq KikgcHB0cik7CisJCXZvaWQgKnA7CisKKwkJRk9SX0VBQ0hfUFRSKGxpc3QsIHApIHsKKwkJCWlm IChzaXplKQorCQkJCXdyaXRlcl9jb252ZXJ0X29iamVjdCh0eXBlLCAmcCwgc2l6ZSwgdHJhdmVy c2UsIGRhdGEpOworCQkJKmN1cisrID0gKHVuc2lnbmVkIGludClwOworCQl9IEVORF9GT1JfRUFD SF9QVFIocCk7CisJfQorfQorCitzdGF0aWMgdm9pZCB3cml0ZXJfY29udmVydF9zdHJpbmcoc3Ry dWN0IHN0cmluZyAqKnBwdHIsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHN0cmluZyAqc3RyaW5n ID0gKnBwdHI7CisJc3RydWN0IHNoYWRvd19wdHIgKnNwID0gY3JlYXRlX3NoYWRvd19wb2ludGVy KHBwdHIpOworCWlmIChzcCkgeworCQlpbnQgc2l6ZSA9IHNpemVvZiAqc3RyaW5nICsgc3RyaW5n LT5sZW5ndGg7CisJCXJlZ2lzdGVyX29iamVjdChQVFJfU1RSSU5HLCBzdHJpbmcsIHNpemUsIHNw LCAodm9pZCoqKSBwcHRyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlcl9jb252ZXJ0X2No YXJzdHJpbmcoY2hhciAqKnBwdHIsIHZvaWQgKmRhdGEpCit7CisJY2hhciAqc3RyaW5nID0gKnBw dHI7CisJc3RydWN0IHNoYWRvd19wdHIgKnNwID0gY3JlYXRlX3NoYWRvd19wb2ludGVyKHBwdHIp OworCWlmIChzcCkgeworCQlpbnQgc2l6ZSA9IHN0cmxlbihzdHJpbmcpICsgMTsKKwkJcmVnaXN0 ZXJfb2JqZWN0KFBUUl9DSEFSU1RSSU5HLCBzdHJpbmcsIHNpemUsIHNwLCAodm9pZCoqKSBwcHRy KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlcl9jb252ZXJ0X3Bvc2lzdGlvbihzdHJ1Y3Qg cG9zaXRpb24gKnBvcywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0gPSBp bnB1dF9zdHJlYW1zICsgcG9zLT5zdHJlYW07CisJY2hhciAqbmFtZSA9IChjaGFyKikgc3RyZWFt LT5uYW1lOworCXN0cnVjdCBzaGFkb3dfcHRyICpzcCA9IGNyZWF0ZV9zaGFkb3dfcG9pbnRlcigm c3RyZWFtKTsKKwlpZiAoc3ApIHsKKwkJcmVnaXN0ZXJfb2JqZWN0KFBUUl9TVFJFQU1fTkFNRSwg bmFtZSwgc3RybGVuKG5hbWUpICsgMSwgc3AsICh2b2lkKiopICZzdHJlYW0pOworCX0KKwlwb3Mt PnN0cmVhbSA9ICh1bnNpZ25lZCBpbnQpIHN0cmVhbTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVy X2NvbnZlcnRfaWRlbnQoc3RydWN0IGlkZW50ICoqcGlkZW50LCB2b2lkICpkYXRhKQoreworCXN0 cnVjdCBpZGVudCAqaWRlbnQgPSAqcGlkZW50OworCXN0cnVjdCBzaGFkb3dfcHRyICpzcCA9IGNy ZWF0ZV9zaGFkb3dfcG9pbnRlcihwaWRlbnQpOworCWlmIChzcCkgeworCQlpbnQgc2l6ZSA9IGlk ZW50LT5sZW4gKyBzaXplb2YgKmlkZW50OworCQlyZWdpc3Rlcl9vYmplY3QoUFRSX0lERU5ULCBp ZGVudCwgc2l6ZSwgc3AsICh2b2lkKiopIHBpZGVudCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0 IGNvbnZlcnRfb3Agd3JpdGVyX29wID0geworCS5jb252ZXJ0X3B0ciA9IHdyaXRlcl9jb252ZXJ0 X29iamVjdCwKKwkuY29udmVydF9saXN0ID0gd3JpdGVyX2NvbnZlcnRfcHRyX2xpc3QsCisJLmNv bnZlcnRfcG9zaXRpb24gPSB3cml0ZXJfY29udmVydF9wb3Npc3Rpb24sCisJLmNvbnZlcnRfc3Ry aW5nID0gd3JpdGVyX2NvbnZlcnRfc3RyaW5nLAorCS5jb252ZXJ0X2NoYXJzdHJpbmcgPSB3cml0 ZXJfY29udmVydF9jaGFyc3RyaW5nLAorCS5jb252ZXJ0X2lkZW50ID0gd3JpdGVyX2NvbnZlcnRf aWRlbnQsCit9OworCitzdGF0aWMgc2l6ZV90IGNhY2x1YXRlX3NpemUodm9pZCkKK3sKKwlpbnQg aTsKKwlzaXplX3QgdG90YWwgPSAwOworCWZvciAoaSA9IDA7IGkgPCBQVFJfTEFTVDsgaSsrKSB7 CisJCXRvdGFsICs9IG9iamVjdF90YWJsZVtpXS50b3RhbHNpemU7CisJCXByaW50ZigiJXMgc2l6 ZSAlZFxuIiwgb2JqZWN0X3R5cGVuYW1lKGkpLCBvYmplY3RfdGFibGVbaV0udG90YWxzaXplKTsK Kwl9CisJcmV0dXJuIHRvdGFsOworfQorCitzdGF0aWMgaW50IHJlZ2lzdGVyX3N5bWJvbF9pZGVu dHMoc3RydWN0IHN5bWJvbF9saXN0ICpzeW1zKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlp bnQgb3JpZyA9IG9iamVjdF90YWJsZVtQVFJfSURFTlRdLmNvdW50OworCisJRk9SX0VBQ0hfUFRS KHN5bXMsIHN5bSkgeworCQlzdHJ1Y3QgaWRlbnQgKmlkZW50ID0gc3ltLT5pZGVudDsKKwkJd3Jp dGVyX2NvbnZlcnRfaWRlbnQoJmlkZW50LCBOVUxMKTsKKwl9IEVORF9GT1JfRUFDSF9QVFIoc3lt KTsKKworCXJldHVybiBvYmplY3RfdGFibGVbUFRSX0lERU5UXS5jb3VudCAtIG9yaWc7Cit9CisK K3N0YXRpYyBzaXplX3Qgd3JpdGVfZml4c2l6ZV9vYmplY3Qoc3RydWN0IGJ5dGVjb2RlX2hkciAq aGRyLCBpbnQgdHlwZSwgc2l6ZV90IG9mZnNldCkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X3RhYmxlICpl bnRyeSA9IG9iamVjdF90YWJsZSArIHR5cGU7CisJc3RydWN0IG9iamVjdF9oZWFkZXIgKmhlYWRl ciA9IGhkci0+aGVhZGVycyArIHR5cGU7CisJaW50IHNpemUgPSBlbnRyeS0+c2l6ZTsKKwl2b2lk ICpwdHI7CisJY2hhciAqYnVmZmVyID0gKChjaGFyKikgaGRyKSArICBvZmZzZXQ7CisJCisJaGVh ZGVyLT50eXBlID0gdHlwZTsKKwloZWFkZXItPm9mZnNldCA9IG9mZnNldDsKKwloZWFkZXItPmNv dW50ID0gZW50cnktPmNvdW50OworCWhlYWRlci0+c2l6ZSA9IGVudHJ5LT50b3RhbHNpemU7CisK KwlvZmZzZXQgPSAwOworCUZPUl9FQUNIX1BUUihlbnRyeS0+b2JqZWN0X2xpc3QsIHB0cikgewor CQltZW1jcHkoYnVmZmVyICsgb2Zmc2V0LCBwdHIsIHNpemUpOworCQlvZmZzZXQgKz0gc2l6ZTsK Kwl9IEVORF9GT1JfRUFDSF9QVFIocHRyKTsKKwlyZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMg c2l6ZV90IHdyaXRlX2lkZW50KHN0cnVjdCBieXRlY29kZV9oZHIgKmhkciwgc2l6ZV90IG9mZnNl dCkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X3RhYmxlICplbnRyeSA9IG9iamVjdF90YWJsZSArIFBUUl9J REVOVDsKKwlzdHJ1Y3Qgb2JqZWN0X2hlYWRlciAqaGVhZGVyID0gaGRyLT5oZWFkZXJzICsgUFRS X0lERU5UOworCXN0cnVjdCBpZGVudCAqaWRlbnQ7CisJc3RydWN0IGlkZW50X2xpc3QgKmxpc3Qg PSAoc3RydWN0IGlkZW50X2xpc3QqKSBlbnRyeS0+b2JqZWN0X2xpc3Q7CisJY2hhciAqYnVmZmVy ID0gKChjaGFyKikgaGRyKSArICBvZmZzZXQ7CisKKwloZWFkZXItPnR5cGUgPSBQVFJfSURFTlQ7 CisJaGVhZGVyLT5vZmZzZXQgPSBvZmZzZXQ7CisJaGVhZGVyLT5jb3VudCA9IGVudHJ5LT5jb3Vu dDsKKwloZWFkZXItPnNpemUgPSBlbnRyeS0+dG90YWxzaXplOworCisJb2Zmc2V0ID0gMDsKKwlG T1JfRUFDSF9QVFIobGlzdCwgaWRlbnQpIHsKKwkJbWVtY3B5KGJ1ZmZlciArIG9mZnNldCwgaWRl bnQtPm5hbWUsIGlkZW50LT5sZW4pOworCQlidWZmZXJbb2Zmc2V0ICsgaWRlbnQtPmxlbl0gPSAn XDAnOworCQlvZmZzZXQgKz0gaWRlbnQtPmxlbiArIDE7CisJfSBFTkRfRk9SX0VBQ0hfUFRSKGlk ZW50KTsKKworCWhlYWRlci0+c2l6ZSA9IG9mZnNldDsKKwlyZXR1cm4gb2Zmc2V0OworfQorCitz dGF0aWMgc2l6ZV90IHdyaXRlX3N0cmluZyhzdHJ1Y3QgYnl0ZWNvZGVfaGRyICpoZHIsIHNpemVf dCBvZmZzZXQpCit7CisJc3RydWN0IG9iamVjdF90YWJsZSAqZW50cnkgPSBvYmplY3RfdGFibGUg KyBQVFJfU1RSSU5HOworCXN0cnVjdCBvYmplY3RfaGVhZGVyICpoZWFkZXIgPSBoZHItPmhlYWRl cnMgKyBQVFJfU1RSSU5HOworCXZvaWQgKnB0cjsKKwljaGFyICpidWZmZXIgPSAoKGNoYXIqKSBo ZHIpICsgIG9mZnNldDsKKworCWhlYWRlci0+dHlwZSA9IFBUUl9TVFJJTkc7CisJaGVhZGVyLT5v ZmZzZXQgPSBvZmZzZXQ7CisJaGVhZGVyLT5jb3VudCA9IGVudHJ5LT5jb3VudDsKKwloZWFkZXIt PnNpemUgPSBlbnRyeS0+dG90YWxzaXplOworCisJb2Zmc2V0ID0gMDsKKwlGT1JfRUFDSF9QVFIo ZW50cnktPm9iamVjdF9saXN0LCBwdHIpIHsKKwkJc3RydWN0IHN0cmluZyAqc3RyaW5nID0gKHN0 cnVjdCBzdHJpbmcgKikgcHRyOworCQlpbnQgc2l6ZSA9IHNpemVvZiAqc3RyaW5nICsgc3RyaW5n LT5sZW5ndGg7CisJCW1lbWNweShidWZmZXIgKyBvZmZzZXQsIHB0ciwgc2l6ZSk7CisJCW9mZnNl dCArPSBzaXplOworCX0gRU5EX0ZPUl9FQUNIX1BUUihwdHIpOworCXJldHVybiBvZmZzZXQ7Cit9 CisKK3N0YXRpYyBzaXplX3Qgd3JpdGVfY2hhcnN0cmluZyhzdHJ1Y3QgYnl0ZWNvZGVfaGRyICpo ZHIsIGludCB0eXBlLCBzaXplX3Qgb2Zmc2V0KQoreworCXN0cnVjdCBvYmplY3RfdGFibGUgKmVu dHJ5ID0gb2JqZWN0X3RhYmxlICsgdHlwZTsKKwlzdHJ1Y3Qgb2JqZWN0X2hlYWRlciAqaGVhZGVy ID0gaGRyLT5oZWFkZXJzICsgdHlwZTsKKwl2b2lkICpwdHI7CisJY2hhciAqYnVmZmVyID0gKChj aGFyKikgaGRyKSArICBvZmZzZXQ7CisKKwloZWFkZXItPnR5cGUgPSB0eXBlOworCWhlYWRlci0+ b2Zmc2V0ID0gb2Zmc2V0OworCWhlYWRlci0+Y291bnQgPSBlbnRyeS0+Y291bnQ7CisJaGVhZGVy LT5zaXplID0gZW50cnktPnRvdGFsc2l6ZTsKKworCW9mZnNldCA9IDA7CisJRk9SX0VBQ0hfUFRS KGVudHJ5LT5vYmplY3RfbGlzdCwgcHRyKSB7CisJCWludCBzaXplID0gc3RybGVuKHB0cik7CisJ CXN0cm5jcHkoYnVmZmVyICsgb2Zmc2V0LCBwdHIsIHNpemUpOworCQlidWZmZXJbb2Zmc2V0ICsg c2l6ZV0gPSAnXDAnOworCQlvZmZzZXQgKz0gc2l6ZSArIDE7CisJfSBFTkRfRk9SX0VBQ0hfUFRS KHB0cik7CisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIHNpemVfdCB3cml0ZV9saXN0KHN0 cnVjdCBieXRlY29kZV9oZHIgKmhkciwgc2l6ZV90IG9mZnNldCkKK3sKKwlzdHJ1Y3Qgb2JqZWN0 X3RhYmxlICplbnRyeSA9IG9iamVjdF90YWJsZSArIFBUUl9MSVNUOworCXN0cnVjdCBvYmplY3Rf aGVhZGVyICpoZWFkZXIgPSBoZHItPmhlYWRlcnMgKyBQVFJfTElTVDsKKwl2b2lkICpwdHI7CisJ Y2hhciAqYnVmZmVyID0gKChjaGFyKikgaGRyKSArICBvZmZzZXQ7CisKKwloZWFkZXItPnR5cGUg PSBQVFJfTElTVDsKKwloZWFkZXItPm9mZnNldCA9IG9mZnNldDsKKwloZWFkZXItPmNvdW50ID0g ZW50cnktPmNvdW50OworCWhlYWRlci0+c2l6ZSA9IGVudHJ5LT50b3RhbHNpemU7CisKKwlvZmZz ZXQgPSAwOworCUZPUl9FQUNIX1BUUihlbnRyeS0+b2JqZWN0X2xpc3QsIHB0cikgeworCQlpbnQg c2l6ZSA9ICgoKih1bnNpZ25lZCBpbnQqKXB0cikgKyAxKSAqIHNpemVvZiAodW5zaWduZWQgaW50 KTsKKwkJbWVtY3B5KGJ1ZmZlciArIG9mZnNldCwgcHRyLCBzaXplKTsKKwkJb2Zmc2V0ICs9IHNp emU7CisJfSBFTkRfRk9SX0VBQ0hfUFRSKHB0cik7CisJcmV0dXJuIG9mZnNldDsKK30KKworc3Rh dGljIHZvaWQgd3JpdGVfZmlsZShjaGFyICpmaWxlbmFtZSwgc3RydWN0IHByb2dyYW0gKnByb2cp Cit7CisJc3RydWN0IGJ5dGVjb2RlX2hkciBoZHIgPSB7fSwgKmJoZHI7CisJc3RydWN0IHByb2dy YW0gY3Byb2cgPSAqcHJvZzsKKwlpbnQgZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JEV1IgfCBPX0NS RUFUIHwgT19UUlVOQywgMDY0NCk7CisJc2l6ZV90IG9mZnNldCA9IDAsIHRvdGFsOworCWludCBo ZHJzaXplID0gc2l6ZW9mIGhkciArIFBUUl9MQVNUICogc2l6ZW9mIChzdHJ1Y3Qgb2JqZWN0X2hl YWRlcik7CisJdm9pZCAqYnVmZmVyOworCWludCBpOworCisJaWYgKGZkIDwgMCkKKwkJZGllKCJl cnJvciBvcGVuaW5nIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKKworCXdyaXRlcl9pbml0KCk7CisK KwloZHIuZXhwb3J0X3N5bWJvbHMgPSByZWdpc3Rlcl9zeW1ib2xfaWRlbnRzKHByb2ctPmV4cG9y dF9zeW1zKTsKKwloZHIuaW50ZXJuYWxfc3ltYm9scyA9IHJlZ2lzdGVyX3N5bWJvbF9pZGVudHMo cHJvZy0+c3ltYm9scyk7CisJaGRyLmltcG9ydF9zeW1ib2xzID0gcmVnaXN0ZXJfc3ltYm9sX2lk ZW50cyhwcm9nLT5pbXBvcnRfc3ltcyk7CisKKwlwcmludGYgKCJleHBvcnQgc3ltcyAlZCBpbnRl cm5hbCAlZCBpbXBvcnQgJWRcbiIsIGhkci5leHBvcnRfc3ltYm9scywgaGRyLmludGVybmFsX3N5 bWJvbHMsIGhkci5pbXBvcnRfc3ltYm9scyk7CisKKwl3cml0ZXJfY29udmVydF9wdHJfbGlzdChQ VFJfU1lNQk9MLCAmY3Byb2cuc3ltYm9scywgc2l6ZW9mKHN0cnVjdCBzeW1ib2wpLAorCQkJCXRy YXZlcnNlX3N5bWJvbCwgTlVMTCk7CisJd3JpdGVyX2NvbnZlcnRfcHRyX2xpc3QoUFRSX0VOVFJZ UE9JTlQsICZjcHJvZy5mdW5jdGlvbl9saXN0LCBzaXplb2Yoc3RydWN0IGVudHJ5cG9pbnQpLAor CQkJCXRyYXZlcnNlX2VudHJ5cG9pbnQsIE5VTEwpOworCWhkci5zeW1ib2xfbGlzdCA9ICh1bnNp Z25lZCBpbnQpIGNwcm9nLnN5bWJvbHM7CisJaGRyLmZ1bmN0aW9uX2xpc3QgPSAodW5zaWduZWQg aW50KSBjcHJvZy5mdW5jdGlvbl9saXN0OworCisJdG90YWwgPSBjYWNsdWF0ZV9zaXplKCkgKyBo ZHJzaXplOworCisJZnRydW5jYXRlKGZkLCB0b3RhbCk7CisJYnVmZmVyID0gbW1hcChOVUxMLCB0 b3RhbCAsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCSAgICAgIE1BUF9TSEFSRUQsIGZkLCAw KTsKKworCWlmIChidWZmZXIgPT0gTUFQX0ZBSUxFRCkKKwkJZGllKCJlcnJvciBtbWFwaW5nIGZp bGUgJXMgd2l0aCBzaXplICVseFxuIiwgZmlsZW5hbWUsICh1bnNpZ25lZCBsb25nKXRvdGFsKTsK KworCW1lbWNweShidWZmZXIsICZoZHIsIHNpemVvZiBoZHIpOworCWJoZHIgPSAoc3RydWN0IGJ5 dGVjb2RlX2hkciopIGJ1ZmZlcjsKKwlvZmZzZXQgKz0gaGRyc2l6ZTsKKworCW9mZnNldCArPSB3 cml0ZV9pZGVudChiaGRyLCBvZmZzZXQpOworCW9mZnNldCArPSB3cml0ZV9zdHJpbmcoYmhkciwg b2Zmc2V0KTsKKwlvZmZzZXQgKz0gd3JpdGVfY2hhcnN0cmluZyhiaGRyLCBQVFJfU1RSRUFNX05B TUUsb2Zmc2V0KTsKKwlvZmZzZXQgKz0gd3JpdGVfY2hhcnN0cmluZyhiaGRyLCBQVFJfQ0hBUlNU UklORywgb2Zmc2V0KTsKKwlvZmZzZXQgKz0gd3JpdGVfbGlzdChiaGRyLCBvZmZzZXQpOworCisJ Zm9yIChpID0gMDsgaSA8IFBUUl9WQVJTSVpFOyBpKyspCisJCW9mZnNldCArPSB3cml0ZV9maXhz aXplX29iamVjdChiaGRyLCBpLCBvZmZzZXQpOworCW11bm1hcChidWZmZXIsIHRvdGFsKTsKKwlm dHJ1bmNhdGUoZmQsIG9mZnNldCk7CisJcHJpbnRmKCJ0b2Fsc2l6ZSAlZFxuIiwgb2Zmc2V0KTsK KwljbG9zZShmZCk7Cit9CisKK3ZvaWQgd3JpdGVfYnl0ZWNvZGUoY2hhciAqZmlsZW5hbWUsIHN0 cnVjdCBzeW1ib2xfbGlzdCAqc3ltcykKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0 IHByb2dyYW0gcHJvZyA9IHt9OworCXN0cnVjdCBlbnRyeXBvaW50ICplcDsKKworCisJcHJvZy5z eW1ib2xzID0gc3ltczsKKwlwcm9nLmltcG9ydF9zeW1zID0gTlVMTDsKKworCUZPUl9FQUNIX1BU UihzeW1zLCBzeW0pIHsKKwkJZXhwYW5kX3N5bWJvbChzeW0pOworCQllcCA9IGxpbmVhcml6ZV9z eW1ib2woc3ltKTsKKworCQlpZiAoIShzeW0tPmN0eXBlLm1vZGlmaWVycyAmIE1PRF9TVEFUSUMp KQorCQkJYWRkX3N5bWJvbCgmcHJvZy5leHBvcnRfc3ltcywgc3ltKTsKKworCQlpZiAoZXApIHsK KwkJCXN0cnVjdCBwc2V1ZG8gKnA7CisJCQlzdHJ1Y3Qgc3ltYm9sICpzOworCQkJYWRkX3B0cl9s aXN0KCZwcm9nLmZ1bmN0aW9uX2xpc3QsIGVwKTsKKwkJCUZPUl9FQUNIX1BUUihlcC0+YWNjZXNz ZXMsIHApIHsKKwkJCQlzdHJ1Y3QgaWRlbnQgKmlkZW50OworCQkJCXMgPSBwLT5zeW07CisJCQkJ aWYgKCEocy0+Y3R5cGUubW9kaWZpZXJzICYgTU9EX0VYVEVSTikpCisJCQkJCWNvbnRpbnVlOwor CQkJCWlmICghKGlkZW50ID0gcy0+aWRlbnQpKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoZmlu ZF9wdHJfaW5fbGlzdCgoc3RydWN0IHB0cl9saXN0ICopcHJvZy5pbXBvcnRfc3ltcywgcykpCisJ CQkJCWNvbnRpbnVlOworCQkJCWFkZF9zeW1ib2woJnByb2cuaW1wb3J0X3N5bXMsIHMpOworCQkJ fSBFTkRfRk9SX0VBQ0hfUFRSKHApOworCQl9CisJfSBFTkRfRk9SX0VBQ0hfUFRSKHN5bSk7CisK Kwl3cml0ZV9maWxlKGZpbGVuYW1lLCAmcHJvZyk7Cit9CisKSW5kZXg6IHNwYXJzZS90ZXN0LXdy aXRlLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQotLS0gc3BhcnNlLm9yaWcvdGVzdC13cml0ZS5jCisrKyBzcGFyc2Uv dGVzdC13cml0ZS5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBUZXN0IHByb2dyYW0gZm9yIGR1 bXBpbmcgdGhlIHNwYXJzZSBwYXJzaW5nIHJlc3VsdCBpbnRvCisgKiBieXRlY29kZSBmaWxlcy4K KyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IENocmlzdG9waGVyIExpLgorICoKKyAqIExpY2Vu c2VkIHVuZGVyIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjEKKyAqLworCisK KyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmlu Zy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRl ICJsaWIuaCIKKyNpbmNsdWRlICJhbGxvY2F0ZS5oIgorI2luY2x1ZGUgInN5bWJvbC5oIgorI2lu Y2x1ZGUgImV4cHJlc3Npb24uaCIKKyNpbmNsdWRlICJsaW5lYXJpemUuaCIKKyNpbmNsdWRlICJi eXRlY29kZS5oIgorCitzdHJ1Y3Qgc3RyZWFtX2xpc3QgKnVzZWRfc3RyZWFtID0gTlVMTDsKKwor c3RhdGljIHZvaWQgd3JpdGVfb25lX2ZpbGUoY2hhciAqc3JjZmlsZSkKK3sKKwljaGFyICpvdXRm aWxlOworCWludCBlbmQ7CisJc3RydWN0IHN5bWJvbF9saXN0ICpzeW1zOworCisJb3V0ZmlsZSA9 IHN0cmR1cChzcmNmaWxlKTsKKwlpZiAoIW91dGZpbGUpCisJCWRpZSgib3V0IG9mIG1lbW9yeSAl c1xuIiwgc3JjZmlsZSk7CisJZW5kID0gc3RybGVuKG91dGZpbGUpOworCWlmIChlbmQgPD0gMiB8 fCBvdXRmaWxlIFtlbmQgLSAxXSAhPSAnYycpCisJCWRpZSgibm90IGEgYyBmaWxlIik7CisJb3V0 ZmlsZVtlbmQgLSAxXSA9ICdiJzsKKwlzeW1zID0gc3BhcnNlKHNyY2ZpbGUpOworCXdyaXRlX2J5 dGVjb2RlKG91dGZpbGUsIHN5bXMpOworCWZyZWUob3V0ZmlsZSk7Cit9CisKK2ludCBtYWluKGlu dCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmZpbGVsaXN0ID0g TlVMTDsKKwljaGFyICpmaWxlOworCisJc3BhcnNlX2luaXRpYWxpemUoYXJnYywgYXJndiwgJmZp bGVsaXN0KTsKKwlGT1JfRUFDSF9QVFJfTk9UQUcoZmlsZWxpc3QsIGZpbGUpIHsKKwkJd3JpdGVf b25lX2ZpbGUoZmlsZSk7CisJfSBFTkRfRk9SX0VBQ0hfUFRSX05PVEFHKGZpbGUpOworCXJldHVy biAwOworfQpJbmRleDogc3BhcnNlL3RyYXZlcnNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3BhcnNlLm9y aWcvdHJhdmVyc2UuaAorKysgc3BhcnNlL3RyYXZlcnNlLmgKQEAgLTAsMCArMSw4NyBAQAorLyoK KyAqIHRyYXZlcnNlLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQ2hyaXN0b3BoZXIgTGku CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9u IDEuMQorICovCisKKyNpbmNsdWRlICJzeW1ib2wuaCIKKyNpbmNsdWRlICJleHByZXNzaW9uLmgi CisKK3N0cnVjdCBjb252ZXJ0X29wOworCitlbnVtIHB0cl90eXBlIHsKKwkvKiBmaXggc2l6ZSBv YmplY3RzICovCisJUFRSX0lOU04sCisJUFRSX0VOVFJZUE9JTlQsCisJUFRSX0JBU0lDQkxPQ0ss CisJUFRSX1BTRVVETywKKwlQVFJfUFNFVURPX1VTRVIsCisJUFRSX0FTTV9DT05TVFJBSU5ULAor CVBUUl9TWU1CT0wsCisJUFRSX0FTTV9SVUxFUywKKwlQVFJfTVVMVElKTVAsCisJUFRSX0VYUFIs CisKKwkvKiB2YXJpYWJsZSBzaXplIG9iamVjdHMgKi8KKwlQVFJfVkFSU0laRSwKKwlQVFJfSURF TlQgPSBQVFJfVkFSU0laRSwKKwlQVFJfU1RSSU5HLAorCVBUUl9DSEFSU1RSSU5HLAorCVBUUl9T VFJFQU1fTkFNRSwKKwlQVFJfTElTVCwKKwlQVFJfTEFTVCwKK307CisKKwordHlwZWRlZiB2b2lk ICgqdHJhdmVyc2VfdCkoc3RydWN0IGNvbnZlcnRfb3AqLCB2b2lkICosIHZvaWQgKik7CisKK3N0 cnVjdCBjb252ZXJ0X29wIHsKKwl2b2lkICgqY29udmVydF9wdHIpKGludCB0eXBlLCB2b2lkICpw dHIsIGludCBzaXplLCB0cmF2ZXJzZV90IGZ1bmMsIHZvaWQgKmRhdGEpOworCXZvaWQgKCpjb252 ZXJ0X2xpc3QpKGludCB0eXBlLCB2b2lkICpwdHIsIGludCBzaXplLCB0cmF2ZXJzZV90IGZ1bmMs IHZvaWQgKmRhdGEpOworCXZvaWQgKCpjb252ZXJ0X3Bvc2l0aW9uKShzdHJ1Y3QgcG9zaXRpb24q LCB2b2lkICpkYXRhKTsKKwl2b2lkICgqY29udmVydF9zdHJpbmcpKHN0cnVjdCBzdHJpbmcqKiwg dm9pZCAqZGF0YSk7CisJdm9pZCAoKmNvbnZlcnRfY2hhcnN0cmluZykoY2hhciAqKiwgdm9pZCAq ZGF0YSk7CisJdm9pZCAoKmNvbnZlcnRfaWRlbnQpKHN0cnVjdCBpZGVudCoqLCB2b2lkICpkYXRh KTsKK307CisKK3ZvaWQgdHJhdmVyc2VfZW50cnlwb2ludChzdHJ1Y3QgY29udmVydF9vcCosIHZv aWQgKnB0ciwgdm9pZCAqZGF0YSk7Cit2b2lkIHRyYXZlcnNlX2Jhc2ljX2Jsb2NrKHN0cnVjdCBj b252ZXJ0X29wKiwgdm9pZCAqcHRyLCB2b2lkICpkYXRhKTsKK3ZvaWQgdHJhdmVyc2VfbXVsdGlq bXAoc3RydWN0IGNvbnZlcnRfb3AqLCB2b2lkICpwdHIsIHZvaWQgKmRhdGEpOwordm9pZCB0cmF2 ZXJzZV9pbnN0cnVjdGlvbihzdHJ1Y3QgY29udmVydF9vcCosIHZvaWQgKnB0ciwgdm9pZCAqZGF0 YSk7Cit2b2lkIHRyYXZlcnNlX3N5bWJvbChzdHJ1Y3QgY29udmVydF9vcCosIHZvaWQgKnB0ciwg dm9pZCAqZGF0YSk7Cit2b2lkIHRyYXZlcnNlX3BzZXVkbyhzdHJ1Y3QgY29udmVydF9vcCAqb3As IHZvaWQgKnB0ciwgdm9pZCAqZGF0YSk7Cit2b2lkIHRyYXZlcnNlX2FzbV9jb25zdHJhaW50KHN0 cnVjdCBjb252ZXJ0X29wKiwgdm9pZCAqcHRyLCB2b2lkICpkYXRhKTsKK3ZvaWQgdHJhdmVyc2Vf YXNtX3J1bGVzKHN0cnVjdCBjb252ZXJ0X29wKiwgdm9pZCAqcHRyLCB2b2lkICpkYXRhKTsKK3Zv aWQgdHJhdmVyc2VfZXhwcmVzc2lvbihzdHJ1Y3QgY29udmVydF9vcCosIHZvaWQgKnB0ciwgdm9p ZCAqZGF0YSk7CisKK2V4dGVybiBjb25zdCBjaGFyKiBvYmplY3RfdHlwZW5hbWUoaW50IHR5cGUp OworZXh0ZXJuIGludCB0cmF2ZXJzZV9sZXZlbDsKKworI2RlZmluZSBERUNMQVJFX1BUUl9DT05W RVJUT1IoZSwgbikJCQkJCQkJXAorCXN0YXRpYyBpbmxpbmUgdm9pZCBjb252ZXJ0XyMjbihzdHJ1 Y3QgY29udmVydF9vcCAqb3AsIHN0cnVjdCBuICoqbiwgdm9pZCAqZGF0YSkJXAorCXsJCQkJCQkJ CQkJXAorCQlvcC0+Y29udmVydF9wdHIoZSwgbiwgc2l6ZW9mICoqbiwgdHJhdmVyc2VfIyNuLCBk YXRhKTsJCQlcCisJfSAJCQkJCQkJCQkJXAorCisKKyNkZWZpbmUgREVDTEFSRV9MSVNUX0NPTlZF UlRPUihlLCBuKQkJCQkJCQlcCisJc3RhdGljIGlubGluZSB2b2lkIGNvbnZlcnRfIyNuIyNfbGlz dChzdHJ1Y3QgY29udmVydF9vcCAqb3AsIHN0cnVjdCBuIyNfbGlzdCAqKm4sIHZvaWQgKmRhdGEp XAorCXsJCQkJCQkJCQkJXAorCQlvcC0+Y29udmVydF9saXN0KGUsIG4sIHNpemVvZiAqKCpuKS0+ bGlzdFswXSwgdHJhdmVyc2VfIyNuLCBkYXRhKTsJXAorCX0gCQkJCQkJCQkJCVwKKworI2RlZmlu ZSBERUNMQVJFX0NPTlZFUlRPUihlLG4pCURFQ0xBUkVfUFRSX0NPTlZFUlRPUihlLCBuKSBERUNM QVJFX0xJU1RfQ09OVkVSVE9SKGUsIG4pIAorCitERUNMQVJFX0NPTlZFUlRPUihQVFJfU1lNQk9M LCBzeW1ib2wpOworREVDTEFSRV9DT05WRVJUT1IoUFRSX0VYUFIsIGV4cHJlc3Npb24pOworREVD TEFSRV9DT05WRVJUT1IoUFRSX0VOVFJZUE9JTlQsIGVudHJ5cG9pbnQpOworREVDTEFSRV9DT05W RVJUT1IoUFRSX1BTRVVETywgcHNldWRvKTsKK0RFQ0xBUkVfQ09OVkVSVE9SKFBUUl9CQVNJQ0JM T0NLLCBiYXNpY19ibG9jayk7CitERUNMQVJFX0NPTlZFUlRPUihQVFJfSU5TTiwgaW5zdHJ1Y3Rp b24pOworREVDTEFSRV9DT05WRVJUT1IoUFRSX01VTFRJSk1QLCBtdWx0aWptcCk7CitERUNMQVJF X0NPTlZFUlRPUihQVFJfQVNNX0NPTlNUUkFJTlQsIGFzbV9jb25zdHJhaW50KTsKK0RFQ0xBUkVf UFRSX0NPTlZFUlRPUihQVFJfQVNNX1JVTEVTLCBhc21fcnVsZXMpOworCisKSW5kZXg6IHNwYXJz ZS90ZXN0LXJlYWQuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09CkluZGV4OiBzcGFyc2UvbGluZWFyaXplLmMKPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQo= ------=_Part_66870_7724490.1220506479546--