Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1leupL-0006gt-3d for pgsql-hackers@arkaria.postgresql.org; Fri, 07 May 2021 07:23:12 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1leupI-0008Fv-Lc for pgsql-hackers@arkaria.postgresql.org; Fri, 07 May 2021 07:23:08 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1leupI-0008Fn-3H for pgsql-hackers@lists.postgresql.org; Fri, 07 May 2021 07:23:08 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1leupD-0002u6-OB for pgsql-hackers@lists.postgresql.org; Fri, 07 May 2021 07:23:07 +0000 Received: from ip-192-168-0-192.is74.loc (pool-77-222-104-44.is74.ru [77.222.104.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) by mail.postgrespro.ru (Postfix) with ESMTPSA id 2C67821C816D; Fri, 7 May 2021 10:23:01 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1620372181; bh=/iby/qqhiKDDD5a71L57SySLv+58prKONEzr8GhGvug=; h=Subject:To:Cc:References:From:Date:In-Reply-To; b=USJoWiK/3MwurO8yDWaX9oGD6cJQJaOqgorakA4on/yhY0gHQJ6w0vWZlXljzN3FB 335nsnHbfYJqrYnVfC3rD5jjuY3TunXBQy28AuDbZKQkzjHvHY7B6p1lKxc33QKDGC rB0C5aztb7a61ofzpp6I/oHW/InTlCGzIamWrIV8= Subject: Re: Removing unneeded self joins To: Hywel Carver Cc: Konstantin Knizhnik , Heikki Linnakangas , David Rowley , Masahiko Sawada , pgsql-hackers@lists.postgresql.org References: <64486b0b-0404-e39e-322d-0801154901f3@postgrespro.ru> <21e15759-dba5-2d2b-dd03-06943ad40378@postgrespro.ru> <161553990603.28624.7702383984090736980.pgcf@coridan.postgresql.org> From: Andrey Lepikhov Organization: Postgres Professional Message-ID: Date: Fri, 7 May 2021 12:23:00 +0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.10.1 MIME-Version: 1.0 In-Reply-To: <161553990603.28624.7702383984090736980.pgcf@coridan.postgresql.org> Content-Type: multipart/mixed; boundary="------------217AA9CF7DA08EB0E90EEF5F" Content-Language: en-US List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------217AA9CF7DA08EB0E90EEF5F Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit On 12/3/21 14:05, Hywel Carver wrote: > I've built and tested this, and it seems to function correctly to me. One question I have is whether the added "IS NOT NULL" filters can be omitted when they're unnecessary. Some of the resulting plans included an "IS NOT NULL" filter on a non-nullable column. To be clear, this is still an improvement (to me) without that. New version of the feature. Deeply refactored with main goal - to reduce the code size) and rebased on current master. Here I didn't work on 'unnecessary IS NOT NULL filter'. -- regards, Andrey Lepikhov Postgres Professional --------------217AA9CF7DA08EB0E90EEF5F Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="v26-0001-Remove-self-joins.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="v26-0001-Remove-self-joins.patch" RnJvbSBlZWUwYzVmMGRlMzVkOGNiODNlNmM0Y2E3NzQ5MDIwYWNiMThhNGQxIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmV5IFYuIExlcGlraG92IiA8YS5sZXBpa2hv dkBwb3N0Z3Jlc3Byby5ydT4KRGF0ZTogV2VkLCAyOCBBcHIgMjAyMSAxODoyNzo1MyArMDUw MApTdWJqZWN0OiBbUEFUQ0hdIFJlbW92ZSBzZWxmLWpvaW5zLgoKUmVtb3ZlIGlubmVyIGpv aW5zIG9mIGEgcmVsYXRpb24gdG8gaXRzZWxmIGlmIGNhbiBiZSBwcm92ZW4gdGhhdCBzdWNo CmpvaW4gY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBzY2FuLiBXZSBjYW4gYnVpbGQgdGhlIHJl cXVpcmVkIHByb29mcyBvZgp1bmlxdWVuZXNzIHVzaW5nIHRoZSBleGlzdGluZyBpbm5lcnJl bF9pc191bmlxdWUgbWFjaGluZXJ5LgoKV2UgY2FuIHJlbW92ZSBhIHNlbGYtam9pbiB3aGVu IGZvciBlYWNoIG91dGVyIHJvdywgaWY6CjEuIEF0IG1vc3Qgb25lIGlubmVyIHJvdyBtYXRj aGVzIHRoZSBqb2luIGNsYXVzZXMuCjIuIElmIHRoZSBqb2luIHRhcmdldCBsaXN0IGNvbnRh aW5zIGFueSBpbm5lciB2YXJzIHRoZW4gdGhlIGlubmVyIHJvdwppcyAocGh5c2ljYWxseSkg c2FtZSByb3cgYXMgdGhlIG91dGVyIG9uZS4KCkluIHRoaXMgcGF0Y2ggd2UgdXNlIFJvd2xl eSdzIFsxXSBhcHByb2FjaCB0byBpZGVudGlmeSBhIHNlbGYtam9pbjoKMS4gQ29sbGVjdCBh bGwgbWVyZ2Vqb2luYWJsZSBqb2luIHF1YWxzIGxvb2tzIGxpa2UgYS54ID0gYi54CjIuIENv bGxlY3QgYWxsIGFub3RoZXIgam9pbiBxdWFscy4KMy4gQ2hlY2sgaW5uZXJyZWxfaXNfdW5p cXVlKCkgZm9yIHRoZSBxdWFsIGxpc3QgZnJvbSAoMSkuIElmIGl0CnJldHVybnMgdHJ1ZSwg dGhlbiBvdXRlciByb3cgbWF0Y2hlcyBvbmx5IHRoZSBzYW1lIHJvdyBmcm9tIHRoZSBpbm5l cgpyZWxhdGlvbi4gUHJvdmVkLCB0aGF0IHRoaXMgam9pbiBpcyBzZWxmLWpvaW4gYW5kIGNh biBiZSByZXBsYWNlZCBieQphIHNjYW4uCgpTb21lIHJlZ3Jlc3Npb24gdGVzdHMgY2hhbmdl ZCBkdWUgdG8gc2VsZi1qb2luIHJlbW92YWwgbG9naWMuCgpbMV0gaHR0cHM6Ly93d3cucG9z dGdyZXNxbC5vcmcvbWVzc2FnZS1pZC9yYXcvQ0FBcEhEdnBnZ25GTUM0eVAtalVPN1BLTiUz RGZYZUVyVzViT3hpc3ZKMEh2a0hRRVklM0RXdyU0MG1haWwuZ21haWwuY29tCi0tLQogc3Jj L2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vYW5hbHl6ZWpvaW5zLmMgfCA5NDIgKysrKysrKysr KysrKysrKysrKysrLQogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vcGxhbm1haW4uYyAg ICAgfCAgIDUgKwogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvam9pbmluZm8uYyAgICAg fCAgIDMgKwogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcmVsbm9kZS5jICAgICAgfCAg MjYgKy0KIHNyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjLmMgICAgICAgICAgICAgIHwgIDEw ICsKIHNyYy9pbmNsdWRlL29wdGltaXplci9wYXRobm9kZS5oICAgICAgICAgIHwgICA0ICsK IHNyYy9pbmNsdWRlL29wdGltaXplci9wbGFubWFpbi5oICAgICAgICAgIHwgICAyICsKIHNy Yy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZXF1aXZjbGFzcy5vdXQgIHwgIDMyICsKIHNyYy90 ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQgICAgICAgIHwgMzMxICsrKysrKysrCiBz cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91dCAgICB8ICAgMyArLQogc3Jj L3Rlc3QvcmVncmVzcy9zcWwvZXF1aXZjbGFzcy5zcWwgICAgICAgfCAgMTYgKwogc3JjL3Rl c3QvcmVncmVzcy9zcWwvam9pbi5zcWwgICAgICAgICAgICAgfCAxNjYgKysrKwogMTIgZmls ZXMgY2hhbmdlZCwgMTUxMSBpbnNlcnRpb25zKCspLCAyOSBkZWxldGlvbnMoLSkKCmRpZmYg LS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9hbmFseXplam9pbnMuYyBiL3Ny Yy9iYWNrZW5kL29wdGltaXplci9wbGFuL2FuYWx5emVqb2lucy5jCmluZGV4IDM3ZWI2NGJj ZWYuLmRkNWM0ZDJiZDMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFu L2FuYWx5emVqb2lucy5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2FuYWx5 emVqb2lucy5jCkBAIC0yMiw2ICsyMiw3IEBACiAgKi8KICNpbmNsdWRlICJwb3N0Z3Jlcy5o IgogCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19jbGFzcy5oIgogI2luY2x1ZGUgIm5vZGVzL25v ZGVGdW5jcy5oIgogI2luY2x1ZGUgIm9wdGltaXplci9jbGF1c2VzLmgiCiAjaW5jbHVkZSAi b3B0aW1pemVyL2pvaW5pbmZvLmgiCkBAIC0zMiwxMCArMzMsMTIgQEAKICNpbmNsdWRlICJv cHRpbWl6ZXIvdGxpc3QuaCIKICNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKIAorYm9v bCBlbmFibGVfc2VsZl9qb2luX3JlbW92YWw7CisKIC8qIGxvY2FsIGZ1bmN0aW9ucyAqLwog c3RhdGljIGJvb2wgam9pbl9pc19yZW1vdmFibGUoUGxhbm5lckluZm8gKnJvb3QsIFNwZWNp YWxKb2luSW5mbyAqc2ppbmZvKTsKIHN0YXRpYyB2b2lkIHJlbW92ZV9yZWxfZnJvbV9xdWVy eShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLAotCQkJCQkJCQkgIFJlbGlkcyBqb2lu cmVsaWRzKTsKKwkJCQkJCQkJICBSZWxpZHMgam9pbnJlbGlkcywgaW50IHN1YnN0X3JlbGlk KTsKIHN0YXRpYyBMaXN0ICpyZW1vdmVfcmVsX2Zyb21fam9pbmxpc3QoTGlzdCAqam9pbmxp c3QsIGludCByZWxpZCwgaW50ICpucmVtb3ZlZCk7CiBzdGF0aWMgYm9vbCByZWxfc3VwcG9y dHNfZGlzdGluY3RuZXNzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwpOwog c3RhdGljIGJvb2wgcmVsX2lzX2Rpc3RpbmN0X2ZvcihQbGFubmVySW5mbyAqcm9vdCwgUmVs T3B0SW5mbyAqcmVsLApAQCAtNDcsNiArNTAsOSBAQCBzdGF0aWMgYm9vbCBpc19pbm5lcnJl bF91bmlxdWVfZm9yKFBsYW5uZXJJbmZvICpyb290LAogCQkJCQkJCQkgICBSZWxPcHRJbmZv ICppbm5lcnJlbCwKIAkJCQkJCQkJICAgSm9pblR5cGUgam9pbnR5cGUsCiAJCQkJCQkJCSAg IExpc3QgKnJlc3RyaWN0bGlzdCk7CitzdGF0aWMgdm9pZCBjaGFuZ2VfcmluZm8oUmVzdHJp Y3RJbmZvKiByaW5mbywgSW5kZXggZnJvbSwgSW5kZXggdG8pOworc3RhdGljIEJpdG1hcHNl dCogY2hhbmdlX3JlbGlkKFJlbGlkcyByZWxpZHMsIEluZGV4IG9sZElkLCBJbmRleCBuZXdJ ZCk7CitzdGF0aWMgdm9pZCBjaGFuZ2VfdmFybm8oRXhwciAqZXhwciwgSW5kZXggb2xkUmVs aWQsIEluZGV4IG5ld1JlbGlkKTsKIAogCiAvKgpAQCAtODYsNyArOTIsNyBAQCByZXN0YXJ0 OgogCiAJCXJlbW92ZV9yZWxfZnJvbV9xdWVyeShyb290LCBpbm5lcnJlbGlkLAogCQkJCQkJ CSAgYm1zX3VuaW9uKHNqaW5mby0+bWluX2xlZnRoYW5kLAotCQkJCQkJCQkJCXNqaW5mby0+ bWluX3JpZ2h0aGFuZCkpOworCQkJCQkJCQkJCXNqaW5mby0+bWluX3JpZ2h0aGFuZCksIDAp OwogCiAJCS8qIFdlIHZlcmlmeSB0aGF0IGV4YWN0bHkgb25lIHJlZmVyZW5jZSBnZXRzIHJl bW92ZWQgZnJvbSBqb2lubGlzdCAqLwogCQlucmVtb3ZlZCA9IDA7CkBAIC0zMDAsNyArMzA2 LDEwIEBAIGpvaW5faXNfcmVtb3ZhYmxlKFBsYW5uZXJJbmZvICpyb290LCBTcGVjaWFsSm9p bkluZm8gKnNqaW5mbykKIAogLyoKICAqIFJlbW92ZSB0aGUgdGFyZ2V0IHJlbGlkIGZyb20g dGhlIHBsYW5uZXIncyBkYXRhIHN0cnVjdHVyZXMsIGhhdmluZwotICogZGV0ZXJtaW5lZCB0 aGF0IHRoZXJlIGlzIG5vIG5lZWQgdG8gaW5jbHVkZSBpdCBpbiB0aGUgcXVlcnkuCisgKiBk ZXRlcm1pbmVkIHRoYXQgdGhlcmUgaXMgbm8gbmVlZCB0byBpbmNsdWRlIGl0IGluIHRoZSBx dWVyeS4gT3IgcmVwbGFjZQorICogd2l0aCBhbm90aGVyIHJlbGlkLgorICogVG8gcmV1c2Fi aWxpdHksIHRoaXMgcm91dGluZSBjYW4gd29yayBpbiB0d28gbW9kZXM6IGRlbGV0ZSByZWxp ZCBmcm9tIGEgcGxhbgorICogb3IgcmVwbGFjZSBpdC4gSXQgaXMgdXNlZCBpbiByZXBsYWNl IG1vZGUgaW4gYSBzZWxmLWpvaW4gcmVtb3ZpbmcgcHJvY2Vzcy4KICAqCiAgKiBXZSBhcmUg bm90IHRlcnJpYmx5IHRob3JvdWdoIGhlcmUuICBXZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRo ZSByZWwgaXMKICAqIG5vIGxvbmdlciB0cmVhdGVkIGFzIGEgYmFzZXJlbCwgYW5kIHRoYXQg YXR0cmlidXRlcyBvZiBvdGhlciBiYXNlcmVscwpAQCAtMzA5LDEzICszMTgsMTYgQEAgam9p bl9pc19yZW1vdmFibGUoUGxhbm5lckluZm8gKnJvb3QsIFNwZWNpYWxKb2luSW5mbyAqc2pp bmZvKQogICogbGlzdHMsIGJ1dCBvbmx5IGlmIHRoZXkgYmVsb25nIHRvIHRoZSBvdXRlciBq b2luIGlkZW50aWZpZWQgYnkgam9pbnJlbGlkcy4KICAqLwogc3RhdGljIHZvaWQKLXJlbW92 ZV9yZWxfZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLCBSZWxpZHMg am9pbnJlbGlkcykKK3JlbW92ZV9yZWxfZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwg aW50IHJlbGlkLCBSZWxpZHMgam9pbnJlbGlkcywKKwkJCQkJICBpbnQgc3Vic3RfcmVsaWQp CiB7CiAJUmVsT3B0SW5mbyAqcmVsID0gZmluZF9iYXNlX3JlbChyb290LCByZWxpZCk7CiAJ TGlzdAkgICAqam9pbmluZm9zOwogCUluZGV4CQlydGk7CiAJTGlzdENlbGwgICAqbDsKIAor CUFzc2VydChzdWJzdF9yZWxpZCA9PSAwIHx8IHJlbGlkICE9IHN1YnN0X3JlbGlkKTsKKwog CS8qCiAJICogTWFyayB0aGUgcmVsIGFzICJkZWFkIiB0byBzaG93IGl0IGlzIG5vIGxvbmdl ciBwYXJ0IG9mIHRoZSBqb2luIHRyZWUuCiAJICogKFJlbW92aW5nIGl0IGZyb20gdGhlIGJh c2VyZWwgYXJyYXkgYWx0b2dldGhlciBzZWVtcyB0b28gcmlza3kuKQpAQCAtMzQ1LDggKzM1 NywxMSBAQCByZW1vdmVfcmVsX2Zyb21fcXVlcnkoUGxhbm5lckluZm8gKnJvb3QsIGludCBy ZWxpZCwgUmVsaWRzIGpvaW5yZWxpZHMpCiAJCQkgYXR0cm9mZi0tKQogCQl7CiAJCQlvdGhl cnJlbC0+YXR0cl9uZWVkZWRbYXR0cm9mZl0gPQotCQkJCWJtc19kZWxfbWVtYmVyKG90aGVy cmVsLT5hdHRyX25lZWRlZFthdHRyb2ZmXSwgcmVsaWQpOworCQkJCWNoYW5nZV9yZWxpZChv dGhlcnJlbC0+YXR0cl9uZWVkZWRbYXR0cm9mZl0sIHJlbGlkLCBzdWJzdF9yZWxpZCk7CiAJ CX0KKworCQkvKiBVcGRhdGUgbGF0ZXJhbCByZWZlcmVuY2VzLiAqLworCQljaGFuZ2VfdmFy bm8oKEV4cHIqKW90aGVycmVsLT5sYXRlcmFsX3ZhcnMsIHJlbGlkLCBzdWJzdF9yZWxpZCk7 CiAJfQogCiAJLyoKQEAgLTM2MSwxMCArMzc2LDEyIEBAIHJlbW92ZV9yZWxfZnJvbV9xdWVy eShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLCBSZWxpZHMgam9pbnJlbGlkcykKIAl7 CiAJCVNwZWNpYWxKb2luSW5mbyAqc2ppbmZvID0gKFNwZWNpYWxKb2luSW5mbyAqKSBsZmly c3QobCk7CiAKLQkJc2ppbmZvLT5taW5fbGVmdGhhbmQgPSBibXNfZGVsX21lbWJlcihzamlu Zm8tPm1pbl9sZWZ0aGFuZCwgcmVsaWQpOwotCQlzamluZm8tPm1pbl9yaWdodGhhbmQgPSBi bXNfZGVsX21lbWJlcihzamluZm8tPm1pbl9yaWdodGhhbmQsIHJlbGlkKTsKLQkJc2ppbmZv LT5zeW5fbGVmdGhhbmQgPSBibXNfZGVsX21lbWJlcihzamluZm8tPnN5bl9sZWZ0aGFuZCwg cmVsaWQpOwotCQlzamluZm8tPnN5bl9yaWdodGhhbmQgPSBibXNfZGVsX21lbWJlcihzamlu Zm8tPnN5bl9yaWdodGhhbmQsIHJlbGlkKTsKKwkJc2ppbmZvLT5taW5fbGVmdGhhbmQgPSBj aGFuZ2VfcmVsaWQoc2ppbmZvLT5taW5fbGVmdGhhbmQsIHJlbGlkLCBzdWJzdF9yZWxpZCk7 CisJCXNqaW5mby0+bWluX3JpZ2h0aGFuZCA9IGNoYW5nZV9yZWxpZChzamluZm8tPm1pbl9y aWdodGhhbmQsIHJlbGlkLCBzdWJzdF9yZWxpZCk7CisJCXNqaW5mby0+c3luX2xlZnRoYW5k ID0gY2hhbmdlX3JlbGlkKHNqaW5mby0+c3luX2xlZnRoYW5kLCByZWxpZCwgc3Vic3RfcmVs aWQpOworCQlzamluZm8tPnN5bl9yaWdodGhhbmQgPSBjaGFuZ2VfcmVsaWQoc2ppbmZvLT5z eW5fcmlnaHRoYW5kLCByZWxpZCwgc3Vic3RfcmVsaWQpOworCisJCWNoYW5nZV92YXJubygo RXhwciopc2ppbmZvLT5zZW1pX3Joc19leHBycywgcmVsaWQsIHN1YnN0X3JlbGlkKTsKIAl9 CiAKIAkvKgpAQCAtMzg1LDE2ICs0MDIsMjkgQEAgcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KFBs YW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQsIFJlbGlkcyBqb2lucmVsaWRzKQogCXsKIAkJ UGxhY2VIb2xkZXJJbmZvICpwaGluZm8gPSAoUGxhY2VIb2xkZXJJbmZvICopIGxmaXJzdChs KTsKIAotCQlBc3NlcnQoIWJtc19pc19tZW1iZXIocmVsaWQsIHBoaW5mby0+cGhfbGF0ZXJh bCkpOwotCQlpZiAoYm1zX2lzX3N1YnNldChwaGluZm8tPnBoX25lZWRlZCwgam9pbnJlbGlk cykgJiYKKwkJaWYgKHN1YnN0X3JlbGlkID09IDAgJiYgYm1zX2lzX3N1YnNldChwaGluZm8t PnBoX25lZWRlZCwgam9pbnJlbGlkcykgJiYKIAkJCWJtc19pc19tZW1iZXIocmVsaWQsIHBo aW5mby0+cGhfZXZhbF9hdCkpCiAJCQlyb290LT5wbGFjZWhvbGRlcl9saXN0ID0gZm9yZWFj aF9kZWxldGVfY3VycmVudChyb290LT5wbGFjZWhvbGRlcl9saXN0LAogCQkJCQkJCQkJCQkJ CQkJbCk7CiAJCWVsc2UKIAkJewotCQkJcGhpbmZvLT5waF9ldmFsX2F0ID0gYm1zX2RlbF9t ZW1iZXIocGhpbmZvLT5waF9ldmFsX2F0LCByZWxpZCk7CisJCQlwaGluZm8tPnBoX2V2YWxf YXQgPSBjaGFuZ2VfcmVsaWQocGhpbmZvLT5waF9ldmFsX2F0LCByZWxpZCwgc3Vic3RfcmVs aWQpOwogCQkJQXNzZXJ0KCFibXNfaXNfZW1wdHkocGhpbmZvLT5waF9ldmFsX2F0KSk7Ci0J CQlwaGluZm8tPnBoX25lZWRlZCA9IGJtc19kZWxfbWVtYmVyKHBoaW5mby0+cGhfbmVlZGVk LCByZWxpZCk7CisJCQlwaGluZm8tPnBoX25lZWRlZCA9IGNoYW5nZV9yZWxpZChwaGluZm8t PnBoX25lZWRlZCwgcmVsaWQsIHN1YnN0X3JlbGlkKTsKKwkJCUFzc2VydChzdWJzdF9yZWxp ZCAhPSAwIHx8ICFibXNfaXNfbWVtYmVyKHJlbGlkLCBwaGluZm8tPnBoX2xhdGVyYWwpKTsK KwkJCXBoaW5mby0+cGhfbGF0ZXJhbCA9IGNoYW5nZV9yZWxpZChwaGluZm8tPnBoX2xhdGVy YWwsIHJlbGlkLCBzdWJzdF9yZWxpZCk7CisJCQlwaGluZm8tPnBoX3Zhci0+cGhyZWxzID0g Y2hhbmdlX3JlbGlkKHBoaW5mby0+cGhfdmFyLT5waHJlbHMsIHJlbGlkLCBzdWJzdF9yZWxp ZCk7CisJCX0KKwl9CisKKwlpZiAoc3Vic3RfcmVsaWQgIT0gMCkKKwl7CisJCWZvcmVhY2go bCwgcmVsLT5iYXNlcmVzdHJpY3RpbmZvKQorCQl7CisJCQlSZXN0cmljdEluZm8gKnJpbmZv ID0gKFJlc3RyaWN0SW5mbyAqKSBsZmlyc3QobCk7CisKKwkJCWNoYW5nZV9yaW5mbyhyaW5m bywgcmVsaWQsIHN1YnN0X3JlbGlkKTsKKwkJCWRpc3RyaWJ1dGVfcmVzdHJpY3RpbmZvX3Rv X3JlbHMocm9vdCwgcmluZm8pOwogCQl9CiAJfQogCkBAIC00MTgsNiArNDQ4LDcgQEAgcmVt b3ZlX3JlbF9mcm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQsIFJlbGlk cyBqb2lucmVsaWRzKQogCQlSZXN0cmljdEluZm8gKnJpbmZvID0gKFJlc3RyaWN0SW5mbyAq KSBsZmlyc3QobCk7CiAKIAkJcmVtb3ZlX2pvaW5fY2xhdXNlX2Zyb21fcmVscyhyb290LCBy aW5mbywgcmluZm8tPnJlcXVpcmVkX3JlbGlkcyk7CisJCWNoYW5nZV9yaW5mbyhyaW5mbywg cmVsaWQsIHN1YnN0X3JlbGlkKTsKIAogCQlpZiAoUklORk9fSVNfUFVTSEVEX0RPV04ocmlu Zm8sIGpvaW5yZWxpZHMpKQogCQl7CkBAIC00MzMsNiArNDY0LDggQEAgcmVtb3ZlX3JlbF9m cm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQsIFJlbGlkcyBqb2lucmVs aWRzKQogCQkJCQkJCQkJCQkJCXJlbGlkKTsKIAkJCWRpc3RyaWJ1dGVfcmVzdHJpY3RpbmZv X3RvX3JlbHMocm9vdCwgcmluZm8pOwogCQl9CisJCWVsc2UgaWYgKHN1YnN0X3JlbGlkICE9 IDApCisJCQlkaXN0cmlidXRlX3Jlc3RyaWN0aW5mb190b19yZWxzKHJvb3QsIHJpbmZvKTsK IAl9CiAKIAkvKgpAQCAtMTExOCwzICsxMTUxLDg4NiBAQCBpc19pbm5lcnJlbF91bmlxdWVf Zm9yKFBsYW5uZXJJbmZvICpyb290LAogCS8qIExldCByZWxfaXNfZGlzdGluY3RfZm9yKCkg ZG8gdGhlIGhhcmQgd29yayAqLwogCXJldHVybiByZWxfaXNfZGlzdGluY3RfZm9yKHJvb3Qs IGlubmVycmVsLCBjbGF1c2VfbGlzdCk7CiB9CisKK3R5cGVkZWYgc3RydWN0IENoYW5nZVZh cm5vQ29udGV4dAoreworCUluZGV4IG9sZFJlbGlkOworCUluZGV4IG5ld1JlbGlkOworfSBD aGFuZ2VWYXJub0NvbnRleHQ7CisKKworc3RhdGljIGJvb2wKK2NoYW5nZV92YXJub193YWxr ZXIoTm9kZSAqbm9kZSwgQ2hhbmdlVmFybm9Db250ZXh0ICpjb250ZXh0KQoreworCWlmIChu b2RlID09IE5VTEwpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChJc0Eobm9kZSwgVmFyKSkK Kwl7CisJCVZhciogdmFyID0gKFZhciopbm9kZTsKKwkJaWYgKHZhci0+dmFybm8gPT0gY29u dGV4dC0+b2xkUmVsaWQpCisJCXsKKwkJCXZhci0+dmFybm8gPSBjb250ZXh0LT5uZXdSZWxp ZDsKKwkJCXZhci0+dmFybm9zeW4gPSBjb250ZXh0LT5uZXdSZWxpZDsKKwkJCXZhci0+bG9j YXRpb24gPSAtMTsKKwkJfQorCQllbHNlIGlmICh2YXItPnZhcm5vID09IGNvbnRleHQtPm5l d1JlbGlkKQorCQkJdmFyLT5sb2NhdGlvbiA9IC0xOworCisJCXJldHVybiBmYWxzZTsKKwl9 CisJaWYgKElzQShub2RlLCBSZXN0cmljdEluZm8pKQorCXsKKwkJY2hhbmdlX3JpbmZvKChS ZXN0cmljdEluZm8qKW5vZGUsIGNvbnRleHQtPm9sZFJlbGlkLCBjb250ZXh0LT5uZXdSZWxp ZCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIGV4cHJlc3Npb25fdHJlZV93YWxr ZXIobm9kZSwgY2hhbmdlX3Zhcm5vX3dhbGtlciwgY29udGV4dCk7Cit9CisKKy8qCisgKiBG b3IgYWxsIFZhcnMgaW4gdGhlIGV4cHJlc3Npb24gdGhhdCBoYXZlIHZhcm5vID0gb2xkUmVs aWQsIHNldAorICogdmFybm8gPSBuZXdSZWxpZC4KKyAqLworc3RhdGljIHZvaWQKK2NoYW5n ZV92YXJubyhFeHByICpleHByLCBJbmRleCBvbGRSZWxpZCwgSW5kZXggbmV3UmVsaWQpCit7 CisJQ2hhbmdlVmFybm9Db250ZXh0IGNvbnRleHQ7CisKKwlpZiAobmV3UmVsaWQgPT0gMCkK KwkJcmV0dXJuOworCisJY29udGV4dC5vbGRSZWxpZCA9IG9sZFJlbGlkOworCWNvbnRleHQu bmV3UmVsaWQgPSBuZXdSZWxpZDsKKwljaGFuZ2VfdmFybm9fd2Fsa2VyKChOb2RlICopIGV4 cHIsICZjb250ZXh0KTsKK30KKworLyoKKyAqIFN1YnN0aXR1dGUgbmV3SWQgZm9yIG9sZElk IGluIHJlbGlkcy4KKyAqLworc3RhdGljIEJpdG1hcHNldCoKK2NoYW5nZV9yZWxpZChSZWxp ZHMgcmVsaWRzLCBJbmRleCBvbGRJZCwgSW5kZXggbmV3SWQpCit7CisJaWYgKG5ld0lkID09 IDApCisJCS8qIERlbGV0ZSByZWxpZCB3aXRob3V0IHN1YnN0aXR1dGlvbi4gKi8KKwkJcmV0 dXJuIGJtc19kZWxfbWVtYmVyKHJlbGlkcywgb2xkSWQpOworCisJaWYgKGJtc19pc19tZW1i ZXIob2xkSWQsIHJlbGlkcykpCisJCXJldHVybiBibXNfYWRkX21lbWJlcihibXNfZGVsX21l bWJlcihibXNfY29weShyZWxpZHMpLCBvbGRJZCksIG5ld0lkKTsKKworCXJldHVybiByZWxp ZHM7Cit9CisKK3N0YXRpYyB2b2lkCitjaGFuZ2VfcmluZm8oUmVzdHJpY3RJbmZvKiByaW5m bywgSW5kZXggZnJvbSwgSW5kZXggdG8pCit7CisJaWYgKHRvID09IDApCisJCXJldHVybjsK KworCWJvb2wgaXNfcmVxX2VxdWFsID0KKwkJKHJpbmZvLT5yZXF1aXJlZF9yZWxpZHMgPT0g cmluZm8tPmNsYXVzZV9yZWxpZHMpID8gdHJ1ZSA6IGZhbHNlOworCisJY2hhbmdlX3Zhcm5v KHJpbmZvLT5jbGF1c2UsIGZyb20sIHRvKTsKKwljaGFuZ2VfdmFybm8ocmluZm8tPm9yY2xh dXNlLCBmcm9tLCB0byk7CisJcmluZm8tPmNsYXVzZV9yZWxpZHMgPSBjaGFuZ2VfcmVsaWQo cmluZm8tPmNsYXVzZV9yZWxpZHMsIGZyb20sIHRvKTsKKwlpZiAoaXNfcmVxX2VxdWFsKQor CQlyaW5mby0+cmVxdWlyZWRfcmVsaWRzID0gcmluZm8tPmNsYXVzZV9yZWxpZHM7CisJZWxz ZQorCQlyaW5mby0+cmVxdWlyZWRfcmVsaWRzID0gY2hhbmdlX3JlbGlkKHJpbmZvLT5yZXF1 aXJlZF9yZWxpZHMsIGZyb20sIHRvKTsKKwlyaW5mby0+bGVmdF9yZWxpZHMgPSBjaGFuZ2Vf cmVsaWQocmluZm8tPmxlZnRfcmVsaWRzLCBmcm9tLCB0byk7CisJcmluZm8tPnJpZ2h0X3Jl bGlkcyA9IGNoYW5nZV9yZWxpZChyaW5mby0+cmlnaHRfcmVsaWRzLCBmcm9tLCB0byk7CisJ cmluZm8tPm91dGVyX3JlbGlkcyA9IGNoYW5nZV9yZWxpZChyaW5mby0+b3V0ZXJfcmVsaWRz LCBmcm9tLCB0byk7CisJcmluZm8tPm51bGxhYmxlX3JlbGlkcyA9IGNoYW5nZV9yZWxpZChy aW5mby0+bnVsbGFibGVfcmVsaWRzLCBmcm9tLCB0byk7Cit9CisKKy8qCisgKiBVcGRhdGUg RUMgbWVtYmVycyB0byBwb2ludCB0byB0aGUgcmVtYWluaW5nIHJlbGF0aW9uIGluc3RlYWQg b2YgdGhlIHJlbW92ZWQKKyAqIG9uZSwgcmVtb3ZpbmcgZHVwbGljYXRlcy4KKyAqLworc3Rh dGljIHZvaWQKK3VwZGF0ZV9lY19tZW1iZXJzKEVxdWl2YWxlbmNlQ2xhc3MgKmVjLCBJbmRl eCB0b1JlbW92ZSwgSW5kZXggdG9LZWVwKQoreworCWludAkJCWNvdW50ZXI7CisKKwlmb3Ig KGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgbGlzdF9sZW5ndGgoZWMtPmVjX21lbWJlcnMpOyAp CisJeworCQlMaXN0Q2VsbAkJCSpjZWxsID0gbGlzdF9udGhfY2VsbChlYy0+ZWNfbWVtYmVy cywgY291bnRlcik7CisJCUVxdWl2YWxlbmNlTWVtYmVyCSplbSA9IGxmaXJzdChjZWxsKTsK KwkJaW50CQkJCQljb3VudGVyMTsKKworCQlpZiAoIWJtc19pc19tZW1iZXIodG9SZW1vdmUs IGVtLT5lbV9yZWxpZHMpKQorCQl7CisJCQljb3VudGVyKys7CisJCQljb250aW51ZTsKKwkJ fQorCisJCWVtLT5lbV9yZWxpZHMgPSBjaGFuZ2VfcmVsaWQoZW0tPmVtX3JlbGlkcywgdG9S ZW1vdmUsIHRvS2VlcCk7CisJCS8qIFdlIG9ubHkgcHJvY2VzcyBpbm5lciBqb2lucyAqLwor CQljaGFuZ2VfdmFybm8oZW0tPmVtX2V4cHIsIHRvUmVtb3ZlLCB0b0tlZXApOworCisJCS8q CisJCSAqIEFmdGVyIHdlIHN3aXRjaGVkIHRoZSBlcXVpdmFsZW5jZSBtZW1iZXIgdG8gdGhl IHJlbWFpbmluZyByZWxhdGlvbiwKKwkJICogY2hlY2sgdGhhdCBpdCBpcyBub3QgdGhlIHNh bWUgYXMgdGhlIGV4aXN0aW5nIG1lbWJlciwgYW5kIGlmIGl0CisJCSAqIGlzLCBkZWxldGUg aXQuCisJCSAqLworCQlmb3IgKGNvdW50ZXIxID0gMDsgY291bnRlcjEgPCBsaXN0X2xlbmd0 aChlYy0+ZWNfbWVtYmVycyk7IGNvdW50ZXIxKyspCisJCXsKKwkJCUVxdWl2YWxlbmNlTWVt YmVyCSpvdGhlcjsKKworCQkJaWYgKGNvdW50ZXIxID09IGNvdW50ZXIpCisJCQkJY29udGlu dWU7CisKKwkJCW90aGVyID0gY2FzdE5vZGUoRXF1aXZhbGVuY2VNZW1iZXIsIGxpc3RfbnRo KGVjLT5lY19tZW1iZXJzLCBjb3VudGVyMSkpOworCisJCQlpZiAoZXF1YWwob3RoZXItPmVt X2V4cHIsIGVtLT5lbV9leHByKSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChjb3VudGVy MSA8IGxpc3RfbGVuZ3RoKGVjLT5lY19tZW1iZXJzKSkKKwkJCWVjLT5lY19tZW1iZXJzID0g bGlzdF9kZWxldGVfY2VsbChlYy0+ZWNfbWVtYmVycywgY2VsbCk7CisJCWVsc2UKKwkJCWNv dW50ZXIrKzsKKwl9Cit9CisKKy8qCisgKiBVcGRhdGUgRUMgc291cmNlcyB0byBwb2ludCB0 byB0aGUgcmVtYWluaW5nIHJlbGF0aW9uIGluc3RlYWQgb2YgdGhlCisgKiByZW1vdmVkIG9u ZS4KKyAqLworc3RhdGljIHZvaWQKK3VwZGF0ZV9lY19zb3VyY2VzKExpc3QgKipzb3VyY2Vz LCBJbmRleCB0b1JlbW92ZSwgSW5kZXggdG9LZWVwKQoreworCWludAkJCWNvdW50ZXI7CisJ aW50IGNjPTA7CisKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgbGlzdF9sZW5ndGgo KnNvdXJjZXMpOyApCisJeworCQlMaXN0Q2VsbAkJKmNlbGwgPSBsaXN0X250aF9jZWxsKCpz b3VyY2VzLCBjb3VudGVyKTsKKwkJUmVzdHJpY3RJbmZvCSpyaW5mbyA9IGNhc3ROb2RlKFJl c3RyaWN0SW5mbywgbGZpcnN0KGNlbGwpKTsKKwkJaW50CQkJCWNvdW50ZXIxOworCisJCWlm ICghYm1zX2lzX21lbWJlcih0b1JlbW92ZSwgcmluZm8tPnJlcXVpcmVkX3JlbGlkcykpCisJ CXsKKwkJCWNvdW50ZXIrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJY2hhbmdlX3Zhcm5v KHJpbmZvLT5jbGF1c2UsIHRvUmVtb3ZlLCB0b0tlZXApOworCisJCS8qCisJCSAqIEFmdGVy IHN3aXRjaGluZyB0aGUgY2xhdXNlIHRvIHRoZSByZW1haW5pbmcgcmVsYXRpb24sIGNoZWNr IGl0IGZvcgorCQkgKiByZWR1bmRhbmN5IHdpdGggZXhpc3Rpbmcgb25lcy4gV2UgZG9uJ3Qg aGF2ZSB0byBjaGVjayBmb3IKKwkJICogcmVkdW5kYW5jeSB3aXRoIGRlcml2ZWQgY2xhdXNl cywgYmVjYXVzZSB3ZSd2ZSBqdXN0IGRlbGV0ZWQgdGhlbS4KKwkJICovCisJCWZvciAoY291 bnRlcjEgPSAwOyBjb3VudGVyMSA8IGxpc3RfbGVuZ3RoKCpzb3VyY2VzKTsgY291bnRlcjEr KykKKwkJeworCQkJUmVzdHJpY3RJbmZvICpvdGhlcjsKKworCQkJaWYgKGNvdW50ZXIxID09 IGNvdW50ZXIpCisJCQkJY29udGludWU7CisKKwkJCW90aGVyID0gY2FzdE5vZGUoUmVzdHJp Y3RJbmZvLCBsaXN0X250aCgqc291cmNlcywgY291bnRlcjEpKTsKKwkJCWlmIChlcXVhbChy aW5mby0+Y2xhdXNlLCBvdGhlci0+Y2xhdXNlKSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlm IChjb3VudGVyMSA8IGxpc3RfbGVuZ3RoKCpzb3VyY2VzKSkKKwkJeworCQkJKnNvdXJjZXMg PSBsaXN0X2RlbGV0ZV9jZWxsKCpzb3VyY2VzLCBjZWxsKTsKKwkJCWNjKys7CisJCX0KKwkJ ZWxzZQorCQl7CisJCQljb3VudGVyKys7CisKKwkJCS8qIFdlIHdpbGwga2VlcCB0aGlzIFJl c3RyaWN0SW5mbywgY29ycmVjdCBpdHMgcmVsaWRzLiAqLworCQkJY2hhbmdlX3JpbmZvKHJp bmZvLCB0b1JlbW92ZSwgdG9LZWVwKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFJlbW92ZSBh IHJlbGF0aW9uIGFmdGVyIHdlIGhhdmUgcHJvdmVuIHRoYXQgaXQgcGFydGljaXBhdGVzIG9u bHkgaW4gYW4KKyAqIHVubmVlZGVkIHVuaXF1ZSBzZWxmIGpvaW4uCisgKgorICogVGhlIGpv aW5jbGF1c2VzIGxpc3QgaXMgZGVzdHJ1Y3RpdmVseSBjaGFuZ2VkLgorICovCitzdGF0aWMg dm9pZAorcmVtb3ZlX3NlbGZfam9pbl9yZWwoUGxhbm5lckluZm8gKnJvb3QsIFBsYW5Sb3dN YXJrICprbWFyaywgUGxhblJvd01hcmsgKnJtYXJrLAorCQkJCQkgUmVsT3B0SW5mbyAqdG9L ZWVwLCBSZWxPcHRJbmZvICp0b1JlbW92ZSkKK3sKKwlMaXN0Q2VsbCAqY2VsbDsKKwlpbnQg aTsKKwlMaXN0ICp0YXJnZXQgPSBOSUw7CisKKwkvKgorCSAqIEluY2x1ZGUgYWxsIGVjbGFz cyBtZW50aW9ucyBvZiByZW1vdmVkIHJlbGF0aW9uIGludG8gdGhlIGVjbGFzcyBtZW50aW9u cworCSAqIG9mIGtlcHQgcmVsYXRpb24uCisJICovCisJdG9LZWVwLT5lY2xhc3NfaW5kZXhl cyA9IGJtc19hZGRfbWVtYmVycyh0b1JlbW92ZS0+ZWNsYXNzX2luZGV4ZXMsCisJCQkJCQkJ CQkJCQkJCXRvS2VlcC0+ZWNsYXNzX2luZGV4ZXMpOworCisJLyoKKwkgKiBOb3csIGJhc2Vy ZXN0cmljdGluZm8gcmVwbGVuaXNoZWQgd2l0aCByZXN0cmljdGlvbnMgZnJvbSByZW1vdmlu ZworCSAqIHJlbGF0aW9uLiBJdCBpcyBuZWVkZWQgdG8gcmVtb3ZlIGR1cGxpY2F0ZXMgYW5k IHJlcGxhY2UgZGVnZW5lcmF0ZWQKKwkgKiBjbGF1c2VzIHdpdGggYSBOdWxsVGVzdC4KKwkg Ki8KKwlmb3JlYWNoKGNlbGwsIHRvS2VlcC0+YmFzZXJlc3RyaWN0aW5mbykKKwl7CisJCVJl c3RyaWN0SW5mbyAqcmluZm8gPSBsZmlyc3Rfbm9kZShSZXN0cmljdEluZm8sIGNlbGwpOwor CQlMaXN0Q2VsbCAqb3RoZXJDZWxsOworCisJCUFzc2VydCghYm1zX2lzX21lbWJlcih0b1Jl bW92ZS0+cmVsaWQsIHJpbmZvLT5jbGF1c2VfcmVsaWRzKSk7CisKKwkJLyoKKwkJICogSWYg dGhpcyBjbGF1c2UgaXMgYSBtZXJnZWpvaW5hYmxlIGVxdWFsaXR5IGNsYXVzZSB0aGF0IGNv bXBhcmVzIGEKKwkJICogdmFyaWFibGUgdG8gaXRzZWxmLCBpLmUuLCBoYXMgdGhlIGZvcm0g b2YgIlg9WCIsIHJlcGxhY2UgaXQgd2l0aAorCQkgKiBudWxsIHRlc3QuCisJCSAqLworCQlp ZiAocmluZm8tPm1lcmdlb3BmYW1pbGllcyAmJiBJc0EocmluZm8tPmNsYXVzZSwgT3BFeHBy KSkKKwkJeworCQkJRXhwciAqbGVmdE9wOworCQkJRXhwciAqcmlnaHRPcDsKKworCQkJbGVm dE9wID0gKEV4cHIgKikgZ2V0X2xlZnRvcChyaW5mby0+Y2xhdXNlKTsKKwkJCXJpZ2h0T3Ag PSAoRXhwciAqKSBnZXRfcmlnaHRvcChyaW5mby0+Y2xhdXNlKTsKKworCQkJaWYgKGxlZnRP cCAhPSBOVUxMICYmIGVxdWFsKGxlZnRPcCwgcmlnaHRPcCkpCisJCQl7CisJCQkJTnVsbFRl c3QgKm51bGxUZXN0ID0gbWFrZU5vZGUoTnVsbFRlc3QpOworCQkJCW51bGxUZXN0LT5hcmcg PSBsZWZ0T3A7CisJCQkJbnVsbFRlc3QtPm51bGx0ZXN0dHlwZSA9IElTX05PVF9OVUxMOwor CQkJCW51bGxUZXN0LT5hcmdpc3JvdyA9IGZhbHNlOworCQkJCW51bGxUZXN0LT5sb2NhdGlv biA9IC0xOworCQkJCXJpbmZvLT5jbGF1c2UgPSAoRXhwciAqKSBudWxsVGVzdDsKKwkJCX0K KwkJfQorCisJCS8qIFNlYXJjaCBmb3IgZHVwbGljYXRlcy4gKi8KKwkJZm9yZWFjaChvdGhl ckNlbGwsIHRhcmdldCkKKwkJeworCQkJUmVzdHJpY3RJbmZvICpvdGhlciA9IGxmaXJzdF9u b2RlKFJlc3RyaWN0SW5mbywgb3RoZXJDZWxsKTsKKworCQkJaWYgKG90aGVyID09IHJpbmZv IHx8CisJCQkJKHJpbmZvLT5wYXJlbnRfZWMgIT0gTlVMTAorCQkJCSAmJiBvdGhlci0+cGFy ZW50X2VjID09IHJpbmZvLT5wYXJlbnRfZWMpCisJCQkJIHx8IGVxdWFsKHJpbmZvLT5jbGF1 c2UsIG90aGVyLT5jbGF1c2UpKQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJ aWYgKG90aGVyQ2VsbCAhPSBOVUxMKQorCQkJLyogRHVwbGljYXRlIGZvdW5kICovCisJCQlj b250aW51ZTsKKworCQl0YXJnZXQgPSBsYXBwZW5kKHRhcmdldCwgcmluZm8pOworCX0KKwor CWxpc3RfZnJlZSh0b0tlZXAtPmJhc2VyZXN0cmljdGluZm8pOworCXRvS2VlcC0+YmFzZXJl c3RyaWN0aW5mbyA9IHRhcmdldDsKKworCS8qCisJICogVXBkYXRlIHRoZSBlcXVpdmFsZW5j ZSBjbGFzc2VzIHRoYXQgcmVmZXJlbmNlIHRoZSByZW1vdmVkIHJlbGF0aW9ucy4KKwkgKi8K Kwlmb3JlYWNoKGNlbGwsIHJvb3QtPmVxX2NsYXNzZXMpCisJeworCQlFcXVpdmFsZW5jZUNs YXNzICplYyA9IGxmaXJzdChjZWxsKTsKKworCQlpZiAoIWJtc19pc19tZW1iZXIodG9SZW1v dmUtPnJlbGlkLCBlYy0+ZWNfcmVsaWRzKSkKKwkJeworCQkJLyoKKwkJCSAqIFRoaXMgRUMg ZG9lc24ndCByZWZlcmVuY2UgdGhlIHJlbW92ZWQgcmVsYXRpb24sIG5vdGhpbmcgdG8gYmUK KwkJCSAqIGRvbmUgZm9yIGl0LgorCQkJICovCisJCQljb250aW51ZTsKKwkJfQorCisJCS8q CisJCSAqIFVwZGF0ZSB0aGUgRUMgbWVtYmVycyB0byByZWZlcmVuY2UgdGhlIHJlbWFpbmlu ZyByZWxhdGlvbiBpbnN0ZWFkCisJCSAqIG9mIHRoZSByZW1vdmVkIG9uZS4KKwkJICovCisJ CXVwZGF0ZV9lY19tZW1iZXJzKGVjLCB0b1JlbW92ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQp OworCQllYy0+ZWNfcmVsaWRzID0gY2hhbmdlX3JlbGlkKGVjLT5lY19yZWxpZHMsIHRvUmVt b3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisKKwkJLyoKKwkJICogV2Ugd2lsbCBub3cg dXBkYXRlIHNvdXJjZSBhbmQgZGVyaXZlZCBjbGF1c2VzIG9mIHRoZSBFQy4KKwkJICoKKwkJ ICogUmVzdHJpY3Rpb24gY2xhdXNlcyBmb3IgYmFzZSByZWxhdGlvbnMgYXJlIGFscmVhZHkg ZGlzdHJpYnV0ZWQgdG8KKwkJICogdGhlIHJlc3BlY3RpdmUgYmFzZXJlc3RyaWN0aW5mbyBs aXN0cyAoc2VlCisJCSAqIGdlbmVyYXRlX2ltcGxpZWRfZXF1YWxpdGllcykuIFRoZSBhYm92 ZSBjb2RlIGhhcyBhbHJlYWR5IHByb2Nlc3NlZAorCQkgKiB0aGlzIGxpc3QsIGFuZCB1cGRh dGVkIHRoZXNlIGNsYXVzZXMgdG8gcmVmZXJlbmNlIHRoZSByZW1haW5pbmcKKwkJICogcmVs YXRpb24sIHNvIHdlIGNhbiBza2lwIHRoZW0gaGVyZSBiYXNlZCBvbiB0aGVpciByZWxpZHMu CisJCSAqCisJCSAqIExpa2V3aXNlLCB3ZSBoYXZlIGFscmVhZHkgcHJvY2Vzc2VkIHRoZSBq b2luIGNsYXVzZXMgdGhhdCBqb2luIHRoZQorCQkgKiByZW1vdmVkIHJlbGF0aW9uIHRvIHRo ZSByZW1haW5pbmcgb25lLgorCQkgKgorCQkgKiBGaW5hbGx5LCB0aGVyZSBhcmUgam9pbiBj bGF1c2VzIHRoYXQgam9pbiB0aGUgcmVtb3ZlZCByZWxhdGlvbiB0bworCQkgKiBzb21lIHRo aXJkIHJlbGF0aW9uLiBXZSBjYW4ndCBqdXN0IGRlbGV0ZSB0aGUgc291cmNlIGNsYXVzZXMg YW5kCisJCSAqIHJlZ2VuZXJhdGUgdGhlbSBmcm9tIHRoZSBFQywgYmVjYXVzZSB0aGUgY29y cmVzcG9uZGluZyBlcXVhbGl0eQorCQkgKiBvcGVyYXRvcnMgbWlnaHQgYmUgbWlzc2luZyAo c2VlIHRoZSBoYW5kbGluZyBvZiBlY19icm9rZW4pLgorCQkgKiBUaGVyZWZvcmUsIHdlIHdp bGwgdXBkYXRlIHRoZSByZWZlcmVuY2VzIGluIHRoZSBzb3VyY2UgY2xhdXNlcy4KKwkJICoK KwkJICogRGVyaXZlZCBjbGF1c2VzIGNhbiBiZSBnZW5lcmF0ZWQgYWdhaW4sIHNvIGl0IGlz IHNpbXBsZXIgdG8ganVzdAorCQkgKiBkZWxldGUgdGhlbS4KKwkJICovCisJCWxpc3RfZnJl ZShlYy0+ZWNfZGVyaXZlcyk7CisJCWVjLT5lY19kZXJpdmVzID0gTlVMTDsKKwkJdXBkYXRl X2VjX3NvdXJjZXMoJmVjLT5lY19zb3VyY2VzLCB0b1JlbW92ZS0+cmVsaWQsIHRvS2VlcC0+ cmVsaWQpOworCX0KKworCS8qCisJICogVHJhbnNmZXIgdGhlIHRhcmdldGxpc3QgYW5kIGF0 dHJfbmVlZGVkIGZsYWdzLgorCSAqLworCUFzc2VydCh0b1JlbW92ZS0+cmVsdGFyZ2V0LT5z b3J0Z3JvdXByZWZzID09IDApOworCisJZm9yZWFjaCAoY2VsbCwgdG9SZW1vdmUtPnJlbHRh cmdldC0+ZXhwcnMpCisJeworCQlFeHByICpub2RlID0gbGZpcnN0KGNlbGwpOworCQljaGFu Z2VfdmFybm8obm9kZSwgdG9SZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlkKTsKKwkJaWYg KCFsaXN0X21lbWJlcih0b0tlZXAtPnJlbHRhcmdldC0+ZXhwcnMsIG5vZGUpKQorCQkJdG9L ZWVwLT5yZWx0YXJnZXQtPmV4cHJzID0gbGFwcGVuZCh0b0tlZXAtPnJlbHRhcmdldC0+ZXhw cnMsIG5vZGUpOworCX0KKworCWZvciAoaSA9IHRvS2VlcC0+bWluX2F0dHI7IGkgPD0gdG9L ZWVwLT5tYXhfYXR0cjsgaSsrKQorCXsKKwkJaW50IGF0dG5vID0gaSAtIHRvS2VlcC0+bWlu X2F0dHI7CisJCXRvS2VlcC0+YXR0cl9uZWVkZWRbYXR0bm9dID0gYm1zX2FkZF9tZW1iZXJz KHRvS2VlcC0+YXR0cl9uZWVkZWRbYXR0bm9dLAorCQkJCQkJCQkJCQkJCSB0b1JlbW92ZS0+ YXR0cl9uZWVkZWRbYXR0bm9dKTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSByZW1vdmVkIHJl bGF0aW9uIGhhcyBhIHJvdyBtYXJrLCB0cmFuc2ZlciBpdCB0byB0aGUgcmVtYWluaW5nCisJ ICogb25lLgorCSAqCisJICogSWYgYm90aCByZWxzIGhhdmUgcm93IG1hcmtzLCBqdXN0IGtl ZXAgdGhlIG9uZSBjb3JyZXNwb25kaW5nIHRvIHRoZQorCSAqIHJlbWFpbmluZyByZWxhdGlv biwgYmVjYXVzZSB3ZSB2ZXJpZmllZCBlYXJsaWVyIHRoYXQgdGhleSBoYXZlIHRoZSBzYW1l CisJICogc3RyZW5ndGguCisJICoKKwkgKiBBbHNvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzY3Jh dGNoLT5yb3dfbWFya3MgY2FjaGUgaXMgdXAgdG8gZGF0ZSwgYmVjYXVzZQorCSAqIHdlIGFy ZSBnb2luZyB0byB1c2UgaXQgZm9yIGZ1cnRoZXIgam9pbiByZW1vdmFscy4KKwkgKi8KKwlp ZiAocm1hcmspCisJeworCQlpZiAoa21hcmspCisJCXsKKwkJCUFzc2VydChrbWFyay0+bWFy a1R5cGUgPT0gcm1hcmstPm1hcmtUeXBlKTsKKworCQkJcm9vdC0+cm93TWFya3MgPSBsaXN0 X2RlbGV0ZV9wdHIocm9vdC0+cm93TWFya3MsIGttYXJrKTsKKwkJfQorCQllbHNlCisJCXsK KwkJCS8qIFNob3VsZG4ndCBoYXZlIGluaGVyaXRhbmNlIGNoaWxkcmVuIGhlcmUuICovCisJ CQlBc3NlcnQoa21hcmstPnJ0aSA9PSBrbWFyay0+cHJ0aSk7CisKKwkJCXJtYXJrLT5ydGkg PSB0b0tlZXAtPnJlbGlkOworCQkJcm1hcmstPnBydGkgPSB0b0tlZXAtPnJlbGlkOworCQl9 CisJfQorCisJLyoKKwkgKiBDaGFuZ2UgdmFybm8gaW4gc29tZSBzcGVjaWFsIGNhc2VzIHdp dGggbm9uLXRyaXZpYWwgUmFuZ2VUYmxFbnRyeQorCSAqLworCWZvcmVhY2goY2VsbCwgcm9v dC0+cGFyc2UtPnJ0YWJsZSkKKwl7CisJCVJhbmdlVGJsRW50cnkgKnJ0ZQk9IGxmaXJzdChj ZWxsKTsKKworCQlzd2l0Y2gocnRlLT5ydGVraW5kKQorCQl7CisJCQljYXNlIFJURV9GVU5D VElPTjoKKwkJCQljaGFuZ2VfdmFybm8oKEV4cHIqKXJ0ZS0+ZnVuY3Rpb25zLCB0b1JlbW92 ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCQkJCWJyZWFrOworCQkJY2FzZSBSVEVfVEFC TEVGVU5DOgorCQkJCWNoYW5nZV92YXJubygoRXhwciopcnRlLT50YWJsZWZ1bmMsIHRvUmVt b3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFJURV9W QUxVRVM6CisJCQkJY2hhbmdlX3Zhcm5vKChFeHByKilydGUtPnZhbHVlc19saXN0cywgdG9S ZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlkKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6 CisJCQkJLyogbm8gb3AgKi8KKwkJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogUmVw bGFjZSB2YXJubyBpbiByb290IHRhcmdldGxpc3QgYW5kIEhBVklORyBjbGF1c2UuCisJICov CisJY2hhbmdlX3Zhcm5vKChFeHByICopIHJvb3QtPnByb2Nlc3NlZF90bGlzdCwgdG9SZW1v dmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlkKTsKKwljaGFuZ2VfdmFybm8oKEV4cHIgKikgcm9v dC0+cGFyc2UtPmhhdmluZ1F1YWwsIHRvUmVtb3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7 CisKKwkvKgorCSAqIFRyYW5zZmVyIGpvaW4gYW5kIHJlc3RyaWN0aW9uIGNsYXVzZXMgZnJv bSB0aGUgcmVtb3ZlZCByZWxhdGlvbiB0byB0aGUKKwkgKiByZW1haW5pbmcgb25lLiBXZSBj aGFuZ2UgdGhlIFZhcnMgb2YgdGhlIGNsYXVzZSB0byBwb2ludCB0byB0aGUKKwkgKiByZW1h aW5pbmcgcmVsYXRpb24gaW5zdGVhZCBvZiB0aGUgcmVtb3ZlZCBvbmUuIFRoZSBjbGF1c2Vz IHRoYXQgcmVxdWlyZQorCSAqIGEgc3Vic2V0IG9mIGpvaW5yZWxpZHMgYmVjb21lIHJlc3Ry aWN0aW9uIGNsYXVzZXMgb2YgdGhlIHJlbWFpbmluZworCSAqIHJlbGF0aW9uLCBhbmQgb3Ro ZXJzIHJlbWFpbiBqb2luIGNsYXVzZXMuIFdlIGFwcGVuZCB0aGVtIHRvCisJICogYmFzZXJl c3RyaWN0aW5mbyBhbmQgam9pbmluZm8gcmVzcGVjdGl2ZWx5LCB0cnlpbmcgbm90IHRvIGlu dHJvZHVjZQorCSAqIGR1cGxpY2F0ZXMuCisJICoKKwkgKiBXZSBhbHNvIGhhdmUgdG8gcHJv Y2VzcyB0aGUgJ2pvaW5jbGF1c2VzJyBsaXN0IGhlcmUsIGJlY2F1c2UgaXQKKwkgKiBjb250 YWlucyBFQy1kZXJpdmVkIGpvaW4gY2xhdXNlcyB3aGljaCBtdXN0IGJlY29tZSBmaWx0ZXIg Y2xhdXNlcy4gSXQKKwkgKiBpcyBub3QgZW5vdWdoIHRvIGp1c3QgY29ycmVjdCB0aGUgRUNz LCBiZWNhdXNlIHRoZSBFQy1kZXJpdmVkCisJICogcmVzdHJpY3Rpb25zIGFyZSBnZW5lcmF0 ZWQgYmVmb3JlIGpvaW4gcmVtb3ZhbCAoc2VlCisJICogZ2VuZXJhdGVfYmFzZV9pbXBsaWVk X2VxdWFsaXRpZXMpLgorCSAqLworfQorCisvKgorICogc3BsaXRfc2VsZmpvaW5fcXVhbHMK KyAqCQlQcm9jZXNzZXMgJ2pvaW5xdWFscycgYnVpbGRpbmcgdHdvIGxpc3RzLCBvbmUgd2l0 aCBhIGxpc3Qgb2YgcXVhbHMKKyAqCQl3aGVyZSB0aGUgY29sdW1ucy9leHBycyBvbiBlaXRo ZXIgc2lkZSBvZiB0aGUgam9pbiBtYXRjaCBhbmQgYW5vdGhlcgorICoJCWxpc3QgY29udGFp bmluZyB0aGUgcmVtYWluaW5nIHF1YWxzLgorICoKKyAqICdqb2lucXVhbHMnIG11c3Qgb25s eSBjb250YWluIHF1YWxzIGZvciBhIFJURV9SRUxBVElPTiBiZWluZyBqb2luZWQgdG8KKyAq IGl0c2VsZi4KKyAqLworc3RhdGljIHZvaWQKK3NwbGl0X3NlbGZqb2luX3F1YWxzKFBsYW5u ZXJJbmZvICpyb290LCBMaXN0ICpqb2lucXVhbHMsIExpc3QgKipzZWxmam9pbnF1YWxzLAor CQkJCQkgTGlzdCAqKm90aGVyam9pbnF1YWxzKQoreworCUxpc3RDZWxsICpsYzsKKwlMaXN0 CSAqc2pvaW5xdWFscyA9IE5JTDsKKwlMaXN0CSAqcmpvaW5xdWFscyA9IE5JTDsKKworCWZv cmVhY2gobGMsIGpvaW5xdWFscykKKwl7CisJCVJlc3RyaWN0SW5mbwkqcmluZm8gPSAoUmVz dHJpY3RJbmZvICopIGxmaXJzdChsYyk7CisJCU9wRXhwcgkJCSpleHByOworCQlFeHByCQkJ KmxlZnRleHByOworCQlFeHByCQkJKnJpZ2h0ZXhwcjsKKworCQlpZiAoYm1zX251bV9tZW1i ZXJzKHJpbmZvLT5jbGF1c2VfcmVsaWRzKSAhPSAyIHx8CisJCQlibXNfbnVtX21lbWJlcnMo cmluZm8tPmxlZnRfcmVsaWRzKSAhPSAxIHx8CisJCQlibXNfbnVtX21lbWJlcnMocmluZm8t PnJpZ2h0X3JlbGlkcykgIT0gMSkKKwkJeworCQkJcmpvaW5xdWFscyA9IGxhcHBlbmQocmpv aW5xdWFscywgcmluZm8pOworCQkJY29udGludWU7CisJCX0KKworCQlleHByID0gKE9wRXhw ciAqKSByaW5mby0+Y2xhdXNlOworCisJCWlmICghSXNBKGV4cHIsIE9wRXhwcikgfHwgbGlz dF9sZW5ndGgoZXhwci0+YXJncykgIT0gMikKKwkJeworCQkJcmpvaW5xdWFscyA9IGxhcHBl bmQocmpvaW5xdWFscywgcmluZm8pOworCQkJY29udGludWU7CisJCX0KKworCQlsZWZ0ZXhw ciA9IChFeHByICopIGNvcHlPYmplY3QoZ2V0X2xlZnRvcChyaW5mby0+Y2xhdXNlKSk7CisJ CXJpZ2h0ZXhwciA9IChFeHByICopIGNvcHlPYmplY3QoZ2V0X3JpZ2h0b3AocmluZm8tPmNs YXVzZSkpOworCisJCS8qIENhbid0IG1hdGNoIG9mIHRoZSBleHBycyBhcmUgbm90IG9mIHRo ZSBzYW1lIHR5cGUgKi8KKwkJaWYgKGxlZnRleHByLT50eXBlICE9IHJpZ2h0ZXhwci0+dHlw ZSkKKwkJeworCQkJcmpvaW5xdWFscyA9IGxhcHBlbmQocmpvaW5xdWFscywgcmluZm8pOwor CQkJY29udGludWU7CisJCX0KKworCQljaGFuZ2VfdmFybm8ocmlnaHRleHByLAorCQkJCQkg Ym1zX25leHRfbWVtYmVyKHJpbmZvLT5yaWdodF9yZWxpZHMsIC0xKSwKKwkJCQkJIGJtc19u ZXh0X21lbWJlcihyaW5mby0+bGVmdF9yZWxpZHMsIC0xKSk7CisKKwkJaWYgKGVxdWFsKGxl ZnRleHByLCByaWdodGV4cHIpKQorCQkJc2pvaW5xdWFscyA9IGxhcHBlbmQoc2pvaW5xdWFs cywgcmluZm8pOworCQllbHNlCisJCQlyam9pbnF1YWxzID0gbGFwcGVuZChyam9pbnF1YWxz LCByaW5mbyk7CisJfQorCisJKnNlbGZqb2lucXVhbHMgPSBzam9pbnF1YWxzOworCSpvdGhl cmpvaW5xdWFscyA9IHJqb2lucXVhbHM7Cit9CisKK3N0YXRpYyBib29sCit0bGlzdF9jb250 YWluc19yZWxfZXhwcnMoUGxhbm5lckluZm8gKnJvb3QsIFJlbGlkcyByZWxpZHMsIFJlbE9w dEluZm8gKnJlbCkKK3sKKwlMaXN0Q2VsbCAgICp2YXJzOworCisJZm9yZWFjaCh2YXJzLCBy ZWwtPnJlbHRhcmdldC0+ZXhwcnMpCisJeworCQlWYXIJCSAgICp2YXIgPSAoVmFyICopIGxm aXJzdCh2YXJzKTsKKwkJUmVsT3B0SW5mbyAqYmFzZXJlbDsKKwkJaW50CQkJbmR4OworCisJ CS8qCisJCSAqIElnbm9yZSBQbGFjZUhvbGRlclZhcnMgaW4gdGhlIGlucHV0IHRsaXN0czsg d2UnbGwgbWFrZSBvdXIgb3duCisJCSAqIGRlY2lzaW9ucyBhYm91dCB3aGV0aGVyIHRvIGNv cHkgdGhlbS4KKwkJICovCisJCWlmIChJc0EodmFyLCBQbGFjZUhvbGRlclZhcikpCisJCQly ZXR1cm4gdHJ1ZTsKKworCQkvKgorCQkgKiBPdGhlcndpc2UsIGFueXRoaW5nIGluIGEgYmFz ZXJlbCBvciBqb2lucmVsIHRhcmdldGxpc3Qgb3VnaHQgdG8gYmUKKwkJICogYSBWYXIuICAo TW9yZSBnZW5lcmFsIGNhc2VzIGNhbiBvbmx5IGFwcGVhciBpbiBhcHBlbmRyZWwgY2hpbGQK KwkJICogcmVscywgd2hpY2ggd2lsbCBuZXZlciBiZSBzZWVuIGhlcmUuKQorCQkgKi8KKwkJ aWYgKCFJc0EodmFyLCBWYXIpKQorCQkJZWxvZyhFUlJPUiwgInVuZXhwZWN0ZWQgbm9kZSB0 eXBlIGluIHJlbCB0YXJnZXRsaXN0OiAlZCIsCisJCQkJIChpbnQpIG5vZGVUYWcodmFyKSk7 CisKKwkJLyogR2V0IHRoZSBWYXIncyBvcmlnaW5hbCBiYXNlIHJlbCAqLworCQliYXNlcmVs ID0gZmluZF9iYXNlX3JlbChyb290LCB2YXItPnZhcm5vKTsKKworCQkvKiBJcyBpdCBzdGls bCBuZWVkZWQgYWJvdmUgdGhpcyBqb2lucmVsPyAqLworCQluZHggPSB2YXItPnZhcmF0dG5v IC0gYmFzZXJlbC0+bWluX2F0dHI7CisJCWlmIChibXNfbm9uZW1wdHlfZGlmZmVyZW5jZShi YXNlcmVsLT5hdHRyX25lZWRlZFtuZHhdLCByZWxpZHMpKQorCQkJcmV0dXJuIHRydWU7CisJ fQorCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIEZpbmQgYW5kIHJlbW92ZSB1bmlxdWUg c2VsZiBqb2lucyBpbiBhIGdyb3VwIG9mIGJhc2UgcmVsYXRpb25zIHRoYXQgaGF2ZQorICog dGhlIHNhbWUgT2lkLgorICoKKyAqIFJldHVybnMgYSBzZXQgb2YgcmVsaWRzIHRoYXQgd2Vy ZSByZW1vdmVkLgorICovCitzdGF0aWMgUmVsaWRzCityZW1vdmVfc2VsZl9qb2luc19vbmVf Z3JvdXAoUGxhbm5lckluZm8gKnJvb3QsIFJlbGlkcyByZWxpZHMpCit7CisJUmVsaWRzIGpv aW5yZWxpZHMgPSBOVUxMOworCVJlbGlkcyByZXN1bHQgPSBOVUxMOworCWludCBrOyAvKiBJ bmRleCBvZiBrZXB0IHJlbGF0aW9uICovCisJaW50IHIgPSAtMTsgLyogSW5kZXggb2YgcmVt b3ZlZCByZWxhdGlvbiAqLworCisJaWYgKGJtc19udW1fbWVtYmVycyhyZWxpZHMpIDwgMikK KwkJcmV0dXJuIE5VTEw7CisKKwl3aGlsZSAoKHIgPSBibXNfbmV4dF9tZW1iZXIocmVsaWRz LCByKSkgPiAwKQorCXsKKwkJUmVsT3B0SW5mbyAqb3V0ZXIgPSByb290LT5zaW1wbGVfcmVs X2FycmF5W3JdOworCQlrID0gcjsKKworCQl3aGlsZSAoKGsgPSBibXNfbmV4dF9tZW1iZXIo cmVsaWRzLCBrKSkgPiAwKQorCQl7CisJCQlSZWxPcHRJbmZvCSppbm5lciA9IHJvb3QtPnNp bXBsZV9yZWxfYXJyYXlba107CisJCQlMaXN0CSAgICpyZXN0cmljdGxpc3Q7CisJCQlMaXN0 CSAgICpzZWxmam9pbnF1YWxzOworCQkJTGlzdAkgICAqb3RoZXJqb2lucXVhbHM7CisJCQlM aXN0Q2VsbAkqbGM7CisJCQlib29sCQlqaW5mb19jaGVjayA9IHRydWU7CisJCQlQbGFuUm93 TWFyawkqb21hcmsgPSBOVUxMOworCQkJUGxhblJvd01hcmsJKmltYXJrID0gTlVMTDsKKwor CQkJLyogQSBzYW5pdHkgY2hlY2s6IHRoZSByZWxhdGlvbnMgaGF2ZSB0aGUgc2FtZSBPaWQu ICovCisJCQlBc3NlcnQocm9vdC0+c2ltcGxlX3J0ZV9hcnJheVtrXS0+cmVsaWQgPT0KKwkJ CQkgICByb290LT5zaW1wbGVfcnRlX2FycmF5W3JdLT5yZWxpZCk7CisKKwkJCS8qCisJCQkg KiBJdCBpcyBpbXBvc3NpYmxlIHRvIG9wdGltaXplIHR3byByZWxhdGlvbnMgaWYgdGhleSBi ZWxvbmcgdG8KKwkJCSAqIGRpZmZlcmVudCBydWxlcyBvZiBvcmRlciByZXN0cmljdGlvbi4g T3RoZXJ3aXNlIHBsYW5uZXIgY2FuJ3QKKwkJCSAqIGJlIGFibGUgdG8gZmluZCBhbnkgdmFy aWFudHMgb2YgY29ycmVjdCBxdWVyeSBwbGFuLgorCQkJICovCisJCQlmb3JlYWNoKGxjLCBy b290LT5qb2luX2luZm9fbGlzdCkKKwkJCXsKKwkJCQlTcGVjaWFsSm9pbkluZm8gKmluZm8g PSAoU3BlY2lhbEpvaW5JbmZvICopIGxmaXJzdChsYyk7CisKKwkJCQlpZiAoYm1zX2lzX21l bWJlcihrLCBpbmZvLT5zeW5fbGVmdGhhbmQpICYmCisJCQkJCSFibXNfaXNfbWVtYmVyKHIs IGluZm8tPnN5bl9sZWZ0aGFuZCkpCisJCQkJCWppbmZvX2NoZWNrID0gZmFsc2U7CisKKwkJ CQlpZiAoYm1zX2lzX21lbWJlcihrLCBpbmZvLT5zeW5fcmlnaHRoYW5kKSAmJgorCQkJCQkh Ym1zX2lzX21lbWJlcihyLCBpbmZvLT5zeW5fcmlnaHRoYW5kKSkKKwkJCQkJamluZm9fY2hl Y2sgPSBmYWxzZTsKKworCQkJCWlmIChibXNfaXNfbWVtYmVyKHIsIGluZm8tPnN5bl9sZWZ0 aGFuZCkgJiYKKwkJCQkJIWJtc19pc19tZW1iZXIoaywgaW5mby0+c3luX2xlZnRoYW5kKSkK KwkJCQkJamluZm9fY2hlY2sgPSBmYWxzZTsKKworCQkJCWlmIChibXNfaXNfbWVtYmVyKHIs IGluZm8tPnN5bl9yaWdodGhhbmQpICYmCisJCQkJCSFibXNfaXNfbWVtYmVyKGssIGluZm8t PnN5bl9yaWdodGhhbmQpKQorCQkJCQlqaW5mb19jaGVjayA9IGZhbHNlOworCisJCQkJaWYg KCFqaW5mb19jaGVjaykKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICghamluZm9fY2hl Y2spCisJCQkJY29udGludWU7CisKKwkJCS8qIFJldXNlIGpvaW5yZWxpZHMgYml0c2V0IHRv IGF2b2lkIHJlYWxsb2NhdGlvbi4gKi8KKwkJCWpvaW5yZWxpZHMgPSBibXNfZGVsX21lbWJl cnMoam9pbnJlbGlkcywgam9pbnJlbGlkcyk7CisKKwkJCS8qCisJCQkgKiBXZSBvbmx5IGRl YWwgd2l0aCBiYXNlIHJlbHMgaGVyZSwgc28gdGhlaXIgcmVsaWRzIGJpdHNldAorCQkJICog Y29udGFpbnMgb25seSBvbmUgbWVtYmVyIC0tIHRoZWlyIHJlbGlkLgorCQkJICovCisJCQlq b2lucmVsaWRzID0gYm1zX2FkZF9tZW1iZXIoam9pbnJlbGlkcywgcik7CisJCQlqb2lucmVs aWRzID0gYm1zX2FkZF9tZW1iZXIoam9pbnJlbGlkcywgayk7CisKKwkJCS8qIElzIGl0IGEg dW5pcXVlIHNlbGYgam9pbj8gKi8KKwkJCXJlc3RyaWN0bGlzdCA9IGJ1aWxkX2pvaW5yZWxf cmVzdHJpY3RsaXN0KHJvb3QsIGpvaW5yZWxpZHMsIG91dGVyLAorCQkJCQkJCQkJCQkJCSAg aW5uZXIpOworCisJCQkvKgorCQkJICogUHJvY2VzcyByZXN0cmljdGxpc3QgdG8gc2VwZXJh dGUgb3V0IHRoZSBzZWxmIGpvaW4gcXVhbHMgZnJvbQorCQkJICogdGhlIG90aGVyIHF1YWxz LiBlLmcgeCA9IHggZ29lcyB0byBzZWxmam9pbnF1YWxzIGFuZCBhID0gYiB0bworCQkJICog b3RoZXJqb2lucXVhbHMuCisJCQkgKi8KKwkJCXNwbGl0X3NlbGZqb2luX3F1YWxzKHJvb3Qs IHJlc3RyaWN0bGlzdCwgJnNlbGZqb2lucXVhbHMsCisJCQkJCQkJCSAmb3RoZXJqb2lucXVh bHMpOworCisJCQlpZiAobGlzdF9sZW5ndGgoc2VsZmpvaW5xdWFscykgPT0gMCkKKwkJCXsK KwkJCQkvKgorCQkJCSAqIEhhdmUgYSBjaGFuY2UgdG8gcmVtb3ZlIGpvaW4gaWYgdGFyZ2V0 IGxpc3QgY29udGFpbnMgdmFycyBmcm9tCisJCQkJICogdGhlIG9ubHkgb25lIHJlbGF0aW9u LgorCQkJCSAqLworCQkJCWlmIChsaXN0X2xlbmd0aChvdGhlcmpvaW5xdWFscykgPT0gMCkK KwkJCQl7CisJCQkJCS8qIENhbid0IGRldGVybWluZSB1bmlxdWVuZXNzIHdpdGhvdXQgYW55 IHF1YWxzLiAqLworCQkJCQljb250aW51ZTsKKworCQkJCX0KKwkJCQllbHNlIGlmICghdGxp c3RfY29udGFpbnNfcmVsX2V4cHJzKHJvb3QsIGpvaW5yZWxpZHMsIGlubmVyKSkKKwkJCQl7 CisJCQkJCS8qCisJCQkJCSAqIFRPRE86CisJCQkJCSAqIEluIHRoaXMgY2FzZSwgd2Ugb25s eSBoYXZlIGEgY2hhbmNlIGluIHRoZSBjYXNlIG9mIGEKKwkJCQkJICogZm9yZWlnbiBrZXkg cmVmZXJlbmNlLgorCQkJCQkgKi8KKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWVsc2UK KwkJCQkJLyoKKwkJCQkJICogVGhlIHRhcmdldCBsaXN0IGNvbnRhaW5zIHZhcnMgZnJvbSBi b3RoIGlubmVyIGFuZCBvdXRlcgorCQkJCQkgKiByZWxhdGlvbnMuCisJCQkJCSAqLworCQkJ CQljb250aW51ZTsKKwkJCX0KKwkJCS8qCisJCQkgKiBEZXRlcm1pbmUgaWYgdGhlIGlubmVy IHRhYmxlIGNhbiBkdXBsaWNhdGUgb3V0ZXIgcm93cy4gIFdlIG11c3QKKwkJCSAqIGJ5cGFz cyB0aGUgdW5pcXVlIHJlbCBjYWNoZSBoZXJlIHNpbmNlIHdlJ3JlIHBvc3NpYmx5IHVzaW5n IGEKKwkJCSAqIHN1YnNldCBvZiBqb2luIHF1YWxzLiBXZSBjYW4gdXNlICdmb3JjZV9jYWNo ZScgPSB0cnVlIHdoZW4gYWxsCisJCQkgKiBqb2luIHF1YWxzIGFyZSBzZWxmam9pbiBxdWFs cy4gIE90aGVyd2lzZSB3ZSBjb3VsZCBlbmQgdXAKKwkJCSAqIHB1dHRpbmcgZmFsc2UgbmVn YXRpdmVzIGluIHRoZSBjYWNoZS4KKwkJCSAqLworCQkJZWxzZSBpZiAoIWlubmVycmVsX2lz X3VuaXF1ZShyb290LCBqb2lucmVsaWRzLCBvdXRlci0+cmVsaWRzLAorCQkJCQkJCQkJCSBp bm5lciwgSk9JTl9JTk5FUiwgc2VsZmpvaW5xdWFscywKKwkJCQkJCQkJCQkgbGlzdF9sZW5n dGgob3RoZXJqb2lucXVhbHMpID09IDApKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBTZWUg Zm9yIHJvdyBtYXJrcy4gKi8KKwkJCWZvcmVhY2ggKGxjLCByb290LT5yb3dNYXJrcykKKwkJ CXsKKwkJCQlQbGFuUm93TWFyayAqcm93TWFyayA9IChQbGFuUm93TWFyayAqKSBsZmlyc3Qo bGMpOworCisJCQkJaWYgKHJvd01hcmstPnJ0aSA9PSBrKQorCQkJCXsKKwkJCQkJQXNzZXJ0 KGltYXJrID09IE5VTEwpOworCQkJCQlpbWFyayA9IHJvd01hcms7CisJCQkJfQorCQkJCWVs c2UgaWYgKHJvd01hcmstPnJ0aSA9PSByKQorCQkJCXsKKwkJCQkJQXNzZXJ0KG9tYXJrID09 IE5VTEwpOworCQkJCQlvbWFyayA9IHJvd01hcms7CisJCQkJfQorCQkJfQorCisJCQkvKgor CQkJICogV2UgY2FuJ3QgcmVtb3ZlIHRoZSBqb2luIGlmIHRoZSByZWxhdGlvbnMgaGF2ZSBy b3cgbWFya3Mgb2YKKwkJCSAqIGRpZmZlcmVudCBzdHJlbmd0aCAoZS5nLiBvbmUgaXMgbG9j a2VkIEZPUiBVUERBVEUgYW5kIGFub3RoZXIKKwkJCSAqIGp1c3QgaGFzIFJPV19NQVJLX1JF RkVSRU5DRSBmb3IgRXZhbFBsYW5RdWFsIHJlY2hlY2tpbmcpLgorCQkJICovCisJCQlpZiAo b21hcmsgJiYgaW1hcmsgJiYgb21hcmstPm1hcmtUeXBlICE9IGltYXJrLT5tYXJrVHlwZSkK KwkJCQljb250aW51ZTsKKworCQkJLyoKKwkJCSAqIEJlIHNhZmUgdG8gZG8gbm90IHJlbW92 ZSB0YWJsZSBwYXJ0aWNpcGF0ZWQgaW4gY29tcGxpY2F0ZWQgUEgKKwkJCSAqLworCQkJZm9y ZWFjaChsYywgcm9vdC0+cGxhY2Vob2xkZXJfbGlzdCkKKwkJCXsKKwkJCQlQbGFjZUhvbGRl ckluZm8gKnBoaW5mbyA9IChQbGFjZUhvbGRlckluZm8gKikgbGZpcnN0KGxjKTsKKworCQkJ CS8qIHRoZXJlIGlzbid0IGFueSBvdGhlciBwbGFjZSB0byBldmFsIFBIViAqLworCQkJCWlm IChibXNfaXNfc3Vic2V0KHBoaW5mby0+cGhfZXZhbF9hdCwgam9pbnJlbGlkcykgfHwKKwkJ CQkJYm1zX2lzX3N1YnNldChwaGluZm8tPnBoX25lZWRlZCwgam9pbnJlbGlkcykpCisJCQkJ CWJyZWFrOworCQkJfQorCisJCQlpZiAobGMpCisJCQkJY29udGludWU7CisKKwkJCS8qCisJ CQkgKiBXZSBjYW4gcmVtb3ZlIGVpdGhlciByZWxhdGlvbiwgc28gcmVtb3ZlIHRoZSBvdXRl ciBvbmUsIHRvCisJCQkgKiBzaW1wbGlmeSB0aGlzIGxvb3AuCisJCQkgKi8KKworCQkJLyoK KwkJCSAqIEFkZCBqb2luIHJlc3RyaWN0aW9ucyB0byBqb2luaW5mbyBvZiByZW1vdmluZyBy ZWxhdGlvbiB0byBzaW1wbGlmeQorCQkJICogdGhlIHJlbGlkcyByZXBsYWNpbmcgcHJvY2Vk dXJlLgorCQkJICovCisJCQlvdXRlci0+am9pbmluZm8gPSBsaXN0X2NvbmNhdChvdXRlci0+ am9pbmluZm8sIHJlc3RyaWN0bGlzdCk7CisKKwkJCS8qIEZpcnN0bHksIHJlcGxhY2UgaW5k ZXggb2YgZXhjbHVkaW5nIHJlbGF0aW9uIHdpdGgga2VlcGluZy4gKi8KKwkJCXJlbW92ZV9y ZWxfZnJvbV9xdWVyeShyb290LCBvdXRlci0+cmVsaWQsIGpvaW5yZWxpZHMsIGlubmVyLT5y ZWxpZCk7CisKKwkJCS8qIFNlY29uZGx5LCBmaXggcmVzdHJpY3Rpb25zIG9mIGtlZXBpbmcg cmVsYXRpb24gKi8KKwkJCXJlbW92ZV9zZWxmX2pvaW5fcmVsKHJvb3QsIGltYXJrLCBvbWFy aywgaW5uZXIsIG91dGVyKTsKKwkJCXJlc3VsdCA9IGJtc19hZGRfbWVtYmVyKHJlc3VsdCwg cik7CisKKwkJCS8qIFdlIHJlbW92ZWQgdGhlIG91dGVyIHJlbGF0aW9uLCB0cnkgdGhlIG5l eHQgb25lLiAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQor CisvKgorICogSXRlcmF0aXZlbHkgZm9ybSBhIGdyb3VwIG9mIHJlbGF0aW9uIGluZGV4ZXMg d2l0aCB0aGUgc2FtZSBvaWQgYW5kIGxhdW5jaAorICogdGhlIHJvdXRpbmUgdGhhdCBkZXRl Y3RzIHNlbGYtam9pbnMgaW4gdGhpcyBncm91cCBhbmQgcmVtb3ZlcyBleGNlc3NpdmUKKyAq IHJhbmdlIHRhYmxlIGVudHJpZXMuCisgKgorICogQXQgdGhlIGVuZCBvZiBpdGVyYXRpb24s IGV4Y2x1ZGUgdGhlIGdyb3VwIGZyb20gdGhlIG92ZXJhbGwgcmVsaWRzIGxpc3QuCisgKiBT byBlYWNoIG5leHQgaXRlcmF0aW9uIG9mIHRoZSBjeWNsZSB3aWxsIGludm9sdmUgbGVzcyBh bmQgbGVzcyB2YWx1ZSBvZgorICogcmVsaWRzLgorICovCitzdGF0aWMgUmVsaWRzCityZW1v dmVfc2VsZl9qb2luc19vbmVfbGV2ZWwoUGxhbm5lckluZm8gKnJvb3QsIFJlbGlkcyByZWxp ZHMsIFJlbGlkcyBUb1JlbW92ZSkKK3sKKwl3aGlsZSAoIWJtc19pc19lbXB0eShyZWxpZHMp KQorCXsKKwkJUmVsaWRzIGdyb3VwID0gTlVMTDsKKwkJT2lkIGdyb3VwT2lkOworCQlpbnQg aTsKKworCQlpID0gYm1zX2ZpcnN0X21lbWJlcihyZWxpZHMpOworCQlncm91cE9pZCA9IHJv b3QtPnNpbXBsZV9ydGVfYXJyYXlbaV0tPnJlbGlkOworCQlBc3NlcnQoT2lkSXNWYWxpZChn cm91cE9pZCkpOworCQlncm91cCA9IGJtc19hZGRfbWVtYmVyKGdyb3VwLCBpKTsKKworCQkv KiBDcmVhdGUgZ3JvdXAgb2YgcmVsYXRpb24gaW5kZXhlcyB3aXRoIHRoZSBzYW1lIG9pZC4g Ki8KKwkJd2hpbGUgKChpID0gYm1zX25leHRfbWVtYmVyKHJlbGlkcywgaSkpID4gMCkKKwkJ eworCQkJUmFuZ2VUYmxFbnRyeSAqcnRlID0gcm9vdC0+c2ltcGxlX3J0ZV9hcnJheVtpXTsK KworCQkJQXNzZXJ0KE9pZElzVmFsaWQocnRlLT5yZWxpZCkpOworCisJCQlpZiAocnRlLT5y ZWxpZCA9PSBncm91cE9pZCkKKwkJCQlncm91cCA9IGJtc19hZGRfbWVtYmVyKGdyb3VwLCBp KTsKKwkJfQorCisJCXJlbGlkcyA9IGJtc19kZWxfbWVtYmVycyhyZWxpZHMsIGdyb3VwKTsK KwkJVG9SZW1vdmUgPSBibXNfYWRkX21lbWJlcnMoVG9SZW1vdmUsCisJCQkJCQkJCSAgIHJl bW92ZV9zZWxmX2pvaW5zX29uZV9ncm91cChyb290LCBncm91cCkpOworCQlibXNfZnJlZShn cm91cCk7CisJfQorCXJldHVybiBUb1JlbW92ZTsKK30KKworLyoKKyAqIEZvciBlYWNoIGxl dmVsIG9mIGpvaW5saXN0IGZvcm0gYSBzZXQgb2YgYmFzZSByZWxhdGlvbnMgYW5kIGxhdW5j aCB0aGUKKyAqIHJvdXRpbmUgb2YgdGhlIHNlbGYtam9pbiByZW1vdmFsIG9wdGltaXphdGlv bi4gUmVjdXJzZSBpbnRvIHN1Yi1qb2lubGlzdHMgdG8KKyAqIGhhbmRsZSBkZWVwZXIgbGV2 ZWxzLgorICovCitzdGF0aWMgUmVsaWRzCityZW1vdmVfc2VsZl9qb2luc19yZWN1cnNlKFBs YW5uZXJJbmZvICpyb290LCBMaXN0ICpqb2lubGlzdCwgUmVsaWRzIFRvUmVtb3ZlKQorewor CUxpc3RDZWxsICpsYzsKKwlSZWxpZHMgcmVsaWRzID0gTlVMTDsKKworCS8qIENvbGxlY3Qg dGhlIGlkcyBvZiBiYXNlIHJlbGF0aW9ucyBhdCBvbmUgbGV2ZWwgb2YgdGhlIGpvaW4gdHJl ZS4gKi8KKwlmb3JlYWNoIChsYywgam9pbmxpc3QpCisJeworCQlzd2l0Y2ggKCgoTm9kZSAq KSBsZmlyc3QobGMpKS0+dHlwZSkKKwkJeworCQkJY2FzZSBUX0xpc3Q6CisJCQkJLyogUmVj dXJzaXZlbHkgZ28gaW5zaWRlIHRoZSBzdWItam9pbmxpc3QgKi8KKwkJCQlUb1JlbW92ZSA9 IHJlbW92ZV9zZWxmX2pvaW5zX3JlY3Vyc2Uocm9vdCwKKwkJCQkJCQkJCQkJCQkgKExpc3Qg KikgbGZpcnN0KGxjKSwKKwkJCQkJCQkJCQkJCQkgVG9SZW1vdmUpOworCQkJCWJyZWFrOwor CQkJY2FzZSBUX1JhbmdlVGJsUmVmOgorCQkJeworCQkJCVJhbmdlVGJsUmVmICpyZWYgPSAo UmFuZ2VUYmxSZWYgKikgbGZpcnN0KGxjKTsKKwkJCQlSYW5nZVRibEVudHJ5ICpydGUgPSBy b290LT5zaW1wbGVfcnRlX2FycmF5W3JlZi0+cnRpbmRleF07CisKKwkJCQkvKgorCQkJCSAq IFdlIG9ubHkgY2FyZSBhYm91dCBiYXNlIHJlbGF0aW9ucyBmcm9tIHdoaWNoIHdlIHNlbGVj dAorCQkJCSAqIHNvbWV0aGluZy4KKwkJCQkgKi8KKwkJCQlpZiAocnRlLT5ydGVraW5kICE9 IFJURV9SRUxBVElPTiB8fAorCQkJCQlydGUtPnJlbGtpbmQgIT0gUkVMS0lORF9SRUxBVElP TiB8fAorCQkJCQlyb290LT5zaW1wbGVfcmVsX2FycmF5W3JlZi0+cnRpbmRleF0gPT0gTlVM TCkKKwkJCQkJYnJlYWs7CisKKwkJCQlBc3NlcnQoIWJtc19pc19tZW1iZXIocmVmLT5ydGlu ZGV4LCByZWxpZHMpKTsKKwkJCQlyZWxpZHMgPSBibXNfYWRkX21lbWJlcihyZWxpZHMsIHJl Zi0+cnRpbmRleCk7CisKKwkJCQkvKgorCQkJCSAqIExpbWl0IHRoZSBudW1iZXIgb2Ygam9p bnMgd2UgcHJvY2VzcyB0byBjb250cm9sIHRoZSBxdWFkcmF0aWMKKwkJCQkgKiBiZWhhdmlv ci4KKwkJCQkgKi8KKwkJCQlpZiAoYm1zX251bV9tZW1iZXJzKHJlbGlkcykgPiBqb2luX2Nv bGxhcHNlX2xpbWl0KQorCQkJCQlicmVhazsKKwkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1 bHQ6CisJCQkJQXNzZXJ0KGZhbHNlKTsKKwkJfQorCX0KKworCWlmIChibXNfbnVtX21lbWJl cnMocmVsaWRzKSA+PSAyKQorCQlUb1JlbW92ZSA9IHJlbW92ZV9zZWxmX2pvaW5zX29uZV9s ZXZlbChyb290LCByZWxpZHMsIFRvUmVtb3ZlKTsKKworCWJtc19mcmVlKHJlbGlkcyk7CisJ cmV0dXJuIFRvUmVtb3ZlOworfQorCisvKgorICogRmluZCBhbmQgcmVtb3ZlIHVzZWxlc3Mg c2VsZiBqb2lucy4KKyAqCisgKiBXZSBzZWFyY2ggZm9yIGpvaW5zIHdoZXJlIHRoZSBzYW1l IHJlbGF0aW9uIGlzIGpvaW5lZCB0byBpdHNlbGYgb24gYWxsCisgKiBjb2x1bW5zIG9mIHNv bWUgdW5pcXVlIGluZGV4LiBJZiB0aGlzIGNvbmRpdGlvbiBob2xkcywgdGhlbiwgZm9yCisg KiBlYWNoIG91dGVyIHJvdywgb25seSBvbmUgaW5uZXIgcm93IG1hdGNoZXMsIGFuZCBpdCBp cyB0aGUgc2FtZSByb3cKKyAqIG9mIHRoZSBzYW1lIHJlbGF0aW9uLiBUaGlzIGFsbG93cyB1 cyB0byByZW1vdmUgdGhlIGpvaW4gYW5kIHJlcGxhY2UKKyAqIGl0IHdpdGggYSBzY2FuIHRo YXQgY29tYmluZXMgV0hFUkUgY2xhdXNlcyBmcm9tIGJvdGggc2lkZXMuIFRoZSBqb2luCisg KiBjbGF1c2VzIHRoZW1zZWx2ZXMgYXNzdW1lIHRoZSBmb3JtIG9mIFggPSBYIGFuZCBjYW4g YmUgcmVwbGFjZWQgd2l0aAorICogTk9UIE5VTEwgY2xhdXNlcy4KKyAqCisgKiBGb3IgdGhl IHNha2Ugb2Ygc2ltcGxpY2l0eSwgd2UgZG9uJ3QgYXBwbHkgdGhpcyBvcHRpbWl6YXRpb24g dG8gc3BlY2lhbAorICogam9pbnMuIEhlcmUgaXMgYSBsaXN0IG9mIHdoYXQgd2UgY291bGQg ZG8gaW4gc29tZSBwYXJ0aWN1bGFyIGNhc2VzOgorICogJ2EgYTEgc2VtaSBqb2luIGEgYTIn OiBpcyByZWR1Y2VkIHRvIGlubmVyIGJ5IHJlZHVjZV91bmlxdWVfc2VtaWpvaW5zLAorICog YW5kIHRoZW4gcmVtb3ZlZCBub3JtYWxseS4KKyAqICdhIGExIGFudGkgam9pbiBhIGEyJzog Y291bGQgc2ltcGxpZnkgdG8gYSBzY2FuIHdpdGggJ291dGVyIHF1YWxzIEFORAorICogKElT IE5VTEwgb24gam9pbiBjb2x1bW5zIE9SIE5PVCBpbm5lciBxdWFscyknLgorICogJ2EgYTEg bGVmdCBqb2luIGEgYTInOiBjb3VsZCBzaW1wbGlmeSB0byBhIHNjYW4gbGlrZSBpbm5lciwg YnV0IHdpdGhvdXQKKyAqIE5PVCBOVUxMIGNvbmRpdGlvbnMgb24gam9pbiBjb2x1bW5zLgor ICogJ2EgYTEgbGVmdCBqb2luIChhIGEyIGpvaW4gYiknOiBjYW4ndCBzaW1wbGlmeSB0aGlz LCBiZWNhdXNlIGpvaW4gdG8gYgorICogY2FuIGJvdGggcmVtb3ZlIHJvd3MgYW5kIGludHJv ZHVjZSBkdXBsaWNhdGVzLgorICoKKyAqIFRvIHNlYXJjaCBmb3IgcmVtb3ZhYmxlIGpvaW5z LCB3ZSBvcmRlciBhbGwgdGhlIHJlbGF0aW9ucyBvbiB0aGVpciBPaWQsCisgKiBnbyBvdmVy IGVhY2ggc2V0IHdpdGggdGhlIHNhbWUgT2lkLCBhbmQgY29uc2lkZXIgZWFjaCBwYWlyIG9m IHJlbGF0aW9ucworICogaW4gdGhpcyBzZXQuIFdlIGNoZWNrIHRoYXQgYm90aCByZWxhdGlv biBhcmUgbWFkZSB1bmlxdWUgYnkgdGhlIHNhbWUKKyAqIHVuaXF1ZSBpbmRleCB3aXRoIHRo ZSBzYW1lIGNsYXVzZXMuCisgKgorICogVG8gcmVtb3ZlIHRoZSBqb2luLCB3ZSBtYXJrIG9u ZSBvZiB0aGUgcGFydGljaXBhdGluZyByZWxhdGlvbnMgYXMKKyAqIGRlYWQsIGFuZCByZXdy aXRlIGFsbCByZWZlcmVuY2VzIHRvIGl0IHRvIHBvaW50IHRvIHRoZSByZW1haW5pbmcKKyAq IHJlbGF0aW9uLiBUaGlzIGluY2x1ZGVzIG1vZGlmeWluZyBSZXN0cmljdEluZm9zLCBFcXVp dmFsZW5jZUNsYXNzZXMgYW5kCisgKiBFcXVpdmFsZW5jZU1lbWJlcnMuIFdlIGFsc28gaGF2 ZSB0byBtb2RpZnkgdGhlIHJvdyBtYXJrcy4gVGhlIGpvaW4gY2xhdXNlcworICogb2YgdGhl IHJlbW92ZWQgcmVsYXRpb24gYmVjb21lIGVpdGhlciByZXN0cmljdGlvbiBvciBqb2luIGNs YXVzZXMsIGJhc2VkIG9uCisgKiB3aGV0aGVyIHRoZXkgcmVmZXJlbmNlIGFueSByZWxhdGlv bnMgbm90IHBhcnRpY2lwYXRpbmcgaW4gdGhlIHJlbW92ZWQgam9pbi4KKyAqCisgKiAndGFy Z2V0bGlzdCcgaXMgdGhlIHRvcC1sZXZlbCB0YXJnZXRsaXN0IG9mIHF1ZXJ5LiBJZiBpdCBo YXMgYW55IHJlZmVyZW5jZXMKKyAqIHRvIHRoZSByZW1vdmVkIHJlbGF0aW9ucywgd2UgdXBk YXRlIHRoZW0gdG8gcG9pbnQgdG8gdGhlIHJlbWFpbmluZyBvbmVzLgorICovCitMaXN0ICoK K3JlbW92ZV91c2VsZXNzX3NlbGZfam9pbnMoUGxhbm5lckluZm8gKnJvb3QsIExpc3QgKmpv aW5saXN0KQoreworCVJlbGlkcyBUb1JlbW92ZSA9IE5VTEw7CisJaW50IHJlbGlkID0gLTE7 CisKKwlpZiAoIWVuYWJsZV9zZWxmX2pvaW5fcmVtb3ZhbCkKKwkJcmV0dXJuIGpvaW5saXN0 OworCisJLyoKKwkgKiBNZXJnZSBwYWlycyBvZiByZWxhdGlvbnMgcGFydGljaXBhdGVkIGlu IHNlbGYtam9pbi4gUmVtb3ZlCisJICogdW5uZWNlc3NhcnkgcmFuZ2UgdGFibGUgZW50cmll cy4KKwkgKi8KKwlUb1JlbW92ZSA9IHJlbW92ZV9zZWxmX2pvaW5zX3JlY3Vyc2Uocm9vdCwg am9pbmxpc3QsIFRvUmVtb3ZlKTsKKwl3aGlsZSAoKHJlbGlkID0gYm1zX25leHRfbWVtYmVy KFRvUmVtb3ZlLCByZWxpZCkpID49IDApCisJeworCQlpbnQgbnJlbW92ZWQgPSAwOworCQlq b2lubGlzdCA9IHJlbW92ZV9yZWxfZnJvbV9qb2lubGlzdChqb2lubGlzdCwgcmVsaWQsICZu cmVtb3ZlZCk7CisJfQorCisJcmV0dXJuIGpvaW5saXN0OworfQpkaWZmIC0tZ2l0IGEvc3Jj L2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vcGxhbm1haW4uYyBiL3NyYy9iYWNrZW5kL29wdGlt aXplci9wbGFuL3BsYW5tYWluLmMKaW5kZXggMjczYWMwYWNmNy4uMjhhNTViMGY0MiAxMDA2 NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vcGxhbm1haW4uYworKysgYi9z cmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9wbGFubWFpbi5jCkBAIC0yMjYsNiArMjI2LDEx IEBAIHF1ZXJ5X3BsYW5uZXIoUGxhbm5lckluZm8gKnJvb3QsCiAJICovCiAJcmVkdWNlX3Vu aXF1ZV9zZW1pam9pbnMocm9vdCk7CiAKKwkvKgorCSAqIFJlbW92ZSBzZWxmIGpvaW5zIG9u IGEgdW5pcXVlIGNvbHVtbi4KKwkgKi8KKwlqb2lubGlzdCA9IHJlbW92ZV91c2VsZXNzX3Nl bGZfam9pbnMocm9vdCwgam9pbmxpc3QpOworCiAJLyoKIAkgKiBOb3cgZGlzdHJpYnV0ZSAi cGxhY2Vob2xkZXJzIiB0byBiYXNlIHJlbHMgYXMgbmVlZGVkLiAgVGhpcyBoYXMgdG8gYmUK IAkgKiBkb25lIGFmdGVyIGpvaW4gcmVtb3ZhbCBiZWNhdXNlIHJlbW92YWwgY291bGQgY2hh bmdlIHdoZXRoZXIgYQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwv am9pbmluZm8uYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL2pvaW5pbmZvLmMKaW5k ZXggNzE3ODA4YjAzNy4uMzg1OWI0ODQzYSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0 aW1pemVyL3V0aWwvam9pbmluZm8uYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRp bC9qb2luaW5mby5jCkBAIC0xMzAsNiArMTMwLDkgQEAgcmVtb3ZlX2pvaW5fY2xhdXNlX2Zy b21fcmVscyhQbGFubmVySW5mbyAqcm9vdCwKIAl7CiAJCVJlbE9wdEluZm8gKnJlbCA9IGZp bmRfYmFzZV9yZWwocm9vdCwgY3VyX3JlbGlkKTsKIAorCQlpZiAoIWxpc3RfbWVtYmVyX3B0 cihyZWwtPmpvaW5pbmZvLCByZXN0cmljdGluZm8pKQorCQkJY29udGludWU7CisKIAkJLyoK IAkJICogUmVtb3ZlIHRoZSByZXN0cmljdGluZm8gZnJvbSB0aGUgbGlzdC4gIFBvaW50ZXIg Y29tcGFyaXNvbiBpcwogCQkgKiBzdWZmaWNpZW50LgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tl bmQvb3B0aW1pemVyL3V0aWwvcmVsbm9kZS5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0 aWwvcmVsbm9kZS5jCmluZGV4IGUxMDVhNGQ1ZjEuLjhhYTg5OTM3NDkgMTAwNjQ0Ci0tLSBh L3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3JlbG5vZGUuYworKysgYi9zcmMvYmFja2Vu ZC9vcHRpbWl6ZXIvdXRpbC9yZWxub2RlLmMKQEAgLTQwLDE0ICs0MCwxMCBAQCB0eXBlZGVm IHN0cnVjdCBKb2luSGFzaEVudHJ5CiAKIHN0YXRpYyB2b2lkIGJ1aWxkX2pvaW5yZWxfdGxp c3QoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKmpvaW5yZWwsCiAJCQkJCQkJCVJl bE9wdEluZm8gKmlucHV0X3JlbCk7Ci1zdGF0aWMgTGlzdCAqYnVpbGRfam9pbnJlbF9yZXN0 cmljdGxpc3QoUGxhbm5lckluZm8gKnJvb3QsCi0JCQkJCQkJCQkJUmVsT3B0SW5mbyAqam9p bnJlbCwKLQkJCQkJCQkJCQlSZWxPcHRJbmZvICpvdXRlcl9yZWwsCi0JCQkJCQkJCQkJUmVs T3B0SW5mbyAqaW5uZXJfcmVsKTsKIHN0YXRpYyB2b2lkIGJ1aWxkX2pvaW5yZWxfam9pbmxp c3QoUmVsT3B0SW5mbyAqam9pbnJlbCwKIAkJCQkJCQkJICAgUmVsT3B0SW5mbyAqb3V0ZXJf cmVsLAogCQkJCQkJCQkgICBSZWxPcHRJbmZvICppbm5lcl9yZWwpOwotc3RhdGljIExpc3Qg KnN1YmJ1aWxkX2pvaW5yZWxfcmVzdHJpY3RsaXN0KFJlbE9wdEluZm8gKmpvaW5yZWwsCitz dGF0aWMgTGlzdCAqc3ViYnVpbGRfam9pbnJlbF9yZXN0cmljdGxpc3QoUmVsaWRzIGpvaW5y ZWxpZHMsCiAJCQkJCQkJCQkJICAgTGlzdCAqam9pbmluZm9fbGlzdCwKIAkJCQkJCQkJCQkg ICBMaXN0ICpuZXdfcmVzdHJpY3RsaXN0KTsKIHN0YXRpYyBMaXN0ICpzdWJidWlsZF9qb2lu cmVsX2pvaW5saXN0KFJlbE9wdEluZm8gKmpvaW5yZWwsCkBAIC01OTksNyArNTk1LDcgQEAg YnVpbGRfam9pbl9yZWwoUGxhbm5lckluZm8gKnJvb3QsCiAJCSAqLwogCQlpZiAocmVzdHJp Y3RsaXN0X3B0cikKIAkJCSpyZXN0cmljdGxpc3RfcHRyID0gYnVpbGRfam9pbnJlbF9yZXN0 cmljdGxpc3Qocm9vdCwKLQkJCQkJCQkJCQkJCQkJICAgam9pbnJlbCwKKwkJCQkJCQkJCQkJ CQkJICAgam9pbnJlbC0+cmVsaWRzLAogCQkJCQkJCQkJCQkJCQkgICBvdXRlcl9yZWwsCiAJ CQkJCQkJCQkJCQkJCSAgIGlubmVyX3JlbCk7CiAJCXJldHVybiBqb2lucmVsOwpAQCAtNzA1 LDcgKzcwMSw3IEBAIGJ1aWxkX2pvaW5fcmVsKFBsYW5uZXJJbmZvICpyb290LAogCSAqIGNh bGxlciBtaWdodCBvciBtaWdodCBub3QgbmVlZCB0aGUgcmVzdHJpY3RsaXN0LCBidXQgSSBu ZWVkIGl0IGFueXdheQogCSAqIGZvciBzZXRfam9pbnJlbF9zaXplX2VzdGltYXRlcygpLikK IAkgKi8KLQlyZXN0cmljdGxpc3QgPSBidWlsZF9qb2lucmVsX3Jlc3RyaWN0bGlzdChyb290 LCBqb2lucmVsLAorCXJlc3RyaWN0bGlzdCA9IGJ1aWxkX2pvaW5yZWxfcmVzdHJpY3RsaXN0 KHJvb3QsIGpvaW5yZWwtPnJlbGlkcywKIAkJCQkJCQkJCQkJICBvdXRlcl9yZWwsIGlubmVy X3JlbCk7CiAJaWYgKHJlc3RyaWN0bGlzdF9wdHIpCiAJCSpyZXN0cmljdGxpc3RfcHRyID0g cmVzdHJpY3RsaXN0OwpAQCAtMTA1Niw3ICsxMDUyLDcgQEAgYnVpbGRfam9pbnJlbF90bGlz dChQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqam9pbnJlbCwKICAqCSAgdGhlIHZh cmlvdXMgam9pbmxpc3QgZW50cmllcyB1bHRpbWF0ZWx5IHJlZmVyIHRvIFJlc3RyaWN0SW5m b3MKICAqCSAgcHVzaGVkIGludG8gdGhlbSBieSBkaXN0cmlidXRlX3Jlc3RyaWN0aW5mb190 b19yZWxzKCkuCiAgKgotICogJ2pvaW5yZWwnIGlzIGEgam9pbiByZWxhdGlvbiBub2RlCisg KiAnam9pbnJlbGlkcycgaXMgYSBqb2luIHJlbGF0aW9uIGlkIHNldAogICogJ291dGVyX3Jl bCcgYW5kICdpbm5lcl9yZWwnIGFyZSBhIHBhaXIgb2YgcmVsYXRpb25zIHRoYXQgY2FuIGJl IGpvaW5lZAogICoJCXRvIGZvcm0gam9pbnJlbC4KICAqCkBAIC0xMDY5LDkgKzEwNjUsOSBA QCBidWlsZF9qb2lucmVsX3RsaXN0KFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpq b2lucmVsLAogICogUmVzdHJpY3RJbmZvIG5vZGVzIGFyZSBubyBsb25nZXIgY29udGV4dC1k ZXBlbmRlbnQuICBJbnN0ZWFkLCBqdXN0IGluY2x1ZGUKICAqIHRoZSBvcmlnaW5hbCBub2Rl cyBpbiB0aGUgbGlzdHMgbWFkZSBmb3IgdGhlIGpvaW4gcmVsYXRpb24uCiAgKi8KLXN0YXRp YyBMaXN0ICoKK0xpc3QgKgogYnVpbGRfam9pbnJlbF9yZXN0cmljdGxpc3QoUGxhbm5lcklu Zm8gKnJvb3QsCi0JCQkJCQkgICBSZWxPcHRJbmZvICpqb2lucmVsLAorCQkJCQkJICAgUmVs aWRzIGpvaW5yZWxpZHMsCiAJCQkJCQkgICBSZWxPcHRJbmZvICpvdXRlcl9yZWwsCiAJCQkJ CQkgICBSZWxPcHRJbmZvICppbm5lcl9yZWwpCiB7CkBAIC0xMDgyLDggKzEwNzgsOCBAQCBi dWlsZF9qb2lucmVsX3Jlc3RyaWN0bGlzdChQbGFubmVySW5mbyAqcm9vdCwKIAkgKiBlbGlt aW5hdGluZyBhbnkgZHVwbGljYXRlcyAoaW1wb3J0YW50IHNpbmNlIHdlIHdpbGwgc2VlIG1h bnkgb2YgdGhlCiAJICogc2FtZSBjbGF1c2VzIGFycml2aW5nIGZyb20gYm90aCBpbnB1dCBy ZWxhdGlvbnMpLgogCSAqLwotCXJlc3VsdCA9IHN1YmJ1aWxkX2pvaW5yZWxfcmVzdHJpY3Rs aXN0KGpvaW5yZWwsIG91dGVyX3JlbC0+am9pbmluZm8sIE5JTCk7Ci0JcmVzdWx0ID0gc3Vi YnVpbGRfam9pbnJlbF9yZXN0cmljdGxpc3Qoam9pbnJlbCwgaW5uZXJfcmVsLT5qb2luaW5m bywgcmVzdWx0KTsKKwlyZXN1bHQgPSBzdWJidWlsZF9qb2lucmVsX3Jlc3RyaWN0bGlzdChq b2lucmVsaWRzLCBvdXRlcl9yZWwtPmpvaW5pbmZvLCBOSUwpOworCXJlc3VsdCA9IHN1YmJ1 aWxkX2pvaW5yZWxfcmVzdHJpY3RsaXN0KGpvaW5yZWxpZHMsIGlubmVyX3JlbC0+am9pbmlu Zm8sIHJlc3VsdCk7CiAKIAkvKgogCSAqIEFkZCBvbiBhbnkgY2xhdXNlcyBkZXJpdmVkIGZy b20gRXF1aXZhbGVuY2VDbGFzc2VzLiAgVGhlc2UgY2Fubm90IGJlCkBAIC0xMDkyLDcgKzEw ODgsNyBAQCBidWlsZF9qb2lucmVsX3Jlc3RyaWN0bGlzdChQbGFubmVySW5mbyAqcm9vdCwK IAkgKi8KIAlyZXN1bHQgPSBsaXN0X2NvbmNhdChyZXN1bHQsCiAJCQkJCQkgZ2VuZXJhdGVf am9pbl9pbXBsaWVkX2VxdWFsaXRpZXMocm9vdCwKLQkJCQkJCQkJCQkJCQkJICBqb2lucmVs LT5yZWxpZHMsCisJCQkJCQkJCQkJCQkJCSAgam9pbnJlbGlkcywKIAkJCQkJCQkJCQkJCQkJ ICBvdXRlcl9yZWwtPnJlbGlkcywKIAkJCQkJCQkJCQkJCQkJICBpbm5lcl9yZWwpKTsKIApA QCAtMTExOCw3ICsxMTE0LDcgQEAgYnVpbGRfam9pbnJlbF9qb2lubGlzdChSZWxPcHRJbmZv ICpqb2lucmVsLAogfQogCiBzdGF0aWMgTGlzdCAqCi1zdWJidWlsZF9qb2lucmVsX3Jlc3Ry aWN0bGlzdChSZWxPcHRJbmZvICpqb2lucmVsLAorc3ViYnVpbGRfam9pbnJlbF9yZXN0cmlj dGxpc3QoUmVsaWRzIGpvaW5yZWxpZHMsCiAJCQkJCQkJICBMaXN0ICpqb2luaW5mb19saXN0 LAogCQkJCQkJCSAgTGlzdCAqbmV3X3Jlc3RyaWN0bGlzdCkKIHsKQEAgLTExMjgsNyArMTEy NCw3IEBAIHN1YmJ1aWxkX2pvaW5yZWxfcmVzdHJpY3RsaXN0KFJlbE9wdEluZm8gKmpvaW5y ZWwsCiAJewogCQlSZXN0cmljdEluZm8gKnJpbmZvID0gKFJlc3RyaWN0SW5mbyAqKSBsZmly c3QobCk7CiAKLQkJaWYgKGJtc19pc19zdWJzZXQocmluZm8tPnJlcXVpcmVkX3JlbGlkcywg am9pbnJlbC0+cmVsaWRzKSkKKwkJaWYgKGJtc19pc19zdWJzZXQocmluZm8tPnJlcXVpcmVk X3JlbGlkcywgam9pbnJlbGlkcykpCiAJCXsKIAkJCS8qCiAJCQkgKiBUaGlzIGNsYXVzZSBi ZWNvbWVzIGEgcmVzdHJpY3Rpb24gY2xhdXNlIGZvciB0aGUgam9pbnJlbCwgc2luY2UKZGlm ZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjLmMgYi9zcmMvYmFja2VuZC91 dGlscy9taXNjL2d1Yy5jCmluZGV4IGYyYzdjMjQ4NmIuLmI0ZDBhNGVkOWYgMTAwNjQ0Ci0t LSBhL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRp bHMvbWlzYy9ndWMuYwpAQCAtMTE1Niw2ICsxMTU2LDE2IEBAIHN0YXRpYyBzdHJ1Y3QgY29u ZmlnX2Jvb2wgQ29uZmlndXJlTmFtZXNCb29sW10gPQogCQl0cnVlLAogCQlOVUxMLCBOVUxM LCBOVUxMCiAJfSwKKwl7CisJCXsiZW5hYmxlX3NlbGZfam9pbl9yZW1vdmFsIiwgUEdDX1VT RVJTRVQsIFFVRVJZX1RVTklOR19NRVRIT0QsCisJCQlnZXR0ZXh0X25vb3AoIkVuYWJsZSBy ZW1vdmFsIG9mIHVuaXF1ZSBzZWxmLWpvaW5zLiIpLAorCQkJTlVMTCwKKwkJCUdVQ19FWFBM QUlOCisJCX0sCisJCSZlbmFibGVfc2VsZl9qb2luX3JlbW92YWwsCisJCXRydWUsCisJCU5V TEwsIE5VTEwsIE5VTEwKKwl9LAogCXsKIAkJeyJnZXFvIiwgUEdDX1VTRVJTRVQsIFFVRVJZ X1RVTklOR19HRVFPLAogCQkJZ2V0dGV4dF9ub29wKCJFbmFibGVzIGdlbmV0aWMgcXVlcnkg b3B0aW1pemF0aW9uLiIpLApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3Bh dGhub2RlLmggYi9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aG5vZGUuaAppbmRleCA1MzI2 MWVlOTFmLi41NGQxYTQ1ZmM1IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIv cGF0aG5vZGUuaAorKysgYi9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aG5vZGUuaApAQCAt MzA2LDYgKzMwNiwxMCBAQCBleHRlcm4gUmVsT3B0SW5mbyAqYnVpbGRfam9pbl9yZWwoUGxh bm5lckluZm8gKnJvb3QsCiAJCQkJCQkJCSAgUmVsT3B0SW5mbyAqaW5uZXJfcmVsLAogCQkJ CQkJCQkgIFNwZWNpYWxKb2luSW5mbyAqc2ppbmZvLAogCQkJCQkJCQkgIExpc3QgKipyZXN0 cmljdGxpc3RfcHRyKTsKK2V4dGVybiBMaXN0ICpidWlsZF9qb2lucmVsX3Jlc3RyaWN0bGlz dChQbGFubmVySW5mbyAqcm9vdCwKKwkJCQkJCSAgIFJlbGlkcyBqb2lucmVsaWRzLAorCQkJ CQkJICAgUmVsT3B0SW5mbyAqb3V0ZXJfcmVsLAorCQkJCQkJICAgUmVsT3B0SW5mbyAqaW5u ZXJfcmVsKTsKIGV4dGVybiBSZWxpZHMgbWluX2pvaW5fcGFyYW1ldGVyaXphdGlvbihQbGFu bmVySW5mbyAqcm9vdCwKIAkJCQkJCQkJCQlSZWxpZHMgam9pbnJlbGlkcywKIAkJCQkJCQkJ CQlSZWxPcHRJbmZvICpvdXRlcl9yZWwsCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9vcHRp bWl6ZXIvcGxhbm1haW4uaCBiL3NyYy9pbmNsdWRlL29wdGltaXplci9wbGFubWFpbi5oCmlu ZGV4IGJmMWFkZmM1MmEuLjYyOWJkYTRiMGIgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29w dGltaXplci9wbGFubWFpbi5oCisrKyBiL3NyYy9pbmNsdWRlL29wdGltaXplci9wbGFubWFp bi5oCkBAIC0yMCw2ICsyMCw3IEBACiAvKiBHVUMgcGFyYW1ldGVycyAqLwogI2RlZmluZSBE RUZBVUxUX0NVUlNPUl9UVVBMRV9GUkFDVElPTiAwLjEKIGV4dGVybiBkb3VibGUgY3Vyc29y X3R1cGxlX2ZyYWN0aW9uOworZXh0ZXJuIGJvb2wgZW5hYmxlX3NlbGZfam9pbl9yZW1vdmFs OwogCiAvKiBxdWVyeV9wbGFubmVyIGNhbGxiYWNrIHRvIGNvbXB1dGUgcXVlcnlfcGF0aGtl eXMgKi8KIHR5cGVkZWYgdm9pZCAoKnF1ZXJ5X3BhdGhrZXlzX2NhbGxiYWNrKSAoUGxhbm5l ckluZm8gKnJvb3QsIHZvaWQgKmV4dHJhKTsKQEAgLTEwNyw2ICsxMDgsNyBAQCBleHRlcm4g Ym9vbCBxdWVyeV9pc19kaXN0aW5jdF9mb3IoUXVlcnkgKnF1ZXJ5LCBMaXN0ICpjb2xub3Ms IExpc3QgKm9waWRzKTsKIGV4dGVybiBib29sIGlubmVycmVsX2lzX3VuaXF1ZShQbGFubmVy SW5mbyAqcm9vdCwKIAkJCQkJCQkgICBSZWxpZHMgam9pbnJlbGlkcywgUmVsaWRzIG91dGVy cmVsaWRzLCBSZWxPcHRJbmZvICppbm5lcnJlbCwKIAkJCQkJCQkgICBKb2luVHlwZSBqb2lu dHlwZSwgTGlzdCAqcmVzdHJpY3RsaXN0LCBib29sIGZvcmNlX2NhY2hlKTsKK2V4dGVybiBM aXN0ICogcmVtb3ZlX3VzZWxlc3Nfc2VsZl9qb2lucyhQbGFubmVySW5mbyAqcm9vdCwgTGlz dCAqam9pbnRyZWUpOwogCiAvKgogICogcHJvdG90eXBlcyBmb3IgcGxhbi9zZXRyZWZzLmMK ZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZXF1aXZjbGFzcy5vdXQg Yi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2VxdWl2Y2xhc3Mub3V0CmluZGV4IDEyNmY3 MDQ3ZmUuLmRlNzE0NDEwNTIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvZXF1aXZjbGFzcy5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9lcXVp dmNsYXNzLm91dApAQCAtNDMwLDYgKzQzMCwzOCBAQCBleHBsYWluIChjb3N0cyBvZmYpCiAg ICBGaWx0ZXI6ICgodW5pcXVlMSBJUyBOT1QgTlVMTCkgQU5EICh1bmlxdWUyIElTIE5PVCBO VUxMKSkKICgyIHJvd3MpCiAKKy0tIFRlc3QgdGhhdCBicm9rZW4gRUNzIGFyZSBwcm9jZXNz ZWQgY29ycmVjdGx5IGR1cmluZyBzZWxmIGpvaW4gcmVtb3ZhbC4KKy0tIERpc2FibGUgbWVy Z2Ugam9pbnMgc28gdGhhdCB3ZSBkb24ndCBnZXQgYW4gZXJyb3IgYWJvdXQgbWlzc2luZyBj b21tdXRhdG9yLgorLS0gVGVzdCBib3RoIG9yaWVudGF0aW9ucyBvZiB0aGUgam9pbiBjbGF1 c2UsIGJlY2F1c2Ugb25seSBvbmUgb2YgdGhlbSBicmVha3MKKy0tIHRoZSBFQy4KK3NldCBl bmFibGVfbWVyZ2Vqb2luIHRvIG9mZjsKK2V4cGxhaW4gKGNvc3RzIG9mZikKKyAgc2VsZWN0 ICogZnJvbSBlYzAgbSBqb2luIGVjMCBuIG9uIG0uZmYgPSBuLmZmCisgIGpvaW4gZWMxIHAg b24gbS5mZiArIG4uZmYgPSBwLmYxOworICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKChuLmZmICsgbi5mZikgPSBwLmYxKQor ICAgLT4gIFNlcSBTY2FuIG9uIGVjMSBwCisgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAg IC0+ICBTZXEgU2NhbiBvbiBlYzAgbgorICAgICAgICAgICAgICAgRmlsdGVyOiAoZmYgSVMg Tk9UIE5VTEwpCisoNiByb3dzKQorCitleHBsYWluIChjb3N0cyBvZmYpCisgIHNlbGVjdCAq IGZyb20gZWMwIG0gam9pbiBlYzAgbiBvbiBtLmZmID0gbi5mZgorICBqb2luIGVjMSBwIG9u IHAuZjE6OmludDggPSAobS5mZiArIG4uZmYpOjppbnQ4YWxpYXMxOworICAgICAgICAgICAg ICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6ICgocC5mMSk6OmJpZ2lu dCA9ICgobi5mZiArIG4uZmYpKTo6aW50OGFsaWFzMSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBl YzEgcAorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gZWMw IG4KKyAgICAgICAgICAgICAgIEZpbHRlcjogKGZmIElTIE5PVCBOVUxMKQorKDYgcm93cykK KworcmVzZXQgZW5hYmxlX21lcmdlam9pbjsKIC0tIHRoaXMgY291bGQgYmUgY29udmVydGVk LCBidXQgaXNuJ3QgYXQgcHJlc2VudAogZXhwbGFpbiAoY29zdHMgb2ZmKQogICBzZWxlY3Qg KiBmcm9tIHRlbmsxIHdoZXJlIHVuaXF1ZTEgPSB1bmlxdWUxIG9yIHVuaXF1ZTIgPSB1bmlx dWUyOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dCBi L3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQKaW5kZXggODZmZDM5MDdjNS4u N2NkMTNjMmIzMyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2lu Lm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0CkBAIC00ODgw LDYgKzQ4ODAsMzM3IEBAIHNlbGVjdCAqIGZyb20KIC0tLS0rLS0tLSstLS0tKy0tLS0KICgw IHJvd3MpCiAKKy0tCistLSB0ZXN0IHRoYXQgc2VtaS0gb3IgaW5uZXIgc2VsZi1qb2lucyBv biBhIHVuaXF1ZSBjb2x1bW4gYXJlIHJlbW92ZWQKKy0tCistLSBlbmFibGUgb25seSBuZXN0 bG9vcCB0byBnZXQgbW9yZSBwcmVkaWN0YWJsZSBwbGFucworc2V0IGVuYWJsZV9oYXNoam9p biB0byBvZmY7CitzZXQgZW5hYmxlX21lcmdlam9pbiB0byBvZmY7CitjcmVhdGUgdGFibGUg c2ogKGEgaW50IHVuaXF1ZSwgYiBpbnQpOworaW5zZXJ0IGludG8gc2ogdmFsdWVzICgxLCBu dWxsKSwgKG51bGwsIDIpLCAoMiwgMSk7CithbmFseXplIHNqOworc2VsZWN0IHAuKiBmcm9t IHNqIHAsIHNqIHEgd2hlcmUgcS5hID0gcC5hIGFuZCBxLmIgPSBxLmEgLSAxOworIGEgfCBi IAorLS0tKy0tLQorIDIgfCAxCisoMSByb3cpCisKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3Nl bGVjdCBwLiogZnJvbSBzaiBwLCBzaiBxIHdoZXJlIHEuYSA9IHAuYSBhbmQgcS5iID0gcS5h IC0gMTsKKyAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNl cSBTY2FuIG9uIHNqIHEKKyAgIEZpbHRlcjogKChhIElTIE5PVCBOVUxMKSBBTkQgKGIgPSAo YSAtIDEpKSkKKygyIHJvd3MpCisKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZy b20gc2ogcAord2hlcmUgZXhpc3RzIChzZWxlY3QgKiBmcm9tIHNqIHEKKwkJCQl3aGVyZSBx LmEgPSBwLmEgYW5kIHEuYiA8IDEwKTsKKyAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAg ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCisgU2VxIFNjYW4gb24gc2ogcQorICAgRmlsdGVyOiAoKGEgSVMgTk9UIE5VTEwpIEFO RCAoYiA8IDEwKSkKKygyIHJvd3MpCisKKy0tIERvdWJsZSBzZWxmLWpvaW4gcmVtb3ZhbC4K Ky0tIFVzZSBhIGNvbmRpdGlvbiBvbiAiYiArIDEiLCBub3Qgb24gImIiLCBmb3IgdGhlIHNl Y29uZCBqb2luLCBzbyB0aGF0CistLSB0aGUgZXF1aXZhbGVuY2UgY2xhc3MgaXMgZGlmZmVy ZW50IGZyb20gdGhlIGZpcnN0IG9uZSwgYW5kIHdlIGNhbgorLS0gdGVzdCB0aGUgbm9uLWVj IGNvZGUgcGF0aC4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogdDEg am9pbiBzaiB0MiBvbiB0MS5hID0gdDIuYSBhbmQgdDEuYiA9IHQyLmIKKwlqb2luIHNqIHQz IG9uIHQyLmEgPSB0My5hIGFuZCB0Mi5iICsgMSA9IHQzLmIgKyAxOworICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBzaiB0Mwor ICAgRmlsdGVyOiAoKGEgSVMgTk9UIE5VTEwpIEFORCAoYiBJUyBOT1QgTlVMTCkgQU5EICgo YiArIDEpIElTIE5PVCBOVUxMKSkKKygyIHJvd3MpCisKKy0tIHN1YnNlbGVjdCB0aGF0IHJl ZmVyZW5jZXMgdGhlIHJlbW92ZWQgcmVsYXRpb24KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3Nl bGVjdCB0MS5hLCAoc2VsZWN0IGEgZnJvbSBzaiB3aGVyZSBhID0gdDIuYSBhbmQgYSA9IHQx LmEpCitmcm9tIHNqIHQxLCBzaiB0Mgord2hlcmUgdDEuYSA9IHQyLmE7CisgICAgICAgICAg ICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHNqIHQyCisgICBGaWx0ZXI6 IChhIElTIE5PVCBOVUxMKQorICAgU3ViUGxhbiAxCisgICAgIC0+ICBSZXN1bHQKKyAgICAg ICAgICAgT25lLVRpbWUgRmlsdGVyOiAodDIuYSA9IHQyLmEpCisgICAgICAgICAgIC0+ICBT ZXEgU2NhbiBvbiBzagorICAgICAgICAgICAgICAgICBGaWx0ZXI6IChhID0gdDIuYSkKKyg3 IHJvd3MpCisKKy0tIHNlbGYtam9pbiB1bmRlciBvdXRlciBqb2luCitleHBsYWluIChjb3N0 cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHggam9pbiBzaiB5IG9uIHguYSA9IHkuYQorbGVm dCBqb2luIGludDhfdGJsIHogb24geC5hID0gei5xMTsKKyAgICAgICAgICAgICBRVUVSWSBQ TEFOICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgTmVzdGVkIExvb3AgTGVmdCBKb2luCisgICBKb2luIEZpbHRlcjogKHkuYSA9IHoucTEp CisgICAtPiAgU2VxIFNjYW4gb24gc2ogeQorICAgICAgICAgRmlsdGVyOiAoYSBJUyBOT1Qg TlVMTCkKKyAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGlu dDhfdGJsIHoKKyg2IHJvd3MpCisKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZy b20gc2ogeCBqb2luIHNqIHkgb24geC5hID0geS5hCitsZWZ0IGpvaW4gaW50OF90YmwgeiBv biB5LmEgPSB6LnExOworICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBMZWZ0 IEpvaW4KKyAgIEpvaW4gRmlsdGVyOiAoeS5hID0gei5xMSkKKyAgIC0+ICBTZXEgU2NhbiBv biBzaiB5CisgICAgICAgICBGaWx0ZXI6IChhIElTIE5PVCBOVUxMKQorICAgLT4gIE1hdGVy aWFsaXplCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gaW50OF90YmwgegorKDYgcm93cykK KworLS0gVGVzdCB0aGF0IHBsYWNlaG9sZGVycyBhcmUgdXBkYXRlZCBjb3JyZWN0bHkgYWZ0 ZXIgam9pbiByZW1vdmFsCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tICh2 YWx1ZXMgKDEpKSB4CitsZWZ0IGpvaW4gKHNlbGVjdCBjb2FsZXNjZSh5LnExLCAxKSBmcm9t IGludDhfdGJsIHkKKwlyaWdodCBqb2luIHNqIGoxIGlubmVyIGpvaW4gc2ogajIgb24gajEu YSA9IGoyLmEKKwlvbiB0cnVlKSB6CitvbiB0cnVlOworICAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgIC0+ICBSZXN1bHQKKyAg IC0+ICBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBz aiBqMgorICAgICAgICAgICAgICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKyAgICAgICAg IC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGludDhf dGJsIHkKKyg3IHJvd3MpCisKKy0tIFRlc3QgdGhhdCBPUiBwcmVkaWNhdGVkIGFyZSB1cGRh dGVkIGNvcnJlY3RseSBhZnRlciBqb2luIHJlbW92YWwKK0NSRUFURSBUQUJMRSB0YWJfd2l0 aF9mbGFnICggaWQgSU5UIFBSSU1BUlkgS0VZLCBpc19mbGFnIFNNQUxMSU5UKTsKK0NSRUFU RSBJTkRFWCBpZHhfdGVzdF9pc19mbGFnIE9OIHRhYl93aXRoX2ZsYWcgKGlzX2ZsYWcpOwor ZXhwbGFpbiAoY29zdHMgb2ZmKQorU0VMRUNUIENPVU5UKCopIEZST00gdGFiX3dpdGhfZmxh ZyBXSEVSRSAoaXNfZmxhZyBJUyBOVUxMIE9SIGlzX2ZsYWcgPSAwKSBBTkQgaWQgSU4gKFNF TEVDVCBpZCBGUk9NIHRhYl93aXRoX2ZsYWcgV0hFUkUgaWQgSU4gKDIsIDMpKTsKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBBZ2dyZWdhdGUKKyAgIC0+ICBCaXRtYXAgSGVhcCBTY2FuIG9uIHRhYl93aXRoX2ZsYWcK KyAgICAgICAgIFJlY2hlY2sgQ29uZDogKChpZCA9IEFOWSAoJ3syLDN9Jzo6aW50ZWdlcltd KSkgQU5EIChpZCBJUyBOT1QgTlVMTCkpCisgICAgICAgICBGaWx0ZXI6ICgoaXNfZmxhZyBJ UyBOVUxMKSBPUiAoaXNfZmxhZyA9IDApKQorICAgICAgICAgLT4gIEJpdG1hcCBJbmRleCBT Y2FuIG9uIHRhYl93aXRoX2ZsYWdfcGtleQorICAgICAgICAgICAgICAgSW5kZXggQ29uZDog KChpZCA9IEFOWSAoJ3syLDN9Jzo6aW50ZWdlcltdKSkgQU5EIChpZCBJUyBOT1QgTlVMTCkp CisoNiByb3dzKQorCitEUk9QIFRBQkxFIHRhYl93aXRoX2ZsYWc7CistLSBIQVZJTkcgY2xh dXNlCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgcC5iIGZyb20gc2ogcCBqb2luIHNq IHEgb24gcC5hID0gcS5hIGdyb3VwIGJ5IHAuYiBoYXZpbmcgc3VtKHAuYSkgPSAxOworICAg ICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBIYXNoQWdncmVnYXRlCisgICBHcm91cCBLZXk6IHEuYgorICAgRmls dGVyOiAoc3VtKHEuYSkgPSAxKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIHEKKyAgICAgICAg IEZpbHRlcjogKGEgSVMgTk9UIE5VTEwpCisoNSByb3dzKQorCistLSB1cGRhdGUgbGF0ZXJh bCByZWZlcmVuY2VzIGFuZCByYW5nZSB0YWJsZSBlbnRyeSByZWZlcmVuY2UKK2V4cGxhaW4g KHZlcmJvc2UsIGNvc3RzIG9mZikKK3NlbGVjdCAxIGZyb20gKHNlbGVjdCB4LiogZnJvbSBz aiB4LCBzaiB5IHdoZXJlIHguYSA9IHkuYSkgcSwKKyAgbGF0ZXJhbCBnZW5lcmF0ZV9zZXJp ZXMoMSwgcS5hKSBncyhpKTsKKyAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAg ICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIE91dHB1dDogMQorICAg LT4gIFNlcSBTY2FuIG9uIHB1YmxpYy5zaiB5CisgICAgICAgICBPdXRwdXQ6IHkuYSwgeS5i CisgICAgICAgICBGaWx0ZXI6ICh5LmEgSVMgTk9UIE5VTEwpCisgICAtPiAgRnVuY3Rpb24g U2NhbiBvbiBwZ19jYXRhbG9nLmdlbmVyYXRlX3NlcmllcyBncworICAgICAgICAgT3V0cHV0 OiBncy5pCisgICAgICAgICBGdW5jdGlvbiBDYWxsOiBnZW5lcmF0ZV9zZXJpZXMoMSwgeS5h KQorKDggcm93cykKKworZXhwbGFpbiAodmVyYm9zZSwgY29zdHMgb2ZmKQorc2VsZWN0IDEg ZnJvbSAoc2VsZWN0IHkuKiBmcm9tIHNqIHgsIHNqIHkgd2hlcmUgeC5hID0geS5hKSBxLAor ICBsYXRlcmFsIGdlbmVyYXRlX3NlcmllcygxLCBxLmEpIGdzKGkpOworICAgICAgICAgICAg ICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQg TG9vcAorICAgT3V0cHV0OiAxCisgICAtPiAgU2VxIFNjYW4gb24gcHVibGljLnNqIHkKKyAg ICAgICAgIE91dHB1dDogeS5hLCB5LmIKKyAgICAgICAgIEZpbHRlcjogKHkuYSBJUyBOT1Qg TlVMTCkKKyAgIC0+ICBGdW5jdGlvbiBTY2FuIG9uIHBnX2NhdGFsb2cuZ2VuZXJhdGVfc2Vy aWVzIGdzCisgICAgICAgICBPdXRwdXQ6IGdzLmkKKyAgICAgICAgIEZ1bmN0aW9uIENhbGw6 IGdlbmVyYXRlX3NlcmllcygxLCB5LmEpCisoOCByb3dzKQorCistLSBUZXN0IHRoYXQgYSBu b24tRUMtZGVyaXZlZCBqb2luIGNsYXVzZSBpcyBwcm9jZXNzZWQgY29ycmVjdGx5LiBVc2Ug YW4KKy0tIG91dGVyIGpvaW4gc28gdGhhdCB3ZSBjYW4ndCBmb3JtIGFuIEVDLgorZXhwbGFp biAoY29zdHMgb2ZmKSBzZWxlY3QgKiBmcm9tIHNqIHAgam9pbiBzaiBxIG9uIHAuYSA9IHEu YQorICBsZWZ0IGpvaW4gc2ogciBvbiBwLmEgKyBxLmEgPSByLmE7CisgICAgICAgICAgICAg UVVFUlkgUExBTiAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIE5lc3RlZCBMb29wIExlZnQgSm9pbgorICAgSm9pbiBGaWx0ZXI6ICgocS5h ICsgcS5hKSA9IHIuYSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBxCisgICAgICAgICBGaWx0 ZXI6IChhIElTIE5PVCBOVUxMKQorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAg U2VxIFNjYW4gb24gc2ogcgorKDYgcm93cykKKworLS0gRklYTUUgdGhpcyBjb25zdGFudCBm YWxzZSBmaWx0ZXIgZG9lc24ndCBsb29rIGdvb2QuIFNob3VsZCB3ZSBtZXJnZQorLS0gZXF1 aXZhbGVuY2UgY2xhc3Nlcz8KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20g c2ogcCwgc2ogcSB3aGVyZSBwLmEgPSBxLmEgYW5kIHAuYiA9IDEgYW5kIHEuYiA9IDI7Cisg ICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBTZXEgU2NhbiBvbiBzaiBxCisgICBGaWx0ZXI6ICgoYSBJUyBOT1QgTlVMTCkgQU5EIChi ID0gMikgQU5EIChiID0gMSkpCisoMiByb3dzKQorCistLSBDaGVjayB0aGF0IGF0dHJfbmVl ZGVkIGlzIHVwZGF0ZWQgY29ycmVjdGx5IGFmdGVyIHNlbGYtam9pbiByZW1vdmFsLiBJbiB0 aGlzCistLSB0ZXN0LCB0aGUgam9pbiBvZiBqMSB3aXRoIGoyIGlzIHJlbW92ZWQuIGsxLmIg aXMgcmVxdWlyZWQgYXQgZWl0aGVyIGoxIG9yIGoyLgorLS0gSWYgdGhpcyBpbmZvIGlzIGxv c3QsIGpvaW4gdGFyZ2V0bGlzdCBmb3IgKGsxLCBrMikgd2lsbCBub3QgY29udGFpbiBrMS5i LgorLS0gVXNlIGluZGV4IHNjYW4gZm9yIGsxIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0ICdiJyBm cm9tIHBoeXNpY2FsIHRsaXN0IHVzZWQgZm9yCistLSBzZXFzY2FuLiBBbHNvIGRpc2FibGUg cmVvcmRlcmluZyBvZiBqb2lucyBiZWNhdXNlIHRoaXMgdGVzdCBkZXBlbmRzIG9uIGEKKy0t IHBhcnRpY3VsYXIgam9pbiB0cmVlLgorY3JlYXRlIHRhYmxlIHNrIChhIGludCwgYiBpbnQp OworY3JlYXRlIGluZGV4IG9uIHNrKGEpOworc2V0IGpvaW5fY29sbGFwc2VfbGltaXQgdG8g MTsKK3NldCBlbmFibGVfc2Vxc2NhbiB0byBvZmY7CitleHBsYWluIChjb3N0cyBvZmYpIHNl bGVjdCAxIGZyb20KKwkoc2sgazEgam9pbiBzayBrMiBvbiBrMS5hID0gazIuYSkKKwlqb2lu IChzaiBqMSBqb2luIHNqIGoyIG9uIGoxLmEgPSBqMi5hKSBvbiBqMS5iID0gazEuYjsKKyAg ICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKGsxLmIgPSBqMi5iKQorICAgLT4gIE5l c3RlZCBMb29wCisgICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyBza19hX2lkeCBvbiBz ayBrMQorICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyBza19hX2lkeCBvbiBz ayBrMgorICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGEgPSBrMS5hKQorICAgLT4gIE1h dGVyaWFsaXplCisgICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyBzal9hX2tleSBvbiBz aiBqMgorICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGEgSVMgTk9UIE5VTEwpCisoOSBy b3dzKQorCitleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCAxIGZyb20KKwkoc2sgazEgam9p biBzayBrMiBvbiBrMS5hID0gazIuYSkKKwlqb2luIChzaiBqMSBqb2luIHNqIGoyIG9uIGox LmEgPSBqMi5hKSBvbiBqMi5iID0gazEuYjsKKyAgICAgICAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZp bHRlcjogKGsxLmIgPSBqMi5iKQorICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICAtPiAg SW5kZXggU2NhbiB1c2luZyBza19hX2lkeCBvbiBzayBrMQorICAgICAgICAgLT4gIEluZGV4 IE9ubHkgU2NhbiB1c2luZyBza19hX2lkeCBvbiBzayBrMgorICAgICAgICAgICAgICAgSW5k ZXggQ29uZDogKGEgPSBrMS5hKQorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAg SW5kZXggU2NhbiB1c2luZyBzal9hX2tleSBvbiBzaiBqMgorICAgICAgICAgICAgICAgSW5k ZXggQ29uZDogKGEgSVMgTk9UIE5VTEwpCisoOSByb3dzKQorCityZXNldCBqb2luX2NvbGxh cHNlX2xpbWl0OworcmVzZXQgZW5hYmxlX3NlcXNjYW47CistLSBDaGVjayB0aGF0IGNsYXVz ZXMgZnJvbSB0aGUgam9pbiBmaWx0ZXIgbGlzdCBpcyBub3QgbG9zdCBvbiB0aGUgc2VsZi1q b2luIHJlbW92YWwKK0NSRUFURSBUQUJMRSBlbXAxICggaWQgU0VSSUFMIFBSSU1BUlkgS0VZ IE5PVCBOVUxMLCBjb2RlIGludCk7CitleHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYpCitT RUxFQ1QgKiBGUk9NIGVtcDEgZTEsIGVtcDEgZTIgV0hFUkUgZTEuaWQgPSBlMi5pZCBBTkQg ZTIuY29kZSA8PiBlMS5jb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExB TiAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHB1YmxpYy5l bXAxIGUyCisgICBPdXRwdXQ6IGUyLmlkLCBlMi5jb2RlLCBlMi5pZCwgZTIuY29kZQorICAg RmlsdGVyOiAoKGUyLmlkIElTIE5PVCBOVUxMKSBBTkQgKGUyLmNvZGUgPD4gZTIuY29kZSkp CisoMyByb3dzKQorCistLSBXZSBjYW4gcmVtb3ZlIHRoZSBqb2luIGV2ZW4gaWYgd2UgZmlu ZCB0aGUgam9pbiBjYW4ndCBkdXBsaWNhdGUgcm93cyBhbmQKKy0tIHRoZSBiYXNlIHF1YWxz IG9mIGVhY2ggc2lkZSBhcmUgZGlmZmVyZW50LiAgSW4gdGhlIGZvbGxvd2luZyBjYXNlIHdl IGVuZCB1cAorLS0gbW92aW5nIHF1YWxzIG92ZXIgdG8gczEgdG8gbWFrZSBpdCBzbyBpdCBj YW4ndCBtYXRjaCBhbnkgcm93cy4KK2NyZWF0ZSB0YWJsZSBzbChhIGludCwgYiBpbnQpOwor Y3JlYXRlIHVuaXF1ZSBpbmRleCBvbiBzbChhLCBiKTsKK3ZhY3V1bSBhbmFseXplIHNsOwor LS0gQm90aCBzaWRlcyBhcmUgdW5pcXVlLCBidXQgYmFzZSBxdWFscyBhcmUgZGlmZmVyZW50 CitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNsIHQxLCBzbCB0MiB3aGVy ZSB0MS5hID0gdDIuYSBhbmQgdDEuYiA9IDEgYW5kIHQyLmIgPSAyOworICAgICAgICAgICAg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4g b24gc2wgdDIKKyAgIEZpbHRlcjogKChhIElTIE5PVCBOVUxMKSBBTkQgKGIgPSAyKSBBTkQg KGIgPSAxKSkKKygyIHJvd3MpCisKKy0tCistLS0tIE9ubHkgb25lIHNpZGUgaXMgdW5xaXVl CistLXNlbGVjdCAqIGZyb20gc2wgdDEsIHNsIHQyIHdoZXJlIHQxLmEgPSB0Mi5hIGFuZCB0 MS5iID0gMTsKKy0tc2VsZWN0ICogZnJvbSBzbCB0MSwgc2wgdDIgd2hlcmUgdDEuYSA9IHQy LmEgYW5kIHQyLmIgPSAxOworLS0KKy0tLS0gU2V2ZXJhbCB1bmlxdWVzIGluZGV4ZXMgbWF0 Y2gsIGFuZCB3ZSBzZWxlY3QgYSBkaWZmZXJlbnQgb25lCistLS0tIGZvciBlYWNoIHNpZGUs IHNvIHRoZSBqb2luIGlzIG5vdCByZW1vdmVkCistLWNyZWF0ZSB0YWJsZSBzbShhIGludCB1 bmlxdWUsIGIgaW50IHVuaXF1ZSwgYyBpbnQgdW5pcXVlKTsKKy0tZXhwbGFpbiAoY29zdHMg b2ZmKQorLS1zZWxlY3QgKiBmcm9tIHNtIG0sIHNtIG4gd2hlcmUgbS5hID0gbi5iIGFuZCBt LmMgPSBuLmM7CistLWV4cGxhaW4gKGNvc3RzIG9mZikKKy0tc2VsZWN0ICogZnJvbSBzbSBt LCBzbSBuIHdoZXJlIG0uYSA9IG4uYyBhbmQgbS5iID0gbi5iOworLS1leHBsYWluIChjb3N0 cyBvZmYpCistLXNlbGVjdCAqIGZyb20gc20gbSwgc20gbiB3aGVyZSBtLmMgPSBuLmIgYW5k IG0uYSA9IG4uYTsKKy0tIENoZWNrIG9wdGltaXphdGlvbiBkaXNhYmxpbmcgaWYgaXQgd2ls bCB2aW9sYXRlIHNwZWNpYWwgam9pbiBjb25kaXRpb25zLgorLS0gVHdvIGlkZW50aWNhbCBq b2luZWQgcmVsYXRpb25zIHNhdGlzZmllcyBzZWxmIGpvaW4gcmVtb3ZhbCBjb25kaXRpb25z IGJ1dAorLS0gc3RheSBpbiBkaWZmZXJlbnQgc3BlY2lhbCBqb2luIGluZm9zLgorQ1JFQVRF IFRBQkxFIHNqX3QxIChpZCBzZXJpYWwsIGEgaW50KTsKK0NSRUFURSBUQUJMRSBzal90MiAo aWQgc2VyaWFsLCBhIGludCk7CitDUkVBVEUgVEFCTEUgc2pfdDMgKGlkIHNlcmlhbCwgYSBp bnQpOworQ1JFQVRFIFRBQkxFIHNqX3Q0IChpZCBzZXJpYWwsIGEgaW50KTsKK0NSRUFURSBV TklRVUUgSU5ERVggT04gc2pfdDMgVVNJTkcgYnRyZWUgKGEsaWQpOworQ1JFQVRFIFVOSVFV RSBJTkRFWCBPTiBzal90MiBVU0lORyBidHJlZSAoaWQpOworRVhQTEFJTiAoQ09TVFMgT0ZG KQorU0VMRUNUICogRlJPTSBzal90MQorSk9JTiAoCisJU0VMRUNUIHNqX3QyLmlkIEFTIGlk IEZST00gc2pfdDIKKwlXSEVSRSBFWElTVFMKKwkJKAorCQlTRUxFQ1QgVFJVRSBGUk9NIHNq X3QzLHNqX3Q0IFdIRVJFIHNqX3QzLmEgPSAxIEFORCBzal90My5pZCA9IHNqX3QyLmlkCisJ CSkKKwkpIHQydDN0NAorT04gc2pfdDEuaWQgPSB0MnQzdDQuaWQKK0pPSU4gKAorCVNFTEVD VCBzal90Mi5pZCBBUyBpZCBGUk9NIHNqX3QyCisJV0hFUkUgRVhJU1RTCisJCSgKKwkJU0VM RUNUIFRSVUUgRlJPTSBzal90Myxzal90NCBXSEVSRSBzal90My5hID0gMSBBTkQgc2pfdDMu aWQgPSBzal90Mi5pZAorCQkpCisJKSBfdDJ0M3Q0CitPTiBzal90MS5pZCA9IF90MnQzdDQu aWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAoc2pfdDMu aWQgPSBzal90MS5pZCkKKyAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAgSm9pbiBGaWx0 ZXI6IChzal90My5pZCA9IHNqX3QyLmlkKQorICAgICAgICAgLT4gIE5lc3RlZCBMb29wIFNl bWkgSm9pbgorICAgICAgICAgICAgICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICAgICAg ICAgICAgICAtPiAgSGFzaEFnZ3JlZ2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAg R3JvdXAgS2V5OiBzal90My5pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIE5l c3RlZCBMb29wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgU2VxIFNj YW4gb24gc2pfdDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBNYXRl cmlhbGl6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIEJp dG1hcCBIZWFwIFNjYW4gb24gc2pfdDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFJlY2hlY2sgQ29uZDogKGEgPSAxKQorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIEJpdG1hcCBJbmRleCBTY2FuIG9u IHNqX3QzX2FfaWRfaWR4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBJbmRleCBDb25kOiAoYSA9IDEpCisgICAgICAgICAgICAgICAgICAg ICAtPiAgSW5kZXggT25seSBTY2FuIHVzaW5nIHNqX3QyX2lkX2lkeCBvbiBzal90MiBzal90 Ml8xCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoaWQgPSBzal90 My5pZCkKKyAgICAgICAgICAgICAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAgICAgICAg ICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyBzal90M19hX2lkX2lkeCBvbiBzal90 MyBzal90M18xCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoKGEg PSAxKSBBTkQgKGlkID0gc2pfdDMuaWQpKQorICAgICAgICAgICAgICAgICAgICAgLT4gIFNl cSBTY2FuIG9uIHNqX3Q0IHNqX3Q0XzEKKyAgICAgICAgIC0+ICBJbmRleCBPbmx5IFNjYW4g dXNpbmcgc2pfdDJfaWRfaWR4IG9uIHNqX3QyCisgICAgICAgICAgICAgICBJbmRleCBDb25k OiAoaWQgPSBzal90Ml8xLmlkKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqX3QxCisoMjQgcm93 cykKKworcmVzZXQgZW5hYmxlX2hhc2hqb2luOworcmVzZXQgZW5hYmxlX21lcmdlam9pbjsK IC0tCiAtLSBUZXN0IGhpbnRzIGdpdmVuIG9uIGluY29ycmVjdCBjb2x1bW4gcmVmZXJlbmNl cyBhcmUgdXNlZnVsCiAtLQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3Rl ZC9zeXN2aWV3cy5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91 dAppbmRleCAwYmI1NThkOTNjLi5kZDAwNWRhMTU2IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4 cGVjdGVkL3N5c3ZpZXdzLm91dApAQCAtMTEyLDEwICsxMTIsMTEgQEAgc2VsZWN0IG5hbWUs IHNldHRpbmcgZnJvbSBwZ19zZXR0aW5ncyB3aGVyZSBuYW1lIGxpa2UgJ2VuYWJsZSUnOwog IGVuYWJsZV9wYXJ0aXRpb253aXNlX2FnZ3JlZ2F0ZSB8IG9mZgogIGVuYWJsZV9wYXJ0aXRp b253aXNlX2pvaW4gICAgICB8IG9mZgogIGVuYWJsZV9yZXN1bHRjYWNoZSAgICAgICAgICAg ICB8IG9uCisgZW5hYmxlX3NlbGZfam9pbl9yZW1vdmFsICAgICAgIHwgb24KICBlbmFibGVf c2Vxc2NhbiAgICAgICAgICAgICAgICAgfCBvbgogIGVuYWJsZV9zb3J0ICAgICAgICAgICAg ICAgICAgICB8IG9uCiAgZW5hYmxlX3RpZHNjYW4gICAgICAgICAgICAgICAgIHwgb24KLSgy MCByb3dzKQorKDIxIHJvd3MpCiAKIC0tIFRlc3QgdGhhdCB0aGUgcGdfdGltZXpvbmVfbmFt ZXMgYW5kIHBnX3RpbWV6b25lX2FiYnJldnMgdmlld3MgYXJlCiAtLSBtb3JlLW9yLWxlc3Mg d29ya2luZy4gIFdlIGNhbid0IHRlc3QgdGhlaXIgY29udGVudHMgaW4gYW55IGdyZWF0IGRl dGFpbApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZXF1aXZjbGFzcy5zcWwg Yi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9lcXVpdmNsYXNzLnNxbAppbmRleCAyNDdiMGEzMTA1 Li43N2RkOTY0ZWJmIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9lcXVpdmNs YXNzLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9lcXVpdmNsYXNzLnNxbApAQCAt MjU5LDYgKzI1OSwyMiBAQCBkcm9wIHVzZXIgcmVncmVzc191c2VyX2VjdGVzdDsKIGV4cGxh aW4gKGNvc3RzIG9mZikKICAgc2VsZWN0ICogZnJvbSB0ZW5rMSB3aGVyZSB1bmlxdWUxID0g dW5pcXVlMSBhbmQgdW5pcXVlMiA9IHVuaXF1ZTI7CiAKKy0tIFRlc3QgdGhhdCBicm9rZW4g RUNzIGFyZSBwcm9jZXNzZWQgY29ycmVjdGx5IGR1cmluZyBzZWxmIGpvaW4gcmVtb3ZhbC4K Ky0tIERpc2FibGUgbWVyZ2Ugam9pbnMgc28gdGhhdCB3ZSBkb24ndCBnZXQgYW4gZXJyb3Ig YWJvdXQgbWlzc2luZyBjb21tdXRhdG9yLgorLS0gVGVzdCBib3RoIG9yaWVudGF0aW9ucyBv ZiB0aGUgam9pbiBjbGF1c2UsIGJlY2F1c2Ugb25seSBvbmUgb2YgdGhlbSBicmVha3MKKy0t IHRoZSBFQy4KK3NldCBlbmFibGVfbWVyZ2Vqb2luIHRvIG9mZjsKKworZXhwbGFpbiAoY29z dHMgb2ZmKQorICBzZWxlY3QgKiBmcm9tIGVjMCBtIGpvaW4gZWMwIG4gb24gbS5mZiA9IG4u ZmYKKyAgam9pbiBlYzEgcCBvbiBtLmZmICsgbi5mZiA9IHAuZjE7CisKK2V4cGxhaW4gKGNv c3RzIG9mZikKKyAgc2VsZWN0ICogZnJvbSBlYzAgbSBqb2luIGVjMCBuIG9uIG0uZmYgPSBu LmZmCisgIGpvaW4gZWMxIHAgb24gcC5mMTo6aW50OCA9IChtLmZmICsgbi5mZik6OmludDhh bGlhczE7CisKK3Jlc2V0IGVuYWJsZV9tZXJnZWpvaW47CisKIC0tIHRoaXMgY291bGQgYmUg Y29udmVydGVkLCBidXQgaXNuJ3QgYXQgcHJlc2VudAogZXhwbGFpbiAoY29zdHMgb2ZmKQog ICBzZWxlY3QgKiBmcm9tIHRlbmsxIHdoZXJlIHVuaXF1ZTEgPSB1bmlxdWUxIG9yIHVuaXF1 ZTIgPSB1bmlxdWUyOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvam9pbi5z cWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbAppbmRleCA3Zjg2NmM2MDNiLi4z ZDU4YTFiMDU0IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbAor KysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbApAQCAtMTczNCw2ICsxNzM0LDE3 MiBAQCBzZWxlY3QgKiBmcm9tCiBzZWxlY3QgKiBmcm9tCiAgIGludDhfdGJsIHggam9pbiAo aW50NF90YmwgeCBjcm9zcyBqb2luIGludDRfdGJsIHkoZmYpKSBqIG9uIHExID0gZjE7IC0t IG9rCiAKKy0tCistLSB0ZXN0IHRoYXQgc2VtaS0gb3IgaW5uZXIgc2VsZi1qb2lucyBvbiBh IHVuaXF1ZSBjb2x1bW4gYXJlIHJlbW92ZWQKKy0tCisKKy0tIGVuYWJsZSBvbmx5IG5lc3Rs b29wIHRvIGdldCBtb3JlIHByZWRpY3RhYmxlIHBsYW5zCitzZXQgZW5hYmxlX2hhc2hqb2lu IHRvIG9mZjsKK3NldCBlbmFibGVfbWVyZ2Vqb2luIHRvIG9mZjsKKworY3JlYXRlIHRhYmxl IHNqIChhIGludCB1bmlxdWUsIGIgaW50KTsKK2luc2VydCBpbnRvIHNqIHZhbHVlcyAoMSwg bnVsbCksIChudWxsLCAyKSwgKDIsIDEpOworYW5hbHl6ZSBzajsKKworc2VsZWN0IHAuKiBm cm9tIHNqIHAsIHNqIHEgd2hlcmUgcS5hID0gcC5hIGFuZCBxLmIgPSBxLmEgLSAxOworCitl eHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgcC4qIGZyb20gc2ogcCwgc2ogcSB3aGVyZSBx LmEgPSBwLmEgYW5kIHEuYiA9IHEuYSAtIDE7CisKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3Nl bGVjdCAqIGZyb20gc2ogcAord2hlcmUgZXhpc3RzIChzZWxlY3QgKiBmcm9tIHNqIHEKKwkJ CQl3aGVyZSBxLmEgPSBwLmEgYW5kIHEuYiA8IDEwKTsKKworLS0gRG91YmxlIHNlbGYtam9p biByZW1vdmFsLgorLS0gVXNlIGEgY29uZGl0aW9uIG9uICJiICsgMSIsIG5vdCBvbiAiYiIs IGZvciB0aGUgc2Vjb25kIGpvaW4sIHNvIHRoYXQKKy0tIHRoZSBlcXVpdmFsZW5jZSBjbGFz cyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZmlyc3Qgb25lLCBhbmQgd2UgY2FuCistLSB0ZXN0 IHRoZSBub24tZWMgY29kZSBwYXRoLgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICog ZnJvbSBzaiB0MSBqb2luIHNqIHQyIG9uIHQxLmEgPSB0Mi5hIGFuZCB0MS5iID0gdDIuYgor CWpvaW4gc2ogdDMgb24gdDIuYSA9IHQzLmEgYW5kIHQyLmIgKyAxID0gdDMuYiArIDE7CisK Ky0tIHN1YnNlbGVjdCB0aGF0IHJlZmVyZW5jZXMgdGhlIHJlbW92ZWQgcmVsYXRpb24KK2V4 cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCB0MS5hLCAoc2VsZWN0IGEgZnJvbSBzaiB3aGVy ZSBhID0gdDIuYSBhbmQgYSA9IHQxLmEpCitmcm9tIHNqIHQxLCBzaiB0Mgord2hlcmUgdDEu YSA9IHQyLmE7CisKKy0tIHNlbGYtam9pbiB1bmRlciBvdXRlciBqb2luCitleHBsYWluIChj b3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHggam9pbiBzaiB5IG9uIHguYSA9IHkuYQor bGVmdCBqb2luIGludDhfdGJsIHogb24geC5hID0gei5xMTsKKworZXhwbGFpbiAoY29zdHMg b2ZmKQorc2VsZWN0ICogZnJvbSBzaiB4IGpvaW4gc2ogeSBvbiB4LmEgPSB5LmEKK2xlZnQg am9pbiBpbnQ4X3RibCB6IG9uIHkuYSA9IHoucTE7CisKKy0tIFRlc3QgdGhhdCBwbGFjZWhv bGRlcnMgYXJlIHVwZGF0ZWQgY29ycmVjdGx5IGFmdGVyIGpvaW4gcmVtb3ZhbAorZXhwbGFp biAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSAodmFsdWVzICgxKSkgeAorbGVmdCBqb2lu IChzZWxlY3QgY29hbGVzY2UoeS5xMSwgMSkgZnJvbSBpbnQ4X3RibCB5CisJcmlnaHQgam9p biBzaiBqMSBpbm5lciBqb2luIHNqIGoyIG9uIGoxLmEgPSBqMi5hCisJb24gdHJ1ZSkgegor b24gdHJ1ZTsKKworLS0gVGVzdCB0aGF0IE9SIHByZWRpY2F0ZWQgYXJlIHVwZGF0ZWQgY29y cmVjdGx5IGFmdGVyIGpvaW4gcmVtb3ZhbAorQ1JFQVRFIFRBQkxFIHRhYl93aXRoX2ZsYWcg KCBpZCBJTlQgUFJJTUFSWSBLRVksIGlzX2ZsYWcgU01BTExJTlQpOworQ1JFQVRFIElOREVY IGlkeF90ZXN0X2lzX2ZsYWcgT04gdGFiX3dpdGhfZmxhZyAoaXNfZmxhZyk7CitleHBsYWlu IChjb3N0cyBvZmYpCitTRUxFQ1QgQ09VTlQoKikgRlJPTSB0YWJfd2l0aF9mbGFnIFdIRVJF IChpc19mbGFnIElTIE5VTEwgT1IgaXNfZmxhZyA9IDApIEFORCBpZCBJTiAoU0VMRUNUIGlk IEZST00gdGFiX3dpdGhfZmxhZyBXSEVSRSBpZCBJTiAoMiwgMykpOworRFJPUCBUQUJMRSB0 YWJfd2l0aF9mbGFnOworCistLSBIQVZJTkcgY2xhdXNlCitleHBsYWluIChjb3N0cyBvZmYp CitzZWxlY3QgcC5iIGZyb20gc2ogcCBqb2luIHNqIHEgb24gcC5hID0gcS5hIGdyb3VwIGJ5 IHAuYiBoYXZpbmcgc3VtKHAuYSkgPSAxOworCistLSB1cGRhdGUgbGF0ZXJhbCByZWZlcmVu Y2VzIGFuZCByYW5nZSB0YWJsZSBlbnRyeSByZWZlcmVuY2UKK2V4cGxhaW4gKHZlcmJvc2Us IGNvc3RzIG9mZikKK3NlbGVjdCAxIGZyb20gKHNlbGVjdCB4LiogZnJvbSBzaiB4LCBzaiB5 IHdoZXJlIHguYSA9IHkuYSkgcSwKKyAgbGF0ZXJhbCBnZW5lcmF0ZV9zZXJpZXMoMSwgcS5h KSBncyhpKTsKKworZXhwbGFpbiAodmVyYm9zZSwgY29zdHMgb2ZmKQorc2VsZWN0IDEgZnJv bSAoc2VsZWN0IHkuKiBmcm9tIHNqIHgsIHNqIHkgd2hlcmUgeC5hID0geS5hKSBxLAorICBs YXRlcmFsIGdlbmVyYXRlX3NlcmllcygxLCBxLmEpIGdzKGkpOworCistLSBUZXN0IHRoYXQg YSBub24tRUMtZGVyaXZlZCBqb2luIGNsYXVzZSBpcyBwcm9jZXNzZWQgY29ycmVjdGx5LiBV c2UgYW4KKy0tIG91dGVyIGpvaW4gc28gdGhhdCB3ZSBjYW4ndCBmb3JtIGFuIEVDLgorZXhw bGFpbiAoY29zdHMgb2ZmKSBzZWxlY3QgKiBmcm9tIHNqIHAgam9pbiBzaiBxIG9uIHAuYSA9 IHEuYQorICBsZWZ0IGpvaW4gc2ogciBvbiBwLmEgKyBxLmEgPSByLmE7CisKKy0tIEZJWE1F IHRoaXMgY29uc3RhbnQgZmFsc2UgZmlsdGVyIGRvZXNuJ3QgbG9vayBnb29kLiBTaG91bGQg d2UgbWVyZ2UKKy0tIGVxdWl2YWxlbmNlIGNsYXNzZXM/CitleHBsYWluIChjb3N0cyBvZmYp CitzZWxlY3QgKiBmcm9tIHNqIHAsIHNqIHEgd2hlcmUgcC5hID0gcS5hIGFuZCBwLmIgPSAx IGFuZCBxLmIgPSAyOworCistLSBDaGVjayB0aGF0IGF0dHJfbmVlZGVkIGlzIHVwZGF0ZWQg Y29ycmVjdGx5IGFmdGVyIHNlbGYtam9pbiByZW1vdmFsLiBJbiB0aGlzCistLSB0ZXN0LCB0 aGUgam9pbiBvZiBqMSB3aXRoIGoyIGlzIHJlbW92ZWQuIGsxLmIgaXMgcmVxdWlyZWQgYXQg ZWl0aGVyIGoxIG9yIGoyLgorLS0gSWYgdGhpcyBpbmZvIGlzIGxvc3QsIGpvaW4gdGFyZ2V0 bGlzdCBmb3IgKGsxLCBrMikgd2lsbCBub3QgY29udGFpbiBrMS5iLgorLS0gVXNlIGluZGV4 IHNjYW4gZm9yIGsxIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0ICdiJyBmcm9tIHBoeXNpY2FsIHRs aXN0IHVzZWQgZm9yCistLSBzZXFzY2FuLiBBbHNvIGRpc2FibGUgcmVvcmRlcmluZyBvZiBq b2lucyBiZWNhdXNlIHRoaXMgdGVzdCBkZXBlbmRzIG9uIGEKKy0tIHBhcnRpY3VsYXIgam9p biB0cmVlLgorY3JlYXRlIHRhYmxlIHNrIChhIGludCwgYiBpbnQpOworY3JlYXRlIGluZGV4 IG9uIHNrKGEpOworc2V0IGpvaW5fY29sbGFwc2VfbGltaXQgdG8gMTsKK3NldCBlbmFibGVf c2Vxc2NhbiB0byBvZmY7CitleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCAxIGZyb20KKwko c2sgazEgam9pbiBzayBrMiBvbiBrMS5hID0gazIuYSkKKwlqb2luIChzaiBqMSBqb2luIHNq IGoyIG9uIGoxLmEgPSBqMi5hKSBvbiBqMS5iID0gazEuYjsKK2V4cGxhaW4gKGNvc3RzIG9m Zikgc2VsZWN0IDEgZnJvbQorCShzayBrMSBqb2luIHNrIGsyIG9uIGsxLmEgPSBrMi5hKQor CWpvaW4gKHNqIGoxIGpvaW4gc2ogajIgb24gajEuYSA9IGoyLmEpIG9uIGoyLmIgPSBrMS5i OworcmVzZXQgam9pbl9jb2xsYXBzZV9saW1pdDsKK3Jlc2V0IGVuYWJsZV9zZXFzY2FuOwor CistLSBDaGVjayB0aGF0IGNsYXVzZXMgZnJvbSB0aGUgam9pbiBmaWx0ZXIgbGlzdCBpcyBu b3QgbG9zdCBvbiB0aGUgc2VsZi1qb2luIHJlbW92YWwKK0NSRUFURSBUQUJMRSBlbXAxICgg aWQgU0VSSUFMIFBSSU1BUlkgS0VZIE5PVCBOVUxMLCBjb2RlIGludCk7CitleHBsYWluICh2 ZXJib3NlLCBjb3N0cyBvZmYpCitTRUxFQ1QgKiBGUk9NIGVtcDEgZTEsIGVtcDEgZTIgV0hF UkUgZTEuaWQgPSBlMi5pZCBBTkQgZTIuY29kZSA8PiBlMS5jb2RlOworCistLSBXZSBjYW4g cmVtb3ZlIHRoZSBqb2luIGV2ZW4gaWYgd2UgZmluZCB0aGUgam9pbiBjYW4ndCBkdXBsaWNh dGUgcm93cyBhbmQKKy0tIHRoZSBiYXNlIHF1YWxzIG9mIGVhY2ggc2lkZSBhcmUgZGlmZmVy ZW50LiAgSW4gdGhlIGZvbGxvd2luZyBjYXNlIHdlIGVuZCB1cAorLS0gbW92aW5nIHF1YWxz IG92ZXIgdG8gczEgdG8gbWFrZSBpdCBzbyBpdCBjYW4ndCBtYXRjaCBhbnkgcm93cy4KK2Ny ZWF0ZSB0YWJsZSBzbChhIGludCwgYiBpbnQpOworY3JlYXRlIHVuaXF1ZSBpbmRleCBvbiBz bChhLCBiKTsKK3ZhY3V1bSBhbmFseXplIHNsOworCistLSBCb3RoIHNpZGVzIGFyZSB1bmlx dWUsIGJ1dCBiYXNlIHF1YWxzIGFyZSBkaWZmZXJlbnQKK2V4cGxhaW4gKGNvc3RzIG9mZikK K3NlbGVjdCAqIGZyb20gc2wgdDEsIHNsIHQyIHdoZXJlIHQxLmEgPSB0Mi5hIGFuZCB0MS5i ID0gMSBhbmQgdDIuYiA9IDI7CisKKy0tCistLS0tIE9ubHkgb25lIHNpZGUgaXMgdW5xaXVl CistLXNlbGVjdCAqIGZyb20gc2wgdDEsIHNsIHQyIHdoZXJlIHQxLmEgPSB0Mi5hIGFuZCB0 MS5iID0gMTsKKy0tc2VsZWN0ICogZnJvbSBzbCB0MSwgc2wgdDIgd2hlcmUgdDEuYSA9IHQy LmEgYW5kIHQyLmIgPSAxOworLS0KKy0tLS0gU2V2ZXJhbCB1bmlxdWVzIGluZGV4ZXMgbWF0 Y2gsIGFuZCB3ZSBzZWxlY3QgYSBkaWZmZXJlbnQgb25lCistLS0tIGZvciBlYWNoIHNpZGUs IHNvIHRoZSBqb2luIGlzIG5vdCByZW1vdmVkCistLWNyZWF0ZSB0YWJsZSBzbShhIGludCB1 bmlxdWUsIGIgaW50IHVuaXF1ZSwgYyBpbnQgdW5pcXVlKTsKKy0tZXhwbGFpbiAoY29zdHMg b2ZmKQorLS1zZWxlY3QgKiBmcm9tIHNtIG0sIHNtIG4gd2hlcmUgbS5hID0gbi5iIGFuZCBt LmMgPSBuLmM7CistLWV4cGxhaW4gKGNvc3RzIG9mZikKKy0tc2VsZWN0ICogZnJvbSBzbSBt LCBzbSBuIHdoZXJlIG0uYSA9IG4uYyBhbmQgbS5iID0gbi5iOworLS1leHBsYWluIChjb3N0 cyBvZmYpCistLXNlbGVjdCAqIGZyb20gc20gbSwgc20gbiB3aGVyZSBtLmMgPSBuLmIgYW5k IG0uYSA9IG4uYTsKKworLS0gQ2hlY2sgb3B0aW1pemF0aW9uIGRpc2FibGluZyBpZiBpdCB3 aWxsIHZpb2xhdGUgc3BlY2lhbCBqb2luIGNvbmRpdGlvbnMuCistLSBUd28gaWRlbnRpY2Fs IGpvaW5lZCByZWxhdGlvbnMgc2F0aXNmaWVzIHNlbGYgam9pbiByZW1vdmFsIGNvbmRpdGlv bnMgYnV0CistLSBzdGF5IGluIGRpZmZlcmVudCBzcGVjaWFsIGpvaW4gaW5mb3MuCitDUkVB VEUgVEFCTEUgc2pfdDEgKGlkIHNlcmlhbCwgYSBpbnQpOworQ1JFQVRFIFRBQkxFIHNqX3Qy IChpZCBzZXJpYWwsIGEgaW50KTsKK0NSRUFURSBUQUJMRSBzal90MyAoaWQgc2VyaWFsLCBh IGludCk7CitDUkVBVEUgVEFCTEUgc2pfdDQgKGlkIHNlcmlhbCwgYSBpbnQpOworCitDUkVB VEUgVU5JUVVFIElOREVYIE9OIHNqX3QzIFVTSU5HIGJ0cmVlIChhLGlkKTsKK0NSRUFURSBV TklRVUUgSU5ERVggT04gc2pfdDIgVVNJTkcgYnRyZWUgKGlkKTsKKworRVhQTEFJTiAoQ09T VFMgT0ZGKQorU0VMRUNUICogRlJPTSBzal90MQorSk9JTiAoCisJU0VMRUNUIHNqX3QyLmlk IEFTIGlkIEZST00gc2pfdDIKKwlXSEVSRSBFWElTVFMKKwkJKAorCQlTRUxFQ1QgVFJVRSBG Uk9NIHNqX3QzLHNqX3Q0IFdIRVJFIHNqX3QzLmEgPSAxIEFORCBzal90My5pZCA9IHNqX3Qy LmlkCisJCSkKKwkpIHQydDN0NAorT04gc2pfdDEuaWQgPSB0MnQzdDQuaWQKK0pPSU4gKAor CVNFTEVDVCBzal90Mi5pZCBBUyBpZCBGUk9NIHNqX3QyCisJV0hFUkUgRVhJU1RTCisJCSgK KwkJU0VMRUNUIFRSVUUgRlJPTSBzal90Myxzal90NCBXSEVSRSBzal90My5hID0gMSBBTkQg c2pfdDMuaWQgPSBzal90Mi5pZAorCQkpCisJKSBfdDJ0M3Q0CitPTiBzal90MS5pZCA9IF90 MnQzdDQuaWQ7CisKK3Jlc2V0IGVuYWJsZV9oYXNoam9pbjsKK3Jlc2V0IGVuYWJsZV9tZXJn ZWpvaW47CisKIC0tCiAtLSBUZXN0IGhpbnRzIGdpdmVuIG9uIGluY29ycmVjdCBjb2x1bW4g cmVmZXJlbmNlcyBhcmUgdXNlZnVsCiAtLQotLSAKMi4zMS4xCgo= --------------217AA9CF7DA08EB0E90EEF5F--