Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1gfAsT-0003Ha-Kh for pgsql-hackers@arkaria.postgresql.org; Thu, 03 Jan 2019 21:50:10 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1gfAsS-00021y-89 for pgsql-hackers@arkaria.postgresql.org; Thu, 03 Jan 2019 21:50:08 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1gfAsR-00021r-FF for pgsql-hackers@lists.postgresql.org; Thu, 03 Jan 2019 21:50:08 +0000 Received: from out1-smtp.messagingengine.com ([66.111.4.25]) by makus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1gfAsL-0004Jw-0F for pgsql-hackers@postgresql.org; Thu, 03 Jan 2019 21:50:06 +0000 Received: from compute7.internal (compute7.nyi.internal [10.202.2.47]) by mailout.nyi.internal (Postfix) with ESMTP id D7EC5221E9; Thu, 3 Jan 2019 16:49:59 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute7.internal (MEProxy); Thu, 03 Jan 2019 16:49:59 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm1; bh=tFIWis MW+mo3aZCR7ogjYob5NotlQvP32Ng1TX1G4Fw=; b=PiTz2ddykdytwQc83R9+tw 3V6+KFwJi3CpQMM1DWV3i0rAYM7VlSHpuItbyUNT5AbSWOxKb4H4HlFxRIFU1aIN hH8YA4fmptI8+6GRrvmKoyFqlyN+csUp+HEgeILfmMqML4vMtcyXLePMO1A/01AF oFZROFDmzr6yk50UCb/FlTKF5OVub5qGPu6fV37hU9N6Pk7eHZrsz1QkRiF6kjn2 H3x/LmChq/7+ZJ49Y2ZRhcsAy/K3LhwtsWp6iHY5G5Gtc2+Wlc5tdi43aWZIQJpC 0+pb8+xiLFB26N6MZ6UYmPiA2fW0yzQ6/saghoAGo7mE5f0Q1ZSKZcuf4siIvDVw == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedtledrudelgdelheculddtuddrgedtkedrtddtmd cutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpqfhuthen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhepuffvfhfhohfkffgfgggjtgesmhdtreertdefjeenucfhrhhomheprfgvthgv rhcugfhishgvnhhtrhgruhhtuceophgvthgvrhdrvghishgvnhhtrhgruhhtsedvnhguqh hurggurhgrnhhtrdgtohhmqeenucffohhmrghinhepvdhnughquhgrughrrghnthdrtgho mhenucfkphepleefrddvgeefrdduudelrddvfeelnecurfgrrhgrmhepmhgrihhlfhhroh hmpehpvghtvghrrdgvihhsvghnthhrrghuthesvdhnughquhgrughrrghnthdrtghomhen ucevlhhushhtvghrufhiiigvpedt X-ME-Proxy: Received: from april.pezone.net (p5df377ef.dip0.t-ipconnect.de [93.243.119.239]) by mail.messagingengine.com (Postfix) with ESMTPA id 88E2210106; Thu, 3 Jan 2019 16:49:56 -0500 (EST) Subject: Re: [HACKERS] REINDEX CONCURRENTLY 2.0 To: Sergei Kornilov , Michael Paquier , Andreas Karlsson , PostgreSQL mailing lists References: <20171221024626.ycidqbnwcz25ekry@alvherre.pgsql> <20180126022813.GD2416@tamriel.snowman.net> <9523ad05-525c-598e-ad2d-061b5a94062c@proxel.se> <20180201062158.GD6398@paquier.xyz> <60052986-956b-4478-45ed-8bd119e9b9cf@2ndquadrant.com> <10797471544200851@myt3-964eae3a5b05.qloud-c.yandex.net> <93a3d2fb-43a0-cf14-e8d0-d2c3195c1e5b@2ndquadrant.com> <20486991544381729@iva5-d3020dc3459d.qloud-c.yandex.net> Cc: Stephen Frost , Craig Ringer , Alvaro Herrera From: Peter Eisentraut Openpgp: preference=signencrypt Autocrypt: addr=peter.eisentraut@2ndquadrant.com; prefer-encrypt=mutual; keydata= xsFNBFUUt6kBEADZd9NNTBJbHmAXXJgPGOdd6Q73l80oifIVgn2tRxP9dYkCfTlo/yLqbKTl JNqTcyM6XrJDnB2sMEUGYCewYZXl+9C4bBJWyNqcEI1ae9u71vEq/fknFLArJ+2wN+f7QuRx Q8d94ZJAiJQ5g3fNk2HVeedCQCKP5dCzU+ZLt2dbsx1PDZLjTO9gf+JswWuGFb5wY5PZVM5V hq66Xk7ZJzHuARacza2RT7J2fkMmQBY+kr7L98Perb0GhafnlhXB0PvUB+N3xpmggMfwuhTu BngS/G/r3GvemxJuFxouw8xsMqrsfdksJXA2gLXYtwRCssdPV3PO0rlD9twqDo8URfIJ5fb6 1g/MV8aTOKjg3Q8MpJPtkwJqN4o3PvbwYdedeFnOVkkYAJdu/aX1v1BeCBDu7Hy3sF52scD3 pQbyQSl9vUDpTLarASAxNbAV0NRJE8dp4vfW6AH1ccryGiFqw/czPK/iN0+MT8wsjAW6WW4w hvjm5UPA1KTwi3ZT8eT5uycuH7QpuNk7LnGGXQ6KaRALFywzkr0A0V0AvFNa+l4wstMaXaB6 dmMXyF0/hfryqyOeu1gAdq4q0/PNC2dPgb/6uoh4eMjN6A5GXcprilhz5DulmsilY21hfSoU S64ODed96pKhprsOxjZiDRsN1QM5MwB+uwVWUNfsX7fIxE0BrwARAQABzSdQZXRlciBFaXNl bnRyYXV0IDxwZXRlckBlaXNlbnRyYXV0Lm9yZz7CwXoEEwEIACQCGwMFCwkIBwMFFQoJCAsF FgIDAQACHgECF4AFAlUUuKQCGQEACgkQoZ8SQ+xBJp8llw//RbGoXnF72FZTlOFsnNyxnWbF vViPCfdAlZl1GGK9OYCvV1dp/956HuhB0wpaGQHiBmQfOPJf/jLOPjXFYm2iEChEycrBChuE j4TSYemMp5BSPILYk9Uwd16kVD/+U6fQfK6H5pOhfBvbM6asMnmpY2wQuvktxHvaGlytFw84 EzFWNZtAZfxkw28w3AhIQkKe9hJanfyDL750RcbyEr8AAHty5IErrvS7tM5vQwIeh5BF26ND CyKPRdZgOgMpcwFfROKBDpAt052CgWIpNdhBdfIKlkCs4/ILxmC3rT/Mb/qZiHcoMMwEu6k+ T7vRAFZZAk62Yrr/U8/vUGKlzRZQoo86fyojCfI0ibCIc0z8rwCVY9P40G9wD9BTCZS/z8Vh jjpBlNnIKw2hM6hbxavKndCJjFFJD08rXrTyrLF/of18xD37vNdYooP9VATB5QjOWFRrscSZ 4a89e+to3m7YVnd4xdXwGp47dYusoax84C8tg1gZrH38ol9dPmnKX6GZrXeS7tH9k8VeUpJ8 HQbRThQRWAT936QpYbLConBmOtmbLmjQOGtiXPo1oK57X/7U/WBja5vWmm2q+Yxtt+3uHGVg DdDU4CJpXo4lX0v2n3QV5EBSW9hjdF3bNfl6GFBb1pPEhqNcMDUc7zkx/2uENdAdk/BnqMgH umip7b0pVfvOwU0EVRS3qQEQAJf6p0P7D+hMYUgCPkvgrcz6OJYsAYdUMUmokfqmkKwK0oJM ew8TNGM53ocKAgQGma5f10rwbZNPlpVPNRX5hwUmwVlcwSut0oE+JfUBH7mpysWvpF05RKIy q9RCoJZrAbXS7Tig56A1QD8IcM00rERZMcCOlI1+q9m4u9AOI+0LyGGSH+VvoyDHD/Jew4R2 TmPEF8Pu7lYiNYK88Q6u0kBkc+Tz3BNlyc6fi3HxnFfp0b75HLXPSTu2SwA/0Q31wHZXwrEU BR9KgSn/qbgy8ydPc97i82fhiFE3cbGexfPrQSMYmDGi+dcQ0s+AMQwC3XyMC0JkHpYUuFkR QdlIvaIhgFUUN2Vr4xF2ADaNTNFc4DYaiPHFAgHZw+3pZWqS4uIiWgJynrEaHw4F3QWU8/JB iyEWDhNq4WBrRA0u914TCCAoFOOKMnRdl8eJrRQKM/5/lXbHFjjlI/LDKhLRFsuQsnJJ3331 RjCzpHPZG5/p5KR1RHiAXa0p/DW5lXyq21hS3kjDlleoHqOxCN/cy0Jgz7qLDq1vZoCl67Sy RAH60c2Xu4may9SVltmot0OzWVHdrfS+85FQGp9580DaeLio7YMFKy2bfEvwQJ/c9xD2QPB+ oSb3V8ueSznXBG5+dyfOsZFRPxceA0wA2rSWZSjxLdKxvyGTj9vsCjaDu13rABEBAAHCwV8E GAEIAAkFAlUUt6kCGwwACgkQoZ8SQ+xBJp+HJhAAxmSTsC5y7p9Zu+nnLpucv/h88oEx985e qWeXzQiwM3pfRZS+PdTH9TyzHK0KOgKoAiubk0vt+BrT91D9d0G5kVQaTctAErGBoMkTaZJT XVEcNphiPzysdSqvprjojMp1y7rG8AP+Xd6m0rE1LRnkRRm8HyI8vdXsuLQPITGWXDLMjaNq AOV3BUnzkgtjMuIYw7SCr+12ZOb5dEKvaG4kjC4kaJ/TLbuBhVANcXkC90yp0AOZLs/cB1Dj OAXno/RUUruJ3r27a+pFv768UAi9QWcdw58yPxreMNMLqAgsS9oTHwHfGNWcB2dJ4UW+GMLJ hTf9TjQ2f+N/sIx5XMQ9pYw6CAJMK29qPx6/ZayrPxf22EXf0D3zTwIEZgwfSkynFVwV25L7 awQq60fifdMYheSxq7GbhpsixmcD+e161cCmLIt75YDt5bQ0B1yf7EmxG8n7pGZAOM6LoNsU fkSldba5XVwh8LuN5mK0nQBELGW6Os4TDq4REggLpfcvFC215zpuo0iCGnmE/Bns4nowqUSP u4tkWL+nxW4qgv8wo8HJ52jd79EJ8iqfIBoidBfy9AIUiEUApGQzWPu6yWcI8fY0rN5D+tc+ Yw1Zt6Mm+huYJpgCRsTcfzEcahnBn521CWcWvhW1ff3KFileFMtNmnBBhMncmRKHphtTKEpN 3jI= Organization: 2ndQuadrant Message-ID: Date: Thu, 3 Jan 2019 22:49:55 +0100 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: <20486991544381729@iva5-d3020dc3459d.qloud-c.yandex.net> Content-Type: multipart/mixed; boundary="------------2251F567199DD5ADF26BB467" Content-Language: en-US List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk This is a multi-part message in MIME format. --------------2251F567199DD5ADF26BB467 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Updated patch for some merge conflicts and addressing most of your comments. (I did not do anything about the syntax.) On 09/12/2018 19:55, Sergei Kornilov wrote: > I found one error in phase 4. Simple reproducer: > >> create table test (i int); >> create index this_is_very_large_exactly_maxnamelen_index_name_wink_wink_wink on test (i); >> create index this_is_very_large_exactly_maxnamelen_index_name_wink_winkccold on test (i); >> reindex table CONCURRENTLY test; > > This fails with error > >> ERROR: duplicate key value violates unique constraint "pg_class_relname_nsp_index" >> DETAIL: Key (relname, relnamespace)=(this_is_very_large_exactly_maxnamelen_index_name_wink_win_ccold, 2200) already exists. > > CommandCounterIncrement() in (or after) index_concurrently_swap will fix this issue. fixed >> ReindexPartitionedIndex(Relation parentIdx) >> ereport(ERROR, >> (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), >> errmsg("REINDEX is not yet implemented for partitioned indexes"))); > > I think we need add errhint("you can REINDEX each partition separately") or something similar. > Also can we omit this warning for reindex database? All partition must be in same database and warning in such case is useless: we have warning, but doing reindex for each partition => we reindex partitioned table correctly. fixed by skipping in ReindexRelationConcurrently(), same as other unsupported relkinds > Another behavior issue i found with reindex (verbose) schema/database: INFO ereport is printed twice for each table. > >> INFO: relation "measurement_y2006m02" was reindexed >> DETAIL: CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.07 s. >> INFO: table "public.measurement_y2006m02" was reindexed > > One from ReindexMultipleTables and another (with pg_rusage_show) from ReindexRelationConcurrently. fixed with some restructuring >> ReindexRelationConcurrently >> if (!indexRelation->rd_index->indisvalid) > > it is better use IndexIsValid macro here? And same question about added indexform->indisvalid in src/backend/commands/tablecmds.c IndexIsValid() has been removed in the meantime. >> >> An index build with the CONCURRENTLY option failed, leaving >> an invalid index. Such indexes are useless but it can be >> - convenient to use REINDEX to rebuild them. Note that >> - REINDEX will not perform a concurrent build. To build the >> - index without interfering with production you should drop the index and >> - reissue the CREATE INDEX CONCURRENTLY command. >> + convenient to use REINDEX to rebuild them. >> > > This documentation change seems wrong for me: reindex concurrently does not rebuild invalid indexes. To fix invalid indexes we still need reindex with lock table or recreate this index concurrently. still being discussed elsewhere in this thread >> + A first pass to build the index is done for each new index entry. >> + Once the index is built, its flag pg_class.isready is >> + switched to true >> + At this point pg_class.indisvalid is switched to >> + true for the new index and to false for the old, and >> + Old indexes have pg_class.isready switched to false > > Should be pg_index.indisvalid and pg_index.indisready, right? fixed -- Peter Eisentraut http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services --------------2251F567199DD5ADF26BB467 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="v6-0001-REINDEX-CONCURRENTLY.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="v6-0001-REINDEX-CONCURRENTLY.patch" RnJvbSA1NTM0NTIxMWU3ZDYwMjZiNTczMTQyYjhjYmU4ZmUyNGY3NjkyMjg1IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBQZXRlciBFaXNlbnRyYXV0IDxwZXRlckBlaXNlbnRy YXV0Lm9yZz4KRGF0ZTogVGh1LCAzIEphbiAyMDE5IDIyOjQzOjMwICswMTAwClN1YmplY3Q6 IFtQQVRDSCB2Nl0gUkVJTkRFWCBDT05DVVJSRU5UTFkKCi0tLQogZG9jL3NyYy9zZ21sL212 Y2Muc2dtbCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxICsKIGRvYy9zcmMvc2dtbC9y ZWYvcmVpbmRleC5zZ21sICAgICAgICAgICAgICAgICB8IDE4NCArKystCiBzcmMvYmFja2Vu ZC9jYXRhbG9nL2luZGV4LmMgICAgICAgICAgICAgICAgICAgfCA1MDEgKysrKysrKysrLQog c3JjL2JhY2tlbmQvY2F0YWxvZy9wZ19kZXBlbmQuYyAgICAgICAgICAgICAgIHwgMTQzICsr Kwogc3JjL2JhY2tlbmQvY2F0YWxvZy90b2FzdGluZy5jICAgICAgICAgICAgICAgIHwgICAy ICstCiBzcmMvYmFja2VuZC9jb21tYW5kcy9pbmRleGNtZHMuYyAgICAgICAgICAgICAgfCA4 ODUgKysrKysrKysrKysrKysrLS0tCiBzcmMvYmFja2VuZC9jb21tYW5kcy90YWJsZWNtZHMu YyAgICAgICAgICAgICAgfCAgMzIgKy0KIHNyYy9iYWNrZW5kL25vZGVzL2NvcHlmdW5jcy5j ICAgICAgICAgICAgICAgICB8ICAgMSArCiBzcmMvYmFja2VuZC9ub2Rlcy9lcXVhbGZ1bmNz LmMgICAgICAgICAgICAgICAgfCAgIDEgKwogc3JjL2JhY2tlbmQvcGFyc2VyL2dyYW0ueSAg ICAgICAgICAgICAgICAgICAgIHwgIDIyICstCiBzcmMvYmFja2VuZC90Y29wL3V0aWxpdHku YyAgICAgICAgICAgICAgICAgICAgfCAgMTAgKy0KIHNyYy9iaW4vcHNxbC9jb21tb24uYyAg ICAgICAgICAgICAgICAgICAgICAgICB8ICAxNiArCiBzcmMvYmluL3BzcWwvdGFiLWNvbXBs ZXRlLmMgICAgICAgICAgICAgICAgICAgfCAgMTggKy0KIHNyYy9pbmNsdWRlL2NhdGFsb2cv ZGVwZW5kZW5jeS5oICAgICAgICAgICAgICB8ICAgNSArCiBzcmMvaW5jbHVkZS9jYXRhbG9n L2luZGV4LmggICAgICAgICAgICAgICAgICAgfCAgMTggKwogc3JjL2luY2x1ZGUvY29tbWFu ZHMvZGVmcmVtLmggICAgICAgICAgICAgICAgIHwgICA2ICstCiBzcmMvaW5jbHVkZS9ub2Rl cy9wYXJzZW5vZGVzLmggICAgICAgICAgICAgICAgfCAgIDEgKwogLi4uL2V4cGVjdGVkL3Jl aW5kZXgtY29uY3VycmVudGx5Lm91dCAgICAgICAgIHwgIDc4ICsrCiBzcmMvdGVzdC9pc29s YXRpb24vaXNvbGF0aW9uX3NjaGVkdWxlICAgICAgICAgfCAgIDEgKwogLi4uL2lzb2xhdGlv bi9zcGVjcy9yZWluZGV4LWNvbmN1cnJlbnRseS5zcGVjIHwgIDQwICsKIHNyYy90ZXN0L3Jl Z3Jlc3MvZXhwZWN0ZWQvY3JlYXRlX2luZGV4Lm91dCAgICB8ICA3MCArKwogc3JjL3Rlc3Qv cmVncmVzcy9zcWwvY3JlYXRlX2luZGV4LnNxbCAgICAgICAgIHwgIDUxICsKIDIyIGZpbGVz IGNoYW5nZWQsIDE5MTIgaW5zZXJ0aW9ucygrKSwgMTc0IGRlbGV0aW9ucygtKQogY3JlYXRl IG1vZGUgMTAwNjQ0IHNyYy90ZXN0L2lzb2xhdGlvbi9leHBlY3RlZC9yZWluZGV4LWNvbmN1 cnJlbnRseS5vdXQKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9pc29sYXRpb24vc3Bl Y3MvcmVpbmRleC1jb25jdXJyZW50bHkuc3BlYwoKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dt bC9tdmNjLnNnbWwgYi9kb2Mvc3JjL3NnbWwvbXZjYy5zZ21sCmluZGV4IGJlZGQ5YTAwOGQu LjliN2VmOGJmMDkgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9tdmNjLnNnbWwKKysrIGIv ZG9jL3NyYy9zZ21sL212Y2Muc2dtbApAQCAtOTI2LDYgKzkyNiw3IEBAIDx0aXRsZT5UYWJs ZS1sZXZlbCBMb2NrIE1vZGVzPC90aXRsZT4KICAgICAgICAgPHBhcmE+CiAgICAgICAgICBB Y3F1aXJlZCBieSA8Y29tbWFuZD5WQUNVVU08L2NvbW1hbmQ+ICh3aXRob3V0IDxvcHRpb24+ RlVMTDwvb3B0aW9uPiksCiAgICAgICAgICA8Y29tbWFuZD5BTkFMWVpFPC9jb21tYW5kPiwg PGNvbW1hbmQ+Q1JFQVRFIElOREVYIENPTkNVUlJFTlRMWTwvY29tbWFuZD4sCisgICAgICAg ICA8Y29tbWFuZD5SRUlOREVYIENPTkNVUlJFTlRMWTwvY29tbWFuZD4sCiAgICAgICAgICA8 Y29tbWFuZD5DUkVBVEUgU1RBVElTVElDUzwvY29tbWFuZD4sIGFuZCBjZXJ0YWluIDxjb21t YW5kPkFMVEVSCiAgICAgICAgICBJTkRFWDwvY29tbWFuZD4gYW5kIDxjb21tYW5kPkFMVEVS IFRBQkxFPC9jb21tYW5kPiB2YXJpYW50cyAoZm9yIGZ1bGwKICAgICAgICAgIGRldGFpbHMg c2VlIDx4cmVmIGxpbmtlbmQ9InNxbC1hbHRlcmluZGV4Ii8+IGFuZCA8eHJlZgpkaWZmIC0t Z2l0IGEvZG9jL3NyYy9zZ21sL3JlZi9yZWluZGV4LnNnbWwgYi9kb2Mvc3JjL3NnbWwvcmVm L3JlaW5kZXguc2dtbAppbmRleCA0N2NlZjk4N2Q0Li45MWU4MjNhYmU4IDEwMDY0NAotLS0g YS9kb2Mvc3JjL3NnbWwvcmVmL3JlaW5kZXguc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvcmVm L3JlaW5kZXguc2dtbApAQCAtMjEsNyArMjEsNyBAQAogCiAgPHJlZnN5bm9wc2lzZGl2Pgog PHN5bm9wc2lzPgotUkVJTkRFWCBbICggVkVSQk9TRSApIF0geyBJTkRFWCB8IFRBQkxFIHwg U0NIRU1BIHwgREFUQUJBU0UgfCBTWVNURU0gfSA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFt ZXRlciI+bmFtZTwvcmVwbGFjZWFibGU+CitSRUlOREVYIFsgKCBWRVJCT1NFICkgXSB7IElO REVYIHwgVEFCTEUgfCBTQ0hFTUEgfCBEQVRBQkFTRSB8IFNZU1RFTSB9IFsgQ09OQ1VSUkVO VExZIF0gPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPm5hbWU8L3JlcGxhY2VhYmxl PgogPC9zeW5vcHNpcz4KICA8L3JlZnN5bm9wc2lzZGl2PgogCkBAIC02NywxMCArNjcsNyBA QCA8dGl0bGU+RGVzY3JpcHRpb248L3RpdGxlPgogICAgICA8cGFyYT4KICAgICAgIEFuIGlu ZGV4IGJ1aWxkIHdpdGggdGhlIDxsaXRlcmFsPkNPTkNVUlJFTlRMWTwvbGl0ZXJhbD4gb3B0 aW9uIGZhaWxlZCwgbGVhdmluZwogICAgICAgYW4gPHF1b3RlPmludmFsaWQ8L3F1b3RlPiBp bmRleC4gU3VjaCBpbmRleGVzIGFyZSB1c2VsZXNzIGJ1dCBpdCBjYW4gYmUKLSAgICAgIGNv bnZlbmllbnQgdG8gdXNlIDxjb21tYW5kPlJFSU5ERVg8L2NvbW1hbmQ+IHRvIHJlYnVpbGQg dGhlbS4gTm90ZSB0aGF0Ci0gICAgICA8Y29tbWFuZD5SRUlOREVYPC9jb21tYW5kPiB3aWxs IG5vdCBwZXJmb3JtIGEgY29uY3VycmVudCBidWlsZC4gVG8gYnVpbGQgdGhlCi0gICAgICBp bmRleCB3aXRob3V0IGludGVyZmVyaW5nIHdpdGggcHJvZHVjdGlvbiB5b3Ugc2hvdWxkIGRy b3AgdGhlIGluZGV4IGFuZAotICAgICAgcmVpc3N1ZSB0aGUgPGNvbW1hbmQ+Q1JFQVRFIElO REVYIENPTkNVUlJFTlRMWTwvY29tbWFuZD4gY29tbWFuZC4KKyAgICAgIGNvbnZlbmllbnQg dG8gdXNlIDxjb21tYW5kPlJFSU5ERVg8L2NvbW1hbmQ+IHRvIHJlYnVpbGQgdGhlbS4KICAg ICAgPC9wYXJhPgogICAgIDwvbGlzdGl0ZW0+CiAKQEAgLTE1MSw2ICsxNDgsMjEgQEAgPHRp dGxlPlBhcmFtZXRlcnM8L3RpdGxlPgogICAgIDwvbGlzdGl0ZW0+CiAgICA8L3Zhcmxpc3Rl bnRyeT4KIAorICAgPHZhcmxpc3RlbnRyeT4KKyAgICA8dGVybT48bGl0ZXJhbD5DT05DVVJS RU5UTFk8L2xpdGVyYWw+PC90ZXJtPgorICAgIDxsaXN0aXRlbT4KKyAgICAgPHBhcmE+Cisg ICAgICBXaGVuIHRoaXMgb3B0aW9uIGlzIHVzZWQsIDxwcm9kdWN0bmFtZT5Qb3N0Z3JlU1FM PC9wcm9kdWN0bmFtZT4gd2lsbCByZWJ1aWxkIHRoZQorICAgICAgaW5kZXggd2l0aG91dCB0 YWtpbmcgYW55IGxvY2tzIHRoYXQgcHJldmVudCBjb25jdXJyZW50IGluc2VydHMsCisgICAg ICB1cGRhdGVzLCBvciBkZWxldGVzIG9uIHRoZSB0YWJsZTsgd2hlcmVhcyBhIHN0YW5kYXJk IHJlaW5kZXggYnVpbGQKKyAgICAgIGxvY2tzIG91dCB3cml0ZXMgKGJ1dCBub3QgcmVhZHMp IG9uIHRoZSB0YWJsZSB1bnRpbCBpdCdzIGRvbmUuCisgICAgICBUaGVyZSBhcmUgc2V2ZXJh bCBjYXZlYXRzIHRvIGJlIGF3YXJlIG9mIHdoZW4gdXNpbmcgdGhpcyBvcHRpb24KKyAgICAg ICZtZGFzaDsgc2VlIDx4cmVmIGxpbmtlbmQ9InNxbC1yZWluZGV4LWNvbmN1cnJlbnRseSIK KyAgICAgIGVuZHRlcm09InNxbC1yZWluZGV4LWNvbmN1cnJlbnRseS10aXRsZSIvPi4KKyAg ICAgPC9wYXJhPgorICAgIDwvbGlzdGl0ZW0+CisgICA8L3Zhcmxpc3RlbnRyeT4KKwogICAg PHZhcmxpc3RlbnRyeT4KICAgICA8dGVybT48bGl0ZXJhbD5WRVJCT1NFPC9saXRlcmFsPjwv dGVybT4KICAgICA8bGlzdGl0ZW0+CkBAIC0yNDEsNiArMjUzLDE2MCBAQCA8dGl0bGU+Tm90 ZXM8L3RpdGxlPgogICAgRWFjaCBpbmRpdmlkdWFsIHBhcnRpdGlvbiBjYW4gYmUgcmVpbmRl eGVkIHNlcGFyYXRlbHkgaW5zdGVhZC4KICAgPC9wYXJhPgogCisgIDxyZWZzZWN0MiBpZD0i c3FsLXJlaW5kZXgtY29uY3VycmVudGx5Ij4KKyAgIDx0aXRsZSBpZD0ic3FsLXJlaW5kZXgt Y29uY3VycmVudGx5LXRpdGxlIj5SZWJ1aWxkaW5nIEluZGV4ZXMgQ29uY3VycmVudGx5PC90 aXRsZT4KKworICAgPGluZGV4dGVybSB6b25lPSJzcWwtcmVpbmRleC1jb25jdXJyZW50bHki PgorICAgIDxwcmltYXJ5PmluZGV4PC9wcmltYXJ5PgorICAgIDxzZWNvbmRhcnk+cmVidWls ZGluZyBjb25jdXJyZW50bHk8L3NlY29uZGFyeT4KKyAgIDwvaW5kZXh0ZXJtPgorCisgICA8 cGFyYT4KKyAgICBSZWJ1aWxkaW5nIGFuIGluZGV4IGNhbiBpbnRlcmZlcmUgd2l0aCByZWd1 bGFyIG9wZXJhdGlvbiBvZiBhIGRhdGFiYXNlLgorICAgIE5vcm1hbGx5IDxwcm9kdWN0bmFt ZT5Qb3N0Z3JlU1FMPC9wcm9kdWN0bmFtZT4gbG9ja3MgdGhlIHRhYmxlIHdob3NlIGluZGV4 IGlzIHJlYnVpbHQKKyAgICBhZ2FpbnN0IHdyaXRlcyBhbmQgcGVyZm9ybXMgdGhlIGVudGly ZSBpbmRleCBidWlsZCB3aXRoIGEgc2luZ2xlIHNjYW4gb2YgdGhlCisgICAgdGFibGUuIE90 aGVyIHRyYW5zYWN0aW9ucyBjYW4gc3RpbGwgcmVhZCB0aGUgdGFibGUsIGJ1dCBpZiB0aGV5 IHRyeSB0bworICAgIGluc2VydCwgdXBkYXRlLCBvciBkZWxldGUgcm93cyBpbiB0aGUgdGFi bGUgdGhleSB3aWxsIGJsb2NrIHVudGlsIHRoZQorICAgIGluZGV4IHJlYnVpbGQgaXMgZmlu aXNoZWQuIFRoaXMgY291bGQgaGF2ZSBhIHNldmVyZSBlZmZlY3QgaWYgdGhlIHN5c3RlbSBp cworICAgIGEgbGl2ZSBwcm9kdWN0aW9uIGRhdGFiYXNlLiBWZXJ5IGxhcmdlIHRhYmxlcyBj YW4gdGFrZSBtYW55IGhvdXJzIHRvIGJlCisgICAgaW5kZXhlZCwgYW5kIGV2ZW4gZm9yIHNt YWxsZXIgdGFibGVzLCBhbiBpbmRleCByZWJ1aWxkIGNhbiBsb2NrIG91dCB3cml0ZXJzCisg ICAgZm9yIHBlcmlvZHMgdGhhdCBhcmUgdW5hY2NlcHRhYmx5IGxvbmcgZm9yIGEgcHJvZHVj dGlvbiBzeXN0ZW0uCisgICA8L3BhcmE+CisKKyAgIDxwYXJhPgorICAgIDxwcm9kdWN0bmFt ZT5Qb3N0Z3JlU1FMPC9wcm9kdWN0bmFtZT4gc3VwcG9ydHMgcmVidWlsZGluZyBpbmRleGVz IHdpdGggbWluaW11bSBsb2NraW5nCisgICAgb2Ygd3JpdGVzLiAgVGhpcyBtZXRob2QgaXMg aW52b2tlZCBieSBzcGVjaWZ5aW5nIHRoZQorICAgIDxsaXRlcmFsPkNPTkNVUlJFTlRMWTwv bGl0ZXJhbD4gb3B0aW9uIG9mIDxjb21tYW5kPlJFSU5ERVg8L2NvbW1hbmQ+LiBXaGVuIHRo aXMgb3B0aW9uCisgICAgaXMgdXNlZCwgPHByb2R1Y3RuYW1lPlBvc3RncmVTUUw8L3Byb2R1 Y3RuYW1lPiBtdXN0IHBlcmZvcm0gdHdvIHNjYW5zIG9mIHRoZSB0YWJsZQorICAgIGZvciBl YWNoIGluZGV4IHRoYXQgbmVlZHMgdG8gYmUgcmVidWlsZCBhbmQgaW4gYWRkaXRpb24gaXQg bXVzdCB3YWl0IGZvcgorICAgIGFsbCBleGlzdGluZyB0cmFuc2FjdGlvbnMgdGhhdCBjb3Vs ZCBwb3RlbnRpYWxseSB1c2UgdGhlIGluZGV4IHRvCisgICAgdGVybWluYXRlLiBUaGlzIG1l dGhvZCByZXF1aXJlcyBtb3JlIHRvdGFsIHdvcmsgdGhhbiBhIHN0YW5kYXJkIGluZGV4Cisg ICAgcmVidWlsZCBhbmQgdGFrZXMgc2lnbmlmaWNhbnRseSBsb25nZXIgdG8gY29tcGxldGUg YXMgaXQgbmVlZHMgdG8gd2FpdAorICAgIGZvciB1bmZpbmlzaGVkIHRyYW5zYWN0aW9ucyB0 aGF0IG1pZ2h0IG1vZGlmeSB0aGUgaW5kZXguIEhvd2V2ZXIsIHNpbmNlCisgICAgaXQgYWxs b3dzIG5vcm1hbCBvcGVyYXRpb25zIHRvIGNvbnRpbnVlIHdoaWxlIHRoZSBpbmRleCBpcyBy ZWJ1aWx0LCB0aGlzCisgICAgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgcmVidWlsZGluZyBpbmRl eGVzIGluIGEgcHJvZHVjdGlvbiBlbnZpcm9ubWVudC4gT2YKKyAgICBjb3Vyc2UsIHRoZSBl eHRyYSBDUFUsIG1lbW9yeSBhbmQgSS9PIGxvYWQgaW1wb3NlZCBieSB0aGUgaW5kZXggcmVi dWlsZAorICAgIG1heSBzbG93IGRvd24gb3RoZXIgb3BlcmF0aW9ucy4KKyAgIDwvcGFyYT4K KworICAgPHBhcmE+CisgICAgVGhlIGZvbGxvd2luZyBzdGVwcyBvY2N1ciBpbiBhIGNvbmN1 cnJlbnQgaW5kZXggYnVpbGQsIGVhY2ggaW4gYSBzZXBhcmF0ZQorICAgIHRyYW5zYWN0aW9u IGV4Y2VwdCB3aGVuIHRoZSBuZXcgaW5kZXggZGVmaW5pdGlvbnMgYXJlIGNyZWF0ZWQsIHdo ZXJlIGFsbAorICAgIHRoZSBjb25jdXJyZW50IGVudHJpZXMgYXJlIGNyZWF0ZWQgdXNpbmcg b25seSBvbmUgdHJhbnNhY3Rpb24uIE5vdGUgdGhhdAorICAgIGlmIHRoZXJlIGFyZSBtdWx0 aXBsZSBpbmRleGVzIHRvIGJlIHJlYnVpbHQgdGhlbiBlYWNoIHN0ZXAgbG9vcHMgdGhyb3Vn aAorICAgIGFsbCB0aGUgaW5kZXhlcyB3ZSdyZSByZWJ1aWxkaW5nLCB1c2luZyBhIHNlcGFy YXRlIHRyYW5zYWN0aW9uIGZvciBlYWNoIG9uZS4KKyAgICA8Y29tbWFuZD5SRUlOREVYIENP TkNVUlJFTlRMWTwvY29tbWFuZD4gcHJvY2VlZHMgYXMgZm9sbG93cyB3aGVuIHJlYnVpbGRp bmcKKyAgICBpbmRleGVzOgorCisgICAgPG9yZGVyZWRsaXN0PgorICAgICA8bGlzdGl0ZW0+ CisgICAgICA8cGFyYT4KKyAgICAgICBBIG5ldyB0ZW1wb3JhcnkgaW5kZXggZGVmaW5pdGlv biBpcyBhZGRlZCBpbnRvIHRoZSBjYXRhbG9nCisgICAgICAgPGxpdGVyYWw+cGdfaW5kZXg8 L2xpdGVyYWw+LiBUaGlzIGRlZmluaXRpb24gd2lsbCBiZSB1c2VkIHRvIHJlcGxhY2UgdGhl CisgICAgICAgb2xkIGluZGV4LiBUaGlzIHN0ZXAgaXMgZG9uZSBhcyBhIHNpbmdsZSB0cmFu c2FjdGlvbiBmb3IgYWxsIHRoZSBpbmRleGVzCisgICAgICAgaW52b2x2ZWQgaW4gdGhpcyBw cm9jZXNzLCBtZWFuaW5nIHRoYXQgaWYKKyAgICAgICA8Y29tbWFuZD5SRUlOREVYIENPTkNV UlJFTlRMWTwvY29tbWFuZD4gaXMgcnVuIG9uIGEgdGFibGUgd2l0aCBtdWx0aXBsZQorICAg ICAgIGluZGV4ZXMsIGFsbCB0aGUgY2F0YWxvZyBlbnRyaWVzIG9mIHRoZSBuZXcgaW5kZXhl cyBhcmUgY3JlYXRlZCB3aXRoaW4gYQorICAgICAgIHNpbmdsZSB0cmFuc2FjdGlvbi4gQSA8 bGl0ZXJhbD5TSEFSRSBVUERBVEUgRVhDTFVTSVZFPC9saXRlcmFsPiBsb2NrIGF0CisgICAg ICAgc2Vzc2lvbiBsZXZlbCBpcyB0YWtlbiBvbiB0aGUgaW5kZXhlcyBiZWluZyByZWluZGV4 ZWQgYXMgd2VsbCBhcyBpdHMKKyAgICAgICBwYXJlbnQgdGFibGUgdG8gcHJldmVudCBhbnkg c2NoZW1hIG1vZGlmaWNhdGlvbiB3aGlsZSBwcm9jZXNzaW5nLgorICAgICAgPC9wYXJhPgor ICAgICA8L2xpc3RpdGVtPgorICAgICA8bGlzdGl0ZW0+CisgICAgICA8cGFyYT4KKyAgICAg ICBBIGZpcnN0IHBhc3MgdG8gYnVpbGQgdGhlIGluZGV4IGlzIGRvbmUgZm9yIGVhY2ggbmV3 IGluZGV4IGVudHJ5LgorICAgICAgIE9uY2UgdGhlIGluZGV4IGlzIGJ1aWx0LCBpdHMgZmxh ZyA8bGl0ZXJhbD5wZ19pbmRleC5pbmRpc3JlYWR5PC9saXRlcmFsPiBpcworICAgICAgIHN3 aXRjaGVkIHRvIDxxdW90ZT50cnVlPC9xdW90ZT4gdG8gbWFrZSByZWFkeSBmb3IgaW5zZXJ0 cywgbWFraW5nIGl0CisgICAgICAgdmlzaWJsZSB0byBvdGhlciBzZXNzaW9ucyBvbmNlIHRo ZSB0cmFuc2FjdGlvbiB0aGF0IHBlcmZvcm1lZCB0aGUKKyAgICAgICBidWlsZCBpcyBmaW5p c2hlZC4gVGhpcyBzdGVwIGlzIGRvbmUgd2l0aGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uCisg ICAgICAgZm9yIGVhY2ggZW50cnkuCisgICAgICA8L3BhcmE+CisgICAgIDwvbGlzdGl0ZW0+ CisgICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPgorICAgICAgIFRoZW4gYSBzZWNvbmQg cGFzcyBpcyBwZXJmb3JtZWQgdG8gYWRkIHR1cGxlcyB0aGF0IHdlcmUgYWRkZWQgd2hpbGUK KyAgICAgICB0aGUgZmlyc3QgcGFzcyBidWlsZCB3YXMgcnVubmluZy4gVGhpcyBzdGVwIGlz IHBlcmZvcm1lZCB3aXRoaW4gYSBzaW5nbGUKKyAgICAgICB0cmFuc2FjdGlvbiBmb3IgZWFj aCB0ZW1wb3JhcnkgZW50cnkuCisgICAgICA8L3BhcmE+CisgICAgIDwvbGlzdGl0ZW0+Cisg ICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPgorICAgICAgIEFsbCB0aGUgY29udHJhaW50 cyBhbmQgZm9yZWlnbiBrZXlzIHdoaWNoIHJlZmVyIHRvIHRoZSBpbmRleCBhcmUgc3dhcHBl ZAorICAgICAgIHRvIHJlZmVyIHRvIHRoZSBuZXcgaW5kZXggZGVmaW5pdGlvbiwgYW5kIHRo ZSBuYW1lcyBvZiB0aGUgaW5kZXhlcyBhcmUKKyAgICAgICBjaGFuZ2VkLiBBdCB0aGlzIHBv aW50IDxsaXRlcmFsPnBnX2luZGV4LmluZGlzdmFsaWQ8L2xpdGVyYWw+IGlzIHN3aXRjaGVk IHRvCisgICAgICAgPHF1b3RlPnRydWU8L3F1b3RlPiBmb3IgdGhlIG5ldyBpbmRleCBhbmQg dG8gPHF1b3RlPmZhbHNlPC9xdW90ZT4gZm9yIHRoZSBvbGQsIGFuZAorICAgICAgIGEgY2Fj aGUgaW52YWxpZGF0aW9uIGlzIGRvbmUgc28gYXMgYWxsIHRoZSBzZXNzaW9ucyB0aGF0IHJl ZmVyZW5jZWQgdGhlCisgICAgICAgb2xkIGluZGV4IGFyZSBpbnZhbGlkYXRlZC4gVGhpcyBz dGVwIGlzIGRvbmUgd2l0aGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uCisgICAgICAgZm9yIGVh Y2ggdGVtcG9yYXJ5IGVudHJ5LgorICAgICAgPC9wYXJhPgorICAgICA8L2xpc3RpdGVtPgor ICAgICA8bGlzdGl0ZW0+CisgICAgICA8cGFyYT4KKyAgICAgICBPbGQgaW5kZXhlcyBoYXZl IDxsaXRlcmFsPnBnX2luZGV4LmluZGlzcmVhZHk8L2xpdGVyYWw+IHN3aXRjaGVkIHRvIDxx dW90ZT5mYWxzZTwvcXVvdGU+CisgICAgICAgdG8gcHJldmVudCBhbnkgbmV3IHR1cGxlIGlu c2VydGlvbnMgYWZ0ZXIgd2FpdGluZyBmb3IgcnVubmluZyBxdWVyaWVzIHdoaWNoCisgICAg ICAgbWF5IHJlZmVyZW5jZSB0aGUgb2xkIGluZGV4IHRvIGNvbXBsZXRlLiBUaGlzIHN0ZXAg aXMgZG9uZSB3aXRoaW4gYSBzaW5nbGUKKyAgICAgICB0cmFuc2FjdGlvbiBmb3IgZWFjaCB0 ZW1wb3JhcnkgZW50cnkuCisgICAgICA8L3BhcmE+CisgICAgIDwvbGlzdGl0ZW0+CisgICAg IDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPgorICAgICAgIFRoZSBvbGQgaW5kZXggZGVmaW5p dGlvbiBhbmQgaXRzIGRhdGEgYXJlIGRyb3BwZWQuIFRoaXMgc3RlcCBpcyBkb25lIHdpdGhp bgorICAgICAgIGEgc2luZ2xlIHRyYW5zYWN0aW9uIGZvciBlYWNoIHRlbXBvcmFyeSBlbnRy eS4KKyAgICAgIDwvcGFyYT4KKyAgICAgPC9saXN0aXRlbT4KKyAgICAgPGxpc3RpdGVtPgor ICAgICAgPHBhcmE+CisgICAgICAgVGhlIDxsaXRlcmFsPlNIQVJFIFVQREFURSBFWENMVVNJ VkU8L2xpdGVyYWw+IHNlc3Npb24gbG9jayBpcyByZWxlYXNlZAorICAgICAgIGZvciBhbGwg dGhlIGluZGV4ZXMgcHJvY2Vzc2VkIGFzIHdlbGwgYXMgdGhlaXIgcGFyZW50IHRhYmxlcy4K KyAgICAgIDwvcGFyYT4KKyAgICAgPC9saXN0aXRlbT4KKyAgICA8L29yZGVyZWRsaXN0Pgor ICAgPC9wYXJhPgorCisgICA8cGFyYT4KKyAgICBJZiBhIHByb2JsZW0gYXJpc2VzIHdoaWxl IHJlYnVpbGRpbmcgdGhlIGluZGV4ZXMsIHN1Y2ggYXMgYQorICAgIHVuaXF1ZW5lc3Mgdmlv bGF0aW9uIGluIGEgdW5pcXVlIGluZGV4LCB0aGUgPGNvbW1hbmQ+UkVJTkRFWDwvY29tbWFu ZD4KKyAgICBjb21tYW5kIHdpbGwgZmFpbCBidXQgbGVhdmUgYmVoaW5kIGFuIDxxdW90ZT5p bnZhbGlkPC9xdW90ZT4gbmV3IGluZGV4IG9uIHRvcAorICAgIG9mIHRoZSBleGlzdGluZyBv bmUuIFRoaXMgaW5kZXggd2lsbCBiZSBpZ25vcmVkIGZvciBxdWVyeWluZyBwdXJwb3Nlcwor ICAgIGJlY2F1c2UgaXQgbWlnaHQgYmUgaW5jb21wbGV0ZTsgaG93ZXZlciBpdCB3aWxsIHN0 aWxsIGNvbnN1bWUgdXBkYXRlCisgICAgb3ZlcmhlYWQuIFRoZSA8YXBwbGljYXRpb24+cHNx bDwvYXBwbGljYXRpb24+IDxjb21tYW5kPlxkPC9jb21tYW5kPiBjb21tYW5kIHdpbGwgcmVw b3J0CisgICAgc3VjaCBhbiBpbmRleCBhcyA8bGl0ZXJhbD5JTlZBTElEPC9saXRlcmFsPjoK KworPHByb2dyYW1saXN0aW5nPgorcG9zdGdyZXM9IyBcZCB0YWIKKyAgICAgICBUYWJsZSAi cHVibGljLnRhYiIKKyBDb2x1bW4gfCAgVHlwZSAgIHwgTW9kaWZpZXJzCistLS0tLS0tLSst LS0tLS0tLS0rLS0tLS0tLS0tLS0KKyBjb2wgICAgfCBpbnRlZ2VyIHwKK0luZGV4ZXM6Cisg ICAgImlkeCIgYnRyZWUgKGNvbCkKKyAgICAiaWR4X2NjdCIgYnRyZWUgKGNvbCkgSU5WQUxJ RAorPC9wcm9ncmFtbGlzdGluZz4KKworICAgIFRoZSByZWNvbW1lbmRlZCByZWNvdmVyeSBt ZXRob2QgaW4gc3VjaCBjYXNlcyBpcyB0byBkcm9wIHRoZSBpbnZhbGlkCisgICAgaW5kZXgg YW5kIHRyeSBhZ2FpbiB0byBwZXJmb3JtIDxjb21tYW5kPlJFSU5ERVggQ09OQ1VSUkVOVExZ PC9jb21tYW5kPi4KKyAgICBUaGUgY29uY3VycmVudCBpbmRleCBjcmVhdGVkIGR1cmluZyB0 aGUgcHJvY2Vzc2luZyBoYXMgYSBuYW1lIGVuZGluZyBpbgorICAgIHRoZSBzdWZmaXggY2Nu ZXcsIG9yIGNjb2xkIGlmIGl0IGlzIGFuIG9sZCBpbmRleCBkZWZpbml0b24gd2hpY2ggd2Ug ZmFpbGVkCisgICAgdG8gZHJvcC4gSW52YWxpZCBpbmRleGVzIGNhbiBiZSBkcm9wcGVkIHVz aW5nIDxsaXRlcmFsPkRST1AgSU5ERVg8L2xpdGVyYWw+LAorICAgIGluY2x1ZGluZyBpbnZh bGlkIHRvYXN0IGluZGV4ZXMuCisgICA8L3BhcmE+CisKKyAgIDxwYXJhPgorICAgIFJlZ3Vs YXIgaW5kZXggYnVpbGRzIHBlcm1pdCBvdGhlciByZWd1bGFyIGluZGV4IGJ1aWxkcyBvbiB0 aGUgc2FtZQorICAgIHRhYmxlIHRvIG9jY3VyIGluIHBhcmFsbGVsLCBidXQgb25seSBvbmUg Y29uY3VycmVudCBpbmRleCBidWlsZCBjYW4KKyAgICBvY2N1ciBvbiBhIHRhYmxlIGF0IGEg dGltZS4gSW4gYm90aCBjYXNlcywgbm8gb3RoZXIgdHlwZXMgb2Ygc2NoZW1hCisgICAgbW9k aWZpY2F0aW9uIG9uIHRoZSB0YWJsZSBhcmUgYWxsb3dlZCBtZWFud2hpbGUuICBBbm90aGVy IGRpZmZlcmVuY2UKKyAgICBpcyB0aGF0IGEgcmVndWxhciA8Y29tbWFuZD5SRUlOREVYIFRB QkxFPC9jb21tYW5kPiBvciA8Y29tbWFuZD5SRUlOREVYIElOREVYPC9jb21tYW5kPgorICAg IGNvbW1hbmQgY2FuIGJlIHBlcmZvcm1lZCB3aXRoaW4gYSB0cmFuc2FjdGlvbiBibG9jaywg YnV0CisgICAgPGNvbW1hbmQ+UkVJTkRFWCBDT05DVVJSRU5UTFk8L2NvbW1hbmQ+IGNhbm5v dC4KKyAgIDwvcGFyYT4KKworICAgPHBhcmE+CisgICAgPGNvbW1hbmQ+UkVJTkRFWCBTWVNU RU08L2NvbW1hbmQ+IGRvZXMgbm90IHN1cHBvcnQKKyAgICA8Y29tbWFuZD5DT05DVVJSRU5U TFk8L2NvbW1hbmQ+IHNpbmNlIHN5c3RlbSBjYXRhbG9ncyBjYW5ub3QgYmUgcmVpbmRleGVk CisgICAgY29uY3VycmVudGx5LgorICAgPC9wYXJhPgorICA8L3JlZnNlY3QyPgogIDwvcmVm c2VjdDE+CiAKICA8cmVmc2VjdDE+CkBAIC0yNzIsNiArNDM4LDE0IEBAIDx0aXRsZT5FeGFt cGxlczwvdGl0bGU+CiAuLi4KIGJyb2tlbl9kYj0mZ3Q7IFJFSU5ERVggREFUQUJBU0UgYnJv a2VuX2RiOwogYnJva2VuX2RiPSZndDsgXHEKKzwvcHJvZ3JhbWxpc3Rpbmc+PC9wYXJhPgor CisgIDxwYXJhPgorICAgUmVidWlsZCBhIHRhYmxlIHdoaWxlIGF1dGhvcml6aW5nIHJlYWQg YW5kIHdyaXRlIG9wZXJhdGlvbnMgb24gaW52b2x2ZWQKKyAgIHJlbGF0aW9ucyB3aGVuIHBl cmZvcm1lZDoKKworPHByb2dyYW1saXN0aW5nPgorUkVJTkRFWCBUQUJMRSBDT05DVVJSRU5U TFkgbXlfYnJva2VuX3RhYmxlOwogPC9wcm9ncmFtbGlzdGluZz48L3BhcmE+CiAgPC9yZWZz ZWN0MT4KIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY2F0YWxvZy9pbmRleC5jIGIvc3Jj L2JhY2tlbmQvY2F0YWxvZy9pbmRleC5jCmluZGV4IGM5MTQwODA0NmEuLjBjMDI2MDQ1Yjgg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NhdGFsb2cvaW5kZXguYworKysgYi9zcmMvYmFj a2VuZC9jYXRhbG9nL2luZGV4LmMKQEAgLTY5NCw2ICs2OTQsNyBAQCBVcGRhdGVJbmRleFJl bGF0aW9uKE9pZCBpbmRleG9pZCwKICAqIGNsYXNzT2JqZWN0SWQ6IGFycmF5IG9mIGluZGV4 IG9wY2xhc3MgT0lEcywgb25lIHBlciBpbmRleCBjb2x1bW4KICAqIGNvbG9wdGlvbnM6IGFy cmF5IG9mIHBlci1pbmRleC1jb2x1bW4gaW5kb3B0aW9uIHNldHRpbmdzCiAgKiByZWxvcHRp b25zOiBBTS1zcGVjaWZpYyBvcHRpb25zCisgKiB0dXBkZXNjOiBUdXBsZSBkZXNjcmlwdG9y IHVzZWQgZm9yIHRoZSBpbmRleCBpZiBkZWZpbmVkCiAgKiBmbGFnczogYml0bWFzayB0aGF0 IGNhbiBpbmNsdWRlIGFueSBjb21iaW5hdGlvbiBvZiB0aGVzZSBiaXRzOgogICoJCUlOREVY X0NSRUFURV9JU19QUklNQVJZCiAgKgkJCXRoZSBpbmRleCBpcyBhIHByaW1hcnkga2V5CkBA IC03MzQsNiArNzM1LDcgQEAgaW5kZXhfY3JlYXRlKFJlbGF0aW9uIGhlYXBSZWxhdGlvbiwK IAkJCSBPaWQgKmNsYXNzT2JqZWN0SWQsCiAJCQkgaW50MTYgKmNvbG9wdGlvbnMsCiAJCQkg RGF0dW0gcmVsb3B0aW9ucywKKwkJCSBUdXBsZURlc2MgdHVwZGVzYywKIAkJCSBiaXRzMTYg ZmxhZ3MsCiAJCQkgYml0czE2IGNvbnN0cl9mbGFncywKIAkJCSBib29sIGFsbG93X3N5c3Rl bV90YWJsZV9tb2RzLApAQCAtNzk2LDcgKzc5OCw3IEBAIGluZGV4X2NyZWF0ZShSZWxhdGlv biBoZWFwUmVsYXRpb24sCiAJICogcmVsZWFzZSBsb2NrcyBiZWZvcmUgY29tbWl0dGluZyBp biBjYXRhbG9ncwogCSAqLwogCWlmIChjb25jdXJyZW50ICYmCi0JCUlzU3lzdGVtUmVsYXRp b24oaGVhcFJlbGF0aW9uKSkKKwkJSXNTeXN0ZW1OYW1lc3BhY2UoZ2V0X3JlbF9uYW1lc3Bh Y2UoaGVhcFJlbGF0aW9uSWQpKSkKIAkJZXJlcG9ydChFUlJPUiwKIAkJCQkoZXJyY29kZShF UlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCiAJCQkJIGVycm1zZygiY29uY3VycmVu dCBpbmRleCBjcmVhdGlvbiBvbiBzeXN0ZW0gY2F0YWxvZyB0YWJsZXMgaXMgbm90IHN1cHBv cnRlZCIpKSk7CkBAIC04NjQsMTQgKzg2NiwyMCBAQCBpbmRleF9jcmVhdGUoUmVsYXRpb24g aGVhcFJlbGF0aW9uLAogCX0KIAogCS8qCi0JICogY29uc3RydWN0IHR1cGxlIGRlc2NyaXB0 b3IgZm9yIGluZGV4IHR1cGxlcworCSAqIGNvbnN0cnVjdCB0dXBsZSBkZXNjcmlwdG9yIGZv ciBpbmRleCB0dXBsZXMgaWYgbm90IHBhc3NlZCBieSBjYWxsZXIKIAkgKi8KLQlpbmRleFR1 cERlc2MgPSBDb25zdHJ1Y3RUdXBsZURlc2NyaXB0b3IoaGVhcFJlbGF0aW9uLAotCQkJCQkJ CQkJCQlpbmRleEluZm8sCi0JCQkJCQkJCQkJCWluZGV4Q29sTmFtZXMsCi0JCQkJCQkJCQkJ CWFjY2Vzc01ldGhvZE9iamVjdElkLAotCQkJCQkJCQkJCQljb2xsYXRpb25PYmplY3RJZCwK LQkJCQkJCQkJCQkJY2xhc3NPYmplY3RJZCk7CisJaWYgKCF0dXBkZXNjKQorCQlpbmRleFR1 cERlc2MgPSBDb25zdHJ1Y3RUdXBsZURlc2NyaXB0b3IoaGVhcFJlbGF0aW9uLAorCQkJCQkJ CQkJCQkJaW5kZXhJbmZvLAorCQkJCQkJCQkJCQkJaW5kZXhDb2xOYW1lcywKKwkJCQkJCQkJ CQkJCWFjY2Vzc01ldGhvZE9iamVjdElkLAorCQkJCQkJCQkJCQkJY29sbGF0aW9uT2JqZWN0 SWQsCisJCQkJCQkJCQkJCQljbGFzc09iamVjdElkKTsKKwllbHNlCisJeworCQlBc3NlcnQo aW5kZXhDb2xOYW1lcyA9PSBOSUwpOworCQlpbmRleFR1cERlc2MgPSB0dXBkZXNjOworCX0K IAogCS8qCiAJICogQWxsb2NhdGUgYW4gT0lEIGZvciB0aGUgaW5kZXgsIHVubGVzcyB3ZSB3 ZXJlIHRvbGQgd2hhdCB0byB1c2UuCkBAIC0xMjAzLDYgKzEyMTEsNDUxIEBAIGluZGV4X2Ny ZWF0ZShSZWxhdGlvbiBoZWFwUmVsYXRpb24sCiAJcmV0dXJuIGluZGV4UmVsYXRpb25JZDsK IH0KIAorLyoKKyAqIGluZGV4X2NvbmN1cnJlbnRseV9jcmVhdGVfY29weQorICoKKyAqIENy ZWF0ZSBjb25jdXJyZW50bHkgYW4gaW5kZXggYmFzZWQgb24gdGhlIGRlZmluaXRpb24gb2Yg dGhlIG9uZSBwcm92aWRlZCBieQorICogY2FsbGVyLiAgVGhlIGluZGV4IGlzIGluc2VydGVk IGludG8gY2F0YWxvZ3MgYW5kIG5lZWRzIHRvIGJlIGJ1aWx0IGxhdGVyCisgKiBvbi4gIFRo aXMgaXMgY2FsbGVkIGR1cmluZyBjb25jdXJyZW50IHJlaW5kZXggcHJvY2Vzc2luZy4KKyAq LworT2lkCitpbmRleF9jb25jdXJyZW50bHlfY3JlYXRlX2NvcHkoUmVsYXRpb24gaGVhcFJl bGF0aW9uLCBPaWQgb2xkSW5kZXhJZCwgY29uc3QgY2hhciAqbmV3TmFtZSkKK3sKKwlSZWxh dGlvbglpbmRleFJlbGF0aW9uOworCUluZGV4SW5mbyAgKmluZGV4SW5mbzsKKwlPaWQJCQlu ZXdJbmRleElkID0gSW52YWxpZE9pZDsKKwlIZWFwVHVwbGUJaW5kZXhUdXBsZSwKKwkJCQlj bGFzc1R1cGxlOworCURhdHVtCQlpbmRjbGFzc0RhdHVtLAorCQkJCWNvbE9wdGlvbkRhdHVt LAorCQkJCW9wdGlvbkRhdHVtOworCVR1cGxlRGVzYwlpbmRleFR1cERlc2M7CisJb2lkdmVj dG9yICAqaW5kY2xhc3M7CisJaW50MnZlY3RvciAqaW5kY29sb3B0aW9uczsKKwlib29sCQlp c251bGw7CisKKwlpbmRleFJlbGF0aW9uID0gaW5kZXhfb3BlbihvbGRJbmRleElkLCBSb3dF eGNsdXNpdmVMb2NrKTsKKworCS8qIE5ldyBpbmRleCB1c2VzIHRoZSBzYW1lIGluZGV4IGlu Zm9ybWF0aW9uIGFzIG9sZCBpbmRleCAqLworCWluZGV4SW5mbyA9IEJ1aWxkSW5kZXhJbmZv KGluZGV4UmVsYXRpb24pOworCisJLyogRG8gbm90IGNvcHkgZXhjbHVzaW9uIGNvbnN0cmFp bnQgKi8KKwlpbmRleEluZm8tPmlpX0V4Y2x1c2lvbk9wcyA9IE5VTEw7CisJaW5kZXhJbmZv LT5paV9FeGNsdXNpb25Qcm9jcyA9IE5VTEw7CisJaW5kZXhJbmZvLT5paV9FeGNsdXNpb25T dHJhdHMgPSBOVUxMOworCisJLyogQ3JlYXRlIGEgY29weSBvZiB0aGUgdHVwbGUgZGVzY3Jp cHRvciB0byBiZSB1c2VkIGZvciB0aGUgbmV3IGVudHJ5ICovCisJaW5kZXhUdXBEZXNjID0g Q3JlYXRlVHVwbGVEZXNjQ29weUNvbnN0cihSZWxhdGlvbkdldERlc2NyKGluZGV4UmVsYXRp b24pKTsKKworCS8qIEdldCB0aGUgYXJyYXkgb2YgY2xhc3MgYW5kIGNvbHVtbiBvcHRpb25z IElEcyBmcm9tIGluZGV4IGluZm8gKi8KKwlpbmRleFR1cGxlID0gU2VhcmNoU3lzQ2FjaGUx KElOREVYUkVMSUQsIE9iamVjdElkR2V0RGF0dW0ob2xkSW5kZXhJZCkpOworCWlmICghSGVh cFR1cGxlSXNWYWxpZChpbmRleFR1cGxlKSkKKwkJZWxvZyhFUlJPUiwgImNhY2hlIGxvb2t1 cCBmYWlsZWQgZm9yIGluZGV4ICV1Iiwgb2xkSW5kZXhJZCk7CisJaW5kY2xhc3NEYXR1bSA9 IFN5c0NhY2hlR2V0QXR0cihJTkRFWFJFTElELCBpbmRleFR1cGxlLAorCQkJCQkJCQkJQW51 bV9wZ19pbmRleF9pbmRjbGFzcywgJmlzbnVsbCk7CisJQXNzZXJ0KCFpc251bGwpOworCWlu ZGNsYXNzID0gKG9pZHZlY3RvciAqKSBEYXR1bUdldFBvaW50ZXIoaW5kY2xhc3NEYXR1bSk7 CisKKwljb2xPcHRpb25EYXR1bSA9IFN5c0NhY2hlR2V0QXR0cihJTkRFWFJFTElELCBpbmRl eFR1cGxlLAorCQkJCQkJCQkJIEFudW1fcGdfaW5kZXhfaW5kb3B0aW9uLCAmaXNudWxsKTsK KwlBc3NlcnQoIWlzbnVsbCk7CisJaW5kY29sb3B0aW9ucyA9IChpbnQydmVjdG9yICopIERh dHVtR2V0UG9pbnRlcihjb2xPcHRpb25EYXR1bSk7CisKKwkvKiBGZXRjaCBvcHRpb25zIG9m IGluZGV4IGlmIGFueSAqLworCWNsYXNzVHVwbGUgPSBTZWFyY2hTeXNDYWNoZTEoUkVMT0lE LCBvbGRJbmRleElkKTsKKwlpZiAoIUhlYXBUdXBsZUlzVmFsaWQoY2xhc3NUdXBsZSkpCisJ CWVsb2coRVJST1IsICJjYWNoZSBsb29rdXAgZmFpbGVkIGZvciByZWxhdGlvbiAldSIsIG9s ZEluZGV4SWQpOworCW9wdGlvbkRhdHVtID0gU3lzQ2FjaGVHZXRBdHRyKFJFTE9JRCwgY2xh c3NUdXBsZSwKKwkJCQkJCQkJICBBbnVtX3BnX2NsYXNzX3JlbG9wdGlvbnMsICZpc251bGwp OworCisJLyogTm93IGNyZWF0ZSB0aGUgbmV3IGluZGV4ICovCisJbmV3SW5kZXhJZCA9IGlu ZGV4X2NyZWF0ZShoZWFwUmVsYXRpb24sCisJCQkJCQkJICBuZXdOYW1lLAorCQkJCQkJCSAg SW52YWxpZE9pZCwJLyogaW5kZXhSZWxhdGlvbklkICovCisJCQkJCQkJICBJbnZhbGlkT2lk LAkvKiBwYXJlbnRJbmRleFJlbGlkICovCisJCQkJCQkJICBJbnZhbGlkT2lkLAkvKiBwYXJl bnRDb25zdHJhaW50SWQgKi8KKwkJCQkJCQkgIEludmFsaWRPaWQsCS8qIHJlbEZpbGVOb2Rl ICovCisJCQkJCQkJICBpbmRleEluZm8sCisJCQkJCQkJICBOSUwsCisJCQkJCQkJICBpbmRl eFJlbGF0aW9uLT5yZF9yZWwtPnJlbGFtLAorCQkJCQkJCSAgaW5kZXhSZWxhdGlvbi0+cmRf cmVsLT5yZWx0YWJsZXNwYWNlLAorCQkJCQkJCSAgaW5kZXhSZWxhdGlvbi0+cmRfaW5kY29s bGF0aW9uLAorCQkJCQkJCSAgaW5kY2xhc3MtPnZhbHVlcywKKwkJCQkJCQkgIGluZGNvbG9w dGlvbnMtPnZhbHVlcywKKwkJCQkJCQkgIG9wdGlvbkRhdHVtLAorCQkJCQkJCSAgaW5kZXhU dXBEZXNjLAorCQkJCQkJCSAgSU5ERVhfQ1JFQVRFX1NLSVBfQlVJTEQgfCBJTkRFWF9DUkVB VEVfQ09OQ1VSUkVOVCwKKwkJCQkJCQkgIDAsCisJCQkJCQkJICB0cnVlLAkvKiBhbGxvdyB0 YWJsZSB0byBiZSBhIHN5c3RlbSBjYXRhbG9nPyAqLworCQkJCQkJCSAgZmFsc2UsIC8qIGlz X2ludGVybmFsPyAqLworCQkJCQkJCSAgTlVMTCk7CisKKwkvKiBDbG9zZSB0aGUgcmVsYXRp b25zIHVzZWQgYW5kIGNsZWFuIHVwICovCisJaW5kZXhfY2xvc2UoaW5kZXhSZWxhdGlvbiwg Tm9Mb2NrKTsKKwlSZWxlYXNlU3lzQ2FjaGUoaW5kZXhUdXBsZSk7CisJUmVsZWFzZVN5c0Nh Y2hlKGNsYXNzVHVwbGUpOworCisJcmV0dXJuIG5ld0luZGV4SWQ7Cit9CisKKy8qCisgKiBp bmRleF9jb25jdXJyZW50bHlfYnVpbGQKKyAqCisgKiBCdWlsZCBpbmRleCBmb3IgYSBjb25j dXJyZW50IG9wZXJhdGlvbi4gIExvdy1sZXZlbCBsb2NrcyBhcmUgdGFrZW4gd2hlbgorICog dGhpcyBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIHRvIHByZXZlbnQgb25seSBzY2hlbWEgY2hh bmdlcywgYnV0IHRoZXkgbmVlZCB0bworICogYmUga2VwdCB1bnRpbCB0aGUgZW5kIG9mIHRo ZSB0cmFuc2FjdGlvbiBwZXJmb3JtaW5nIHRoaXMgb3BlcmF0aW9uLgorICovCit2b2lkCitp bmRleF9jb25jdXJyZW50bHlfYnVpbGQoT2lkIGhlYXBPaWQsCisJCQkJCQkgT2lkIGluZGV4 T2lkLAorCQkJCQkJIGJvb2wgaXNwcmltYXJ5KQoreworCVJlbGF0aW9uCWhlYXBSZWwsCisJ CQkJaW5kZXhSZWxhdGlvbjsKKwlJbmRleEluZm8gICppbmRleEluZm87CisKKwkvKiBPcGVu IGFuZCBsb2NrIHRoZSBwYXJlbnQgaGVhcCByZWxhdGlvbiAqLworCWhlYXBSZWwgPSBoZWFw X29wZW4oaGVhcE9pZCwgU2hhcmVVcGRhdGVFeGNsdXNpdmVMb2NrKTsKKworCS8qIEFuZCB0 aGUgdGFyZ2V0IGluZGV4IHJlbGF0aW9uICovCisJaW5kZXhSZWxhdGlvbiA9IGluZGV4X29w ZW4oaW5kZXhPaWQsIFJvd0V4Y2x1c2l2ZUxvY2spOworCisJLyoKKwkgKiBXZSBoYXZlIHRv IHJlLWJ1aWxkIHRoZSBJbmRleEluZm8gc3RydWN0LCBzaW5jZSBpdCB3YXMgbG9zdCBpbiB0 aGUKKwkgKiBjb21taXQgb2YgdGhlIHRyYW5zYWN0aW9uIHdoZXJlIHRoaXMgY29uY3VycmVu dCBpbmRleCB3YXMgY3JlYXRlZCBhdAorCSAqIHRoZSBjYXRhbG9nIGxldmVsLgorCSAqLwor CWluZGV4SW5mbyA9IEJ1aWxkSW5kZXhJbmZvKGluZGV4UmVsYXRpb24pOworCUFzc2VydCgh aW5kZXhJbmZvLT5paV9SZWFkeUZvckluc2VydHMpOworCWluZGV4SW5mby0+aWlfQ29uY3Vy cmVudCA9IHRydWU7CisJaW5kZXhJbmZvLT5paV9Ccm9rZW5Ib3RDaGFpbiA9IGZhbHNlOwor CisJLyogTm93IGJ1aWxkIHRoZSBpbmRleCAqLworCWluZGV4X2J1aWxkKGhlYXBSZWwsIGlu ZGV4UmVsYXRpb24sIGluZGV4SW5mbywgaXNwcmltYXJ5LCBmYWxzZSwgdHJ1ZSk7CisKKwkv KiBDbG9zZSBib3RoIHJlbGF0aW9ucywgYW5kIGtlZXAgdGhlIGxvY2tzICovCisJaGVhcF9j bG9zZShoZWFwUmVsLCBOb0xvY2spOworCWluZGV4X2Nsb3NlKGluZGV4UmVsYXRpb24sIE5v TG9jayk7CisKKwkvKgorCSAqIFVwZGF0ZSB0aGUgcGdfaW5kZXggcm93IHRvIG1hcmsgdGhl IGluZGV4IGFzIHJlYWR5IGZvciBpbnNlcnRzLiAgT25jZQorCSAqIHdlIGNvbW1pdCB0aGlz IHRyYW5zYWN0aW9uLCBhbnkgbmV3IHRyYW5zYWN0aW9ucyB0aGF0IG9wZW4gdGhlIHRhYmxl CisJICogbXVzdCBpbnNlcnQgbmV3IGVudHJpZXMgaW50byB0aGUgaW5kZXggZm9yIGluc2Vy dGlvbnMgYW5kIG5vbi1IT1QKKwkgKiB1cGRhdGVzLgorCSAqLworCWluZGV4X3NldF9zdGF0 ZV9mbGFncyhpbmRleE9pZCwgSU5ERVhfQ1JFQVRFX1NFVF9SRUFEWSk7Cit9CisKKy8qCisg KiBpbmRleF9jb25jdXJyZW50bHlfc3dhcAorICoKKyAqIFN3YXAgbmFtZSwgZGVwZW5kZW5j aWVzLCBhbmQgY29uc3RyYWludHMgb2YgdGhlIG9sZCBpbmRleCBvdmVyIHRvIHRoZSBuZXcK KyAqIGluZGV4LCB3aGlsZSBtYXJraW5nIHRoZSBvbGQgaW5kZXggYXMgaW52YWxpZCBhbmQg dGhlIG5ldyBhcyB2YWxpZC4KKyAqLwordm9pZAoraW5kZXhfY29uY3VycmVudGx5X3N3YXAo T2lkIG5ld0luZGV4SWQsIE9pZCBvbGRJbmRleElkLCBjb25zdCBjaGFyICpvbGROYW1lKQor eworCVJlbGF0aW9uCXBnX2NsYXNzLAorCQkJCXBnX2luZGV4LAorCQkJCXBnX2NvbnN0cmFp bnQsCisJCQkJcGdfdHJpZ2dlcjsKKwlSZWxhdGlvbglvbGRDbGFzc1JlbCwKKwkJCQluZXdD bGFzc1JlbDsKKwlIZWFwVHVwbGUJb2xkQ2xhc3NUdXBsZSwKKwkJCQluZXdDbGFzc1R1cGxl OworCUZvcm1fcGdfY2xhc3Mgb2xkQ2xhc3NGb3JtLAorCQkJCW5ld0NsYXNzRm9ybTsKKwlI ZWFwVHVwbGUJb2xkSW5kZXhUdXBsZSwKKwkJCQluZXdJbmRleFR1cGxlOworCUZvcm1fcGdf aW5kZXggb2xkSW5kZXhGb3JtLAorCQkJCW5ld0luZGV4Rm9ybTsKKwlPaWQJCQlpbmRleENv bnN0cmFpbnRPaWQ7CisJTGlzdAkgICAqY29uc3RyYWludE9pZHMgPSBOSUw7CisJTGlzdENl bGwgICAqbGM7CisKKwkvKgorCSAqIFRha2UgYSBuZWNlc3NhcnkgbG9jayBvbiB0aGUgb2xk IGFuZCBuZXcgaW5kZXggYmVmb3JlIHN3YXBwaW5nIHRoZW0uCisJICovCisJb2xkQ2xhc3NS ZWwgPSByZWxhdGlvbl9vcGVuKG9sZEluZGV4SWQsIFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9j ayk7CisJbmV3Q2xhc3NSZWwgPSByZWxhdGlvbl9vcGVuKG5ld0luZGV4SWQsIFNoYXJlVXBk YXRlRXhjbHVzaXZlTG9jayk7CisKKwkvKiBOb3cgc3dhcCBuYW1lcyBhbmQgZGVwZW5kZW5j aWVzIG9mIHRob3NlIGluZGV4ZXMgKi8KKwlwZ19jbGFzcyA9IGhlYXBfb3BlbihSZWxhdGlv blJlbGF0aW9uSWQsIFJvd0V4Y2x1c2l2ZUxvY2spOworCisJb2xkQ2xhc3NUdXBsZSA9IFNl YXJjaFN5c0NhY2hlQ29weTEoUkVMT0lELAorCQkJCQkJCQkJCU9iamVjdElkR2V0RGF0dW0o b2xkSW5kZXhJZCkpOworCWlmICghSGVhcFR1cGxlSXNWYWxpZChvbGRDbGFzc1R1cGxlKSkK KwkJZWxvZyhFUlJPUiwgImNvdWxkIG5vdCBmaW5kIHR1cGxlIGZvciByZWxhdGlvbiAldSIs IG9sZEluZGV4SWQpOworCW5ld0NsYXNzVHVwbGUgPSBTZWFyY2hTeXNDYWNoZUNvcHkxKFJF TE9JRCwKKwkJCQkJCQkJCQlPYmplY3RJZEdldERhdHVtKG5ld0luZGV4SWQpKTsKKwlpZiAo IUhlYXBUdXBsZUlzVmFsaWQobmV3Q2xhc3NUdXBsZSkpCisJCWVsb2coRVJST1IsICJjb3Vs ZCBub3QgZmluZCB0dXBsZSBmb3IgcmVsYXRpb24gJXUiLCBuZXdJbmRleElkKTsKKworCW9s ZENsYXNzRm9ybSA9IChGb3JtX3BnX2NsYXNzKSBHRVRTVFJVQ1Qob2xkQ2xhc3NUdXBsZSk7 CisJbmV3Q2xhc3NGb3JtID0gKEZvcm1fcGdfY2xhc3MpIEdFVFNUUlVDVChuZXdDbGFzc1R1 cGxlKTsKKworCS8qIFN3YXAgdGhlIG5hbWVzICovCisJbmFtZXN0cmNweSgmbmV3Q2xhc3NG b3JtLT5yZWxuYW1lLCBOYW1lU3RyKG9sZENsYXNzRm9ybS0+cmVsbmFtZSkpOworCW5hbWVz dHJjcHkoJm9sZENsYXNzRm9ybS0+cmVsbmFtZSwgb2xkTmFtZSk7CisKKwlDYXRhbG9nVHVw bGVVcGRhdGUocGdfY2xhc3MsICZvbGRDbGFzc1R1cGxlLT50X3NlbGYsIG9sZENsYXNzVHVw bGUpOworCUNhdGFsb2dUdXBsZVVwZGF0ZShwZ19jbGFzcywgJm5ld0NsYXNzVHVwbGUtPnRf c2VsZiwgbmV3Q2xhc3NUdXBsZSk7CisKKwloZWFwX2ZyZWV0dXBsZShvbGRDbGFzc1R1cGxl KTsKKwloZWFwX2ZyZWV0dXBsZShuZXdDbGFzc1R1cGxlKTsKKworCS8qIE5vdyBzd2FwIGlu ZGV4IGluZm8gKi8KKwlwZ19pbmRleCA9IGhlYXBfb3BlbihJbmRleFJlbGF0aW9uSWQsIFJv d0V4Y2x1c2l2ZUxvY2spOworCisJb2xkSW5kZXhUdXBsZSA9IFNlYXJjaFN5c0NhY2hlQ29w eTEoSU5ERVhSRUxJRCwKKwkJCQkJCQkJCQlPYmplY3RJZEdldERhdHVtKG9sZEluZGV4SWQp KTsKKwlpZiAoIUhlYXBUdXBsZUlzVmFsaWQob2xkSW5kZXhUdXBsZSkpCisJCWVsb2coRVJS T1IsICJjb3VsZCBub3QgZmluZCB0dXBsZSBmb3IgcmVsYXRpb24gJXUiLCBvbGRJbmRleElk KTsKKwluZXdJbmRleFR1cGxlID0gU2VhcmNoU3lzQ2FjaGVDb3B5MShJTkRFWFJFTElELAor CQkJCQkJCQkJCU9iamVjdElkR2V0RGF0dW0obmV3SW5kZXhJZCkpOworCWlmICghSGVhcFR1 cGxlSXNWYWxpZChuZXdJbmRleFR1cGxlKSkKKwkJZWxvZyhFUlJPUiwgImNvdWxkIG5vdCBm aW5kIHR1cGxlIGZvciByZWxhdGlvbiAldSIsIG5ld0luZGV4SWQpOworCisJb2xkSW5kZXhG b3JtID0gKEZvcm1fcGdfaW5kZXgpIEdFVFNUUlVDVChvbGRJbmRleFR1cGxlKTsKKwluZXdJ bmRleEZvcm0gPSAoRm9ybV9wZ19pbmRleCkgR0VUU1RSVUNUKG5ld0luZGV4VHVwbGUpOwor CisJLyoKKwkgKiBDb3B5IGNvbnRyYWludCBmbGFncyBmb3Igb2xkIGluZGV4LiBUaGlzIGlz IHNhZmUgYmVjYXVzZSB0aGUgb2xkIGluZGV4CisJICogZ3VhcmFudGVlZCB1bmlxdWVuZXNz LgorCSAqLworCW5ld0luZGV4Rm9ybS0+aW5kaXNwcmltYXJ5ID0gb2xkSW5kZXhGb3JtLT5p bmRpc3ByaW1hcnk7CisJb2xkSW5kZXhGb3JtLT5pbmRpc3ByaW1hcnkgPSBmYWxzZTsKKwlu ZXdJbmRleEZvcm0tPmluZGlzZXhjbHVzaW9uID0gb2xkSW5kZXhGb3JtLT5pbmRpc2V4Y2x1 c2lvbjsKKwlvbGRJbmRleEZvcm0tPmluZGlzZXhjbHVzaW9uID0gZmFsc2U7CisJbmV3SW5k ZXhGb3JtLT5pbmRpbW1lZGlhdGUgPSBvbGRJbmRleEZvcm0tPmluZGltbWVkaWF0ZTsKKwlv bGRJbmRleEZvcm0tPmluZGltbWVkaWF0ZSA9IHRydWU7CisKKwkvKiBNYXJrIG9sZCBpbmRl eCBhcyB2YWxpZCBhbmQgbmV3IGFzIGludmFsaWQgYXMgaW5kZXhfc2V0X3N0YXRlX2ZsYWdz ICovCisJbmV3SW5kZXhGb3JtLT5pbmRpc3ZhbGlkID0gdHJ1ZTsKKwlvbGRJbmRleEZvcm0t PmluZGlzdmFsaWQgPSBmYWxzZTsKKwlvbGRJbmRleEZvcm0tPmluZGlzY2x1c3RlcmVkID0g ZmFsc2U7CisKKwlDYXRhbG9nVHVwbGVVcGRhdGUocGdfaW5kZXgsICZvbGRJbmRleFR1cGxl LT50X3NlbGYsIG9sZEluZGV4VHVwbGUpOworCUNhdGFsb2dUdXBsZVVwZGF0ZShwZ19pbmRl eCwgJm5ld0luZGV4VHVwbGUtPnRfc2VsZiwgbmV3SW5kZXhUdXBsZSk7CisKKwloZWFwX2Zy ZWV0dXBsZShvbGRJbmRleFR1cGxlKTsKKwloZWFwX2ZyZWV0dXBsZShuZXdJbmRleFR1cGxl KTsKKworCS8qCisJICogTW92ZSBjb25zdHJhaW50cyBhbmQgdHJpZ2dlcnMgb3ZlciB0byB0 aGUgbmV3IGluZGV4CisJICovCisKKwljb25zdHJhaW50T2lkcyA9IGdldF9pbmRleF9yZWZf Y29uc3RyYWludHMob2xkSW5kZXhJZCk7CisKKwlpbmRleENvbnN0cmFpbnRPaWQgPSBnZXRf aW5kZXhfY29uc3RyYWludChvbGRJbmRleElkKTsKKworCWlmIChPaWRJc1ZhbGlkKGluZGV4 Q29uc3RyYWludE9pZCkpCisJCWNvbnN0cmFpbnRPaWRzID0gbGFwcGVuZF9vaWQoY29uc3Ry YWludE9pZHMsIGluZGV4Q29uc3RyYWludE9pZCk7CisKKwlwZ19jb25zdHJhaW50ID0gaGVh cF9vcGVuKENvbnN0cmFpbnRSZWxhdGlvbklkLCBSb3dFeGNsdXNpdmVMb2NrKTsKKwlwZ190 cmlnZ2VyID0gaGVhcF9vcGVuKFRyaWdnZXJSZWxhdGlvbklkLCBSb3dFeGNsdXNpdmVMb2Nr KTsKKworCWZvcmVhY2gobGMsIGNvbnN0cmFpbnRPaWRzKQorCXsKKwkJSGVhcFR1cGxlCWNv bnN0cmFpbnRUdXBsZSwKKwkJCQkJdHJpZ2dlclR1cGxlOworCQlGb3JtX3BnX2NvbnN0cmFp bnQgY29uRm9ybTsKKwkJU2NhbktleURhdGEga2V5WzFdOworCQlTeXNTY2FuRGVzYyBzY2Fu OworCQlPaWQJCQljb25zdHJhaW50T2lkID0gbGZpcnN0X29pZChsYyk7CisKKwkJLyogTW92 ZSB0aGUgY29uc3RyYWludCBmcm9tIHRoZSBvbGQgdG8gdGhlIG5ldyBpbmRleCAqLworCQlj b25zdHJhaW50VHVwbGUgPSBTZWFyY2hTeXNDYWNoZUNvcHkxKENPTlNUUk9JRCwKKwkJCQkJ CQkJCQkJICBPYmplY3RJZEdldERhdHVtKGNvbnN0cmFpbnRPaWQpKTsKKwkJaWYgKCFIZWFw VHVwbGVJc1ZhbGlkKGNvbnN0cmFpbnRUdXBsZSkpCisJCQllbG9nKEVSUk9SLCAiY291bGQg bm90IGZpbmQgdHVwbGUgZm9yIGNvbnN0cmFpbnQgJXUiLCBjb25zdHJhaW50T2lkKTsKKwor CQljb25Gb3JtID0gKChGb3JtX3BnX2NvbnN0cmFpbnQpIEdFVFNUUlVDVChjb25zdHJhaW50 VHVwbGUpKTsKKworCQlpZiAoY29uRm9ybS0+Y29uaW5kaWQgPT0gb2xkSW5kZXhJZCkKKwkJ eworCQkJY29uRm9ybS0+Y29uaW5kaWQgPSBuZXdJbmRleElkOworCisJCQlDYXRhbG9nVHVw bGVVcGRhdGUocGdfY29uc3RyYWludCwgJmNvbnN0cmFpbnRUdXBsZS0+dF9zZWxmLCBjb25z dHJhaW50VHVwbGUpOworCQl9CisKKwkJaGVhcF9mcmVldHVwbGUoY29uc3RyYWludFR1cGxl KTsKKworCQkvKiBTZWFyY2ggZm9yIHRyaWdnZXIgcmVjb3JkcyAqLworCQlTY2FuS2V5SW5p dCgma2V5WzBdLAorCQkJCQlBbnVtX3BnX3RyaWdnZXJfdGdjb25zdHJhaW50LAorCQkJCQlC VEVxdWFsU3RyYXRlZ3lOdW1iZXIsIEZfT0lERVEsCisJCQkJCU9iamVjdElkR2V0RGF0dW0o Y29uc3RyYWludE9pZCkpOworCisJCXNjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4ocGdfdHJp Z2dlciwgVHJpZ2dlckNvbnN0cmFpbnRJbmRleElkLCB0cnVlLAorCQkJCQkJCQkgIE5VTEws IDEsIGtleSk7CisKKwkJd2hpbGUgKEhlYXBUdXBsZUlzVmFsaWQoKHRyaWdnZXJUdXBsZSA9 IHN5c3RhYmxlX2dldG5leHQoc2NhbikpKSkKKwkJeworCQkJRm9ybV9wZ190cmlnZ2VyIHRn Rm9ybSA9IChGb3JtX3BnX3RyaWdnZXIpIEdFVFNUUlVDVCh0cmlnZ2VyVHVwbGUpOworCisJ CQlpZiAodGdGb3JtLT50Z2NvbnN0cmluZGlkICE9IG9sZEluZGV4SWQpCisJCQkJY29udGlu dWU7CisKKwkJCS8qIE1ha2UgYSBtb2RpZmlhYmxlIGNvcHkgKi8KKwkJCXRyaWdnZXJUdXBs ZSA9IGhlYXBfY29weXR1cGxlKHRyaWdnZXJUdXBsZSk7CisJCQl0Z0Zvcm0gPSAoRm9ybV9w Z190cmlnZ2VyKSBHRVRTVFJVQ1QodHJpZ2dlclR1cGxlKTsKKworCQkJdGdGb3JtLT50Z2Nv bnN0cmluZGlkID0gbmV3SW5kZXhJZDsKKworCQkJQ2F0YWxvZ1R1cGxlVXBkYXRlKHBnX3Ry aWdnZXIsICZ0cmlnZ2VyVHVwbGUtPnRfc2VsZiwgdHJpZ2dlclR1cGxlKTsKKworCQkJaGVh cF9mcmVldHVwbGUodHJpZ2dlclR1cGxlKTsKKwkJfQorCisJCXN5c3RhYmxlX2VuZHNjYW4o c2Nhbik7CisJfQorCisJLyoKKwkgKiBNb3ZlIGFsbCBkZXBlbmRlbmNpZXMgb24gdGhlIG9s ZCBpbmRleCB0byB0aGUgbmV3CisJICovCisKKwlpZiAoT2lkSXNWYWxpZChpbmRleENvbnN0 cmFpbnRPaWQpKQorCXsKKwkJT2JqZWN0QWRkcmVzcyBteXNlbGYsCisJCQkJCXJlZmVyZW5j ZWQ7CisKKwkJLyogQ2hhbmdlIHRvIGhhdmluZyB0aGUgbmV3IGluZGV4IGRlcGVuZCBvbiB0 aGUgY29uc3RyYWludCAqLworCQlkZWxldGVEZXBlbmRlbmN5UmVjb3Jkc0ZvckNsYXNzKFJl bGF0aW9uUmVsYXRpb25JZCwgb2xkSW5kZXhJZCwKKwkJCQkJCQkJCQlDb25zdHJhaW50UmVs YXRpb25JZCwgREVQRU5ERU5DWV9JTlRFUk5BTCk7CisKKwkJbXlzZWxmLmNsYXNzSWQgPSBS ZWxhdGlvblJlbGF0aW9uSWQ7CisJCW15c2VsZi5vYmplY3RJZCA9IG5ld0luZGV4SWQ7CisJ CW15c2VsZi5vYmplY3RTdWJJZCA9IDA7CisKKwkJcmVmZXJlbmNlZC5jbGFzc0lkID0gQ29u c3RyYWludFJlbGF0aW9uSWQ7CisJCXJlZmVyZW5jZWQub2JqZWN0SWQgPSBpbmRleENvbnN0 cmFpbnRPaWQ7CisJCXJlZmVyZW5jZWQub2JqZWN0U3ViSWQgPSAwOworCisJCXJlY29yZERl cGVuZGVuY3lPbigmbXlzZWxmLCAmcmVmZXJlbmNlZCwgREVQRU5ERU5DWV9JTlRFUk5BTCk7 CisJfQorCisJY2hhbmdlRGVwZW5kZW5jaWVzT24oUmVsYXRpb25SZWxhdGlvbklkLCBvbGRJ bmRleElkLCBuZXdJbmRleElkKTsKKworCS8qIENsb3NlIHJlbGF0aW9ucyAqLworCWhlYXBf Y2xvc2UocGdfY2xhc3MsIFJvd0V4Y2x1c2l2ZUxvY2spOworCWhlYXBfY2xvc2UocGdfaW5k ZXgsIFJvd0V4Y2x1c2l2ZUxvY2spOworCWhlYXBfY2xvc2UocGdfY29uc3RyYWludCwgUm93 RXhjbHVzaXZlTG9jayk7CisJaGVhcF9jbG9zZShwZ190cmlnZ2VyLCBSb3dFeGNsdXNpdmVM b2NrKTsKKworCS8qIFRoZSBsb2NrIHRha2VuIHByZXZpb3VzbHkgaXMgbm90IHJlbGVhc2Vk IHVudGlsIHRoZSBlbmQgb2YgdHJhbnNhY3Rpb24gKi8KKwlyZWxhdGlvbl9jbG9zZShvbGRD bGFzc1JlbCwgTm9Mb2NrKTsKKwlyZWxhdGlvbl9jbG9zZShuZXdDbGFzc1JlbCwgTm9Mb2Nr KTsKK30KKworLyoKKyAqIGluZGV4X2NvbmN1cnJlbnRseV9zZXRfZGVhZAorICoKKyAqIFBl cmZvcm0gdGhlIGxhc3QgaW52YWxpZGF0aW9uIHN0YWdlIG9mIERST1AgSU5ERVggQ09OQ1VS UkVOVExZIG9yIFJFSU5ERVgKKyAqIENPTkNVUlJFTlRMWSBiZWZvcmUgYWN0dWFsbHkgZHJv cHBpbmcgdGhlIGluZGV4LiBBZnRlciBjYWxsaW5nIHRoaXMKKyAqIGZ1bmN0aW9uIHRoZSBp bmRleCBpcyBzZWVuIGJ5IGFsbCB0aGUgYmFja2VuZHMgYXMgZGVhZC4gTG93LWxldmVsIGxv Y2tzCisgKiB0YWtlbiBoZXJlIGFyZSBrZXB0IHVudGlsIHRoZSBlbmQgb2YgdGhlIHRyYW5z YWN0aW9uIGRvaW5nIGNhbGxpbmcgdGhpcworICogZnVuY3Rpb24uCisgKi8KK3ZvaWQKK2lu ZGV4X2NvbmN1cnJlbnRseV9zZXRfZGVhZChPaWQgaGVhcE9pZCwgT2lkIGluZGV4T2lkKQor eworCVJlbGF0aW9uCWhlYXBSZWxhdGlvbiwKKwkJCQlpbmRleFJlbGF0aW9uOworCisJLyoK KwkgKiBObyBtb3JlIHByZWRpY2F0ZSBsb2NrcyB3aWxsIGJlIGFjcXVpcmVkIG9uIHRoaXMg aW5kZXgsIGFuZCB3ZSdyZSBhYm91dAorCSAqIHRvIHN0b3AgZG9pbmcgaW5zZXJ0cyBpbnRv IHRoZSBpbmRleCB3aGljaCBjb3VsZCBzaG93IGNvbmZsaWN0cyB3aXRoCisJICogZXhpc3Rp bmcgcHJlZGljYXRlIGxvY2tzLCBzbyBub3cgaXMgdGhlIHRpbWUgdG8gbW92ZSB0aGVtIHRv IHRoZSBoZWFwCisJICogcmVsYXRpb24uCisJICovCisJaGVhcFJlbGF0aW9uID0gaGVhcF9v cGVuKGhlYXBPaWQsIFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9jayk7CisJaW5kZXhSZWxhdGlv biA9IGluZGV4X29wZW4oaW5kZXhPaWQsIFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9jayk7CisJ VHJhbnNmZXJQcmVkaWNhdGVMb2Nrc1RvSGVhcFJlbGF0aW9uKGluZGV4UmVsYXRpb24pOwor CisJLyoKKwkgKiBOb3cgd2UgYXJlIHN1cmUgdGhhdCBub2JvZHkgdXNlcyB0aGUgaW5kZXgg Zm9yIHF1ZXJpZXM7IHRoZXkganVzdCBtaWdodAorCSAqIGhhdmUgaXQgb3BlbiBmb3IgdXBk YXRpbmcgaXQuICBTbyBub3cgd2UgY2FuIHVuc2V0IGluZGlzcmVhZHkgYW5kCisJICogaW5k aXNsaXZlLCB0aGVuIHdhaXQgdGlsbCBub2JvZHkgY291bGQgYmUgdXNpbmcgaXQgYXQgYWxs IGFueW1vcmUuCisJICovCisJaW5kZXhfc2V0X3N0YXRlX2ZsYWdzKGluZGV4T2lkLCBJTkRF WF9EUk9QX1NFVF9ERUFEKTsKKworCS8qCisJICogSW52YWxpZGF0ZSB0aGUgcmVsY2FjaGUg Zm9yIHRoZSB0YWJsZSwgc28gdGhhdCBhZnRlciB0aGlzIGNvbW1pdCBhbGwKKwkgKiBzZXNz aW9ucyB3aWxsIHJlZnJlc2ggdGhlIHRhYmxlJ3MgaW5kZXggbGlzdC4gIEZvcmdldHRpbmcg anVzdCB0aGUKKwkgKiBpbmRleCdzIHJlbGNhY2hlIGVudHJ5IGlzIG5vdCBlbm91Z2guCisJ ICovCisJQ2FjaGVJbnZhbGlkYXRlUmVsY2FjaGUoaGVhcFJlbGF0aW9uKTsKKworCS8qCisJ ICogQ2xvc2UgdGhlIHJlbGF0aW9ucyBhZ2FpbiwgdGhvdWdoIHN0aWxsIGhvbGRpbmcgc2Vz c2lvbiBsb2NrLgorCSAqLworCWhlYXBfY2xvc2UoaGVhcFJlbGF0aW9uLCBOb0xvY2spOwor CWluZGV4X2Nsb3NlKGluZGV4UmVsYXRpb24sIE5vTG9jayk7Cit9CisKKy8qCisgKiBpbmRl eF9jb25jdXJyZW50bHlfZHJvcAorICoKKyAqIERyb3AgYSBzaW5nbGUgaW5kZXggY29uY3Vy cmVudGx5IGFzIHRoZSBsYXN0IHN0ZXAgb2YgYW4gaW5kZXggY29uY3VycmVudAorICogcHJv Y2Vzcy4gRGVsZXRpb24gaXMgZG9uZSB0aHJvdWdoIHBlcmZvcm1EZWxldGlvbiBvciBkZXBl bmRlbmNpZXMgb2YgdGhlCisgKiBpbmRleCB3b3VsZCBub3QgZ2V0IGRyb3BwZWQuIEF0IHRo aXMgcG9pbnQgYWxsIHRoZSBpbmRleGVzIGFyZSBhbHJlYWR5CisgKiBjb25zaWRlcmVkIGFz IGludmFsaWQgYW5kIGRlYWQgc28gdGhleSBjYW4gYmUgZHJvcHBlZCB3aXRob3V0IHVzaW5n IGFueQorICogY29uY3VycmVudCBvcHRpb25zIGFzIGl0IGlzIGNlcnRhaW4gdGhhdCB0aGV5 IHdpbGwgbm90IGludGVyYWN0IHdpdGggb3RoZXIKKyAqIHNlcnZlciBzZXNzaW9ucy4KKyAq Lwordm9pZAoraW5kZXhfY29uY3VycmVudGx5X2Ryb3AoT2lkIGluZGV4SWQpCit7CisJT2lk CQkJY29uc3RyYWludE9pZCA9IGdldF9pbmRleF9jb25zdHJhaW50KGluZGV4SWQpOworCU9i amVjdEFkZHJlc3Mgb2JqZWN0OworCUZvcm1fcGdfaW5kZXggaW5kZXhGb3JtOworCVJlbGF0 aW9uCXBnX2luZGV4OworCUhlYXBUdXBsZQlpbmRleFR1cGxlOworCisJLyoKKwkgKiBDaGVj ayB0aGF0IHRoZSBpbmRleCBkcm9wcGVkIGhlcmUgaXMgbm90IGFsaXZlLCBpdCBtaWdodCBi ZSB1c2VkIGJ5CisJICogb3RoZXIgYmFja2VuZHMgaW4gdGhpcyBjYXNlLgorCSAqLworCXBn X2luZGV4ID0gaGVhcF9vcGVuKEluZGV4UmVsYXRpb25JZCwgUm93RXhjbHVzaXZlTG9jayk7 CisKKwlpbmRleFR1cGxlID0gU2VhcmNoU3lzQ2FjaGVDb3B5MShJTkRFWFJFTElELAorCQkJ CQkJCQkJIE9iamVjdElkR2V0RGF0dW0oaW5kZXhJZCkpOworCWlmICghSGVhcFR1cGxlSXNW YWxpZChpbmRleFR1cGxlKSkKKwkJZWxvZyhFUlJPUiwgImNhY2hlIGxvb2t1cCBmYWlsZWQg Zm9yIGluZGV4ICV1IiwgaW5kZXhJZCk7CisJaW5kZXhGb3JtID0gKEZvcm1fcGdfaW5kZXgp IEdFVFNUUlVDVChpbmRleFR1cGxlKTsKKworCS8qCisJICogVGhpcyBpcyBvbmx5IGEgc2Fm ZXR5IGNoZWNrLCBqdXN0IHRvIGF2b2lkIGxpdmUgaW5kZXhlcyBmcm9tIGJlaW5nCisJICog ZHJvcHBlZC4KKwkgKi8KKwlpZiAoaW5kZXhGb3JtLT5pbmRpc2xpdmUpCisJCWVsb2coRVJS T1IsICJjYW5ub3QgZHJvcCBsaXZlIGluZGV4IHdpdGggT0lEICV1IiwgaW5kZXhJZCk7CisK KwkvKiBDbGVhbiB1cCAqLworCWhlYXBfY2xvc2UocGdfaW5kZXgsIFJvd0V4Y2x1c2l2ZUxv Y2spOworCisJLyoKKwkgKiBXZSBhcmUgc3VyZSB0byBoYXZlIGEgZGVhZCBpbmRleCwgc28g YmVnaW4gdGhlIGRyb3AgcHJvY2Vzcy4gUmVnaXN0ZXIKKwkgKiBjb25zdHJhaW50IG9yIGlu ZGV4IGZvciBkcm9wLgorCSAqLworCWlmIChPaWRJc1ZhbGlkKGNvbnN0cmFpbnRPaWQpKQor CXsKKwkJb2JqZWN0LmNsYXNzSWQgPSBDb25zdHJhaW50UmVsYXRpb25JZDsKKwkJb2JqZWN0 Lm9iamVjdElkID0gY29uc3RyYWludE9pZDsKKwl9CisJZWxzZQorCXsKKwkJb2JqZWN0LmNs YXNzSWQgPSBSZWxhdGlvblJlbGF0aW9uSWQ7CisJCW9iamVjdC5vYmplY3RJZCA9IGluZGV4 SWQ7CisJfQorCisJb2JqZWN0Lm9iamVjdFN1YklkID0gMDsKKworCS8qIFBlcmZvcm0gZGVs ZXRpb24gZm9yIG5vcm1hbCBhbmQgdG9hc3QgaW5kZXhlcyAqLworCXBlcmZvcm1EZWxldGlv bigmb2JqZWN0LCBEUk9QX1JFU1RSSUNULCAwKTsKK30KKwogLyoKICAqIGluZGV4X2NvbnN0 cmFpbnRfY3JlYXRlCiAgKgpAQCAtMTU5MiwzNiArMjA0NSw4IEBAIGluZGV4X2Ryb3AoT2lk IGluZGV4SWQsIGJvb2wgY29uY3VycmVudCkKIAkJICovCiAJCVdhaXRGb3JMb2NrZXJzKGhl YXBsb2NrdGFnLCBBY2Nlc3NFeGNsdXNpdmVMb2NrKTsKIAotCQkvKgotCQkgKiBObyBtb3Jl IHByZWRpY2F0ZSBsb2NrcyB3aWxsIGJlIGFjcXVpcmVkIG9uIHRoaXMgaW5kZXgsIGFuZCB3 ZSdyZQotCQkgKiBhYm91dCB0byBzdG9wIGRvaW5nIGluc2VydHMgaW50byB0aGUgaW5kZXgg d2hpY2ggY291bGQgc2hvdwotCQkgKiBjb25mbGljdHMgd2l0aCBleGlzdGluZyBwcmVkaWNh dGUgbG9ja3MsIHNvIG5vdyBpcyB0aGUgdGltZSB0byBtb3ZlCi0JCSAqIHRoZW0gdG8gdGhl IGhlYXAgcmVsYXRpb24uCi0JCSAqLwotCQl1c2VySGVhcFJlbGF0aW9uID0gaGVhcF9vcGVu KGhlYXBJZCwgU2hhcmVVcGRhdGVFeGNsdXNpdmVMb2NrKTsKLQkJdXNlckluZGV4UmVsYXRp b24gPSBpbmRleF9vcGVuKGluZGV4SWQsIFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9jayk7Ci0J CVRyYW5zZmVyUHJlZGljYXRlTG9ja3NUb0hlYXBSZWxhdGlvbih1c2VySW5kZXhSZWxhdGlv bik7Ci0KLQkJLyoKLQkJICogTm93IHdlIGFyZSBzdXJlIHRoYXQgbm9ib2R5IHVzZXMgdGhl IGluZGV4IGZvciBxdWVyaWVzOyB0aGV5IGp1c3QKLQkJICogbWlnaHQgaGF2ZSBpdCBvcGVu IGZvciB1cGRhdGluZyBpdC4gIFNvIG5vdyB3ZSBjYW4gdW5zZXQgaW5kaXNyZWFkeQotCQkg KiBhbmQgaW5kaXNsaXZlLCB0aGVuIHdhaXQgdGlsbCBub2JvZHkgY291bGQgYmUgdXNpbmcg aXQgYXQgYWxsCi0JCSAqIGFueW1vcmUuCi0JCSAqLwotCQlpbmRleF9zZXRfc3RhdGVfZmxh Z3MoaW5kZXhJZCwgSU5ERVhfRFJPUF9TRVRfREVBRCk7Ci0KLQkJLyoKLQkJICogSW52YWxp ZGF0ZSB0aGUgcmVsY2FjaGUgZm9yIHRoZSB0YWJsZSwgc28gdGhhdCBhZnRlciB0aGlzIGNv bW1pdAotCQkgKiBhbGwgc2Vzc2lvbnMgd2lsbCByZWZyZXNoIHRoZSB0YWJsZSdzIGluZGV4 IGxpc3QuICBGb3JnZXR0aW5nIGp1c3QKLQkJICogdGhlIGluZGV4J3MgcmVsY2FjaGUgZW50 cnkgaXMgbm90IGVub3VnaC4KLQkJICovCi0JCUNhY2hlSW52YWxpZGF0ZVJlbGNhY2hlKHVz ZXJIZWFwUmVsYXRpb24pOwotCi0JCS8qCi0JCSAqIENsb3NlIHRoZSByZWxhdGlvbnMgYWdh aW4sIHRob3VnaCBzdGlsbCBob2xkaW5nIHNlc3Npb24gbG9jay4KLQkJICovCi0JCWhlYXBf Y2xvc2UodXNlckhlYXBSZWxhdGlvbiwgTm9Mb2NrKTsKLQkJaW5kZXhfY2xvc2UodXNlcklu ZGV4UmVsYXRpb24sIE5vTG9jayk7CisJCS8qIEZpbmlzaCBpbnZhbGlkYXRpb24gb2YgaW5k ZXggYW5kIG1hcmsgaXQgYXMgZGVhZCAqLworCQlpbmRleF9jb25jdXJyZW50bHlfc2V0X2Rl YWQoaGVhcElkLCBpbmRleElkKTsKIAogCQkvKgogCQkgKiBBZ2FpbiwgY29tbWl0IHRoZSB0 cmFuc2FjdGlvbiB0byBtYWtlIHRoZSBwZ19pbmRleCB1cGRhdGUgdmlzaWJsZQpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvY2F0YWxvZy9wZ19kZXBlbmQuYyBiL3NyYy9iYWNrZW5kL2Nh dGFsb2cvcGdfZGVwZW5kLmMKaW5kZXggZmRlN2UxNzBiZS4uOWFiZmIyMWU5NiAxMDA2NDQK LS0tIGEvc3JjL2JhY2tlbmQvY2F0YWxvZy9wZ19kZXBlbmQuYworKysgYi9zcmMvYmFja2Vu ZC9jYXRhbG9nL3BnX2RlcGVuZC5jCkBAIC0zNzYsNiArMzc2LDk0IEBAIGNoYW5nZURlcGVu ZGVuY3lGb3IoT2lkIGNsYXNzSWQsIE9pZCBvYmplY3RJZCwKIAlyZXR1cm4gY291bnQ7CiB9 CiAKKy8qCisgKiBBZGp1c3QgYWxsIGRlcGVuZGVuY3kgcmVjb3JkcyB0byBwb2ludCB0byBh IGRpZmZlcmVudCBvYmplY3Qgb2YgdGhlIHNhbWUgdHlwZQorICoKKyAqIHJlZkNsYXNzSWQv b2xkUmVmT2JqZWN0SWQgc3BlY2lmeSB0aGUgb2xkIHJlZmVyZW5jZWQgb2JqZWN0LgorICog bmV3UmVmT2JqZWN0SWQgaXMgdGhlIG5ldyByZWZlcmVuY2VkIG9iamVjdCAobXVzdCBiZSBv ZiBjbGFzcyByZWZDbGFzc0lkKS4KKyAqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVj b3JkcyB1cGRhdGVkLgorICovCitsb25nCitjaGFuZ2VEZXBlbmRlbmNpZXNPbihPaWQgcmVm Q2xhc3NJZCwgT2lkIG9sZFJlZk9iamVjdElkLAorCQkJCQkgT2lkIG5ld1JlZk9iamVjdElk KQoreworCWxvbmcJCWNvdW50ID0gMDsKKwlSZWxhdGlvbglkZXBSZWw7CisJU2NhbktleURh dGEga2V5WzJdOworCVN5c1NjYW5EZXNjIHNjYW47CisJSGVhcFR1cGxlCXR1cDsKKwlPYmpl Y3RBZGRyZXNzIG9iakFkZHI7CisJYm9vbAkJbmV3SXNQaW5uZWQ7CisKKwlkZXBSZWwgPSBo ZWFwX29wZW4oRGVwZW5kUmVsYXRpb25JZCwgUm93RXhjbHVzaXZlTG9jayk7CisKKwkvKgor CSAqIElmIG9sZFJlZk9iamVjdElkIGlzIHBpbm5lZCwgdGhlcmUgd29uJ3QgYmUgYW55IGRl cGVuZGVuY3kgZW50cmllcyBvbgorCSAqIGl0IC0tLSB3ZSBjYW4ndCBjb3BlIGluIHRoYXQg Y2FzZS4gIChUaGlzIGlzbid0IHJlYWxseSB3b3J0aCBleHBlbmRpbmcKKwkgKiBjb2RlIHRv IGZpeCwgaW4gY3VycmVudCB1c2FnZTsgaXQganVzdCBtZWFucyB5b3UgY2FuJ3QgcmVuYW1l IHN0dWZmIG91dAorCSAqIG9mIHBnX2NhdGFsb2csIHdoaWNoIHdvdWxkIGxpa2VseSBiZSBh IGJhZCBtb3ZlIGFueXdheS4pCisJICovCisJb2JqQWRkci5jbGFzc0lkID0gcmVmQ2xhc3NJ ZDsKKwlvYmpBZGRyLm9iamVjdElkID0gb2xkUmVmT2JqZWN0SWQ7CisJb2JqQWRkci5vYmpl Y3RTdWJJZCA9IDA7CisKKwlpZiAoaXNPYmplY3RQaW5uZWQoJm9iakFkZHIsIGRlcFJlbCkp CisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9T VVBQT1JURUQpLAorCQkJCSBlcnJtc2coImNhbm5vdCByZW1vdmUgZGVwZW5kZW5jeSBvbiAl cyBiZWNhdXNlIGl0IGlzIGEgc3lzdGVtIG9iamVjdCIsCisJCQkJCQlnZXRPYmplY3REZXNj cmlwdGlvbigmb2JqQWRkcikpKSk7CisKKwkvKgorCSAqIFdlIGNhbiBoYW5kbGUgYWRkaW5n IGEgZGVwZW5kZW5jeSBvbiBzb21ldGhpbmcgcGlubmVkLCB0aG91Z2gsIHNpbmNlCisJICog dGhhdCBqdXN0IG1lYW5zIGRlbGV0aW5nIHRoZSBkZXBlbmRlbmN5IGVudHJ5LgorCSAqLwor CW9iakFkZHIub2JqZWN0SWQgPSBuZXdSZWZPYmplY3RJZDsKKworCW5ld0lzUGlubmVkID0g aXNPYmplY3RQaW5uZWQoJm9iakFkZHIsIGRlcFJlbCk7CisKKwkvKiBOb3cgc2VhcmNoIGZv ciBkZXBlbmRlbmN5IHJlY29yZHMgKi8KKwlTY2FuS2V5SW5pdCgma2V5WzBdLAorCQkJCUFu dW1fcGdfZGVwZW5kX3JlZmNsYXNzaWQsCisJCQkJQlRFcXVhbFN0cmF0ZWd5TnVtYmVyLCBG X09JREVRLAorCQkJCU9iamVjdElkR2V0RGF0dW0ocmVmQ2xhc3NJZCkpOworCVNjYW5LZXlJ bml0KCZrZXlbMV0sCisJCQkJQW51bV9wZ19kZXBlbmRfcmVmb2JqaWQsCisJCQkJQlRFcXVh bFN0cmF0ZWd5TnVtYmVyLCBGX09JREVRLAorCQkJCU9iamVjdElkR2V0RGF0dW0ob2xkUmVm T2JqZWN0SWQpKTsKKworCXNjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4oZGVwUmVsLCBEZXBl bmRSZWZlcmVuY2VJbmRleElkLCB0cnVlLAorCQkJCQkJCSAgTlVMTCwgMiwga2V5KTsKKwor CXdoaWxlIChIZWFwVHVwbGVJc1ZhbGlkKCh0dXAgPSBzeXN0YWJsZV9nZXRuZXh0KHNjYW4p KSkpCisJeworCQlGb3JtX3BnX2RlcGVuZCBkZXBmb3JtID0gKEZvcm1fcGdfZGVwZW5kKSBH RVRTVFJVQ1QodHVwKTsKKworCQlpZiAobmV3SXNQaW5uZWQpCisJCQlDYXRhbG9nVHVwbGVE ZWxldGUoZGVwUmVsLCAmdHVwLT50X3NlbGYpOworCQllbHNlCisJCXsKKwkJCS8qIG1ha2Ug YSBtb2RpZmlhYmxlIGNvcHkgKi8KKwkJCXR1cCA9IGhlYXBfY29weXR1cGxlKHR1cCk7CisJ CQlkZXBmb3JtID0gKEZvcm1fcGdfZGVwZW5kKSBHRVRTVFJVQ1QodHVwKTsKKworCQkJZGVw Zm9ybS0+cmVmb2JqaWQgPSBuZXdSZWZPYmplY3RJZDsKKworCQkJQ2F0YWxvZ1R1cGxlVXBk YXRlKGRlcFJlbCwgJnR1cC0+dF9zZWxmLCB0dXApOworCisJCQloZWFwX2ZyZWV0dXBsZSh0 dXApOworCQl9CisKKwkJY291bnQrKzsKKwl9CisKKwlzeXN0YWJsZV9lbmRzY2FuKHNjYW4p OworCisJaGVhcF9jbG9zZShkZXBSZWwsIFJvd0V4Y2x1c2l2ZUxvY2spOworCisJcmV0dXJu IGNvdW50OworfQorCiAvKgogICogaXNPYmplY3RQaW5uZWQoKQogICoKQEAgLTczNSwzICs4 MjMsNTggQEAgZ2V0X2luZGV4X2NvbnN0cmFpbnQoT2lkIGluZGV4SWQpCiAKIAlyZXR1cm4g Y29uc3RyYWludElkOwogfQorCisvKgorICogZ2V0X2luZGV4X3JlZl9jb25zdHJhaW50cwor ICoJCUdpdmVuIHRoZSBPSUQgb2YgYW4gaW5kZXgsIHJldHVybiB0aGUgT0lEIG9mIGFsbCBm b3JlaWduIGtleQorICoJCWNvbnN0cmFpbnRzIHdoaWNoIHJlZmVyZW5jZSB0aGUgaW5kZXgu CisgKi8KK0xpc3QgKgorZ2V0X2luZGV4X3JlZl9jb25zdHJhaW50cyhPaWQgaW5kZXhJZCkK K3sKKwlMaXN0CSAgICpyZXN1bHQgPSBOSUw7CisJUmVsYXRpb24JZGVwUmVsOworCVNjYW5L ZXlEYXRhIGtleVszXTsKKwlTeXNTY2FuRGVzYyBzY2FuOworCUhlYXBUdXBsZQl0dXA7CisK KwkvKiBTZWFyY2ggdGhlIGRlcGVuZGVuY3kgdGFibGUgZm9yIHRoZSBpbmRleCAqLworCWRl cFJlbCA9IGhlYXBfb3BlbihEZXBlbmRSZWxhdGlvbklkLCBBY2Nlc3NTaGFyZUxvY2spOwor CisJU2NhbktleUluaXQoJmtleVswXSwKKwkJCQlBbnVtX3BnX2RlcGVuZF9yZWZjbGFzc2lk LAorCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9PSURFUSwKKwkJCQlPYmplY3RJZEdl dERhdHVtKFJlbGF0aW9uUmVsYXRpb25JZCkpOworCVNjYW5LZXlJbml0KCZrZXlbMV0sCisJ CQkJQW51bV9wZ19kZXBlbmRfcmVmb2JqaWQsCisJCQkJQlRFcXVhbFN0cmF0ZWd5TnVtYmVy LCBGX09JREVRLAorCQkJCU9iamVjdElkR2V0RGF0dW0oaW5kZXhJZCkpOworCVNjYW5LZXlJ bml0KCZrZXlbMl0sCisJCQkJQW51bV9wZ19kZXBlbmRfcmVmb2Jqc3ViaWQsCisJCQkJQlRF cXVhbFN0cmF0ZWd5TnVtYmVyLCBGX0lOVDRFUSwKKwkJCQlJbnQzMkdldERhdHVtKDApKTsK KworCXNjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4oZGVwUmVsLCBEZXBlbmRSZWZlcmVuY2VJ bmRleElkLCB0cnVlLAorCQkJCQkJCSAgTlVMTCwgMywga2V5KTsKKworCXdoaWxlIChIZWFw VHVwbGVJc1ZhbGlkKHR1cCA9IHN5c3RhYmxlX2dldG5leHQoc2NhbikpKQorCXsKKwkJRm9y bV9wZ19kZXBlbmQgZGVwcmVjID0gKEZvcm1fcGdfZGVwZW5kKSBHRVRTVFJVQ1QodHVwKTsK KworCQkvKgorCQkgKiBXZSBhc3N1bWUgYW55IG5vcm1hbCBkZXBlbmRlbmN5IGZyb20gYSBj b25zdHJhaW50IG11c3QgYmUgd2hhdCB3ZQorCQkgKiBhcmUgbG9va2luZyBmb3IuCisJCSAq LworCQlpZiAoZGVwcmVjLT5jbGFzc2lkID09IENvbnN0cmFpbnRSZWxhdGlvbklkICYmCisJ CQlkZXByZWMtPm9ianN1YmlkID09IDAgJiYKKwkJCWRlcHJlYy0+ZGVwdHlwZSA9PSBERVBF TkRFTkNZX05PUk1BTCkKKwkJeworCQkJcmVzdWx0ID0gbGFwcGVuZF9vaWQocmVzdWx0LCBk ZXByZWMtPm9iamlkKTsKKwkJfQorCX0KKworCXN5c3RhYmxlX2VuZHNjYW4oc2Nhbik7CisJ aGVhcF9jbG9zZShkZXBSZWwsIEFjY2Vzc1NoYXJlTG9jayk7CisKKwlyZXR1cm4gcmVzdWx0 OworfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY2F0YWxvZy90b2FzdGluZy5jIGIvc3Jj L2JhY2tlbmQvY2F0YWxvZy90b2FzdGluZy5jCmluZGV4IDA1MmEwYTEzMDUuLjk5YWJhMjY0 ZmMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NhdGFsb2cvdG9hc3RpbmcuYworKysgYi9z cmMvYmFja2VuZC9jYXRhbG9nL3RvYXN0aW5nLmMKQEAgLTMzNSw3ICszMzUsNyBAQCBjcmVh dGVfdG9hc3RfdGFibGUoUmVsYXRpb24gcmVsLCBPaWQgdG9hc3RPaWQsIE9pZCB0b2FzdElu ZGV4T2lkLAogCQkJCSBsaXN0X21ha2UyKCJjaHVua19pZCIsICJjaHVua19zZXEiKSwKIAkJ CQkgQlRSRUVfQU1fT0lELAogCQkJCSByZWwtPnJkX3JlbC0+cmVsdGFibGVzcGFjZSwKLQkJ CQkgY29sbGF0aW9uT2JqZWN0SWQsIGNsYXNzT2JqZWN0SWQsIGNvbG9wdGlvbnMsIChEYXR1 bSkgMCwKKwkJCQkgY29sbGF0aW9uT2JqZWN0SWQsIGNsYXNzT2JqZWN0SWQsIGNvbG9wdGlv bnMsIChEYXR1bSkgMCwgTlVMTCwKIAkJCQkgSU5ERVhfQ1JFQVRFX0lTX1BSSU1BUlksIDAs IHRydWUsIHRydWUsIE5VTEwpOwogCiAJaGVhcF9jbG9zZSh0b2FzdF9yZWwsIE5vTG9jayk7 CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy9pbmRleGNtZHMuYyBiL3NyYy9i YWNrZW5kL2NvbW1hbmRzL2luZGV4Y21kcy5jCmluZGV4IGQyNjM5MDM2MjIuLmZiNDgyNmQ2 MWYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2luZGV4Y21kcy5jCisrKyBi L3NyYy9iYWNrZW5kL2NvbW1hbmRzL2luZGV4Y21kcy5jCkBAIC01OCw2ICs1OCw3IEBACiAj aW5jbHVkZSAidXRpbHMvbHN5c2NhY2hlLmgiCiAjaW5jbHVkZSAidXRpbHMvbWVtdXRpbHMu aCIKICNpbmNsdWRlICJ1dGlscy9wYXJ0Y2FjaGUuaCIKKyNpbmNsdWRlICJ1dGlscy9wZ19y dXNhZ2UuaCIKICNpbmNsdWRlICJ1dGlscy9yZWdwcm9jLmgiCiAjaW5jbHVkZSAidXRpbHMv c25hcG1nci5oIgogI2luY2x1ZGUgInV0aWxzL3N5c2NhY2hlLmgiCkBAIC04NCw2ICs4NSw3 IEBAIHN0YXRpYyBjaGFyICpDaG9vc2VJbmRleE5hbWVBZGRpdGlvbihMaXN0ICpjb2xuYW1l cyk7CiBzdGF0aWMgTGlzdCAqQ2hvb3NlSW5kZXhDb2x1bW5OYW1lcyhMaXN0ICppbmRleEVs ZW1zKTsKIHN0YXRpYyB2b2lkIFJhbmdlVmFyQ2FsbGJhY2tGb3JSZWluZGV4SW5kZXgoY29u c3QgUmFuZ2VWYXIgKnJlbGF0aW9uLAogCQkJCQkJCQlPaWQgcmVsSWQsIE9pZCBvbGRSZWxJ ZCwgdm9pZCAqYXJnKTsKK3N0YXRpYyBib29sIFJlaW5kZXhSZWxhdGlvbkNvbmN1cnJlbnRs eShPaWQgcmVsYXRpb25PaWQsIGludCBvcHRpb25zKTsKIHN0YXRpYyB2b2lkIFJlaW5kZXhQ YXJ0aXRpb25lZEluZGV4KFJlbGF0aW9uIHBhcmVudElkeCk7CiAKIC8qCkBAIC0yOTgsNiAr MzAwLDkwIEBAIENoZWNrSW5kZXhDb21wYXRpYmxlKE9pZCBvbGRJZCwKIAlyZXR1cm4gcmV0 OwogfQogCisKKy8qCisgKiBXYWl0Rm9yT2xkZXJTbmFwc2hvdHMKKyAqCisgKiBXYWl0IGZv ciB0cmFuc2FjdGlvbnMgdGhhdCBtaWdodCBoYXZlIGFuIG9sZGVyIHNuYXBzaG90IHRoYW4g dGhlIGdpdmVuIHhtaW4KKyAqIGxpbWl0LCBiZWNhdXNlIGl0IG1pZ2h0IG5vdCBjb250YWlu IHR1cGxlcyBkZWxldGVkIGp1c3QgYmVmb3JlIGl0IGhhcworICogYmVlbiB0YWtlbi4gT2J0 YWluIGEgbGlzdCBvZiBWWElEcyBvZiBzdWNoIHRyYW5zYWN0aW9ucywgYW5kIHdhaXQgZm9y IHRoZW0KKyAqIGluZGl2aWR1YWxseS4KKyAqCisgKiBXZSBjYW4gZXhjbHVkZSBhbnkgcnVu bmluZyB0cmFuc2FjdGlvbnMgdGhhdCBoYXZlIHhtaW4gPiB0aGUgeG1pbiBnaXZlbjsKKyAq IHRoZWlyIG9sZGVzdCBzbmFwc2hvdCBtdXN0IGJlIG5ld2VyIHRoYW4gb3VyIHhtaW4gbGlt aXQuCisgKiBXZSBjYW4gYWxzbyBleGNsdWRlIGFueSB0cmFuc2FjdGlvbnMgdGhhdCBoYXZl IHhtaW4gPSB6ZXJvLCBzaW5jZSB0aGV5CisgKiBldmlkZW50bHkgaGF2ZSBubyBsaXZlIHNu YXBzaG90IGF0IGFsbCAoYW5kIGFueSBvbmUgdGhleSBtaWdodCBiZSBpbgorICogcHJvY2Vz cyBvZiB0YWtpbmcgaXMgY2VydGFpbmx5IG5ld2VyIHRoYW4gb3VycykuICBUcmFuc2FjdGlv bnMgaW4gb3RoZXIKKyAqIERCcyBjYW4gYmUgaWdub3JlZCB0b28sIHNpbmNlIHRoZXknbGwg bmV2ZXIgZXZlbiBiZSBhYmxlIHRvIHNlZSB0aGlzCisgKiBpbmRleC4KKyAqCisgKiBXZSBj YW4gYWxzbyBleGNsdWRlIGF1dG92YWN1dW0gcHJvY2Vzc2VzIGFuZCBwcm9jZXNzZXMgcnVu bmluZyBtYW51YWwKKyAqIGxhenkgVkFDVVVNcywgYmVjYXVzZSB0aGV5IHdvbid0IGJlIGZh emVkIGJ5IG1pc3NpbmcgaW5kZXggZW50cmllcworICogZWl0aGVyLiAoTWFudWFsIEFOQUxZ WkVzLCBob3dldmVyLCBjYW4ndCBiZSBleGNsdWRlZCBiZWNhdXNlIHRoZXkKKyAqIG1pZ2h0 IGJlIHdpdGhpbiB0cmFuc2FjdGlvbnMgdGhhdCBhcmUgZ29pbmcgdG8gZG8gYXJiaXRyYXJ5 IG9wZXJhdGlvbnMKKyAqIGxhdGVyLikKKyAqCisgKiBBbHNvLCBHZXRDdXJyZW50VmlydHVh bFhJRHMgbmV2ZXIgcmVwb3J0cyBvdXIgb3duIHZ4aWQsIHNvIHdlIG5lZWQgbm90CisgKiBj aGVjayBmb3IgdGhhdC4KKyAqCisgKiBJZiBhIHByb2Nlc3MgZ29lcyBpZGxlLWluLXRyYW5z YWN0aW9uIHdpdGggeG1pbiB6ZXJvLCB3ZSBkbyBub3QgbmVlZCB0bworICogd2FpdCBmb3Ig aXQgYW55bW9yZSwgcGVyIHRoZSBhYm92ZSBhcmd1bWVudC4gIFdlIGRvIG5vdCBoYXZlIHRo ZQorICogaW5mcmFzdHJ1Y3R1cmUgcmlnaHQgbm93IHRvIHN0b3Agd2FpdGluZyBpZiB0aGF0 IGhhcHBlbnMsIGJ1dCB3ZSBjYW4gYXQKKyAqIGxlYXN0IGF2b2lkIHRoZSBmb2xseSBvZiB3 YWl0aW5nIHdoZW4gaXQgaXMgaWRsZSBhdCB0aGUgdGltZSB3ZSB3b3VsZAorICogYmVnaW4g dG8gd2FpdC4gIFdlIGRvIHRoaXMgYnkgcmVwZWF0ZWRseSByZWNoZWNraW5nIHRoZSBvdXRw dXQgb2YKKyAqIEdldEN1cnJlbnRWaXJ0dWFsWElEcy4gIElmLCBkdXJpbmcgYW55IGl0ZXJh dGlvbiwgYSBwYXJ0aWN1bGFyIHZ4aWQKKyAqIGRvZXNuJ3Qgc2hvdyB1cCBpbiB0aGUgb3V0 cHV0LCB3ZSBrbm93IHdlIGNhbiBmb3JnZXQgYWJvdXQgaXQuCisgKi8KK3N0YXRpYyB2b2lk CitXYWl0Rm9yT2xkZXJTbmFwc2hvdHMoVHJhbnNhY3Rpb25JZCBsaW1pdFhtaW4pCit7CisJ aW50CQkJaSwKKwkJCQluX29sZF9zbmFwc2hvdHM7CisJVmlydHVhbFRyYW5zYWN0aW9uSWQg Km9sZF9zbmFwc2hvdHM7CisKKwlvbGRfc25hcHNob3RzID0gR2V0Q3VycmVudFZpcnR1YWxY SURzKGxpbWl0WG1pbiwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkJCQkJICBQUk9DX0lTX0FVVE9W QUNVVU0gfCBQUk9DX0lOX1ZBQ1VVTSwKKwkJCQkJCQkJCQkgICZuX29sZF9zbmFwc2hvdHMp OworCisJZm9yIChpID0gMDsgaSA8IG5fb2xkX3NuYXBzaG90czsgaSsrKQorCXsKKwkJaWYg KCFWaXJ0dWFsVHJhbnNhY3Rpb25JZElzVmFsaWQob2xkX3NuYXBzaG90c1tpXSkpCisJCQlj b250aW51ZTsJCQkvKiBmb3VuZCB1bmludGVyZXN0aW5nIGluIHByZXZpb3VzIGN5Y2xlICov CisKKwkJaWYgKGkgPiAwKQorCQl7CisJCQkvKiBzZWUgaWYgYW55dGhpbmcncyBjaGFuZ2Vk IC4uLiAqLworCQkJVmlydHVhbFRyYW5zYWN0aW9uSWQgKm5ld2VyX3NuYXBzaG90czsKKwkJ CWludAkJCW5fbmV3ZXJfc25hcHNob3RzOworCQkJaW50CQkJajsKKwkJCWludAkJCWs7CisK KwkJCW5ld2VyX3NuYXBzaG90cyA9IEdldEN1cnJlbnRWaXJ0dWFsWElEcyhsaW1pdFhtaW4s CisJCQkJCQkJCQkJCQkJdHJ1ZSwgZmFsc2UsCisJCQkJCQkJCQkJCQkJUFJPQ19JU19BVVRP VkFDVVVNIHwgUFJPQ19JTl9WQUNVVU0sCisJCQkJCQkJCQkJCQkJJm5fbmV3ZXJfc25hcHNo b3RzKTsKKwkJCWZvciAoaiA9IGk7IGogPCBuX29sZF9zbmFwc2hvdHM7IGorKykKKwkJCXsK KwkJCQlpZiAoIVZpcnR1YWxUcmFuc2FjdGlvbklkSXNWYWxpZChvbGRfc25hcHNob3RzW2pd KSkKKwkJCQkJY29udGludWU7CS8qIGZvdW5kIHVuaW50ZXJlc3RpbmcgaW4gcHJldmlvdXMg Y3ljbGUgKi8KKwkJCQlmb3IgKGsgPSAwOyBrIDwgbl9uZXdlcl9zbmFwc2hvdHM7IGsrKykK KwkJCQl7CisJCQkJCWlmIChWaXJ0dWFsVHJhbnNhY3Rpb25JZEVxdWFscyhvbGRfc25hcHNo b3RzW2pdLAorCQkJCQkJCQkJCQkJICAgbmV3ZXJfc25hcHNob3RzW2tdKSkKKwkJCQkJCWJy ZWFrOworCQkJCX0KKwkJCQlpZiAoayA+PSBuX25ld2VyX3NuYXBzaG90cykgLyogbm90IHRo ZXJlIGFueW1vcmUgKi8KKwkJCQkJU2V0SW52YWxpZFZpcnR1YWxUcmFuc2FjdGlvbklkKG9s ZF9zbmFwc2hvdHNbal0pOworCQkJfQorCQkJcGZyZWUobmV3ZXJfc25hcHNob3RzKTsKKwkJ fQorCisJCWlmIChWaXJ0dWFsVHJhbnNhY3Rpb25JZElzVmFsaWQob2xkX3NuYXBzaG90c1tp XSkpCisJCQlWaXJ0dWFsWGFjdExvY2sob2xkX3NuYXBzaG90c1tpXSwgdHJ1ZSk7CisJfQor fQorCisKIC8qCiAgKiBEZWZpbmVJbmRleAogICoJCUNyZWF0ZXMgYSBuZXcgaW5kZXguCkBA IC0zNDYsNyArNDMyLDYgQEAgRGVmaW5lSW5kZXgoT2lkIHJlbGF0aW9uSWQsCiAJTGlzdAkg ICAqaW5kZXhDb2xOYW1lczsKIAlMaXN0CSAgICphbGxJbmRleFBhcmFtczsKIAlSZWxhdGlv bglyZWw7Ci0JUmVsYXRpb24JaW5kZXhSZWxhdGlvbjsKIAlIZWFwVHVwbGUJdHVwbGU7CiAJ Rm9ybV9wZ19hbQlhY2Nlc3NNZXRob2RGb3JtOwogCUluZGV4QW1Sb3V0aW5lICphbVJvdXRp bmU7CkBAIC0zNjEsOSArNDQ2LDcgQEAgRGVmaW5lSW5kZXgoT2lkIHJlbGF0aW9uSWQsCiAJ aW50CQkJbnVtYmVyT2ZBdHRyaWJ1dGVzOwogCWludAkJCW51bWJlck9mS2V5QXR0cmlidXRl czsKIAlUcmFuc2FjdGlvbklkIGxpbWl0WG1pbjsKLQlWaXJ0dWFsVHJhbnNhY3Rpb25JZCAq b2xkX3NuYXBzaG90czsKIAlPYmplY3RBZGRyZXNzIGFkZHJlc3M7Ci0JaW50CQkJbl9vbGRf c25hcHNob3RzOwogCUxvY2tSZWxJZAloZWFwcmVsaWQ7CiAJTE9DS1RBRwkJaGVhcGxvY2t0 YWc7CiAJTE9DS01PREUJbG9ja21vZGU7CkBAIC04NTYsNyArOTM5LDcgQEAgRGVmaW5lSW5k ZXgoT2lkIHJlbGF0aW9uSWQsCiAJCQkJCSBzdG10LT5vbGROb2RlLCBpbmRleEluZm8sIGlu ZGV4Q29sTmFtZXMsCiAJCQkJCSBhY2Nlc3NNZXRob2RJZCwgdGFibGVzcGFjZUlkLAogCQkJ CQkgY29sbGF0aW9uT2JqZWN0SWQsIGNsYXNzT2JqZWN0SWQsCi0JCQkJCSBjb2xvcHRpb25z LCByZWxvcHRpb25zLAorCQkJCQkgY29sb3B0aW9ucywgcmVsb3B0aW9ucywgTlVMTCwKIAkJ CQkJIGZsYWdzLCBjb25zdHJfZmxhZ3MsCiAJCQkJCSBhbGxvd1N5c3RlbVRhYmxlTW9kcywg IWNoZWNrX3JpZ2h0cywKIAkJCQkJICZjcmVhdGVkQ29uc3RyYWludElkKTsKQEAgLTExNTIs MzQgKzEyMzUsMTUgQEAgRGVmaW5lSW5kZXgoT2lkIHJlbGF0aW9uSWQsCiAJICogSE9ULWNo YWluIG9yIHRoZSBleHRlbnNpb24gb2YgdGhlIGNoYWluIGlzIEhPVC1zYWZlIGZvciB0aGlz IGluZGV4LgogCSAqLwogCi0JLyogT3BlbiBhbmQgbG9jayB0aGUgcGFyZW50IGhlYXAgcmVs YXRpb24gKi8KLQlyZWwgPSBoZWFwX29wZW4ocmVsYXRpb25JZCwgU2hhcmVVcGRhdGVFeGNs dXNpdmVMb2NrKTsKLQotCS8qIEFuZCB0aGUgdGFyZ2V0IGluZGV4IHJlbGF0aW9uICovCi0J aW5kZXhSZWxhdGlvbiA9IGluZGV4X29wZW4oaW5kZXhSZWxhdGlvbklkLCBSb3dFeGNsdXNp dmVMb2NrKTsKLQogCS8qIFNldCBBY3RpdmVTbmFwc2hvdCBzaW5jZSBmdW5jdGlvbnMgaW4g dGhlIGluZGV4ZXMgbWF5IG5lZWQgaXQgKi8KIAlQdXNoQWN0aXZlU25hcHNob3QoR2V0VHJh bnNhY3Rpb25TbmFwc2hvdCgpKTsKIAotCS8qIFdlIGhhdmUgdG8gcmUtYnVpbGQgdGhlIElu ZGV4SW5mbyBzdHJ1Y3QsIHNpbmNlIGl0IHdhcyBsb3N0IGluIGNvbW1pdCAqLwotCWluZGV4 SW5mbyA9IEJ1aWxkSW5kZXhJbmZvKGluZGV4UmVsYXRpb24pOwotCUFzc2VydCghaW5kZXhJ bmZvLT5paV9SZWFkeUZvckluc2VydHMpOwotCWluZGV4SW5mby0+aWlfQ29uY3VycmVudCA9 IHRydWU7Ci0JaW5kZXhJbmZvLT5paV9Ccm9rZW5Ib3RDaGFpbiA9IGZhbHNlOwotCi0JLyog Tm93IGJ1aWxkIHRoZSBpbmRleCAqLwotCWluZGV4X2J1aWxkKHJlbCwgaW5kZXhSZWxhdGlv biwgaW5kZXhJbmZvLCBzdG10LT5wcmltYXJ5LCBmYWxzZSwgdHJ1ZSk7Ci0KLQkvKiBDbG9z ZSBib3RoIHRoZSByZWxhdGlvbnMsIGJ1dCBrZWVwIHRoZSBsb2NrcyAqLwotCWhlYXBfY2xv c2UocmVsLCBOb0xvY2spOwotCWluZGV4X2Nsb3NlKGluZGV4UmVsYXRpb24sIE5vTG9jayk7 Ci0KLQkvKgotCSAqIFVwZGF0ZSB0aGUgcGdfaW5kZXggcm93IHRvIG1hcmsgdGhlIGluZGV4 IGFzIHJlYWR5IGZvciBpbnNlcnRzLiBPbmNlIHdlCi0JICogY29tbWl0IHRoaXMgdHJhbnNh Y3Rpb24sIGFueSBuZXcgdHJhbnNhY3Rpb25zIHRoYXQgb3BlbiB0aGUgdGFibGUgbXVzdAot CSAqIGluc2VydCBuZXcgZW50cmllcyBpbnRvIHRoZSBpbmRleCBmb3IgaW5zZXJ0aW9ucyBh bmQgbm9uLUhPVCB1cGRhdGVzLgotCSAqLwotCWluZGV4X3NldF9zdGF0ZV9mbGFncyhpbmRl eFJlbGF0aW9uSWQsIElOREVYX0NSRUFURV9TRVRfUkVBRFkpOworCS8qIFBlcmZvcm0gY29u Y3VycmVudCBidWlsZCBvZiBpbmRleCAqLworCWluZGV4X2NvbmN1cnJlbnRseV9idWlsZChS YW5nZVZhckdldFJlbGlkKHN0bXQtPnJlbGF0aW9uLAorCQkJCQkJCQkJCQkgIFNoYXJlVXBk YXRlRXhjbHVzaXZlTG9jaywKKwkJCQkJCQkJCQkJICBmYWxzZSksCisJCQkJCQkJIGluZGV4 UmVsYXRpb25JZCwKKwkJCQkJCQkgc3RtdC0+cHJpbWFyeSk7CiAKIAkvKiB3ZSBjYW4gZG8g YXdheSB3aXRoIG91ciBzbmFwc2hvdCAqLwogCVBvcEFjdGl2ZVNuYXBzaG90KCk7CkBAIC0x MjUxLDc0ICsxMzE1LDkgQEAgRGVmaW5lSW5kZXgoT2lkIHJlbGF0aW9uSWQsCiAJICogVGhl IGluZGV4IGlzIG5vdyB2YWxpZCBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBjb250YWlucyBhbGwg Y3VycmVudGx5CiAJICogaW50ZXJlc3RpbmcgdHVwbGVzLiAgQnV0IHNpbmNlIGl0IG1pZ2h0 IG5vdCBjb250YWluIHR1cGxlcyBkZWxldGVkIGp1c3QKIAkgKiBiZWZvcmUgdGhlIHJlZmVy ZW5jZSBzbmFwIHdhcyB0YWtlbiwgd2UgaGF2ZSB0byB3YWl0IG91dCBhbnkKLQkgKiB0cmFu c2FjdGlvbnMgdGhhdCBtaWdodCBoYXZlIG9sZGVyIHNuYXBzaG90cy4gIE9idGFpbiBhIGxp c3Qgb2YgVlhJRHMKLQkgKiBvZiBzdWNoIHRyYW5zYWN0aW9ucywgYW5kIHdhaXQgZm9yIHRo ZW0gaW5kaXZpZHVhbGx5LgotCSAqCi0JICogV2UgY2FuIGV4Y2x1ZGUgYW55IHJ1bm5pbmcg dHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSB4bWluID4gdGhlIHhtaW4gb2YKLQkgKiBvdXIgcmVm ZXJlbmNlIHNuYXBzaG90OyB0aGVpciBvbGRlc3Qgc25hcHNob3QgbXVzdCBiZSBuZXdlciB0 aGFuIG91cnMuCi0JICogV2UgY2FuIGFsc28gZXhjbHVkZSBhbnkgdHJhbnNhY3Rpb25zIHRo YXQgaGF2ZSB4bWluID0gemVybywgc2luY2UgdGhleQotCSAqIGV2aWRlbnRseSBoYXZlIG5v IGxpdmUgc25hcHNob3QgYXQgYWxsIChhbmQgYW55IG9uZSB0aGV5IG1pZ2h0IGJlIGluCi0J ICogcHJvY2VzcyBvZiB0YWtpbmcgaXMgY2VydGFpbmx5IG5ld2VyIHRoYW4gb3VycykuICBU cmFuc2FjdGlvbnMgaW4gb3RoZXIKLQkgKiBEQnMgY2FuIGJlIGlnbm9yZWQgdG9vLCBzaW5j ZSB0aGV5J2xsIG5ldmVyIGV2ZW4gYmUgYWJsZSB0byBzZWUgdGhpcwotCSAqIGluZGV4Lgot CSAqCi0JICogV2UgY2FuIGFsc28gZXhjbHVkZSBhdXRvdmFjdXVtIHByb2Nlc3NlcyBhbmQg cHJvY2Vzc2VzIHJ1bm5pbmcgbWFudWFsCi0JICogbGF6eSBWQUNVVU1zLCBiZWNhdXNlIHRo ZXkgd29uJ3QgYmUgZmF6ZWQgYnkgbWlzc2luZyBpbmRleCBlbnRyaWVzCi0JICogZWl0aGVy LiAgKE1hbnVhbCBBTkFMWVpFcywgaG93ZXZlciwgY2FuJ3QgYmUgZXhjbHVkZWQgYmVjYXVz ZSB0aGV5Ci0JICogbWlnaHQgYmUgd2l0aGluIHRyYW5zYWN0aW9ucyB0aGF0IGFyZSBnb2lu ZyB0byBkbyBhcmJpdHJhcnkgb3BlcmF0aW9ucwotCSAqIGxhdGVyLikKLQkgKgotCSAqIEFs c28sIEdldEN1cnJlbnRWaXJ0dWFsWElEcyBuZXZlciByZXBvcnRzIG91ciBvd24gdnhpZCwg c28gd2UgbmVlZCBub3QKLQkgKiBjaGVjayBmb3IgdGhhdC4KLQkgKgotCSAqIElmIGEgcHJv Y2VzcyBnb2VzIGlkbGUtaW4tdHJhbnNhY3Rpb24gd2l0aCB4bWluIHplcm8sIHdlIGRvIG5v dCBuZWVkIHRvCi0JICogd2FpdCBmb3IgaXQgYW55bW9yZSwgcGVyIHRoZSBhYm92ZSBhcmd1 bWVudC4gIFdlIGRvIG5vdCBoYXZlIHRoZQotCSAqIGluZnJhc3RydWN0dXJlIHJpZ2h0IG5v dyB0byBzdG9wIHdhaXRpbmcgaWYgdGhhdCBoYXBwZW5zLCBidXQgd2UgY2FuIGF0Ci0JICog bGVhc3QgYXZvaWQgdGhlIGZvbGx5IG9mIHdhaXRpbmcgd2hlbiBpdCBpcyBpZGxlIGF0IHRo ZSB0aW1lIHdlIHdvdWxkCi0JICogYmVnaW4gdG8gd2FpdC4gIFdlIGRvIHRoaXMgYnkgcmVw ZWF0ZWRseSByZWNoZWNraW5nIHRoZSBvdXRwdXQgb2YKLQkgKiBHZXRDdXJyZW50VmlydHVh bFhJRHMuICBJZiwgZHVyaW5nIGFueSBpdGVyYXRpb24sIGEgcGFydGljdWxhciB2eGlkCi0J ICogZG9lc24ndCBzaG93IHVwIGluIHRoZSBvdXRwdXQsIHdlIGtub3cgd2UgY2FuIGZvcmdl dCBhYm91dCBpdC4KKwkgKiB0cmFuc2FjdGlvbnMgdGhhdCBtaWdodCBoYXZlIG9sZGVyIHNu YXBzaG90cy4KIAkgKi8KLQlvbGRfc25hcHNob3RzID0gR2V0Q3VycmVudFZpcnR1YWxYSURz KGxpbWl0WG1pbiwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQkJCQkJICBQUk9DX0lTX0FVVE9WQUNV VU0gfCBQUk9DX0lOX1ZBQ1VVTSwKLQkJCQkJCQkJCQkgICZuX29sZF9zbmFwc2hvdHMpOwot Ci0JZm9yIChpID0gMDsgaSA8IG5fb2xkX3NuYXBzaG90czsgaSsrKQotCXsKLQkJaWYgKCFW aXJ0dWFsVHJhbnNhY3Rpb25JZElzVmFsaWQob2xkX3NuYXBzaG90c1tpXSkpCi0JCQljb250 aW51ZTsJCQkvKiBmb3VuZCB1bmludGVyZXN0aW5nIGluIHByZXZpb3VzIGN5Y2xlICovCi0K LQkJaWYgKGkgPiAwKQotCQl7Ci0JCQkvKiBzZWUgaWYgYW55dGhpbmcncyBjaGFuZ2VkIC4u LiAqLwotCQkJVmlydHVhbFRyYW5zYWN0aW9uSWQgKm5ld2VyX3NuYXBzaG90czsKLQkJCWlu dAkJCW5fbmV3ZXJfc25hcHNob3RzOwotCQkJaW50CQkJajsKLQkJCWludAkJCWs7Ci0KLQkJ CW5ld2VyX3NuYXBzaG90cyA9IEdldEN1cnJlbnRWaXJ0dWFsWElEcyhsaW1pdFhtaW4sCi0J CQkJCQkJCQkJCQkJdHJ1ZSwgZmFsc2UsCi0JCQkJCQkJCQkJCQkJUFJPQ19JU19BVVRPVkFD VVVNIHwgUFJPQ19JTl9WQUNVVU0sCi0JCQkJCQkJCQkJCQkJJm5fbmV3ZXJfc25hcHNob3Rz KTsKLQkJCWZvciAoaiA9IGk7IGogPCBuX29sZF9zbmFwc2hvdHM7IGorKykKLQkJCXsKLQkJ CQlpZiAoIVZpcnR1YWxUcmFuc2FjdGlvbklkSXNWYWxpZChvbGRfc25hcHNob3RzW2pdKSkK LQkJCQkJY29udGludWU7CS8qIGZvdW5kIHVuaW50ZXJlc3RpbmcgaW4gcHJldmlvdXMgY3lj bGUgKi8KLQkJCQlmb3IgKGsgPSAwOyBrIDwgbl9uZXdlcl9zbmFwc2hvdHM7IGsrKykKLQkJ CQl7Ci0JCQkJCWlmIChWaXJ0dWFsVHJhbnNhY3Rpb25JZEVxdWFscyhvbGRfc25hcHNob3Rz W2pdLAotCQkJCQkJCQkJCQkJICAgbmV3ZXJfc25hcHNob3RzW2tdKSkKLQkJCQkJCWJyZWFr OwotCQkJCX0KLQkJCQlpZiAoayA+PSBuX25ld2VyX3NuYXBzaG90cykgLyogbm90IHRoZXJl IGFueW1vcmUgKi8KLQkJCQkJU2V0SW52YWxpZFZpcnR1YWxUcmFuc2FjdGlvbklkKG9sZF9z bmFwc2hvdHNbal0pOwotCQkJfQotCQkJcGZyZWUobmV3ZXJfc25hcHNob3RzKTsKLQkJfQot Ci0JCWlmIChWaXJ0dWFsVHJhbnNhY3Rpb25JZElzVmFsaWQob2xkX3NuYXBzaG90c1tpXSkp Ci0JCQlWaXJ0dWFsWGFjdExvY2sob2xkX3NuYXBzaG90c1tpXSwgdHJ1ZSk7Ci0JfQorCVdh aXRGb3JPbGRlclNuYXBzaG90cyhsaW1pdFhtaW4pOwogCiAJLyoKIAkgKiBJbmRleCBjYW4g bm93IGJlIG1hcmtlZCB2YWxpZCAtLSB1cGRhdGUgaXRzIHBnX2luZGV4IGVudHJ5CkBAIC0y MjA0LDcgKzIyMDMsNyBAQCBDaG9vc2VJbmRleENvbHVtbk5hbWVzKExpc3QgKmluZGV4RWxl bXMpCiAgKgkJUmVjcmVhdGUgYSBzcGVjaWZpYyBpbmRleC4KICAqLwogdm9pZAotUmVpbmRl eEluZGV4KFJhbmdlVmFyICppbmRleFJlbGF0aW9uLCBpbnQgb3B0aW9ucykKK1JlaW5kZXhJ bmRleChSYW5nZVZhciAqaW5kZXhSZWxhdGlvbiwgaW50IG9wdGlvbnMsIGJvb2wgY29uY3Vy cmVudCkKIHsKIAlPaWQJCQlpbmRPaWQ7CiAJT2lkCQkJaGVhcE9pZCA9IEludmFsaWRPaWQ7 CkBAIC0yMjE2LDcgKzIyMTUsOCBAQCBSZWluZGV4SW5kZXgoUmFuZ2VWYXIgKmluZGV4UmVs YXRpb24sIGludCBvcHRpb25zKQogCSAqIG9idGFpbiBsb2NrIG9uIHRhYmxlIGZpcnN0LCB0 byBhdm9pZCBkZWFkbG9jayBoYXphcmQuICBUaGUgbG9jayBsZXZlbAogCSAqIHVzZWQgaGVy ZSBtdXN0IG1hdGNoIHRoZSBpbmRleCBsb2NrIG9idGFpbmVkIGluIHJlaW5kZXhfaW5kZXgo KS4KIAkgKi8KLQlpbmRPaWQgPSBSYW5nZVZhckdldFJlbGlkRXh0ZW5kZWQoaW5kZXhSZWxh dGlvbiwgQWNjZXNzRXhjbHVzaXZlTG9jaywKKwlpbmRPaWQgPSBSYW5nZVZhckdldFJlbGlk RXh0ZW5kZWQoaW5kZXhSZWxhdGlvbiwKKwkJCQkJCQkJCSAgY29uY3VycmVudCA/IFNoYXJl VXBkYXRlRXhjbHVzaXZlTG9jayA6IEFjY2Vzc0V4Y2x1c2l2ZUxvY2ssCiAJCQkJCQkJCQkg IDAsCiAJCQkJCQkJCQkgIFJhbmdlVmFyQ2FsbGJhY2tGb3JSZWluZGV4SW5kZXgsCiAJCQkJ CQkJCQkgICh2b2lkICopICZoZWFwT2lkKTsKQEAgLTIyMzYsNyArMjIzNiwxMCBAQCBSZWlu ZGV4SW5kZXgoUmFuZ2VWYXIgKmluZGV4UmVsYXRpb24sIGludCBvcHRpb25zKQogCXBlcnNp c3RlbmNlID0gaXJlbC0+cmRfcmVsLT5yZWxwZXJzaXN0ZW5jZTsKIAlpbmRleF9jbG9zZShp cmVsLCBOb0xvY2spOwogCi0JcmVpbmRleF9pbmRleChpbmRPaWQsIGZhbHNlLCBwZXJzaXN0 ZW5jZSwgb3B0aW9ucyk7CisJaWYgKGNvbmN1cnJlbnQpCisJCVJlaW5kZXhSZWxhdGlvbkNv bmN1cnJlbnRseShpbmRPaWQsIG9wdGlvbnMpOworCWVsc2UKKwkJcmVpbmRleF9pbmRleChp bmRPaWQsIGZhbHNlLCBwZXJzaXN0ZW5jZSwgb3B0aW9ucyk7CiB9CiAKIC8qCkBAIC0yMzA0 LDE4ICsyMzA3LDI2IEBAIFJhbmdlVmFyQ2FsbGJhY2tGb3JSZWluZGV4SW5kZXgoY29uc3Qg UmFuZ2VWYXIgKnJlbGF0aW9uLAogICoJCVJlY3JlYXRlIGFsbCBpbmRleGVzIG9mIGEgdGFi bGUgKGFuZCBvZiBpdHMgdG9hc3QgdGFibGUsIGlmIGFueSkKICAqLwogT2lkCi1SZWluZGV4 VGFibGUoUmFuZ2VWYXIgKnJlbGF0aW9uLCBpbnQgb3B0aW9ucykKK1JlaW5kZXhUYWJsZShS YW5nZVZhciAqcmVsYXRpb24sIGludCBvcHRpb25zLCBib29sIGNvbmN1cnJlbnQpCiB7CiAJ T2lkCQkJaGVhcE9pZDsKKwlib29sCQlyZXN1bHQ7CiAKIAkvKiBUaGUgbG9jayBsZXZlbCB1 c2VkIGhlcmUgc2hvdWxkIG1hdGNoIHJlaW5kZXhfcmVsYXRpb24oKS4gKi8KLQloZWFwT2lk ID0gUmFuZ2VWYXJHZXRSZWxpZEV4dGVuZGVkKHJlbGF0aW9uLCBTaGFyZUxvY2ssIDAsCisJ aGVhcE9pZCA9IFJhbmdlVmFyR2V0UmVsaWRFeHRlbmRlZChyZWxhdGlvbiwKKwkJCQkJCQkJ CSAgIGNvbmN1cnJlbnQgPyBTaGFyZVVwZGF0ZUV4Y2x1c2l2ZUxvY2sgOiBTaGFyZUxvY2ss CisJCQkJCQkJCQkgICAwLAogCQkJCQkJCQkJICAgUmFuZ2VWYXJDYWxsYmFja093bnNUYWJs ZSwgTlVMTCk7CiAKLQlpZiAoIXJlaW5kZXhfcmVsYXRpb24oaGVhcE9pZCwKLQkJCQkJCSAg UkVJTkRFWF9SRUxfUFJPQ0VTU19UT0FTVCB8Ci0JCQkJCQkgIFJFSU5ERVhfUkVMX0NIRUNL X0NPTlNUUkFJTlRTLAotCQkJCQkJICBvcHRpb25zKSkKKwlpZiAoY29uY3VycmVudCkKKwkJ cmVzdWx0ID0gUmVpbmRleFJlbGF0aW9uQ29uY3VycmVudGx5KGhlYXBPaWQsIG9wdGlvbnMp OworCWVsc2UKKwkJcmVzdWx0ID0gcmVpbmRleF9yZWxhdGlvbihoZWFwT2lkLAorCQkJCQkJ CQkgIFJFSU5ERVhfUkVMX1BST0NFU1NfVE9BU1QgfAorCQkJCQkJCQkgIFJFSU5ERVhfUkVM X0NIRUNLX0NPTlNUUkFJTlRTLAorCQkJCQkJCQkgIG9wdGlvbnMpOworCisJaWYgKCFyZXN1 bHQpCiAJCWVyZXBvcnQoTk9USUNFLAogCQkJCShlcnJtc2coInRhYmxlIFwiJXNcIiBoYXMg bm8gaW5kZXhlcyIsCiAJCQkJCQlyZWxhdGlvbi0+cmVsbmFtZSkpKTsKQEAgLTIzMzMsNyAr MjM0NCw3IEBAIFJlaW5kZXhUYWJsZShSYW5nZVZhciAqcmVsYXRpb24sIGludCBvcHRpb25z KQogICovCiB2b2lkCiBSZWluZGV4TXVsdGlwbGVUYWJsZXMoY29uc3QgY2hhciAqb2JqZWN0 TmFtZSwgUmVpbmRleE9iamVjdFR5cGUgb2JqZWN0S2luZCwKLQkJCQkJICBpbnQgb3B0aW9u cykKKwkJCQkJICBpbnQgb3B0aW9ucywgYm9vbCBjb25jdXJyZW50KQogewogCU9pZAkJCW9i amVjdE9pZDsKIAlSZWxhdGlvbglyZWxhdGlvblJlbGF0aW9uOwpAQCAtMjM0NSw2ICsyMzU2 LDcgQEAgUmVpbmRleE11bHRpcGxlVGFibGVzKGNvbnN0IGNoYXIgKm9iamVjdE5hbWUsIFJl aW5kZXhPYmplY3RUeXBlIG9iamVjdEtpbmQsCiAJTGlzdAkgICAqcmVsaWRzID0gTklMOwog CUxpc3RDZWxsICAgKmw7CiAJaW50CQkJbnVtX2tleXM7CisJYm9vbAkJY29uY3VycmVudF93 YXJuaW5nID0gZmFsc2U7CiAKIAlBc3NlcnRBcmcob2JqZWN0TmFtZSk7CiAJQXNzZXJ0KG9i amVjdEtpbmQgPT0gUkVJTkRFWF9PQkpFQ1RfU0NIRU1BIHx8CkBAIC0yNDUzLDYgKzI0NjUs MjAgQEAgUmVpbmRleE11bHRpcGxlVGFibGVzKGNvbnN0IGNoYXIgKm9iamVjdE5hbWUsIFJl aW5kZXhPYmplY3RUeXBlIG9iamVjdEtpbmQsCiAJCQkhcGdfY2xhc3Nfb3duZXJjaGVjayhy ZWxpZCwgR2V0VXNlcklkKCkpKQogCQkJY29udGludWU7CiAKKwkJLyoKKwkJICogU2tpcCBz eXN0ZW0gdGFibGVzIHRoYXQgaW5kZXhfY3JlYXRlKCkgd291bGQgcmVqZWN0IHRvIGluZGV4 CisJCSAqIGNvbmN1cnJlbnRseS4KKwkJICovCisJCWlmIChjb25jdXJyZW50ICYmIElzU3lz dGVtTmFtZXNwYWNlKGdldF9yZWxfbmFtZXNwYWNlKHJlbGlkKSkpCisJCXsKKwkJCWlmICgh Y29uY3VycmVudF93YXJuaW5nKQorCQkJCWVyZXBvcnQoV0FSTklORywKKwkJCQkJCShlcnJj b2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKKwkJCQkJCSBlcnJtc2coImNv bmN1cnJlbnQgcmVpbmRleCBpcyBub3Qgc3VwcG9ydGVkIGZvciBjYXRhbG9nIHJlbGF0aW9u cywgc2tpcHBpbmcgYWxsIikpKTsKKwkJCWNvbmN1cnJlbnRfd2FybmluZyA9IHRydWU7CisJ CQljb250aW51ZTsKKwkJfQorCiAJCS8qIFNhdmUgdGhlIGxpc3Qgb2YgcmVsYXRpb24gT0lE cyBpbiBwcml2YXRlIGNvbnRleHQgKi8KIAkJb2xkID0gTWVtb3J5Q29udGV4dFN3aXRjaFRv KHByaXZhdGVfY29udGV4dCk7CiAKQEAgLTI0NzksMjYgKzI1MDUsNjYzIEBAIFJlaW5kZXhN dWx0aXBsZVRhYmxlcyhjb25zdCBjaGFyICpvYmplY3ROYW1lLCBSZWluZGV4T2JqZWN0VHlw ZSBvYmplY3RLaW5kLAogCWZvcmVhY2gobCwgcmVsaWRzKQogCXsKIAkJT2lkCQkJcmVsaWQg PSBsZmlyc3Rfb2lkKGwpOworCQlib29sCQlyZXN1bHQ7CiAKIAkJU3RhcnRUcmFuc2FjdGlv bkNvbW1hbmQoKTsKIAkJLyogZnVuY3Rpb25zIGluIGluZGV4ZXMgbWF5IHdhbnQgYSBzbmFw c2hvdCBzZXQgKi8KIAkJUHVzaEFjdGl2ZVNuYXBzaG90KEdldFRyYW5zYWN0aW9uU25hcHNo b3QoKSk7Ci0JCWlmIChyZWluZGV4X3JlbGF0aW9uKHJlbGlkLAotCQkJCQkJCSBSRUlOREVY X1JFTF9QUk9DRVNTX1RPQVNUIHwKLQkJCQkJCQkgUkVJTkRFWF9SRUxfQ0hFQ0tfQ09OU1RS QUlOVFMsCi0JCQkJCQkJIG9wdGlvbnMpKQogCi0JCQlpZiAob3B0aW9ucyAmIFJFSU5ERVhP UFRfVkVSQk9TRSkKKwkJaWYgKGNvbmN1cnJlbnQpCisJCXsKKwkJCXJlc3VsdCA9IFJlaW5k ZXhSZWxhdGlvbkNvbmN1cnJlbnRseShyZWxpZCwgb3B0aW9ucyk7CisJCQkvKiBSZWluZGV4 UmVsYXRpb25Db25jdXJyZW50bHkoKSBkb2VzIHRoZSB2ZXJib3NlIG91dHB1dCAqLworCisJ CQlQdXNoQWN0aXZlU25hcHNob3QoR2V0VHJhbnNhY3Rpb25TbmFwc2hvdCgpKTsKKwkJfQor CQllbHNlCisJCXsKKwkJCXJlc3VsdCA9IHJlaW5kZXhfcmVsYXRpb24ocmVsaWQsCisJCQkJ CQkJCQkgIFJFSU5ERVhfUkVMX1BST0NFU1NfVE9BU1QgfAorCQkJCQkJCQkJICBSRUlOREVY X1JFTF9DSEVDS19DT05TVFJBSU5UUywKKwkJCQkJCQkJCSAgb3B0aW9ucyk7CisKKwkJCWlm IChyZXN1bHQgJiYgKG9wdGlvbnMgJiBSRUlOREVYT1BUX1ZFUkJPU0UpKQogCQkJCWVyZXBv cnQoSU5GTywKIAkJCQkJCShlcnJtc2coInRhYmxlIFwiJXMuJXNcIiB3YXMgcmVpbmRleGVk IiwKIAkJCQkJCQkJZ2V0X25hbWVzcGFjZV9uYW1lKGdldF9yZWxfbmFtZXNwYWNlKHJlbGlk KSksCiAJCQkJCQkJCWdldF9yZWxfbmFtZShyZWxpZCkpKSk7CisJCX0KKworCQlQb3BBY3Rp dmVTbmFwc2hvdCgpOworCQlDb21taXRUcmFuc2FjdGlvbkNvbW1hbmQoKTsKKwl9CisJU3Rh cnRUcmFuc2FjdGlvbkNvbW1hbmQoKTsKKworCU1lbW9yeUNvbnRleHREZWxldGUocHJpdmF0 ZV9jb250ZXh0KTsKK30KKworCisvKgorICogUmVpbmRleFJlbGF0aW9uQ29uY3VycmVudGx5 CisgKgorICogUHJvY2VzcyBSRUlOREVYIENPTkNVUlJFTlRMWSBmb3IgZ2l2ZW4gcmVsYXRp b24gT2lkLiBUaGUgcmVsYXRpb24gY2FuIGJlCisgKiBlaXRoZXIgYW4gaW5kZXggb3IgYSB0 YWJsZS4gSWYgYSB0YWJsZSBpcyBzcGVjaWZpZWQsIGVhY2ggcGhhc2UgaXMgcHJvY2Vzc2Vk CisgKiBvbmUgYnkgb25lIGZvciBlYWNoIHRhYmxlJ3MgaW5kZXhlcyBhcyB3ZWxsIGFzIGl0 cyBkZXBlbmRlbnQgdG9hc3QgaW5kZXhlcworICogaWYgdGhpcyB0YWJsZSBoYXMgYSB0b2Fz dCByZWxhdGlvbiBkZWZpbmVkLgorICovCitzdGF0aWMgYm9vbAorUmVpbmRleFJlbGF0aW9u Q29uY3VycmVudGx5KE9pZCByZWxhdGlvbk9pZCwgaW50IG9wdGlvbnMpCit7CisJTGlzdAkg ICAqcGFyZW50UmVsYXRpb25JZHMgPSBOSUw7CisJTGlzdAkgICAqaW5kZXhJZHMgPSBOSUw7 CisJTGlzdAkgICAqbmV3SW5kZXhJZHMgPSBOSUw7CisJTGlzdAkgICAqcmVsYXRpb25Mb2Nr cyA9IE5JTDsKKwlMaXN0CSAgICpsb2NrVGFncyA9IE5JTDsKKwlMaXN0Q2VsbCAgICpsYywK KwkJCSAgICpsYzI7CisJTWVtb3J5Q29udGV4dCBwcml2YXRlX2NvbnRleHQ7CisJTWVtb3J5 Q29udGV4dCBvbGQ7CisJY2hhcgkJcmVsa2luZDsKKwljaGFyCSAgICpyZWxhdGlvbk5hbWUg PSBOVUxMOworCWNoYXIJICAgKnJlbGF0aW9uTmFtZXNwYWNlID0gTlVMTDsKKwlQR1JVc2Fn ZQlydTA7CisKKwkvKgorCSAqIENyZWF0ZSBhIG1lbW9yeSBjb250ZXh0IHRoYXQgd2lsbCBz dXJ2aXZlIGZvcmNlZCB0cmFuc2FjdGlvbiBjb21taXRzIHdlCisJICogZG8gYmVsb3cuICBT aW5jZSBpdCBpcyBhIGNoaWxkIG9mIFBvcnRhbENvbnRleHQsIGl0IHdpbGwgZ28gYXdheQor CSAqIGV2ZW50dWFsbHkgZXZlbiBpZiB3ZSBzdWZmZXIgYW4gZXJyb3I7IHRoZXJlJ3Mgbm8g bmVlZCBmb3Igc3BlY2lhbAorCSAqIGFib3J0IGNsZWFudXAgbG9naWMuCisJICovCisJcHJp dmF0ZV9jb250ZXh0ID0gQWxsb2NTZXRDb250ZXh0Q3JlYXRlKFBvcnRhbENvbnRleHQsCisJ CQkJCQkJCQkJCSJSZWluZGV4Q29uY3VycmVudCIsCisJCQkJCQkJCQkJCUFMTE9DU0VUX1NN QUxMX1NJWkVTKTsKKworCWlmIChvcHRpb25zICYgUkVJTkRFWE9QVF9WRVJCT1NFKQorCXsK KwkJLyogU2F2ZSBkYXRhIG5lZWRlZCBieSBSRUlOREVYIFZFUkJPU0UgaW4gcHJpdmF0ZSBj b250ZXh0ICovCisJCW9sZCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhwcml2YXRlX2NvbnRl eHQpOworCisJCXJlbGF0aW9uTmFtZSA9IGdldF9yZWxfbmFtZShyZWxhdGlvbk9pZCk7CisJ CXJlbGF0aW9uTmFtZXNwYWNlID0gZ2V0X25hbWVzcGFjZV9uYW1lKGdldF9yZWxfbmFtZXNw YWNlKHJlbGF0aW9uT2lkKSk7CisKKwkJcGdfcnVzYWdlX2luaXQoJnJ1MCk7CisKKwkJTWVt b3J5Q29udGV4dFN3aXRjaFRvKG9sZCk7CisJfQorCisJcmVsa2luZCA9IGdldF9yZWxfcmVs a2luZChyZWxhdGlvbk9pZCk7CisKKwkvKgorCSAqIEV4dHJhY3QgdGhlIGxpc3Qgb2YgaW5k ZXhlcyB0aGF0IGFyZSBnb2luZyB0byBiZSByZWJ1aWx0IGJhc2VkIG9uIHRoZQorCSAqIGxp c3Qgb2YgcmVsYXRpb24gT2lkcyBnaXZlbiBieSBjYWxsZXIuIEZvciBlYWNoIGVsZW1lbnQg aW4gZ2l2ZW4gbGlzdCwKKwkgKiBpZiB0aGUgcmVsa2luZCBvZiBnaXZlbiByZWxhdGlvbiBP aWQgaXMgYSB0YWJsZSwgYWxsIGl0cyB2YWxpZCBpbmRleGVzCisJICogd2lsbCBiZSByZWJ1 aWx0LCBpbmNsdWRpbmcgaXRzIGFzc29jaWF0ZWQgdG9hc3QgdGFibGUgaW5kZXhlcy4gSWYK KwkgKiByZWxraW5kIGlzIGFuIGluZGV4LCB0aGlzIGluZGV4IGl0c2VsZiB3aWxsIGJlIHJl YnVpbHQuIFRoZSBsb2NrcyB0YWtlbgorCSAqIG9uIHBhcmVudCByZWxhdGlvbnMgYW5kIGlu dm9sdmVkIGluZGV4ZXMgYXJlIGtlcHQgdW50aWwgdGhpcworCSAqIHRyYW5zYWN0aW9uIGlz IGNvbW1pdHRlZCB0byBwcm90ZWN0IGFnYWluc3Qgc2NoZW1hIGNoYW5nZXMgdGhhdCBtaWdo dAorCSAqIG9jY3VyIHVudGlsIHRoZSBzZXNzaW9uIGxvY2sgaXMgdGFrZW4gb24gZWFjaCBy ZWxhdGlvbiwgc2Vzc2lvbiBsb2NrCisJICogdXNlZCB0byBzaW1pbGFybHkgcHJvdGVjdCBm cm9tIGFueSBzY2hlbWEgY2hhbmdlIHRoYXQgY291bGQgaGFwcGVuCisJICogd2l0aGluIHRo ZSBtdWx0aXBsZSB0cmFuc2FjdGlvbnMgdGhhdCBhcmUgdXNlZCBkdXJpbmcgdGhpcyBwcm9j ZXNzLgorCSAqLworCXN3aXRjaCAocmVsa2luZCkKKwl7CisJCWNhc2UgUkVMS0lORF9SRUxB VElPTjoKKwkJY2FzZSBSRUxLSU5EX01BVFZJRVc6CisJCWNhc2UgUkVMS0lORF9UT0FTVFZB TFVFOgorCQkJeworCQkJCS8qCisJCQkJICogSW4gdGhlIGNhc2Ugb2YgYSByZWxhdGlvbiwg ZmluZCBhbGwgaXRzIGluZGV4ZXMgaW5jbHVkaW5nCisJCQkJICogdG9hc3QgaW5kZXhlcy4K KwkJCQkgKi8KKwkJCQlSZWxhdGlvbgloZWFwUmVsYXRpb247CisKKwkJCQkvKiBTYXZlIHRo ZSBsaXN0IG9mIHJlbGF0aW9uIE9JRHMgaW4gcHJpdmF0ZSBjb250ZXh0ICovCisJCQkJb2xk ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKHByaXZhdGVfY29udGV4dCk7CisKKwkJCQkvKiBU cmFjayB0aGlzIHJlbGF0aW9uIGZvciBzZXNzaW9uIGxvY2tzICovCisJCQkJcGFyZW50UmVs YXRpb25JZHMgPSBsYXBwZW5kX29pZChwYXJlbnRSZWxhdGlvbklkcywgcmVsYXRpb25PaWQp OworCisJCQkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZCk7CisKKwkJCQkvKiBBIHNoYXJl ZCByZWxhdGlvbiBjYW5ub3QgYmUgcmVpbmRleGVkIGNvbmN1cnJlbnRseSAqLworCQkJCWlm IChJc1NoYXJlZFJlbGF0aW9uKHJlbGF0aW9uT2lkKSkKKwkJCQkJZXJlcG9ydChFUlJPUiwK KwkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCisJCQkJ CQkJIGVycm1zZygiY29uY3VycmVudCByZWluZGV4IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHNo YXJlZCByZWxhdGlvbnMiKSkpOworCisJCQkJLyogQSBzeXN0ZW0gY2F0YWxvZyBjYW5ub3Qg YmUgcmVpbmRleGVkIGNvbmN1cnJlbnRseSAqLworCQkJCWlmIChJc1N5c3RlbU5hbWVzcGFj ZShnZXRfcmVsX25hbWVzcGFjZShyZWxhdGlvbk9pZCkpKQorCQkJCQllcmVwb3J0KEVSUk9S LAorCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKKwkJ CQkJCQkgZXJybXNnKCJjb25jdXJyZW50IHJlaW5kZXggaXMgbm90IHN1cHBvcnRlZCBmb3Ig Y2F0YWxvZyByZWxhdGlvbnMiKSkpOworCisJCQkJLyogT3BlbiByZWxhdGlvbiB0byBnZXQg aXRzIGluZGV4ZXMgKi8KKwkJCQloZWFwUmVsYXRpb24gPSBoZWFwX29wZW4ocmVsYXRpb25P aWQsIFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9jayk7CisKKwkJCQkvKiBBZGQgYWxsIHRoZSB2 YWxpZCBpbmRleGVzIG9mIHJlbGF0aW9uIHRvIGxpc3QgKi8KKwkJCQlmb3JlYWNoKGxjLCBS ZWxhdGlvbkdldEluZGV4TGlzdChoZWFwUmVsYXRpb24pKQorCQkJCXsKKwkJCQkJT2lkCQkJ Y2VsbE9pZCA9IGxmaXJzdF9vaWQobGMpOworCQkJCQlSZWxhdGlvbglpbmRleFJlbGF0aW9u ID0gaW5kZXhfb3BlbihjZWxsT2lkLAorCQkJCQkJCQkJCQkJCQkgICBTaGFyZVVwZGF0ZUV4 Y2x1c2l2ZUxvY2spOworCisJCQkJCWlmICghaW5kZXhSZWxhdGlvbi0+cmRfaW5kZXgtPmlu ZGlzdmFsaWQpCisJCQkJCQllcmVwb3J0KFdBUk5JTkcsCisJCQkJCQkJCShlcnJjb2RlKEVS UkNPREVfSU5ERVhfQ09SUlVQVEVEKSwKKwkJCQkJCQkJIGVycm1zZygiY2Fubm90IHJlaW5k ZXggY29uY3VycmVudGx5IGludmFsaWQgaW5kZXggXCIlcy4lc1wiLCBza2lwcGluZyIsCisJ CQkJCQkJCQkJZ2V0X25hbWVzcGFjZV9uYW1lKGdldF9yZWxfbmFtZXNwYWNlKGNlbGxPaWQp KSwKKwkJCQkJCQkJCQlnZXRfcmVsX25hbWUoY2VsbE9pZCkpKSk7CisJCQkJCWVsc2UKKwkJ CQkJeworCQkJCQkJLyogU2F2ZSB0aGUgbGlzdCBvZiByZWxhdGlvbiBPSURzIGluIHByaXZh dGUgY29udGV4dCAqLworCQkJCQkJb2xkID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKHByaXZh dGVfY29udGV4dCk7CisKKwkJCQkJCWluZGV4SWRzID0gbGFwcGVuZF9vaWQoaW5kZXhJZHMs IGNlbGxPaWQpOworCisJCQkJCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkKTsKKwkJCQkJ fQorCisJCQkJCWluZGV4X2Nsb3NlKGluZGV4UmVsYXRpb24sIE5vTG9jayk7CisJCQkJfQor CisJCQkJLyogQWxzbyBhZGQgdGhlIHRvYXN0IGluZGV4ZXMgKi8KKwkJCQlpZiAoT2lkSXNW YWxpZChoZWFwUmVsYXRpb24tPnJkX3JlbC0+cmVsdG9hc3RyZWxpZCkpCisJCQkJeworCQkJ CQlPaWQJCQl0b2FzdE9pZCA9IGhlYXBSZWxhdGlvbi0+cmRfcmVsLT5yZWx0b2FzdHJlbGlk OworCQkJCQlSZWxhdGlvbgl0b2FzdFJlbGF0aW9uID0gaGVhcF9vcGVuKHRvYXN0T2lkLAor CQkJCQkJCQkJCQkJCQkgIFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9jayk7CisKKwkJCQkJLyog U2F2ZSB0aGUgbGlzdCBvZiByZWxhdGlvbiBPSURzIGluIHByaXZhdGUgY29udGV4dCAqLwor CQkJCQlvbGQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8ocHJpdmF0ZV9jb250ZXh0KTsKKwor CQkJCQkvKiBUcmFjayB0aGlzIHJlbGF0aW9uIGZvciBzZXNzaW9uIGxvY2tzICovCisJCQkJ CXBhcmVudFJlbGF0aW9uSWRzID0gbGFwcGVuZF9vaWQocGFyZW50UmVsYXRpb25JZHMsIHRv YXN0T2lkKTsKKworCQkJCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkKTsKKworCQkJCQlm b3JlYWNoKGxjMiwgUmVsYXRpb25HZXRJbmRleExpc3QodG9hc3RSZWxhdGlvbikpCisJCQkJ CXsKKwkJCQkJCU9pZAkJCWNlbGxPaWQgPSBsZmlyc3Rfb2lkKGxjMik7CisJCQkJCQlSZWxh dGlvbglpbmRleFJlbGF0aW9uID0gaW5kZXhfb3BlbihjZWxsT2lkLAorCQkJCQkJCQkJCQkJ CQkJICAgU2hhcmVVcGRhdGVFeGNsdXNpdmVMb2NrKTsKKworCQkJCQkJaWYgKCFpbmRleFJl bGF0aW9uLT5yZF9pbmRleC0+aW5kaXN2YWxpZCkKKwkJCQkJCQllcmVwb3J0KFdBUk5JTkcs CisJCQkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0lOREVYX0NPUlJVUFRFRCksCisJCQkJCQkJ CQkgZXJybXNnKCJjYW5ub3QgcmVpbmRleCBjb25jdXJyZW50bHkgaW52YWxpZCBpbmRleCBc IiVzLiVzXCIsIHNraXBwaW5nIiwKKwkJCQkJCQkJCQkJZ2V0X25hbWVzcGFjZV9uYW1lKGdl dF9yZWxfbmFtZXNwYWNlKGNlbGxPaWQpKSwKKwkJCQkJCQkJCQkJZ2V0X3JlbF9uYW1lKGNl bGxPaWQpKSkpOworCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCS8qCisJCQkJCQkJICog U2F2ZSB0aGUgbGlzdCBvZiByZWxhdGlvbiBPSURzIGluIHByaXZhdGUKKwkJCQkJCQkgKiBj b250ZXh0CisJCQkJCQkJICovCisJCQkJCQkJb2xkID0gTWVtb3J5Q29udGV4dFN3aXRjaFRv KHByaXZhdGVfY29udGV4dCk7CisKKwkJCQkJCQlpbmRleElkcyA9IGxhcHBlbmRfb2lkKGlu ZGV4SWRzLCBjZWxsT2lkKTsKKworCQkJCQkJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGQp OworCQkJCQkJfQorCisJCQkJCQlpbmRleF9jbG9zZShpbmRleFJlbGF0aW9uLCBOb0xvY2sp OworCQkJCQl9CisKKwkJCQkJaGVhcF9jbG9zZSh0b2FzdFJlbGF0aW9uLCBOb0xvY2spOwor CQkJCX0KKworCQkJCWhlYXBfY2xvc2UoaGVhcFJlbGF0aW9uLCBOb0xvY2spOworCQkJCWJy ZWFrOworCQkJfQorCQljYXNlIFJFTEtJTkRfSU5ERVg6CisJCQl7CisJCQkJLyoKKwkJCQkg KiBGb3IgYW4gaW5kZXggc2ltcGx5IGFkZCBpdHMgT2lkIHRvIGxpc3QuIEludmFsaWQgaW5k ZXhlcworCQkJCSAqIGNhbm5vdCBiZSBpbmNsdWRlZCBpbiBsaXN0LgorCQkJCSAqLworCQkJ CVJlbGF0aW9uCWluZGV4UmVsYXRpb24gPSBpbmRleF9vcGVuKHJlbGF0aW9uT2lkLCBTaGFy ZVVwZGF0ZUV4Y2x1c2l2ZUxvY2spOworCQkJCU9pZAkJCXBhcmVudE9pZCA9IEluZGV4R2V0 UmVsYXRpb24ocmVsYXRpb25PaWQsIGZhbHNlKTsKKworCQkJCS8qIEEgc2hhcmVkIHJlbGF0 aW9uIGNhbm5vdCBiZSByZWluZGV4ZWQgY29uY3VycmVudGx5ICovCisJCQkJaWYgKElzU2hh cmVkUmVsYXRpb24ocGFyZW50T2lkKSkKKwkJCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJCQko ZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCisJCQkJCQkJIGVycm1z ZygiY29uY3VycmVudCByZWluZGV4IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHNoYXJlZCByZWxh dGlvbnMiKSkpOworCisJCQkJLyogQSBzeXN0ZW0gY2F0YWxvZyBjYW5ub3QgYmUgcmVpbmRl eGVkIGNvbmN1cnJlbnRseSAqLworCQkJCWlmIChJc1N5c3RlbU5hbWVzcGFjZShnZXRfcmVs X25hbWVzcGFjZShwYXJlbnRPaWQpKSkKKwkJCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJCQko ZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCisJCQkJCQkJIGVycm1z ZygiY29uY3VycmVudCByZWluZGV4IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGNhdGFsb2cgcmVs YXRpb25zIikpKTsKKworCQkJCS8qIFNhdmUgdGhlIGxpc3Qgb2YgcmVsYXRpb24gT0lEcyBp biBwcml2YXRlIGNvbnRleHQgKi8KKwkJCQlvbGQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8o cHJpdmF0ZV9jb250ZXh0KTsKKworCQkJCS8qIFRyYWNrIHRoZSBwYXJlbnQgcmVsYXRpb24g b2YgdGhpcyBpbmRleCBmb3Igc2Vzc2lvbiBsb2NrcyAqLworCQkJCXBhcmVudFJlbGF0aW9u SWRzID0gbGlzdF9tYWtlMV9vaWQocGFyZW50T2lkKTsKKworCQkJCU1lbW9yeUNvbnRleHRT d2l0Y2hUbyhvbGQpOworCisJCQkJaWYgKCFpbmRleFJlbGF0aW9uLT5yZF9pbmRleC0+aW5k aXN2YWxpZCkKKwkJCQkJZXJlcG9ydChXQVJOSU5HLAorCQkJCQkJCShlcnJjb2RlKEVSUkNP REVfSU5ERVhfQ09SUlVQVEVEKSwKKwkJCQkJCQkgZXJybXNnKCJjYW5ub3QgcmVpbmRleCBj b25jdXJyZW50bHkgaW52YWxpZCBpbmRleCBcIiVzLiVzXCIsIHNraXBwaW5nIiwKKwkJCQkJ CQkJCWdldF9uYW1lc3BhY2VfbmFtZShnZXRfcmVsX25hbWVzcGFjZShyZWxhdGlvbk9pZCkp LAorCQkJCQkJCQkJZ2V0X3JlbF9uYW1lKHJlbGF0aW9uT2lkKSkpKTsKKwkJCQllbHNlCisJ CQkJeworCQkJCQkvKiBTYXZlIHRoZSBsaXN0IG9mIHJlbGF0aW9uIE9JRHMgaW4gcHJpdmF0 ZSBjb250ZXh0ICovCisJCQkJCW9sZCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhwcml2YXRl X2NvbnRleHQpOworCisJCQkJCWluZGV4SWRzID0gbGFwcGVuZF9vaWQoaW5kZXhJZHMsIHJl bGF0aW9uT2lkKTsKKworCQkJCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkKTsKKwkJCQl9 CisKKwkJCQlpbmRleF9jbG9zZShpbmRleFJlbGF0aW9uLCBOb0xvY2spOworCQkJCWJyZWFr OworCQkJfQorCQljYXNlIFJFTEtJTkRfUEFSVElUSU9ORURfVEFCTEU6CisJCQkvKiBzZWUg cmVpbmRleF9yZWxhdGlvbigpICovCisJCQllcmVwb3J0KFdBUk5JTkcsCisJCQkJCShlcnJj b2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKKwkJCQkJIGVycm1zZygiUkVJ TkRFWCBvZiBwYXJ0aXRpb25lZCB0YWJsZXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCwgc2tp cHBpbmcgXCIlc1wiIiwKKwkJCQkJCQlnZXRfcmVsX25hbWUocmVsYXRpb25PaWQpKSkpOwor CQkJcmV0dXJuIGZhbHNlOworCQlkZWZhdWx0OgorCQkJLyogUmV0dXJuIGVycm9yIGlmIHR5 cGUgb2YgcmVsYXRpb24gaXMgbm90IHN1cHBvcnRlZCAqLworCQkJZXJlcG9ydChFUlJPUiwK KwkJCQkJKGVycmNvZGUoRVJSQ09ERV9XUk9OR19PQkpFQ1RfVFlQRSksCisJCQkJCSBlcnJt c2coImNhbm5vdCByZWluZGV4IGNvbmN1cnJlbnRseSB0aGlzIHR5cGUgb2YgcmVsYXRpb24i KSkpOworCQkJYnJlYWs7CisJfQorCisJLyogRGVmaW5ldGVseSBubyBpbmRleGVzLCBzbyBs ZWF2ZSAqLworCWlmIChpbmRleElkcyA9PSBOSUwpCisJCXJldHVybiBmYWxzZTsKKworCUFz c2VydChwYXJlbnRSZWxhdGlvbklkcyAhPSBOSUwpOworCisJLyoKKwkgKiBQaGFzZSAxIG9m IFJFSU5ERVggQ09OQ1VSUkVOVExZCisJICoKKwkgKiBIZXJlIGJlZ2lucyB0aGUgcHJvY2Vz cyBmb3IgY29uY3VycmVudGx5IHJlYnVpbGRpbmcgdGhlIGluZGV4IGVudHJpZXMuCisJICog V2UgbmVlZCBmaXJzdCB0byBjcmVhdGUgYW4gaW5kZXggd2hpY2ggaXMgYmFzZWQgb24gdGhl IHNhbWUgZGF0YSBhcyB0aGUKKwkgKiBmb3JtZXIgaW5kZXggZXhjZXB0IHRoYXQgaXQgd2ls bCBiZSBvbmx5IHJlZ2lzdGVyZWQgaW4gY2F0YWxvZ3MgYW5kCisJICogd2lsbCBiZSBidWls dCBsYXRlci4gSXQgaXMgcG9zc2libGUgdG8gcGVyZm9ybSBhbGwgdGhlIG9wZXJhdGlvbnMg b24KKwkgKiBhbGwgdGhlIGluZGV4ZXMgYXQgdGhlIHNhbWUgdGltZSBmb3IgYSBwYXJlbnQg cmVsYXRpb24gaW5jbHVkaW5nCisJICogaW5kZXhlcyBmb3IgaXRzIHRvYXN0IHJlbGF0aW9u LgorCSAqLworCisJLyogRG8gdGhlIGNvbmN1cnJlbnQgaW5kZXggY3JlYXRpb24gZm9yIGVh Y2ggaW5kZXggKi8KKwlmb3JlYWNoKGxjLCBpbmRleElkcykKKwl7CisJCWNoYXIJICAgKmNv bmN1cnJlbnROYW1lOworCQlPaWQJCQlpbmRPaWQgPSBsZmlyc3Rfb2lkKGxjKTsKKwkJT2lk CQkJY29uY3VycmVudE9pZCA9IEludmFsaWRPaWQ7CisJCVJlbGF0aW9uCWluZGV4UmVsLAor CQkJCQlpbmRleFBhcmVudFJlbCwKKwkJCQkJaW5kZXhDb25jdXJyZW50UmVsOworCQlMb2Nr UmVsSWQJbG9ja3JlbGlkOworCisJCWluZGV4UmVsID0gaW5kZXhfb3BlbihpbmRPaWQsIFNo YXJlVXBkYXRlRXhjbHVzaXZlTG9jayk7CisJCS8qIE9wZW4gdGhlIGluZGV4IHBhcmVudCBy ZWxhdGlvbiwgbWlnaHQgYmUgYSB0b2FzdCBvciBwYXJlbnQgcmVsYXRpb24gKi8KKwkJaW5k ZXhQYXJlbnRSZWwgPSBoZWFwX29wZW4oaW5kZXhSZWwtPnJkX2luZGV4LT5pbmRyZWxpZCwK KwkJCQkJCQkJICAgU2hhcmVVcGRhdGVFeGNsdXNpdmVMb2NrKTsKKworCQkvKiBDaG9vc2Ug YSB0ZW1wb3JhcnkgcmVsYXRpb24gbmFtZSBmb3IgdGhlIG5ldyBpbmRleCAqLworCQljb25j dXJyZW50TmFtZSA9IENob29zZVJlbGF0aW9uTmFtZShnZXRfcmVsX25hbWUoaW5kT2lkKSwK KwkJCQkJCQkJCQkJTlVMTCwKKwkJCQkJCQkJCQkJImNjbmV3IiwKKwkJCQkJCQkJCQkJZ2V0 X3JlbF9uYW1lc3BhY2UoaW5kZXhSZWwtPnJkX2luZGV4LT5pbmRyZWxpZCksCisJCQkJCQkJ CQkJCWZhbHNlKTsKKworCQkvKiBDcmVhdGUgbmV3IGluZGV4IGRlZmluaXRpb24gYmFzZWQg b24gZ2l2ZW4gaW5kZXggKi8KKwkJY29uY3VycmVudE9pZCA9IGluZGV4X2NvbmN1cnJlbnRs eV9jcmVhdGVfY29weShpbmRleFBhcmVudFJlbCwKKwkJCQkJCQkJCQkJCQkgICBpbmRPaWQs CisJCQkJCQkJCQkJCQkJICAgY29uY3VycmVudE5hbWUpOworCisJCS8qIE5vdyBvcGVuIHRo ZSByZWxhdGlvbiBvZiB0aGUgbmV3IGluZGV4LCBhIGxvY2sgaXMgYWxzbyBuZWVkZWQgb24g aXQgKi8KKwkJaW5kZXhDb25jdXJyZW50UmVsID0gaW5kZXhfb3Blbihjb25jdXJyZW50T2lk LCBTaGFyZVVwZGF0ZUV4Y2x1c2l2ZUxvY2spOworCisJCS8qIFNhdmUgdGhlIGxpc3Qgb2Yg b2lkcyBhbmQgbG9ja3MgaW4gcHJpdmF0ZSBjb250ZXh0ICovCisJCW9sZCA9IE1lbW9yeUNv bnRleHRTd2l0Y2hUbyhwcml2YXRlX2NvbnRleHQpOworCisJCS8qIFNhdmUgdGhlIG5ldyBp bmRleCBPaWQgKi8KKwkJbmV3SW5kZXhJZHMgPSBsYXBwZW5kX29pZChuZXdJbmRleElkcywg Y29uY3VycmVudE9pZCk7CisKKwkJLyoKKwkJICogU2F2ZSBsb2NrcmVsaWQgdG8gcHJvdGVj dCBlYWNoIHJlbGF0aW9uIGZyb20gZHJvcCB0aGVuIGNsb3NlCisJCSAqIHJlbGF0aW9ucy4g VGhlIGxvY2tyZWxpZCBvbiBwYXJlbnQgcmVsYXRpb24gaXMgbm90IHRha2VuIGhlcmUgdG8K KwkJICogYXZvaWQgbXVsdGlwbGUgbG9ja3MgdGFrZW4gb24gdGhlIHNhbWUgcmVsYXRpb24s IGluc3RlYWQgd2UgcmVseSBvbgorCQkgKiBwYXJlbnRSZWxhdGlvbklkcyBidWlsdCBlYXJs aWVyLgorCQkgKi8KKwkJbG9ja3JlbGlkID0gaW5kZXhSZWwtPnJkX2xvY2tJbmZvLmxvY2tS ZWxJZDsKKwkJcmVsYXRpb25Mb2NrcyA9IGxhcHBlbmQocmVsYXRpb25Mb2NrcywgJmxvY2ty ZWxpZCk7CisJCWxvY2tyZWxpZCA9IGluZGV4Q29uY3VycmVudFJlbC0+cmRfbG9ja0luZm8u bG9ja1JlbElkOworCQlyZWxhdGlvbkxvY2tzID0gbGFwcGVuZChyZWxhdGlvbkxvY2tzLCAm bG9ja3JlbGlkKTsKKworCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkKTsKKworCQlpbmRl eF9jbG9zZShpbmRleFJlbCwgTm9Mb2NrKTsKKwkJaW5kZXhfY2xvc2UoaW5kZXhDb25jdXJy ZW50UmVsLCBOb0xvY2spOworCQloZWFwX2Nsb3NlKGluZGV4UGFyZW50UmVsLCBOb0xvY2sp OworCX0KKworCS8qCisJICogU2F2ZSB0aGUgaGVhcCBsb2NrIGZvciBmb2xsb3dpbmcgdmlz aWJpbGl0eSBjaGVja3Mgd2l0aCBvdGhlciBiYWNrZW5kcworCSAqIG1pZ2h0IGNvbmZsaWN0 IHdpdGggdGhpcyBzZXNzaW9uLgorCSAqLworCWZvcmVhY2gobGMsIHBhcmVudFJlbGF0aW9u SWRzKQorCXsKKwkJUmVsYXRpb24JaGVhcFJlbGF0aW9uID0gaGVhcF9vcGVuKGxmaXJzdF9v aWQobGMpLCBTaGFyZVVwZGF0ZUV4Y2x1c2l2ZUxvY2spOworCQlMb2NrUmVsSWQJbG9ja3Jl bGlkID0gaGVhcFJlbGF0aW9uLT5yZF9sb2NrSW5mby5sb2NrUmVsSWQ7CisJCUxPQ0tUQUcg ICAgKmhlYXBsb2NrdGFnOworCisJCS8qIFNhdmUgdGhlIGxpc3Qgb2YgbG9ja3MgaW4gcHJp dmF0ZSBjb250ZXh0ICovCisJCW9sZCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhwcml2YXRl X2NvbnRleHQpOworCisJCS8qIEFkZCBsb2NrcmVsaWQgb2YgcGFyZW50IHJlbGF0aW9uIHRv IHRoZSBsaXN0IG9mIGxvY2tlZCByZWxhdGlvbnMgKi8KKwkJcmVsYXRpb25Mb2NrcyA9IGxh cHBlbmQocmVsYXRpb25Mb2NrcywgJmxvY2tyZWxpZCk7CisKKwkJaGVhcGxvY2t0YWcgPSAo TE9DS1RBRyAqKSBwYWxsb2Moc2l6ZW9mKExPQ0tUQUcpKTsKKworCQkvKiBTYXZlIHRoZSBM T0NLVEFHIGZvciB0aGlzIHBhcmVudCByZWxhdGlvbiBmb3IgdGhlIHdhaXQgcGhhc2UgKi8K KwkJU0VUX0xPQ0tUQUdfUkVMQVRJT04oKmhlYXBsb2NrdGFnLCBsb2NrcmVsaWQuZGJJZCwg bG9ja3JlbGlkLnJlbElkKTsKKwkJbG9ja1RhZ3MgPSBsYXBwZW5kKGxvY2tUYWdzLCBoZWFw bG9ja3RhZyk7CisKKwkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZCk7CisKKwkJLyogQ2xv c2UgaGVhcCByZWxhdGlvbiAqLworCQloZWFwX2Nsb3NlKGhlYXBSZWxhdGlvbiwgTm9Mb2Nr KTsKKwl9CisKKwkvKgorCSAqIEZvciBhIGNvbmN1cnJlbnQgYnVpbGQsIGl0IGlzIG5lY2Vz c2FyeSB0byBtYWtlIHRoZSBjYXRhbG9nIGVudHJpZXMKKwkgKiB2aXNpYmxlIHRvIHRoZSBv dGhlciB0cmFuc2FjdGlvbnMgYmVmb3JlIGFjdHVhbGx5IGJ1aWxkaW5nIHRoZSBpbmRleC4K KwkgKiBUaGlzIHdpbGwgcHJldmVudCB0aGVtIGZyb20gbWFraW5nIGluY29tcGF0aWJsZSBI T1QgdXBkYXRlcy4gVGhlIGluZGV4CisJICogaXMgbWFya2VkIGFzIG5vdCByZWFkeSBhbmQg aW52YWxpZCBzbyBhcyBubyBvdGhlciB0cmFuc2FjdGlvbnMgd2lsbCB0cnkKKwkgKiB0byB1 c2UgaXQgZm9yIElOU0VSVCBvciBTRUxFQ1QuCisJICoKKwkgKiBCZWZvcmUgY29tbWl0dGlu ZywgZ2V0IGEgc2Vzc2lvbiBsZXZlbCBsb2NrIG9uIHRoZSByZWxhdGlvbiwgdGhlCisJICog Y29uY3VycmVudCBpbmRleCBhbmQgaXRzIGNvcHkgdG8gaW5zdXJlIHRoYXQgbm9uZSBvZiB0 aGVtIGFyZSBkcm9wcGVkCisJICogdW50aWwgdGhlIG9wZXJhdGlvbiBpcyBkb25lLgorCSAq LworCWZvcmVhY2gobGMsIHJlbGF0aW9uTG9ja3MpCisJeworCQlMb2NrUmVsSWQJbG9ja1Jl bCA9ICooKExvY2tSZWxJZCAqKSBsZmlyc3QobGMpKTsKKworCQlMb2NrUmVsYXRpb25JZEZv clNlc3Npb24oJmxvY2tSZWwsIFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9jayk7CisJfQorCisJ UG9wQWN0aXZlU25hcHNob3QoKTsKKwlDb21taXRUcmFuc2FjdGlvbkNvbW1hbmQoKTsKKwor CS8qCisJICogUGhhc2UgMiBvZiBSRUlOREVYIENPTkNVUlJFTlRMWQorCSAqCisJICogQnVp bGQgdGhlIG5ldyBpbmRleGVzIGluIGEgc2VwYXJhdGUgdHJhbnNhY3Rpb24gZm9yIGVhY2gg aW5kZXggdG8gYXZvaWQKKwkgKiBoYXZpbmcgb3BlbiB0cmFuc2FjdGlvbnMgZm9yIGFuIHVu bmVjZXNzYXJ5IGxvbmcgdGltZS4gQSBjb25jdXJyZW50CisJICogYnVpbGQgaXMgZG9uZSBm b3IgZWFjaCBpbmRleCB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgb2xkIGluZGV4ZXMuIEJlZm9y ZQorCSAqIGRvaW5nIHRoYXQsIHdlIG5lZWQgdG8gd2FpdCBvbiB0aGUgcGFyZW50IHJlbGF0 aW9ucyB1bnRpbCBubyBydW5uaW5nCisJICogdHJhbnNhY3Rpb25zIGNvdWxkIGhhdmUgdGhl IHBhcmVudCB0YWJsZSBvZiBpbmRleCBvcGVuLgorCSAqLworCisJLyogUGVyZm9ybSBhIHdh aXQgb24gYWxsIHRoZSBzZXNzaW9uIGxvY2tzICovCisJU3RhcnRUcmFuc2FjdGlvbkNvbW1h bmQoKTsKKwlXYWl0Rm9yTG9ja2Vyc011bHRpcGxlKGxvY2tUYWdzLCBTaGFyZUxvY2spOwor CUNvbW1pdFRyYW5zYWN0aW9uQ29tbWFuZCgpOworCisJZm9yYm90aChsYywgaW5kZXhJZHMs IGxjMiwgbmV3SW5kZXhJZHMpCisJeworCQlSZWxhdGlvbglpbmRleFJlbDsKKwkJT2lkCQkJ aW5kT2lkID0gbGZpcnN0X29pZChsYyk7CisJCU9pZAkJCWNvbmN1cnJlbnRPaWQgPSBsZmly c3Rfb2lkKGxjMik7CisJCWJvb2wJCXByaW1hcnk7CisKKwkJQ0hFQ0tfRk9SX0lOVEVSUlVQ VFMoKTsKKworCQkvKiBTdGFydCBuZXcgdHJhbnNhY3Rpb24gZm9yIHRoaXMgaW5kZXgncyBj b25jdXJyZW50IGJ1aWxkICovCisJCVN0YXJ0VHJhbnNhY3Rpb25Db21tYW5kKCk7CisKKwkJ LyogU2V0IEFjdGl2ZVNuYXBzaG90IHNpbmNlIGZ1bmN0aW9ucyBpbiB0aGUgaW5kZXhlcyBt YXkgbmVlZCBpdCAqLworCQlQdXNoQWN0aXZlU25hcHNob3QoR2V0VHJhbnNhY3Rpb25TbmFw c2hvdCgpKTsKKworCQkvKgorCQkgKiBJbmRleCByZWxhdGlvbiBoYXMgYmVlbiBjbG9zZWQg YnkgcHJldmlvdXMgY29tbWl0LCBzbyByZW9wZW4gaXQgdG8KKwkJICogZGV0ZXJtaW5lIGlm IGl0IGlzIHVzZWQgYXMgYSBwcmltYXJ5IGtleS4KKwkJICovCisJCWluZGV4UmVsID0gaW5k ZXhfb3BlbihpbmRPaWQsIFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9jayk7CisJCXByaW1hcnkg PSBpbmRleFJlbC0+cmRfaW5kZXgtPmluZGlzcHJpbWFyeTsKKwkJaW5kZXhfY2xvc2UoaW5k ZXhSZWwsIE5vTG9jayk7CisKKwkJLyogUGVyZm9ybSBjb25jdXJyZW50IGJ1aWxkIG9mIG5l dyBpbmRleCAqLworCQlpbmRleF9jb25jdXJyZW50bHlfYnVpbGQoaW5kZXhSZWwtPnJkX2lu ZGV4LT5pbmRyZWxpZCwKKwkJCQkJCQkJIGNvbmN1cnJlbnRPaWQsCisJCQkJCQkJCSBwcmlt YXJ5KTsKKworCQkvKiBXZSBjYW4gZG8gYXdheSB3aXRoIG91ciBzbmFwc2hvdCAqLworCQlQ b3BBY3RpdmVTbmFwc2hvdCgpOworCisJCS8qCisJCSAqIENvbW1pdCB0aGlzIHRyYW5zYWN0 aW9uIHRvIG1ha2UgdGhlIGluZGlzcmVhZHkgdXBkYXRlIHZpc2libGUgZm9yCisJCSAqIGNv bmN1cnJlbnQgaW5kZXguCisJCSAqLworCQlDb21taXRUcmFuc2FjdGlvbkNvbW1hbmQoKTsK Kwl9CisKKwkvKgorCSAqIFBoYXNlIDMgb2YgUkVJTkRFWCBDT05DVVJSRU5UTFkKKwkgKgor CSAqIER1cmluZyB0aGlzIHBoYXNlIHRoZSBvbGQgaW5kZXhlcyBjYXRjaCB1cCB3aXRoIGFu eSBuZXcgdHVwbGVzIHRoYXQKKwkgKiB3ZXJlIGNyZWF0ZWQgZHVyaW5nIHRoZSBwcmV2aW91 cyBwaGFzZS4KKwkgKgorCSAqIFdlIG9uY2UgYWdhaW4gd2FpdCB1bnRpbCBubyB0cmFuc2Fj dGlvbiBjYW4gaGF2ZSB0aGUgdGFibGUgb3BlbiB3aXRoCisJICogdGhlIGluZGV4IG1hcmtl ZCBhcyByZWFkLW9ubHkgZm9yIHVwZGF0ZXMuIEVhY2ggaW5kZXggdmFsaWRhdGlvbiBpcwor CSAqIGRvbmUgaW4gYSBzZXBhcmF0ZSB0cmFuc2FjdGlvbiB0byBtaW5pbWl6ZSBob3cgbG9u ZyB3ZSBob2xkIGFuIG9wZW4KKwkgKiB0cmFuc2FjdGlvbi4KKwkgKi8KKworCS8qIFBlcmZv cm0gYSB3YWl0IG9uIGFsbCB0aGUgc2Vzc2lvbiBsb2NrcyAqLworCVN0YXJ0VHJhbnNhY3Rp b25Db21tYW5kKCk7CisJV2FpdEZvckxvY2tlcnNNdWx0aXBsZShsb2NrVGFncywgU2hhcmVM b2NrKTsKKwlDb21taXRUcmFuc2FjdGlvbkNvbW1hbmQoKTsKKworCS8qCisJICogU2NhbiB0 aGUgaGVhcCBmb3IgZWFjaCBuZXcgaW5kZXgsIHRoZW4gaW5zZXJ0IGFueSBtaXNzaW5nIGlu ZGV4CisJICogZW50cmllcy4KKwkgKi8KKwlmb3JlYWNoKGxjLCBuZXdJbmRleElkcykKKwl7 CisJCU9pZAkJCWluZE9pZCA9IGxmaXJzdF9vaWQobGMpOworCQlPaWQJCQlyZWxPaWQ7CisJ CVRyYW5zYWN0aW9uSWQgbGltaXRYbWluOworCQlTbmFwc2hvdAlzbmFwc2hvdDsKKworCQlD SEVDS19GT1JfSU5URVJSVVBUUygpOworCisJCS8qIE9wZW4gc2VwYXJhdGUgdHJhbnNhY3Rp b24gdG8gdmFsaWRhdGUgaW5kZXggKi8KKwkJU3RhcnRUcmFuc2FjdGlvbkNvbW1hbmQoKTsK KworCQkvKiBHZXQgdGhlIHBhcmVudCByZWxhdGlvbiBPaWQgKi8KKwkJcmVsT2lkID0gSW5k ZXhHZXRSZWxhdGlvbihpbmRPaWQsIGZhbHNlKTsKKworCQkvKgorCQkgKiBUYWtlIHRoZSBy ZWZlcmVuY2Ugc25hcHNob3QgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBvbGQgaW5kZXhl cworCQkgKiB2YWxpZGF0aW9uLgorCQkgKi8KKwkJc25hcHNob3QgPSBSZWdpc3RlclNuYXBz aG90KEdldFRyYW5zYWN0aW9uU25hcHNob3QoKSk7CisJCVB1c2hBY3RpdmVTbmFwc2hvdChz bmFwc2hvdCk7CisKKwkJLyogVmFsaWRhdGUgaW5kZXgsIHdoaWNoIG1pZ2h0IGJlIGEgdG9h c3QgKi8KKwkJdmFsaWRhdGVfaW5kZXgocmVsT2lkLCBpbmRPaWQsIHNuYXBzaG90KTsKKwor CQkvKgorCQkgKiBXZSBjYW4gbm93IGRvIGF3YXkgd2l0aCBvdXIgYWN0aXZlIHNuYXBzaG90 LCB3ZSBzdGlsbCBuZWVkIHRvIHNhdmUKKwkJICogdGhlIHhtaW4gbGltaXQgdG8gd2FpdCBm b3Igb2xkZXIgc25hcHNob3RzLgorCQkgKi8KKwkJbGltaXRYbWluID0gc25hcHNob3QtPnht aW47CiAJCVBvcEFjdGl2ZVNuYXBzaG90KCk7CisKKwkJLyogQW5kIHdlIGNhbiByZW1vdmUg dGhlIHZhbGlkYXRpbmcgc25hcHNob3QgdG9vICovCisJCVVucmVnaXN0ZXJTbmFwc2hvdChz bmFwc2hvdCk7CisKKwkJLyoKKwkJICogVGhpcyBuZXcgaW5kZXggaXMgbm93IHZhbGlkIGFz IGl0IGNvbnRhaW5zIGFsbCB0aGUgdHVwbGVzCisJCSAqIG5lY2Vzc2FyeS4gSG93ZXZlciwg aXQgbWlnaHQgbm90IGhhdmUgdGFrZW4gaW50byBhY2NvdW50IGRlbGV0ZWQKKwkJICogdHVw bGVzIGJlZm9yZSB0aGUgcmVmZXJlbmNlIHNuYXBzaG90IHdhcyB0YWtlbiwgc28gd2UgbmVl ZCB0byB3YWl0CisJCSAqIGZvciB0aGUgdHJhbnNhY3Rpb25zIHRoYXQgbWlnaHQgaGF2ZSBv bGRlciBzbmFwc2hvdHMgdGhhbiBvdXJzLgorCQkgKi8KKwkJV2FpdEZvck9sZGVyU25hcHNo b3RzKGxpbWl0WG1pbik7CisKKwkJLyogQ29tbWl0IHRoaXMgdHJhbnNhY3Rpb24gbm93IHRo YXQgdGhlIG5ldyBpbmRleCBpcyB2YWxpZCAqLwogCQlDb21taXRUcmFuc2FjdGlvbkNvbW1h bmQoKTsKIAl9CisKKwkvKgorCSAqIFBoYXNlIDQgb2YgUkVJTkRFWCBDT05DVVJSRU5UTFkK KwkgKgorCSAqIE5vdyB0aGF0IHRoZSBuZXcgaW5kZXhlcyBoYXZlIGJlZW4gdmFsaWRhdGVk LCBpdCBpcyBuZWNlc3NhcnkgdG8gc3dhcAorCSAqIGVhY2ggbmV3IGluZGV4IHdpdGggaXRz IGNvcnJlc3BvbmRpbmcgb2xkIGluZGV4LgorCSAqCisJICogV2UgbWFyayB0aGUgbmV3IGlu ZGV4ZXMgYXMgdmFsaWQgYW5kIHRoZSBvbGQgaW5kZXhlcyBkZWFkIGF0IHRoZSBzYW1lCisJ ICogdGltZSB0byBtYWtlIHN1cmUgd2Ugb25seSBnZXQgY29uc3RyYWludCB2aW9sYXRpb25z IGZyb20gdGhlIGluZGV4ZXMKKwkgKiB3aXRoIHRoZSBjb3JyZWN0IG5hbWVzLgorCSAqLwor CisJU3RhcnRUcmFuc2FjdGlvbkNvbW1hbmQoKTsKKworCWZvcmJvdGgobGMsIGluZGV4SWRz LCBsYzIsIG5ld0luZGV4SWRzKQorCXsKKwkJY2hhcgkgICAqb2xkTmFtZTsKKwkJT2lkCQkJ aW5kT2lkID0gbGZpcnN0X29pZChsYyk7CisJCU9pZAkJCWNvbmN1cnJlbnRPaWQgPSBsZmly c3Rfb2lkKGxjMik7CisJCU9pZAkJCXJlbE9pZDsKKworCQlDSEVDS19GT1JfSU5URVJSVVBU UygpOworCisJCXJlbE9pZCA9IEluZGV4R2V0UmVsYXRpb24oaW5kT2lkLCBmYWxzZSk7CisK KwkJLyogQ2hvb3NlIGEgcmVsYXRpb24gbmFtZSBmb3Igb2xkIGluZGV4ICovCisJCW9sZE5h bWUgPSBDaG9vc2VSZWxhdGlvbk5hbWUoZ2V0X3JlbF9uYW1lKGluZE9pZCksCisJCQkJCQkJ CQkgTlVMTCwKKwkJCQkJCQkJCSAiY2NvbGQiLAorCQkJCQkJCQkJIGdldF9yZWxfbmFtZXNw YWNlKHJlbE9pZCksCisJCQkJCQkJCQkgZmFsc2UpOworCisJCS8qIFN3YXAgb2xkIGluZGV4 IHdpdGggdGhlIG5ldyBvbmUgKi8KKwkJaW5kZXhfY29uY3VycmVudGx5X3N3YXAoY29uY3Vy cmVudE9pZCwgaW5kT2lkLCBvbGROYW1lKTsKKworCQkvKgorCQkgKiBJbnZhbGlkYXRlIHRo ZSByZWxjYWNoZSBmb3IgdGhlIHRhYmxlLCBzbyB0aGF0IGFmdGVyIHRoaXMgY29tbWl0CisJ CSAqIGFsbCBzZXNzaW9ucyB3aWxsIHJlZnJlc2ggYW55IGNhY2hlZCBwbGFucyB0aGF0IG1p Z2h0IHJlZmVyZW5jZSB0aGUKKwkJICogaW5kZXguCisJCSAqLworCQlDYWNoZUludmFsaWRh dGVSZWxjYWNoZUJ5UmVsaWQocmVsT2lkKTsKKworCQkvKgorCQkgKiBDQ0kgaGVyZSBzbyB0 aGF0IHN1YnNlcXVlbnQgaXRlcmF0aW9ucyBzZWUgdGhlIG9sZE5hbWUgaW4gdGhlCisJCSAq IGNhdGFsb2cgYW5kIGNhbiBjaG9vc2UgYSBub25jb25mbGljdGluZyBuYW1lIGZvciB0aGVp ciBvbGROYW1lLgorCQkgKiBPdGhlcndpc2UsIHRoaXMgY291bGQgbGVhZCB0byBjb25mbGlj dHMgaWYgYSB0YWJsZSBoYXMgdHdvIGluZGV4ZXMKKwkJICogd2hvc2UgbmFtZXMgYXJlIGVx dWFsIGZvciB0aGUgZmlyc3QgTkFNRURBVEFMRU4tbWludXMtYS1mZXcKKwkJICogY2hhcmFj dGVycy4KKwkJICovCisJCUNvbW1hbmRDb3VudGVySW5jcmVtZW50KCk7CisJfQorCisJLyog Q29tbWl0IHRoaXMgdHJhbnNhY3Rpb24gYW5kIG1ha2UgaW5kZXggc3dhcHMgdmlzaWJsZSAq LworCUNvbW1pdFRyYW5zYWN0aW9uQ29tbWFuZCgpOworCisJLyoKKwkgKiBQaGFzZSA1IG9m IFJFSU5ERVggQ09OQ1VSUkVOVExZCisJICoKKwkgKiBNYXJrIHRoZSBvbGQgaW5kZXhlcyBh cyBkZWFkIHNvIHRoZXkgY2FuIGxhdGVyIGJlIGRyb3BwZWQuCisJICoKKwkgKiBOb3RlIHRo YXQgaXQgaXMgbmVjZXNzYXJ5IHRvIHdhaXQgZm9yIGZvciB2aXJ0dWFsIGxvY2tzIG9uIHRo ZSBwYXJlbnQKKwkgKiByZWxhdGlvbiBiZWZvcmUgc2V0dGluZyB0aGUgaW5kZXggYXMgZGVh ZC4KKwkgKi8KKworCS8qIFBlcmZvcm0gYSB3YWl0IG9uIGFsbCB0aGUgc2Vzc2lvbiBsb2Nr cyAqLworCVN0YXJ0VHJhbnNhY3Rpb25Db21tYW5kKCk7CisJV2FpdEZvckxvY2tlcnNNdWx0 aXBsZShsb2NrVGFncywgQWNjZXNzRXhjbHVzaXZlTG9jayk7CisKKwlmb3JlYWNoKGxjLCBp bmRleElkcykKKwl7CisJCU9pZAkJCWluZE9pZCA9IGxmaXJzdF9vaWQobGMpOworCQlPaWQJ CQlyZWxPaWQ7CisKKwkJQ0hFQ0tfRk9SX0lOVEVSUlVQVFMoKTsKKworCQlyZWxPaWQgPSBJ bmRleEdldFJlbGF0aW9uKGluZE9pZCwgZmFsc2UpOworCisJCS8qIEZpbmlzaCB0aGUgaW5k ZXggaW52YWxpZGF0aW9uIGFuZCBzZXQgaXQgYXMgZGVhZC4gKi8KKwkJaW5kZXhfY29uY3Vy cmVudGx5X3NldF9kZWFkKHJlbE9pZCwgaW5kT2lkKTsKKwl9CisKKwkvKiBDb21taXQgdGhp cyB0cmFuc2FjdGlvbiB0byBtYWtlIHRoZSB1cGRhdGVzIHZpc2libGUuICovCisJQ29tbWl0 VHJhbnNhY3Rpb25Db21tYW5kKCk7CisKKwkvKgorCSAqIFBoYXNlIDYgb2YgUkVJTkRFWCBD T05DVVJSRU5UTFkKKwkgKgorCSAqIERyb3AgdGhlIG9sZCBpbmRleGVzLCB3aXRoIGFjdHVh bGx5IHRoZSBzYW1lIGNvZGUgcGF0aCBhcyBEUk9QIElOREVYCisJICogQ09OQ1VSUkVOVExZ LiBUaGlzIGlzIHNhZmUgYXMgYWxsIHRoZSBvbGQgZW50cmllcyBhcmUgYWxyZWFkeQorCSAq IGNvbnNpZGVyZWQgYXMgaW52YWxpZCBhbmQgbm90IHJlYWR5LCBzbyB0aGV5IHdpbGwgbm90 IGJlIHVzZWQgYnkgb3RoZXIKKwkgKiBiYWNrZW5kcyBmb3IgYW55IHJlYWQgb3Igd3JpdGUg b3BlcmF0aW9ucy4KKwkgKi8KKworCS8qIFBlcmZvcm0gYSB3YWl0IG9uIGFsbCB0aGUgc2Vz c2lvbiBsb2NrcyAqLworCVN0YXJ0VHJhbnNhY3Rpb25Db21tYW5kKCk7CisJV2FpdEZvckxv Y2tlcnNNdWx0aXBsZShsb2NrVGFncywgQWNjZXNzRXhjbHVzaXZlTG9jayk7CisKKwkvKiBH ZXQgZnJlc2ggc25hcHNob3QgZm9yIG5leHQgc3RlcCAqLworCVB1c2hBY3RpdmVTbmFwc2hv dChHZXRUcmFuc2FjdGlvblNuYXBzaG90KCkpOworCisJZm9yZWFjaChsYywgaW5kZXhJZHMp CisJeworCQlPaWQJCQlpbmRPaWQgPSBsZmlyc3Rfb2lkKGxjKTsKKworCQlDSEVDS19GT1Jf SU5URVJSVVBUUygpOworCisJCWluZGV4X2NvbmN1cnJlbnRseV9kcm9wKGluZE9pZCk7CisJ fQorCisJUG9wQWN0aXZlU25hcHNob3QoKTsKKwlDb21taXRUcmFuc2FjdGlvbkNvbW1hbmQo KTsKKworCS8qCisJICogRmluYWxsdCByZWxlYXNlIHRoZSBzZXNzaW9uLWxldmVsIGxvY2sg b24gdGhlIHBhcmVudCB0YWJsZS4KKwkgKi8KKwlmb3JlYWNoKGxjLCByZWxhdGlvbkxvY2tz KQorCXsKKwkJTG9ja1JlbElkCWxvY2tSZWwgPSAqKChMb2NrUmVsSWQgKikgbGZpcnN0KGxj KSk7CisKKwkJVW5sb2NrUmVsYXRpb25JZEZvclNlc3Npb24oJmxvY2tSZWwsIFNoYXJlVXBk YXRlRXhjbHVzaXZlTG9jayk7CisJfQorCisJLyogTG9nIHdoYXQgd2UgZGlkICovCisJaWYg KG9wdGlvbnMgJiBSRUlOREVYT1BUX1ZFUkJPU0UpCisJeworCQlpZiAocmVsa2luZCA9PSBS RUxLSU5EX0lOREVYKQorCQkJZXJlcG9ydChJTkZPLAorCQkJCQkoZXJybXNnKCJpbmRleCBc IiVzLiVzXCIgd2FzIHJlaW5kZXhlZCIsCisJCQkJCQkJcmVsYXRpb25OYW1lc3BhY2UsIHJl bGF0aW9uTmFtZSksCisJCQkJCSBlcnJkZXRhaWwoIiVzLiIsCisJCQkJCQkJICAgcGdfcnVz YWdlX3Nob3coJnJ1MCkpKSk7CisJCWVsc2UKKwkJCWVyZXBvcnQoSU5GTywKKwkJCQkJKGVy cm1zZygidGFibGUgXCIlcy4lc1wiIHdhcyByZWluZGV4ZWQiLAorCQkJCQkJCXJlbGF0aW9u TmFtZXNwYWNlLCByZWxhdGlvbk5hbWUpLAorCQkJCQkgZXJyZGV0YWlsKCIlcy4iLAorCQkJ CQkJCSAgIHBnX3J1c2FnZV9zaG93KCZydTApKSkpOworCX0KKworCS8qIFN0YXJ0IGEgbmV3 IHRyYW5zYWN0aW9uIHRvIGZpbmlzaCBwcm9jZXNzIHByb3Blcmx5ICovCiAJU3RhcnRUcmFu c2FjdGlvbkNvbW1hbmQoKTsKIAogCU1lbW9yeUNvbnRleHREZWxldGUocHJpdmF0ZV9jb250 ZXh0KTsKKworCXJldHVybiB0cnVlOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tl bmQvY29tbWFuZHMvdGFibGVjbWRzLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy90YWJsZWNt ZHMuYwppbmRleCBlMWFmMmM0NDk1Li45MGRlMjg0OGUzIDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC9jb21tYW5kcy90YWJsZWNtZHMuYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy90 YWJsZWNtZHMuYwpAQCAtMTI0NSw2ICsxMjQ1LDcgQEAgUmFuZ2VWYXJDYWxsYmFja0ZvckRy b3BSZWxhdGlvbihjb25zdCBSYW5nZVZhciAqcmVsLCBPaWQgcmVsT2lkLCBPaWQgb2xkUmVs T2lkLAogCWJvb2wJCWlzX3BhcnRpdGlvbjsKIAlGb3JtX3BnX2NsYXNzIGNsYXNzZm9ybTsK IAlMT0NLTU9ERQloZWFwX2xvY2ttb2RlOworCWJvb2wJCWludmFsaWRfc3lzdGVtX2luZGV4 ID0gZmFsc2U7CiAKIAlzdGF0ZSA9IChzdHJ1Y3QgRHJvcFJlbGF0aW9uQ2FsbGJhY2tTdGF0 ZSAqKSBhcmc7CiAJcmVsa2luZCA9IHN0YXRlLT5yZWxraW5kOwpAQCAtMTMwNyw3ICsxMzA4 LDM2IEBAIFJhbmdlVmFyQ2FsbGJhY2tGb3JEcm9wUmVsYXRpb24oY29uc3QgUmFuZ2VWYXIg KnJlbCwgT2lkIHJlbE9pZCwgT2lkIG9sZFJlbE9pZCwKIAkJYWNsY2hlY2tfZXJyb3IoQUNM Q0hFQ0tfTk9UX09XTkVSLCBnZXRfcmVsa2luZF9vYmp0eXBlKGdldF9yZWxfcmVsa2luZChy ZWxPaWQpKSwKIAkJCQkJICAgcmVsLT5yZWxuYW1lKTsKIAotCWlmICghYWxsb3dTeXN0ZW1U YWJsZU1vZHMgJiYgSXNTeXN0ZW1DbGFzcyhyZWxPaWQsIGNsYXNzZm9ybSkpCisJLyoKKwkg KiBDaGVjayB0aGUgY2FzZSBvZiBhIHN5c3RlbSBpbmRleCB0aGF0IG1pZ2h0IGhhdmUgYmVl biBpbnZhbGlkYXRlZCBieSBhCisJICogZmFpbGVkIGNvbmN1cnJlbnQgcHJvY2VzcyBhbmQg YWxsb3cgaXRzIGRyb3AuIEZvciB0aGUgdGltZSBiZWluZywgdGhpcworCSAqIG9ubHkgY29u Y2VybnMgaW5kZXhlcyBvZiB0b2FzdCByZWxhdGlvbnMgdGhhdCBiZWNhbWUgaW52YWxpZCBk dXJpbmcgYQorCSAqIFJFSU5ERVggQ09OQ1VSUkVOVExZIHByb2Nlc3MuCisJICovCisJaWYg KElzU3lzdGVtQ2xhc3MocmVsT2lkLCBjbGFzc2Zvcm0pICYmIHJlbGtpbmQgPT0gUkVMS0lO RF9JTkRFWCkKKwl7CisJCUhlYXBUdXBsZQkJbG9jVHVwbGU7CisJCUZvcm1fcGdfaW5kZXgJ aW5kZXhmb3JtOworCQlib29sCQkJaW5kaXN2YWxpZDsKKworCQlsb2NUdXBsZSA9IFNlYXJj aFN5c0NhY2hlMShJTkRFWFJFTElELCBPYmplY3RJZEdldERhdHVtKHJlbE9pZCkpOworCQlp ZiAoIUhlYXBUdXBsZUlzVmFsaWQobG9jVHVwbGUpKQorCQl7CisJCQlSZWxlYXNlU3lzQ2Fj aGUodHVwbGUpOworCQkJcmV0dXJuOworCQl9CisKKwkJaW5kZXhmb3JtID0gKEZvcm1fcGdf aW5kZXgpIEdFVFNUUlVDVChsb2NUdXBsZSk7CisJCWluZGlzdmFsaWQgPSBpbmRleGZvcm0t PmluZGlzdmFsaWQ7CisJCVJlbGVhc2VTeXNDYWNoZShsb2NUdXBsZSk7CisKKwkJLyogTWFy ayBvYmplY3QgYXMgYmVpbmcgYW4gaW52YWxpZCBpbmRleCBvZiBzeXN0ZW0gY2F0YWxvZ3Mg Ki8KKwkJaWYgKCFpbmRpc3ZhbGlkKQorCQkJaW52YWxpZF9zeXN0ZW1faW5kZXggPSB0cnVl OworCX0KKworCS8qIEluIHRoZSBjYXNlIG9mIGFuIGludmFsaWQgaW5kZXgsIGl0IGlzIGZp bmUgdG8gYnlwYXNzIHRoaXMgY2hlY2sgKi8KKwlpZiAoIWludmFsaWRfc3lzdGVtX2luZGV4 ICYmICFhbGxvd1N5c3RlbVRhYmxlTW9kcyAmJiBJc1N5c3RlbUNsYXNzKHJlbE9pZCwgY2xh c3Nmb3JtKSkKIAkJZXJlcG9ydChFUlJPUiwKIAkJCQkoZXJyY29kZShFUlJDT0RFX0lOU1VG RklDSUVOVF9QUklWSUxFR0UpLAogCQkJCSBlcnJtc2coInBlcm1pc3Npb24gZGVuaWVkOiBc IiVzXCIgaXMgYSBzeXN0ZW0gY2F0YWxvZyIsCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9u b2Rlcy9jb3B5ZnVuY3MuYyBiL3NyYy9iYWNrZW5kL25vZGVzL2NvcHlmdW5jcy5jCmluZGV4 IDAwNmEzZDE3NzIuLmY3ZjhlMDQwYTMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL25vZGVz L2NvcHlmdW5jcy5jCisrKyBiL3NyYy9iYWNrZW5kL25vZGVzL2NvcHlmdW5jcy5jCkBAIC00 MzUyLDYgKzQzNTIsNyBAQCBfY29weVJlaW5kZXhTdG10KGNvbnN0IFJlaW5kZXhTdG10ICpm cm9tKQogCUNPUFlfTk9ERV9GSUVMRChyZWxhdGlvbik7CiAJQ09QWV9TVFJJTkdfRklFTEQo bmFtZSk7CiAJQ09QWV9TQ0FMQVJfRklFTEQob3B0aW9ucyk7CisJQ09QWV9TQ0FMQVJfRklF TEQoY29uY3VycmVudCk7CiAKIAlyZXR1cm4gbmV3bm9kZTsKIH0KZGlmZiAtLWdpdCBhL3Ny Yy9iYWNrZW5kL25vZGVzL2VxdWFsZnVuY3MuYyBiL3NyYy9iYWNrZW5kL25vZGVzL2VxdWFs ZnVuY3MuYwppbmRleCAxMzNkZjFiMzY0Li44ODBkNGEwYmRiIDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC9ub2Rlcy9lcXVhbGZ1bmNzLmMKKysrIGIvc3JjL2JhY2tlbmQvbm9kZXMvZXF1 YWxmdW5jcy5jCkBAIC0yMDk3LDYgKzIwOTcsNyBAQCBfZXF1YWxSZWluZGV4U3RtdChjb25z dCBSZWluZGV4U3RtdCAqYSwgY29uc3QgUmVpbmRleFN0bXQgKmIpCiAJQ09NUEFSRV9OT0RF X0ZJRUxEKHJlbGF0aW9uKTsKIAlDT01QQVJFX1NUUklOR19GSUVMRChuYW1lKTsKIAlDT01Q QVJFX1NDQUxBUl9GSUVMRChvcHRpb25zKTsKKwlDT01QQVJFX1NDQUxBUl9GSUVMRChjb25j dXJyZW50KTsKIAogCXJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQv cGFyc2VyL2dyYW0ueSBiL3NyYy9iYWNrZW5kL3BhcnNlci9ncmFtLnkKaW5kZXggYzA4NjIz NWIyNS4uNzRhODdlZjFmYyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvcGFyc2VyL2dyYW0u eQorKysgYi9zcmMvYmFja2VuZC9wYXJzZXIvZ3JhbS55CkBAIC04MzEyLDQyICs4MzEyLDQ2 IEBAIERyb3BUcmFuc2Zvcm1TdG10OiBEUk9QIFRSQU5TRk9STSBvcHRfaWZfZXhpc3RzIEZP UiBUeXBlbmFtZSBMQU5HVUFHRSBuYW1lIG9wdF9kCiAgKgogICoJCVFVRVJZOgogICoKLSAq CQlSRUlOREVYIFsgKG9wdGlvbnMpIF0gdHlwZSA8bmFtZT4KKyAqCQlSRUlOREVYIFsgKG9w dGlvbnMpIF0gdHlwZSBbQ09OQ1VSUkVOVExZXSA8bmFtZT4KICAqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKi8KIAogUmVpbmRleFN0bXQ6Ci0JCQlSRUlOREVYIHJlaW5kZXhfdGFyZ2V0X3R5 cGUgcXVhbGlmaWVkX25hbWUKKwkJCVJFSU5ERVggcmVpbmRleF90YXJnZXRfdHlwZSBvcHRf Y29uY3VycmVudGx5IHF1YWxpZmllZF9uYW1lCiAJCQkJewogCQkJCQlSZWluZGV4U3RtdCAq biA9IG1ha2VOb2RlKFJlaW5kZXhTdG10KTsKIAkJCQkJbi0+a2luZCA9ICQyOwotCQkJCQlu LT5yZWxhdGlvbiA9ICQzOworCQkJCQluLT5jb25jdXJyZW50ID0gJDM7CisJCQkJCW4tPnJl bGF0aW9uID0gJDQ7CiAJCQkJCW4tPm5hbWUgPSBOVUxMOwogCQkJCQluLT5vcHRpb25zID0g MDsKIAkJCQkJJCQgPSAoTm9kZSAqKW47CiAJCQkJfQotCQkJfCBSRUlOREVYIHJlaW5kZXhf dGFyZ2V0X211bHRpdGFibGUgbmFtZQorCQkJfCBSRUlOREVYIHJlaW5kZXhfdGFyZ2V0X211 bHRpdGFibGUgb3B0X2NvbmN1cnJlbnRseSBuYW1lCiAJCQkJewogCQkJCQlSZWluZGV4U3Rt dCAqbiA9IG1ha2VOb2RlKFJlaW5kZXhTdG10KTsKIAkJCQkJbi0+a2luZCA9ICQyOwotCQkJ CQluLT5uYW1lID0gJDM7CisJCQkJCW4tPmNvbmN1cnJlbnQgPSAkMzsKKwkJCQkJbi0+bmFt ZSA9ICQ0OwogCQkJCQluLT5yZWxhdGlvbiA9IE5VTEw7CiAJCQkJCW4tPm9wdGlvbnMgPSAw OwogCQkJCQkkJCA9IChOb2RlICopbjsKIAkJCQl9Ci0JCQl8IFJFSU5ERVggJygnIHJlaW5k ZXhfb3B0aW9uX2xpc3QgJyknIHJlaW5kZXhfdGFyZ2V0X3R5cGUgcXVhbGlmaWVkX25hbWUK KwkJCXwgUkVJTkRFWCAnKCcgcmVpbmRleF9vcHRpb25fbGlzdCAnKScgcmVpbmRleF90YXJn ZXRfdHlwZSBvcHRfY29uY3VycmVudGx5IHF1YWxpZmllZF9uYW1lCiAJCQkJewogCQkJCQlS ZWluZGV4U3RtdCAqbiA9IG1ha2VOb2RlKFJlaW5kZXhTdG10KTsKIAkJCQkJbi0+a2luZCA9 ICQ1OwotCQkJCQluLT5yZWxhdGlvbiA9ICQ2OworCQkJCQluLT5jb25jdXJyZW50ID0gJDY7 CisJCQkJCW4tPnJlbGF0aW9uID0gJDc7CiAJCQkJCW4tPm5hbWUgPSBOVUxMOwogCQkJCQlu LT5vcHRpb25zID0gJDM7CiAJCQkJCSQkID0gKE5vZGUgKiluOwogCQkJCX0KLQkJCXwgUkVJ TkRFWCAnKCcgcmVpbmRleF9vcHRpb25fbGlzdCAnKScgcmVpbmRleF90YXJnZXRfbXVsdGl0 YWJsZSBuYW1lCisJCQl8IFJFSU5ERVggJygnIHJlaW5kZXhfb3B0aW9uX2xpc3QgJyknIHJl aW5kZXhfdGFyZ2V0X211bHRpdGFibGUgb3B0X2NvbmN1cnJlbnRseSBuYW1lCiAJCQkJewog CQkJCQlSZWluZGV4U3RtdCAqbiA9IG1ha2VOb2RlKFJlaW5kZXhTdG10KTsKIAkJCQkJbi0+ a2luZCA9ICQ1OwotCQkJCQluLT5uYW1lID0gJDY7CisJCQkJCW4tPmNvbmN1cnJlbnQgPSAk NjsKKwkJCQkJbi0+bmFtZSA9ICQ3OwogCQkJCQluLT5yZWxhdGlvbiA9IE5VTEw7CiAJCQkJ CW4tPm9wdGlvbnMgPSAkMzsKIAkJCQkJJCQgPSAoTm9kZSAqKW47CmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC90Y29wL3V0aWxpdHkuYyBiL3NyYy9iYWNrZW5kL3Rjb3AvdXRpbGl0eS5j CmluZGV4IDI3YWU2YmU3NTEuLjE0MGE2N2U1NDggMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L3Rjb3AvdXRpbGl0eS5jCisrKyBiL3NyYy9iYWNrZW5kL3Rjb3AvdXRpbGl0eS5jCkBAIC03 NzQsMTYgKzc3NCwyMCBAQCBzdGFuZGFyZF9Qcm9jZXNzVXRpbGl0eShQbGFubmVkU3RtdCAq cHN0bXQsCiAJCQl7CiAJCQkJUmVpbmRleFN0bXQgKnN0bXQgPSAoUmVpbmRleFN0bXQgKikg cGFyc2V0cmVlOwogCisJCQkJaWYgKHN0bXQtPmNvbmN1cnJlbnQpCisJCQkJCVByZXZlbnRJ blRyYW5zYWN0aW9uQmxvY2soaXNUb3BMZXZlbCwKKwkJCQkJCQkJCQkJICAiUkVJTkRFWCBD T05DVVJSRU5UTFkiKTsKKwogCQkJCS8qIHdlIGNob29zZSB0byBhbGxvdyB0aGlzIGR1cmlu ZyAicmVhZCBvbmx5IiB0cmFuc2FjdGlvbnMgKi8KIAkJCQlQcmV2ZW50Q29tbWFuZER1cmlu Z1JlY292ZXJ5KCJSRUlOREVYIik7CiAJCQkJLyogZm9yYmlkZGVuIGluIHBhcmFsbGVsIG1v ZGUgZHVlIHRvIENvbW1hbmRJc1JlYWRPbmx5ICovCiAJCQkJc3dpdGNoIChzdG10LT5raW5k KQogCQkJCXsKIAkJCQkJY2FzZSBSRUlOREVYX09CSkVDVF9JTkRFWDoKLQkJCQkJCVJlaW5k ZXhJbmRleChzdG10LT5yZWxhdGlvbiwgc3RtdC0+b3B0aW9ucyk7CisJCQkJCQlSZWluZGV4 SW5kZXgoc3RtdC0+cmVsYXRpb24sIHN0bXQtPm9wdGlvbnMsIHN0bXQtPmNvbmN1cnJlbnQp OwogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgUkVJTkRFWF9PQkpFQ1RfVEFCTEU6Ci0JCQkJ CQlSZWluZGV4VGFibGUoc3RtdC0+cmVsYXRpb24sIHN0bXQtPm9wdGlvbnMpOworCQkJCQkJ UmVpbmRleFRhYmxlKHN0bXQtPnJlbGF0aW9uLCBzdG10LT5vcHRpb25zLCBzdG10LT5jb25j dXJyZW50KTsKIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIFJFSU5ERVhfT0JKRUNUX1NDSEVN QToKIAkJCQkJY2FzZSBSRUlOREVYX09CSkVDVF9TWVNURU06CkBAIC03OTksNyArODAzLDcg QEAgc3RhbmRhcmRfUHJvY2Vzc1V0aWxpdHkoUGxhbm5lZFN0bXQgKnBzdG10LAogCQkJCQkJ CQkJCQkJICAoc3RtdC0+a2luZCA9PSBSRUlOREVYX09CSkVDVF9TQ0hFTUEpID8gIlJFSU5E RVggU0NIRU1BIiA6CiAJCQkJCQkJCQkJCQkgIChzdG10LT5raW5kID09IFJFSU5ERVhfT0JK RUNUX1NZU1RFTSkgPyAiUkVJTkRFWCBTWVNURU0iIDoKIAkJCQkJCQkJCQkJCSAgIlJFSU5E RVggREFUQUJBU0UiKTsKLQkJCQkJCVJlaW5kZXhNdWx0aXBsZVRhYmxlcyhzdG10LT5uYW1l LCBzdG10LT5raW5kLCBzdG10LT5vcHRpb25zKTsKKwkJCQkJCVJlaW5kZXhNdWx0aXBsZVRh YmxlcyhzdG10LT5uYW1lLCBzdG10LT5raW5kLCBzdG10LT5vcHRpb25zLCBzdG10LT5jb25j dXJyZW50KTsKIAkJCQkJCWJyZWFrOwogCQkJCQlkZWZhdWx0OgogCQkJCQkJZWxvZyhFUlJP UiwgInVucmVjb2duaXplZCBvYmplY3QgdHlwZTogJWQiLApkaWZmIC0tZ2l0IGEvc3JjL2Jp bi9wc3FsL2NvbW1vbi5jIGIvc3JjL2Jpbi9wc3FsL2NvbW1vbi5jCmluZGV4IGIxMWQ3YWM2 Y2UuLjgyOTdiZjlhYTUgMTAwNjQ0Ci0tLSBhL3NyYy9iaW4vcHNxbC9jb21tb24uYworKysg Yi9zcmMvYmluL3BzcWwvY29tbW9uLmMKQEAgLTIxNDksNiArMjE0OSwyMiBAQCBjb21tYW5k X25vX2JlZ2luKGNvbnN0IGNoYXIgKnF1ZXJ5KQogCQkJcmV0dXJuIHRydWU7CiAJCWlmICh3 b3JkbGVuID09IDEwICYmIHBnX3N0cm5jYXNlY21wKHF1ZXJ5LCAidGFibGVzcGFjZSIsIDEw KSA9PSAwKQogCQkJcmV0dXJuIHRydWU7CisJCWlmICh3b3JkbGVuID09IDUgJiYgKHBnX3N0 cm5jYXNlY21wKHF1ZXJ5LCAiaW5kZXgiLCA1KSA9PSAwIHx8CisJCQkJCQkJIHBnX3N0cm5j YXNlY21wKHF1ZXJ5LCAidGFibGUiLCA1KSA9PSAwKSkKKwkJeworCQkJcXVlcnkgKz0gd29y ZGxlbjsKKwkJCXF1ZXJ5ID0gc2tpcF93aGl0ZV9zcGFjZShxdWVyeSk7CisJCQl3b3JkbGVu ID0gMDsKKwkJCXdoaWxlIChpc2FscGhhKCh1bnNpZ25lZCBjaGFyKSBxdWVyeVt3b3JkbGVu XSkpCisJCQkJd29yZGxlbiArPSBQUW1ibGVuKCZxdWVyeVt3b3JkbGVuXSwgcHNldC5lbmNv ZGluZyk7CisKKwkJCS8qCisJCQkgKiBSRUlOREVYIFsgVEFCTEUgfCBJTkRFWCBdIENPTkNV UlJFTlRMWSBhcmUgbm90IGFsbG93ZWQgaW4KKwkJCSAqIHhhY3RzLgorCQkJICovCisJCQlp ZiAod29yZGxlbiA9PSAxMiAmJiBwZ19zdHJuY2FzZWNtcChxdWVyeSwgImNvbmN1cnJlbnRs eSIsIDEyKSA9PSAwKQorCQkJCXJldHVybiB0cnVlOworCQl9CiAKIAkJLyogRFJPUCBJTkRF WCBDT05DVVJSRU5UTFkgaXNuJ3QgYWxsb3dlZCBpbiB4YWN0cyAqLwogCQlpZiAod29yZGxl biA9PSA1ICYmIHBnX3N0cm5jYXNlY21wKHF1ZXJ5LCAiaW5kZXgiLCA1KSA9PSAwKQpkaWZm IC0tZ2l0IGEvc3JjL2Jpbi9wc3FsL3RhYi1jb21wbGV0ZS5jIGIvc3JjL2Jpbi9wc3FsL3Rh Yi1jb21wbGV0ZS5jCmluZGV4IGJjYTc4OGM3YTMuLmYwODI5NTM2YTIgMTAwNjQ0Ci0tLSBh L3NyYy9iaW4vcHNxbC90YWItY29tcGxldGUuYworKysgYi9zcmMvYmluL3BzcWwvdGFiLWNv bXBsZXRlLmMKQEAgLTMxOTcsMTIgKzMxOTcsMjQgQEAgcHNxbF9jb21wbGV0aW9uKGNvbnN0 IGNoYXIgKnRleHQsIGludCBzdGFydCwgaW50IGVuZCkKIAllbHNlIGlmIChNYXRjaGVzKCJS RUlOREVYIikpCiAJCUNPTVBMRVRFX1dJVEgoIlRBQkxFIiwgIklOREVYIiwgIlNZU1RFTSIs ICJTQ0hFTUEiLCAiREFUQUJBU0UiKTsKIAllbHNlIGlmIChNYXRjaGVzKCJSRUlOREVYIiwg IlRBQkxFIikpCi0JCUNPTVBMRVRFX1dJVEhfU0NIRU1BX1FVRVJZKFF1ZXJ5X2Zvcl9saXN0 X29mX2luZGV4YWJsZXMsIE5VTEwpOworCQlDT01QTEVURV9XSVRIX1NDSEVNQV9RVUVSWShR dWVyeV9mb3JfbGlzdF9vZl9pbmRleGFibGVzLAorCQkJCQkJCQkgICAiIFVOSU9OIFNFTEVD VCAnQ09OQ1VSUkVOVExZJyIpOwogCWVsc2UgaWYgKE1hdGNoZXMoIlJFSU5ERVgiLCAiSU5E RVgiKSkKLQkJQ09NUExFVEVfV0lUSF9TQ0hFTUFfUVVFUlkoUXVlcnlfZm9yX2xpc3Rfb2Zf aW5kZXhlcywgTlVMTCk7CisJCUNPTVBMRVRFX1dJVEhfU0NIRU1BX1FVRVJZKFF1ZXJ5X2Zv cl9saXN0X29mX2luZGV4ZXMsCisJCQkJCQkJCSAgICIgVU5JT04gU0VMRUNUICdDT05DVVJS RU5UTFknIik7CiAJZWxzZSBpZiAoTWF0Y2hlcygiUkVJTkRFWCIsICJTQ0hFTUEiKSkKLQkJ Q09NUExFVEVfV0lUSF9RVUVSWShRdWVyeV9mb3JfbGlzdF9vZl9zY2hlbWFzKTsKKwkJQ09N UExFVEVfV0lUSF9RVUVSWShRdWVyeV9mb3JfbGlzdF9vZl9zY2hlbWFzCisJCQkJCQkJIiBV TklPTiBTRUxFQ1QgJ0NPTkNVUlJFTlRMWSciKTsKIAllbHNlIGlmIChNYXRjaGVzKCJSRUlO REVYIiwgIlNZU1RFTXxEQVRBQkFTRSIpKQorCQlDT01QTEVURV9XSVRIX1FVRVJZKFF1ZXJ5 X2Zvcl9saXN0X29mX2RhdGFiYXNlcworCQkJCQkJCSIgVU5JT04gU0VMRUNUICdDT05DVVJS RU5UTFknIik7CisJZWxzZSBpZiAoTWF0Y2hlcygiUkVJTkRFWCIsICJUQUJMRSIsICJDT05D VVJSRU5UTFkiKSkKKwkJQ09NUExFVEVfV0lUSF9TQ0hFTUFfUVVFUlkoUXVlcnlfZm9yX2xp c3Rfb2ZfaW5kZXhhYmxlcywgTlVMTCk7CisJZWxzZSBpZiAoTWF0Y2hlcygiUkVJTkRFWCIs ICJJTkRFWCIsICJDT05DVVJSRU5UTFkiKSkKKwkJQ09NUExFVEVfV0lUSF9TQ0hFTUFfUVVF UlkoUXVlcnlfZm9yX2xpc3Rfb2ZfaW5kZXhlcywgTlVMTCk7CisJZWxzZSBpZiAoTWF0Y2hl cygiUkVJTkRFWCIsICJTQ0hFTUEiLCAiQ09OQ1VSUkVOVExZIikpCisJCUNPTVBMRVRFX1dJ VEhfUVVFUlkoUXVlcnlfZm9yX2xpc3Rfb2Zfc2NoZW1hcyk7CisJZWxzZSBpZiAoTWF0Y2hl cygiUkVJTkRFWCIsICJTWVNURU18REFUQUJBU0UiLCAiQ09OQ1VSUkVOVExZIikpCiAJCUNP TVBMRVRFX1dJVEhfUVVFUlkoUXVlcnlfZm9yX2xpc3Rfb2ZfZGF0YWJhc2VzKTsKIAogLyog U0VDVVJJVFkgTEFCRUwgKi8KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvZGVw ZW5kZW5jeS5oIGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9kZXBlbmRlbmN5LmgKaW5kZXggNWRl YTI3MDE2ZS4uMjRiNDdkNGZjNiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9k ZXBlbmRlbmN5LmgKKysrIGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9kZXBlbmRlbmN5LmgKQEAg LTI1MSw2ICsyNTEsOSBAQCBleHRlcm4gbG9uZyBjaGFuZ2VEZXBlbmRlbmN5Rm9yKE9pZCBj bGFzc0lkLCBPaWQgb2JqZWN0SWQsCiAJCQkJCU9pZCByZWZDbGFzc0lkLCBPaWQgb2xkUmVm T2JqZWN0SWQsCiAJCQkJCU9pZCBuZXdSZWZPYmplY3RJZCk7CiAKK2V4dGVybiBsb25nIGNo YW5nZURlcGVuZGVuY2llc09uKE9pZCByZWZDbGFzc0lkLCBPaWQgb2xkUmVmT2JqZWN0SWQs CisJCQkJCQkJCSBPaWQgbmV3UmVmT2JqZWN0SWQpOworCiBleHRlcm4gT2lkCWdldEV4dGVu c2lvbk9mT2JqZWN0KE9pZCBjbGFzc0lkLCBPaWQgb2JqZWN0SWQpOwogCiBleHRlcm4gYm9v bCBzZXF1ZW5jZUlzT3duZWQoT2lkIHNlcUlkLCBjaGFyIGRlcHR5cGUsIE9pZCAqdGFibGVJ ZCwgaW50MzIgKmNvbElkKTsKQEAgLTI2MSw2ICsyNjQsOCBAQCBleHRlcm4gT2lkCWdldF9j b25zdHJhaW50X2luZGV4KE9pZCBjb25zdHJhaW50SWQpOwogCiBleHRlcm4gT2lkCWdldF9p bmRleF9jb25zdHJhaW50KE9pZCBpbmRleElkKTsKIAorZXh0ZXJuIExpc3QgKmdldF9pbmRl eF9yZWZfY29uc3RyYWludHMoT2lkIGluZGV4SWQpOworCiAvKiBpbiBwZ19zaGRlcGVuZC5j ICovCiAKIGV4dGVybiB2b2lkIHJlY29yZFNoYXJlZERlcGVuZGVuY3lPbihPYmplY3RBZGRy ZXNzICpkZXBlbmRlciwKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvaW5kZXgu aCBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvaW5kZXguaAppbmRleCAwZjFmNjNiMzhlLi5lZWVk NDA3OTQzIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9jYXRhbG9nL2luZGV4LmgKKysrIGIv c3JjL2luY2x1ZGUvY2F0YWxvZy9pbmRleC5oCkBAIC02NSw2ICs2NSw3IEBAIGV4dGVybiBP aWQgaW5kZXhfY3JlYXRlKFJlbGF0aW9uIGhlYXBSZWxhdGlvbiwKIAkJCSBPaWQgKmNsYXNz T2JqZWN0SWQsCiAJCQkgaW50MTYgKmNvbG9wdGlvbnMsCiAJCQkgRGF0dW0gcmVsb3B0aW9u cywKKwkJCSBUdXBsZURlc2MgdHVwZGVzYywKIAkJCSBiaXRzMTYgZmxhZ3MsCiAJCQkgYml0 czE2IGNvbnN0cl9mbGFncywKIAkJCSBib29sIGFsbG93X3N5c3RlbV90YWJsZV9tb2RzLApA QCAtNzcsNiArNzgsMjMgQEAgZXh0ZXJuIE9pZCBpbmRleF9jcmVhdGUoUmVsYXRpb24gaGVh cFJlbGF0aW9uLAogI2RlZmluZQlJTkRFWF9DT05TVFJfQ1JFQVRFX1VQREFURV9JTkRFWAko MSA8PCAzKQogI2RlZmluZQlJTkRFWF9DT05TVFJfQ1JFQVRFX1JFTU9WRV9PTERfREVQUwko MSA8PCA0KQogCitleHRlcm4gT2lkIGluZGV4X2NvbmN1cnJlbnRseV9jcmVhdGVfY29weShS ZWxhdGlvbiBoZWFwUmVsYXRpb24sCisJCQkJCQkJCQkJICBPaWQgb2xkSW5kZXhJZCwKKwkJ CQkJCQkJCQkgIGNvbnN0IGNoYXIgKm5ld05hbWUpOworCitleHRlcm4gdm9pZCBpbmRleF9j b25jdXJyZW50bHlfYnVpbGQoT2lkIGhlYXBPaWQsCisJCQkJCQkJCQkgT2lkIGluZGV4T2lk LAorCQkJCQkJCQkJIGJvb2wgaXNwcmltYXJ5KTsKKworZXh0ZXJuIHZvaWQgaW5kZXhfY29u Y3VycmVudGx5X3N3YXAoT2lkIG5ld0luZGV4SWQsCisJCQkJCQkJCQlPaWQgb2xkSW5kZXhJ ZCwKKwkJCQkJCQkJCWNvbnN0IGNoYXIgKm9sZE5hbWUpOworCitleHRlcm4gdm9pZCBpbmRl eF9jb25jdXJyZW50bHlfc2V0X2RlYWQoT2lkIGhlYXBPaWQsCisJCQkJCQkJCQkJT2lkIGlu ZGV4T2lkKTsKKworZXh0ZXJuIHZvaWQgaW5kZXhfY29uY3VycmVudGx5X2Ryb3AoT2lkIGlu ZGV4SWQpOworCiBleHRlcm4gT2JqZWN0QWRkcmVzcyBpbmRleF9jb25zdHJhaW50X2NyZWF0 ZShSZWxhdGlvbiBoZWFwUmVsYXRpb24sCiAJCQkJCQlPaWQgaW5kZXhSZWxhdGlvbklkLAog CQkJCQkJT2lkIHBhcmVudENvbnN0cmFpbnRJZCwKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRl L2NvbW1hbmRzL2RlZnJlbS5oIGIvc3JjL2luY2x1ZGUvY29tbWFuZHMvZGVmcmVtLmgKaW5k ZXggZTU5MmE5MTRhNC4uZTExY2FmMmNkMSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY29t bWFuZHMvZGVmcmVtLmgKKysrIGIvc3JjL2luY2x1ZGUvY29tbWFuZHMvZGVmcmVtLmgKQEAg LTM0LDEwICszNCwxMCBAQCBleHRlcm4gT2JqZWN0QWRkcmVzcyBEZWZpbmVJbmRleChPaWQg cmVsYXRpb25JZCwKIAkJCWJvb2wgY2hlY2tfbm90X2luX3VzZSwKIAkJCWJvb2wgc2tpcF9i dWlsZCwKIAkJCWJvb2wgcXVpZXQpOwotZXh0ZXJuIHZvaWQgUmVpbmRleEluZGV4KFJhbmdl VmFyICppbmRleFJlbGF0aW9uLCBpbnQgb3B0aW9ucyk7Ci1leHRlcm4gT2lkCVJlaW5kZXhU YWJsZShSYW5nZVZhciAqcmVsYXRpb24sIGludCBvcHRpb25zKTsKK2V4dGVybiB2b2lkIFJl aW5kZXhJbmRleChSYW5nZVZhciAqaW5kZXhSZWxhdGlvbiwgaW50IG9wdGlvbnMsIGJvb2wg Y29uY3VycmVudCk7CitleHRlcm4gT2lkCVJlaW5kZXhUYWJsZShSYW5nZVZhciAqcmVsYXRp b24sIGludCBvcHRpb25zLCBib29sIGNvbmN1cnJlbnQpOwogZXh0ZXJuIHZvaWQgUmVpbmRl eE11bHRpcGxlVGFibGVzKGNvbnN0IGNoYXIgKm9iamVjdE5hbWUsIFJlaW5kZXhPYmplY3RU eXBlIG9iamVjdEtpbmQsCi0JCQkJCSAgaW50IG9wdGlvbnMpOworCQkJCQkgIGludCBvcHRp b25zLCBib29sIGNvbmN1cnJlbnQpOwogZXh0ZXJuIGNoYXIgKm1ha2VPYmplY3ROYW1lKGNv bnN0IGNoYXIgKm5hbWUxLCBjb25zdCBjaGFyICpuYW1lMiwKIAkJCSAgIGNvbnN0IGNoYXIg KmxhYmVsKTsKIGV4dGVybiBjaGFyICpDaG9vc2VSZWxhdGlvbk5hbWUoY29uc3QgY2hhciAq bmFtZTEsIGNvbnN0IGNoYXIgKm5hbWUyLApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvbm9k ZXMvcGFyc2Vub2Rlcy5oIGIvc3JjL2luY2x1ZGUvbm9kZXMvcGFyc2Vub2Rlcy5oCmluZGV4 IDI3NzgyZmVkNmMuLjRiZmU0Y2UwNWIgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL25vZGVz L3BhcnNlbm9kZXMuaAorKysgYi9zcmMvaW5jbHVkZS9ub2Rlcy9wYXJzZW5vZGVzLmgKQEAg LTMzMDMsNiArMzMwMyw3IEBAIHR5cGVkZWYgc3RydWN0IFJlaW5kZXhTdG10CiAJUmFuZ2VW YXIgICAqcmVsYXRpb247CQkvKiBUYWJsZSBvciBpbmRleCB0byByZWluZGV4ICovCiAJY29u c3QgY2hhciAqbmFtZTsJCQkvKiBuYW1lIG9mIGRhdGFiYXNlIHRvIHJlaW5kZXggKi8KIAlp bnQJCQlvcHRpb25zOwkJLyogUmVpbmRleCBvcHRpb25zIGZsYWdzICovCisJYm9vbAkJY29u Y3VycmVudDsJCS8qIHJlaW5kZXggY29uY3VycmVudGx5PyAqLwogfSBSZWluZGV4U3RtdDsK IAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvaXNv bGF0aW9uL2V4cGVjdGVkL3JlaW5kZXgtY29uY3VycmVudGx5Lm91dCBiL3NyYy90ZXN0L2lz b2xhdGlvbi9leHBlY3RlZC9yZWluZGV4LWNvbmN1cnJlbnRseS5vdXQKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMC4uOWUwNDE2OWIyZgotLS0gL2Rldi9udWxsCisr KyBiL3NyYy90ZXN0L2lzb2xhdGlvbi9leHBlY3RlZC9yZWluZGV4LWNvbmN1cnJlbnRseS5v dXQKQEAgLTAsMCArMSw3OCBAQAorUGFyc2VkIHRlc3Qgc3BlYyB3aXRoIDMgc2Vzc2lvbnMK Kworc3RhcnRpbmcgcGVybXV0YXRpb246IHJlaW5kZXggc2VsMSB1cGQyIGluczIgZGVsMiBl bmQxIGVuZDIKK3N0ZXAgcmVpbmRleDogUkVJTkRFWCBUQUJMRSBDT05DVVJSRU5UTFkgcmVp bmRfY29uX3RhYjsKK3N0ZXAgc2VsMTogU0VMRUNUIGRhdGEgRlJPTSByZWluZF9jb25fdGFi IFdIRVJFIGlkID0gMzsKK2RhdGEgICAgICAgICAgIAorCithYWFhICAgICAgICAgICAKK3N0 ZXAgdXBkMjogVVBEQVRFIHJlaW5kX2Nvbl90YWIgU0VUIGRhdGEgPSAnYmJiYicgV0hFUkUg aWQgPSAzOworc3RlcCBpbnMyOiBJTlNFUlQgSU5UTyByZWluZF9jb25fdGFiKGRhdGEpIFZB TFVFUyAoJ2NjY2MnKTsKK3N0ZXAgZGVsMjogREVMRVRFIEZST00gcmVpbmRfY29uX3RhYiBX SEVSRSBkYXRhID0gJ2NjY2MnOworc3RlcCBlbmQxOiBDT01NSVQ7CitzdGVwIGVuZDI6IENP TU1JVDsKKworc3RhcnRpbmcgcGVybXV0YXRpb246IHNlbDEgcmVpbmRleCB1cGQyIGluczIg ZGVsMiBlbmQxIGVuZDIKK3N0ZXAgc2VsMTogU0VMRUNUIGRhdGEgRlJPTSByZWluZF9jb25f dGFiIFdIRVJFIGlkID0gMzsKK2RhdGEgICAgICAgICAgIAorCithYWFhICAgICAgICAgICAK K3N0ZXAgcmVpbmRleDogUkVJTkRFWCBUQUJMRSBDT05DVVJSRU5UTFkgcmVpbmRfY29uX3Rh YjsgPHdhaXRpbmcgLi4uPgorc3RlcCB1cGQyOiBVUERBVEUgcmVpbmRfY29uX3RhYiBTRVQg ZGF0YSA9ICdiYmJiJyBXSEVSRSBpZCA9IDM7CitzdGVwIGluczI6IElOU0VSVCBJTlRPIHJl aW5kX2Nvbl90YWIoZGF0YSkgVkFMVUVTICgnY2NjYycpOworc3RlcCBkZWwyOiBERUxFVEUg RlJPTSByZWluZF9jb25fdGFiIFdIRVJFIGRhdGEgPSAnY2NjYyc7CitzdGVwIGVuZDE6IENP TU1JVDsKK3N0ZXAgZW5kMjogQ09NTUlUOworc3RlcCByZWluZGV4OiA8Li4uIGNvbXBsZXRl ZD4KKworc3RhcnRpbmcgcGVybXV0YXRpb246IHNlbDEgdXBkMiByZWluZGV4IGluczIgZGVs MiBlbmQxIGVuZDIKK3N0ZXAgc2VsMTogU0VMRUNUIGRhdGEgRlJPTSByZWluZF9jb25fdGFi IFdIRVJFIGlkID0gMzsKK2RhdGEgICAgICAgICAgIAorCithYWFhICAgICAgICAgICAKK3N0 ZXAgdXBkMjogVVBEQVRFIHJlaW5kX2Nvbl90YWIgU0VUIGRhdGEgPSAnYmJiYicgV0hFUkUg aWQgPSAzOworc3RlcCByZWluZGV4OiBSRUlOREVYIFRBQkxFIENPTkNVUlJFTlRMWSByZWlu ZF9jb25fdGFiOyA8d2FpdGluZyAuLi4+CitzdGVwIGluczI6IElOU0VSVCBJTlRPIHJlaW5k X2Nvbl90YWIoZGF0YSkgVkFMVUVTICgnY2NjYycpOworc3RlcCBkZWwyOiBERUxFVEUgRlJP TSByZWluZF9jb25fdGFiIFdIRVJFIGRhdGEgPSAnY2NjYyc7CitzdGVwIGVuZDE6IENPTU1J VDsKK3N0ZXAgZW5kMjogQ09NTUlUOworc3RlcCByZWluZGV4OiA8Li4uIGNvbXBsZXRlZD4K Kworc3RhcnRpbmcgcGVybXV0YXRpb246IHNlbDEgdXBkMiBpbnMyIHJlaW5kZXggZGVsMiBl bmQxIGVuZDIKK3N0ZXAgc2VsMTogU0VMRUNUIGRhdGEgRlJPTSByZWluZF9jb25fdGFiIFdI RVJFIGlkID0gMzsKK2RhdGEgICAgICAgICAgIAorCithYWFhICAgICAgICAgICAKK3N0ZXAg dXBkMjogVVBEQVRFIHJlaW5kX2Nvbl90YWIgU0VUIGRhdGEgPSAnYmJiYicgV0hFUkUgaWQg PSAzOworc3RlcCBpbnMyOiBJTlNFUlQgSU5UTyByZWluZF9jb25fdGFiKGRhdGEpIFZBTFVF UyAoJ2NjY2MnKTsKK3N0ZXAgcmVpbmRleDogUkVJTkRFWCBUQUJMRSBDT05DVVJSRU5UTFkg cmVpbmRfY29uX3RhYjsgPHdhaXRpbmcgLi4uPgorc3RlcCBkZWwyOiBERUxFVEUgRlJPTSBy ZWluZF9jb25fdGFiIFdIRVJFIGRhdGEgPSAnY2NjYyc7CitzdGVwIGVuZDE6IENPTU1JVDsK K3N0ZXAgZW5kMjogQ09NTUlUOworc3RlcCByZWluZGV4OiA8Li4uIGNvbXBsZXRlZD4KKwor c3RhcnRpbmcgcGVybXV0YXRpb246IHNlbDEgdXBkMiBpbnMyIGRlbDIgcmVpbmRleCBlbmQx IGVuZDIKK3N0ZXAgc2VsMTogU0VMRUNUIGRhdGEgRlJPTSByZWluZF9jb25fdGFiIFdIRVJF IGlkID0gMzsKK2RhdGEgICAgICAgICAgIAorCithYWFhICAgICAgICAgICAKK3N0ZXAgdXBk MjogVVBEQVRFIHJlaW5kX2Nvbl90YWIgU0VUIGRhdGEgPSAnYmJiYicgV0hFUkUgaWQgPSAz Oworc3RlcCBpbnMyOiBJTlNFUlQgSU5UTyByZWluZF9jb25fdGFiKGRhdGEpIFZBTFVFUyAo J2NjY2MnKTsKK3N0ZXAgZGVsMjogREVMRVRFIEZST00gcmVpbmRfY29uX3RhYiBXSEVSRSBk YXRhID0gJ2NjY2MnOworc3RlcCByZWluZGV4OiBSRUlOREVYIFRBQkxFIENPTkNVUlJFTlRM WSByZWluZF9jb25fdGFiOyA8d2FpdGluZyAuLi4+CitzdGVwIGVuZDE6IENPTU1JVDsKK3N0 ZXAgZW5kMjogQ09NTUlUOworc3RlcCByZWluZGV4OiA8Li4uIGNvbXBsZXRlZD4KKworc3Rh cnRpbmcgcGVybXV0YXRpb246IHNlbDEgdXBkMiBpbnMyIGRlbDIgZW5kMSByZWluZGV4IGVu ZDIKK3N0ZXAgc2VsMTogU0VMRUNUIGRhdGEgRlJPTSByZWluZF9jb25fdGFiIFdIRVJFIGlk ID0gMzsKK2RhdGEgICAgICAgICAgIAorCithYWFhICAgICAgICAgICAKK3N0ZXAgdXBkMjog VVBEQVRFIHJlaW5kX2Nvbl90YWIgU0VUIGRhdGEgPSAnYmJiYicgV0hFUkUgaWQgPSAzOwor c3RlcCBpbnMyOiBJTlNFUlQgSU5UTyByZWluZF9jb25fdGFiKGRhdGEpIFZBTFVFUyAoJ2Nj Y2MnKTsKK3N0ZXAgZGVsMjogREVMRVRFIEZST00gcmVpbmRfY29uX3RhYiBXSEVSRSBkYXRh ID0gJ2NjY2MnOworc3RlcCBlbmQxOiBDT01NSVQ7CitzdGVwIHJlaW5kZXg6IFJFSU5ERVgg VEFCTEUgQ09OQ1VSUkVOVExZIHJlaW5kX2Nvbl90YWI7IDx3YWl0aW5nIC4uLj4KK3N0ZXAg ZW5kMjogQ09NTUlUOworc3RlcCByZWluZGV4OiA8Li4uIGNvbXBsZXRlZD4KZGlmZiAtLWdp dCBhL3NyYy90ZXN0L2lzb2xhdGlvbi9pc29sYXRpb25fc2NoZWR1bGUgYi9zcmMvdGVzdC9p c29sYXRpb24vaXNvbGF0aW9uX3NjaGVkdWxlCmluZGV4IDkxZDlkOTAxMzUuLmUzMjg4NmJh Y2IgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2lzb2xhdGlvbi9pc29sYXRpb25fc2NoZWR1bGUK KysrIGIvc3JjL3Rlc3QvaXNvbGF0aW9uL2lzb2xhdGlvbl9zY2hlZHVsZQpAQCAtNDIsNiAr NDIsNyBAQCB0ZXN0OiBtdWx0aXhhY3Qtbm8tZm9yZ2V0CiB0ZXN0OiBsb2NrLWNvbW1pdHRl ZC11cGRhdGUKIHRlc3Q6IGxvY2stY29tbWl0dGVkLWtleXVwZGF0ZQogdGVzdDogdXBkYXRl LWxvY2tlZC10dXBsZQordGVzdDogcmVpbmRleC1jb25jdXJyZW50bHkKIHRlc3Q6IHByb3Bh Z2F0ZS1sb2NrLWRlbGV0ZQogdGVzdDogdHVwbGVsb2NrLWNvbmZsaWN0CiB0ZXN0OiB0dXBs ZWxvY2stdXBkYXRlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9pc29sYXRpb24vc3BlY3MvcmVp bmRleC1jb25jdXJyZW50bHkuc3BlYyBiL3NyYy90ZXN0L2lzb2xhdGlvbi9zcGVjcy9yZWlu ZGV4LWNvbmN1cnJlbnRseS5zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAwMDAuLmViNTlmZTBjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9pc29sYXRp b24vc3BlY3MvcmVpbmRleC1jb25jdXJyZW50bHkuc3BlYwpAQCAtMCwwICsxLDQwIEBACisj IFJFSU5ERVggQ09OQ1VSUkVOVExZCisjCisjIEVuc3VyZSB0aGF0IGNvbmN1cnJlbnQgb3Bl cmF0aW9ucyB3b3JrIGNvcnJlY3RseSB3aGVuIGEgUkVJTkRFWCBpcyBwZXJmb3JtZWQKKyMg Y29uY3VycmVudGx5LgorCitzZXR1cAoreworCUNSRUFURSBUQUJMRSByZWluZF9jb25fdGFi KGlkIHNlcmlhbCBwcmltYXJ5IGtleSwgZGF0YSB0ZXh0KTsKKwlJTlNFUlQgSU5UTyByZWlu ZF9jb25fdGFiKGRhdGEpIFZBTFVFUyAoJ2FhJyk7CisJSU5TRVJUIElOVE8gcmVpbmRfY29u X3RhYihkYXRhKSBWQUxVRVMgKCdhYWEnKTsKKwlJTlNFUlQgSU5UTyByZWluZF9jb25fdGFi KGRhdGEpIFZBTFVFUyAoJ2FhYWEnKTsKKwlJTlNFUlQgSU5UTyByZWluZF9jb25fdGFiKGRh dGEpIFZBTFVFUyAoJ2FhYWFhJyk7Cit9CisKK3RlYXJkb3duCit7CisJRFJPUCBUQUJMRSBy ZWluZF9jb25fdGFiOworfQorCitzZXNzaW9uICJzMSIKK3NldHVwIHsgQkVHSU47IH0KK3N0 ZXAgInNlbDEiIHsgU0VMRUNUIGRhdGEgRlJPTSByZWluZF9jb25fdGFiIFdIRVJFIGlkID0g MzsgfQorc3RlcCAiZW5kMSIgeyBDT01NSVQ7IH0KKworc2Vzc2lvbiAiczIiCitzZXR1cCB7 IEJFR0lOOyB9CitzdGVwICJ1cGQyIiB7IFVQREFURSByZWluZF9jb25fdGFiIFNFVCBkYXRh ID0gJ2JiYmInIFdIRVJFIGlkID0gMzsgfQorc3RlcCAiaW5zMiIgeyBJTlNFUlQgSU5UTyBy ZWluZF9jb25fdGFiKGRhdGEpIFZBTFVFUyAoJ2NjY2MnKTsgfQorc3RlcCAiZGVsMiIgeyBE RUxFVEUgRlJPTSByZWluZF9jb25fdGFiIFdIRVJFIGRhdGEgPSAnY2NjYyc7IH0KK3N0ZXAg ImVuZDIiIHsgQ09NTUlUOyB9CisKK3Nlc3Npb24gInMzIgorc3RlcCAicmVpbmRleCIgeyBS RUlOREVYIFRBQkxFIENPTkNVUlJFTlRMWSByZWluZF9jb25fdGFiOyB9CisKK3Blcm11dGF0 aW9uICJyZWluZGV4IiAic2VsMSIgInVwZDIiICJpbnMyIiAiZGVsMiIgImVuZDEiICJlbmQy IgorcGVybXV0YXRpb24gInNlbDEiICJyZWluZGV4IiAidXBkMiIgImluczIiICJkZWwyIiAi ZW5kMSIgImVuZDIiCitwZXJtdXRhdGlvbiAic2VsMSIgInVwZDIiICJyZWluZGV4IiAiaW5z MiIgImRlbDIiICJlbmQxIiAiZW5kMiIKK3Blcm11dGF0aW9uICJzZWwxIiAidXBkMiIgImlu czIiICJyZWluZGV4IiAiZGVsMiIgImVuZDEiICJlbmQyIgorcGVybXV0YXRpb24gInNlbDEi ICJ1cGQyIiAiaW5zMiIgImRlbDIiICJyZWluZGV4IiAiZW5kMSIgImVuZDIiCitwZXJtdXRh dGlvbiAic2VsMSIgInVwZDIiICJpbnMyIiAiZGVsMiIgImVuZDEiICJyZWluZGV4IiAiZW5k MiIKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY3JlYXRlX2luZGV4 Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY3JlYXRlX2luZGV4Lm91dAppbmRl eCA0NmRlYjU1YzY3Li5hNWUzODJiZjI4IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNz L2V4cGVjdGVkL2NyZWF0ZV9pbmRleC5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBl Y3RlZC9jcmVhdGVfaW5kZXgub3V0CkBAIC0zMjkyLDMgKzMyOTIsNzMgQEAgRFJPUCBST0xF IHJlZ3Jlc3NfcmVpbmRleHVzZXI7CiBcc2V0IFZFUkJPU0lUWSB0ZXJzZSBcXCAtLSBzdXBw cmVzcyBjYXNjYWRlIGRldGFpbHMKIERST1AgU0NIRU1BIHNjaGVtYV90b19yZWluZGV4IENB U0NBREU7CiBOT1RJQ0U6ICBkcm9wIGNhc2NhZGVzIHRvIDYgb3RoZXIgb2JqZWN0cworUkVT RVQgY2xpZW50X21pbl9tZXNzYWdlczsKK1JFU0VUIHNlYXJjaF9wYXRoOworLS0KKy0tIENo ZWNrIGJlaGF2aW9yIG9mIFJFSU5ERVggYW5kIFJFSU5ERVggQ09OQ1VSUkVOVExZCistLQor Q1JFQVRFIFRBQkxFIGNvbmN1cl9yZWluZGV4X3RhYiAoYzEgaW50KTsKKy0tIFJFSU5ERVgK K1JFSU5ERVggVEFCTEUgY29uY3VyX3JlaW5kZXhfdGFiOyAtLSBub3RpY2UKK05PVElDRTog IHRhYmxlICJjb25jdXJfcmVpbmRleF90YWIiIGhhcyBubyBpbmRleGVzCitSRUlOREVYIFRB QkxFIENPTkNVUlJFTlRMWSBjb25jdXJfcmVpbmRleF90YWI7IC0tIG5vdGljZQorTk9USUNF OiAgdGFibGUgImNvbmN1cl9yZWluZGV4X3RhYiIgaGFzIG5vIGluZGV4ZXMKK0FMVEVSIFRB QkxFIGNvbmN1cl9yZWluZGV4X3RhYiBBREQgQ09MVU1OIGMyIHRleHQ7IC0tIGFkZCB0b2Fz dCBpbmRleAorLS0gTm9ybWFsIGluZGV4IHdpdGggaW50ZWdlciBjb2x1bW4KK0NSRUFURSBV TklRVUUgSU5ERVggY29uY3VyX3JlaW5kZXhfaW5kMSBPTiBjb25jdXJfcmVpbmRleF90YWIo YzEpOworLS0gTm9ybWFsIGluZGV4IHdpdGggdGV4dCBjb2x1bW4KK0NSRUFURSBJTkRFWCBj b25jdXJfcmVpbmRleF9pbmQyIE9OIGNvbmN1cl9yZWluZGV4X3RhYihjMik7CistLSBVTklR VUUgaW5kZXggd2l0aCBleHByZXNzaW9uCitDUkVBVEUgVU5JUVVFIElOREVYIGNvbmN1cl9y ZWluZGV4X2luZDMgT04gY29uY3VyX3JlaW5kZXhfdGFiKGFicyhjMSkpOworLS0gRHVwbGlj YXRlIGNvbHVtbiBuYW1lcworQ1JFQVRFIElOREVYIGNvbmN1cl9yZWluZGV4X2luZDQgT04g Y29uY3VyX3JlaW5kZXhfdGFiKGMxLCBjMSwgYzIpOworLS0gQ3JlYXRlIHRhYmxlIGZvciBj aGVjayBvbiBmb3JlaWduIGtleSBkZXBlbmRlbmNlIHN3aXRjaCB3aXRoIGluZGV4ZXMgc3dh cHBlZAorQUxURVIgVEFCTEUgY29uY3VyX3JlaW5kZXhfdGFiIEFERCBQUklNQVJZIEtFWSBV U0lORyBJTkRFWCBjb25jdXJfcmVpbmRleF9pbmQxOworQ1JFQVRFIFRBQkxFIGNvbmN1cl9y ZWluZGV4X3RhYjIgKGMxIGludCBSRUZFUkVOQ0VTIGNvbmN1cl9yZWluZGV4X3RhYik7CitJ TlNFUlQgSU5UTyBjb25jdXJfcmVpbmRleF90YWIgVkFMVUVTICAoMSwgJ2EnKTsKK0lOU0VS VCBJTlRPIGNvbmN1cl9yZWluZGV4X3RhYiBWQUxVRVMgICgyLCAnYScpOworLS0gUmVpbmRl eCBvZiBleGNsdXNpb24gY29uc3RyYWludAorQUxURVIgVEFCTEUgY29uY3VyX3JlaW5kZXhf dGFiIEFERCBDT0xVTU4gYzMgaW50NHJhbmdlLCBBREQgRVhDTFVERSBVU0lORyBnaXN0IChj MyBXSVRIICYmKTsKK0lOU0VSVCBJTlRPIGNvbmN1cl9yZWluZGV4X3RhYiBWQUxVRVMgICgz LCAnYScsICdbMSwyXScpOworUkVJTkRFWCBUQUJMRSBjb25jdXJfcmVpbmRleF90YWI7CitJ TlNFUlQgSU5UTyBjb25jdXJfcmVpbmRleF90YWIgVkFMVUVTICAoNCwgJ2EnLCAnWzIsNF0n KTsKK0VSUk9SOiAgY29uZmxpY3Rpbmcga2V5IHZhbHVlIHZpb2xhdGVzIGV4Y2x1c2lvbiBj b25zdHJhaW50ICJjb25jdXJfcmVpbmRleF90YWJfYzNfZXhjbCIKKy0tIENoZWNrIG1hdGVy aWFsaXplZCB2aWV3cworQ1JFQVRFIE1BVEVSSUFMSVpFRCBWSUVXIGNvbmN1cl9yZWluZGV4 X21hdHZpZXcgQVMgU0VMRUNUICogRlJPTSBjb25jdXJfcmVpbmRleF90YWI7CitSRUlOREVY IElOREVYIENPTkNVUlJFTlRMWSBjb25jdXJfcmVpbmRleF9pbmQxOworUkVJTkRFWCBUQUJM RSBDT05DVVJSRU5UTFkgY29uY3VyX3JlaW5kZXhfdGFiOworUkVJTkRFWCBUQUJMRSBDT05D VVJSRU5UTFkgY29uY3VyX3JlaW5kZXhfbWF0dmlldzsKKy0tIENoZWNrIGVycm9ycworLS0g Q2Fubm90IHJ1biBpbnNpZGUgYSB0cmFuc2FjdGlvbiBibG9jaworQkVHSU47CitSRUlOREVY IFRBQkxFIENPTkNVUlJFTlRMWSBjb25jdXJfcmVpbmRleF90YWI7CitFUlJPUjogIFJFSU5E RVggQ09OQ1VSUkVOVExZIGNhbm5vdCBydW4gaW5zaWRlIGEgdHJhbnNhY3Rpb24gYmxvY2sK K0NPTU1JVDsKK1JFSU5ERVggVEFCTEUgQ09OQ1VSUkVOVExZIHBnX2RhdGFiYXNlOyAtLSBu byBzaGFyZWQgcmVsYXRpb24KK0VSUk9SOiAgY29uY3VycmVudCByZWluZGV4IGlzIG5vdCBz dXBwb3J0ZWQgZm9yIHNoYXJlZCByZWxhdGlvbnMKK1JFSU5ERVggVEFCTEUgQ09OQ1VSUkVO VExZIHBnX2NsYXNzOyAtLSBubyBjYXRhbG9nIHJlbGF0aW9ucworRVJST1I6ICBjb25jdXJy ZW50IHJlaW5kZXggaXMgbm90IHN1cHBvcnRlZCBmb3IgY2F0YWxvZyByZWxhdGlvbnMKK1JF SU5ERVggU1lTVEVNIENPTkNVUlJFTlRMWSBwb3N0Z3JlczsgLS0gbm90IGFsbG93ZWQgZm9y IFNZU1RFTQorRVJST1I6ICBjYW4gb25seSByZWluZGV4IHRoZSBjdXJyZW50bHkgb3BlbiBk YXRhYmFzZQorLS0gV2FybnMgYWJvdXQgY2F0YWxvZyByZWxhdGlvbnMKK1JFSU5ERVggU0NI RU1BIENPTkNVUlJFTlRMWSBwZ19jYXRhbG9nOworV0FSTklORzogIGNvbmN1cnJlbnQgcmVp bmRleCBpcyBub3Qgc3VwcG9ydGVkIGZvciBjYXRhbG9nIHJlbGF0aW9ucywgc2tpcHBpbmcg YWxsCistLSBDaGVjayB0aGUgcmVsYXRpb24gc3RhdHVzLCB0aGVyZSBzaG91bGQgbm90IGJl IGludmFsaWQgaW5kZXhlcworXGQgY29uY3VyX3JlaW5kZXhfdGFiCisgICAgICAgICAgVGFi bGUgInB1YmxpYy5jb25jdXJfcmVpbmRleF90YWIiCisgQ29sdW1uIHwgICBUeXBlICAgIHwg Q29sbGF0aW9uIHwgTnVsbGFibGUgfCBEZWZhdWx0IAorLS0tLS0tLS0rLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0KKyBjMSAgICAgfCBpbnRlZ2VyICAg fCAgICAgICAgICAgfCBub3QgbnVsbCB8IAorIGMyICAgICB8IHRleHQgICAgICB8ICAgICAg ICAgICB8ICAgICAgICAgIHwgCisgYzMgICAgIHwgaW50NHJhbmdlIHwgICAgICAgICAgIHwg ICAgICAgICAgfCAKK0luZGV4ZXM6CisgICAgImNvbmN1cl9yZWluZGV4X2luZDEiIFBSSU1B UlkgS0VZLCBidHJlZSAoYzEpCisgICAgImNvbmN1cl9yZWluZGV4X2luZDMiIFVOSVFVRSwg YnRyZWUgKGFicyhjMSkpCisgICAgImNvbmN1cl9yZWluZGV4X2luZDIiIGJ0cmVlIChjMikK KyAgICAiY29uY3VyX3JlaW5kZXhfaW5kNCIgYnRyZWUgKGMxLCBjMSwgYzIpCisgICAgImNv bmN1cl9yZWluZGV4X3RhYl9jM19leGNsIiBFWENMVURFIFVTSU5HIGdpc3QgKGMzIFdJVEgg JiYpCitSZWZlcmVuY2VkIGJ5OgorICAgIFRBQkxFICJjb25jdXJfcmVpbmRleF90YWIyIiBD T05TVFJBSU5UICJjb25jdXJfcmVpbmRleF90YWIyX2MxX2ZrZXkiIEZPUkVJR04gS0VZIChj MSkgUkVGRVJFTkNFUyBjb25jdXJfcmVpbmRleF90YWIoYzEpCisKK0RST1AgTUFURVJJQUxJ WkVEIFZJRVcgY29uY3VyX3JlaW5kZXhfbWF0dmlldzsKK0RST1AgVEFCTEUgY29uY3VyX3Jl aW5kZXhfdGFiLCBjb25jdXJfcmVpbmRleF90YWIyOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qv cmVncmVzcy9zcWwvY3JlYXRlX2luZGV4LnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2Ny ZWF0ZV9pbmRleC5zcWwKaW5kZXggNTlkYTZiNjU5Mi4uOWYxM2U3MThhMSAxMDA2NDQKLS0t IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvY3JlYXRlX2luZGV4LnNxbAorKysgYi9zcmMvdGVz dC9yZWdyZXNzL3NxbC9jcmVhdGVfaW5kZXguc3FsCkBAIC0xMjA3LDMgKzEyMDcsNTQgQEAg Q1JFQVRFIFJPTEUgcmVncmVzc19yZWluZGV4dXNlciBOT0xPR0lOOwogRFJPUCBST0xFIHJl Z3Jlc3NfcmVpbmRleHVzZXI7CiBcc2V0IFZFUkJPU0lUWSB0ZXJzZSBcXCAtLSBzdXBwcmVz cyBjYXNjYWRlIGRldGFpbHMKIERST1AgU0NIRU1BIHNjaGVtYV90b19yZWluZGV4IENBU0NB REU7CitSRVNFVCBjbGllbnRfbWluX21lc3NhZ2VzOworUkVTRVQgc2VhcmNoX3BhdGg7CisK Ky0tCistLSBDaGVjayBiZWhhdmlvciBvZiBSRUlOREVYIGFuZCBSRUlOREVYIENPTkNVUlJF TlRMWQorLS0KKworQ1JFQVRFIFRBQkxFIGNvbmN1cl9yZWluZGV4X3RhYiAoYzEgaW50KTsK Ky0tIFJFSU5ERVgKK1JFSU5ERVggVEFCTEUgY29uY3VyX3JlaW5kZXhfdGFiOyAtLSBub3Rp Y2UKK1JFSU5ERVggVEFCTEUgQ09OQ1VSUkVOVExZIGNvbmN1cl9yZWluZGV4X3RhYjsgLS0g bm90aWNlCitBTFRFUiBUQUJMRSBjb25jdXJfcmVpbmRleF90YWIgQUREIENPTFVNTiBjMiB0 ZXh0OyAtLSBhZGQgdG9hc3QgaW5kZXgKKy0tIE5vcm1hbCBpbmRleCB3aXRoIGludGVnZXIg Y29sdW1uCitDUkVBVEUgVU5JUVVFIElOREVYIGNvbmN1cl9yZWluZGV4X2luZDEgT04gY29u Y3VyX3JlaW5kZXhfdGFiKGMxKTsKKy0tIE5vcm1hbCBpbmRleCB3aXRoIHRleHQgY29sdW1u CitDUkVBVEUgSU5ERVggY29uY3VyX3JlaW5kZXhfaW5kMiBPTiBjb25jdXJfcmVpbmRleF90 YWIoYzIpOworLS0gVU5JUVVFIGluZGV4IHdpdGggZXhwcmVzc2lvbgorQ1JFQVRFIFVOSVFV RSBJTkRFWCBjb25jdXJfcmVpbmRleF9pbmQzIE9OIGNvbmN1cl9yZWluZGV4X3RhYihhYnMo YzEpKTsKKy0tIER1cGxpY2F0ZSBjb2x1bW4gbmFtZXMKK0NSRUFURSBJTkRFWCBjb25jdXJf cmVpbmRleF9pbmQ0IE9OIGNvbmN1cl9yZWluZGV4X3RhYihjMSwgYzEsIGMyKTsKKy0tIENy ZWF0ZSB0YWJsZSBmb3IgY2hlY2sgb24gZm9yZWlnbiBrZXkgZGVwZW5kZW5jZSBzd2l0Y2gg d2l0aCBpbmRleGVzIHN3YXBwZWQKK0FMVEVSIFRBQkxFIGNvbmN1cl9yZWluZGV4X3RhYiBB REQgUFJJTUFSWSBLRVkgVVNJTkcgSU5ERVggY29uY3VyX3JlaW5kZXhfaW5kMTsKK0NSRUFU RSBUQUJMRSBjb25jdXJfcmVpbmRleF90YWIyIChjMSBpbnQgUkVGRVJFTkNFUyBjb25jdXJf cmVpbmRleF90YWIpOworSU5TRVJUIElOVE8gY29uY3VyX3JlaW5kZXhfdGFiIFZBTFVFUyAg KDEsICdhJyk7CitJTlNFUlQgSU5UTyBjb25jdXJfcmVpbmRleF90YWIgVkFMVUVTICAoMiwg J2EnKTsKKy0tIFJlaW5kZXggb2YgZXhjbHVzaW9uIGNvbnN0cmFpbnQKK0FMVEVSIFRBQkxF IGNvbmN1cl9yZWluZGV4X3RhYiBBREQgQ09MVU1OIGMzIGludDRyYW5nZSwgQUREIEVYQ0xV REUgVVNJTkcgZ2lzdCAoYzMgV0lUSCAmJik7CitJTlNFUlQgSU5UTyBjb25jdXJfcmVpbmRl eF90YWIgVkFMVUVTICAoMywgJ2EnLCAnWzEsMl0nKTsKK1JFSU5ERVggVEFCTEUgY29uY3Vy X3JlaW5kZXhfdGFiOworSU5TRVJUIElOVE8gY29uY3VyX3JlaW5kZXhfdGFiIFZBTFVFUyAg KDQsICdhJywgJ1syLDRdJyk7CistLSBDaGVjayBtYXRlcmlhbGl6ZWQgdmlld3MKK0NSRUFU RSBNQVRFUklBTElaRUQgVklFVyBjb25jdXJfcmVpbmRleF9tYXR2aWV3IEFTIFNFTEVDVCAq IEZST00gY29uY3VyX3JlaW5kZXhfdGFiOworUkVJTkRFWCBJTkRFWCBDT05DVVJSRU5UTFkg Y29uY3VyX3JlaW5kZXhfaW5kMTsKK1JFSU5ERVggVEFCTEUgQ09OQ1VSUkVOVExZIGNvbmN1 cl9yZWluZGV4X3RhYjsKK1JFSU5ERVggVEFCTEUgQ09OQ1VSUkVOVExZIGNvbmN1cl9yZWlu ZGV4X21hdHZpZXc7CisKKy0tIENoZWNrIGVycm9ycworLS0gQ2Fubm90IHJ1biBpbnNpZGUg YSB0cmFuc2FjdGlvbiBibG9jaworQkVHSU47CitSRUlOREVYIFRBQkxFIENPTkNVUlJFTlRM WSBjb25jdXJfcmVpbmRleF90YWI7CitDT01NSVQ7CitSRUlOREVYIFRBQkxFIENPTkNVUlJF TlRMWSBwZ19kYXRhYmFzZTsgLS0gbm8gc2hhcmVkIHJlbGF0aW9uCitSRUlOREVYIFRBQkxF IENPTkNVUlJFTlRMWSBwZ19jbGFzczsgLS0gbm8gY2F0YWxvZyByZWxhdGlvbnMKK1JFSU5E RVggU1lTVEVNIENPTkNVUlJFTlRMWSBwb3N0Z3JlczsgLS0gbm90IGFsbG93ZWQgZm9yIFNZ U1RFTQorLS0gV2FybnMgYWJvdXQgY2F0YWxvZyByZWxhdGlvbnMKK1JFSU5ERVggU0NIRU1B IENPTkNVUlJFTlRMWSBwZ19jYXRhbG9nOworCistLSBDaGVjayB0aGUgcmVsYXRpb24gc3Rh dHVzLCB0aGVyZSBzaG91bGQgbm90IGJlIGludmFsaWQgaW5kZXhlcworXGQgY29uY3VyX3Jl aW5kZXhfdGFiCitEUk9QIE1BVEVSSUFMSVpFRCBWSUVXIGNvbmN1cl9yZWluZGV4X21hdHZp ZXc7CitEUk9QIFRBQkxFIGNvbmN1cl9yZWluZGV4X3RhYiwgY29uY3VyX3JlaW5kZXhfdGFi MjsKCmJhc2UtY29tbWl0OiA2OGExM2YyOGJlYmM5ZWI3MGNjNjk4OGJmYTJkYWFmNDUwMGY1 MTlmCi0tIAoyLjIwLjEKCg== --------------2251F567199DD5ADF26BB467--