From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x32e.google.com (mail-wm1-x32e.google.com [IPv6:2a00:1450:4864:20::32e]) by sourceware.org (Postfix) with ESMTPS id 415C9385E449; Thu, 23 Nov 2023 21:59:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 415C9385E449 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 415C9385E449 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::32e ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1700776752; cv=none; b=gx2N2WdL+Oh6fxVKW+hRWOQl3ml3nEoW/gicr5ZVbziatCu2CLOK1MiGutvhe2KHeKB1mnVS8Ek4LBoYAbwXbyF7QnuWILFfvN+p7VJHnaSSbMNp7QvFZQyY8dbmkdwJjjAf8+xMmKATlE2IQ4EXKqD7ALqVtMfaTs+QrkpN+7s= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1700776752; c=relaxed/simple; bh=3kIgpqVCpddrjE/C2Fi1wlxHvco1EB/m/hv7X7n3R5E=; h=DKIM-Signature:Message-ID:Date:MIME-Version:From:Subject:To; b=sSlWlLWOjuWKIvruO2nWC7vMKAa64P4XJQyPhM1J1F7+NziA2eKSuff5W9fFoF6NJ6xUtwVn7MevTUaysKrSe8c5O8adKFj0q8YKhqm9rPlb8ArAl8RlJmUOXWgI9MuBXzhX35+17GWfupMyaQtniSTlEkEtr7VgTwNjYchKM6Q= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-wm1-x32e.google.com with SMTP id 5b1f17b1804b1-40b30308c67so8846675e9.0; Thu, 23 Nov 2023 13:59:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1700776745; x=1701381545; darn=gcc.gnu.org; h=content-language:cc:to:subject:from:user-agent:mime-version:date :message-id:from:to:cc:subject:date:message-id:reply-to; bh=++R3xHiXiZVILwc0f1OXVd7xn/bHtLNzEmZWFUbiS8w=; b=OtaUoYUNVwEaNImDRQyZy6g65ETjoABLdmxi0b8SsWK1/szh2oM9TXtLlKXkXUGfXl jRP6kns3TePCRXLMxI0B1tjyOWdViEzfTc6CwNEuUJMPz7neMEJEMTXzj77IpAkzrVyP XFhDmgk+UXpjf41ZukrMZe87APaFDyVhgoJBCDuO1nHYBRrjiZ4FhlxTUZDK45ZL4xs+ aj8EtyR7AZWtl4pzdCgsdAtVfxBzO4slJKy9iWceMey8rBt9vg+Uv6kK5od85cniMDAK aQmTupgfT13a0s2VfxbkT9bb7V1d0amrwLjKJ/kWFTihheTM1Lu8wZwqllXJz9ivwdQJ iZoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1700776745; x=1701381545; h=content-language:cc:to:subject:from:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=++R3xHiXiZVILwc0f1OXVd7xn/bHtLNzEmZWFUbiS8w=; b=dLa2ci+UEdzvGk387zfQ90HSLV+YnyFBEv2NPK+ezEIOrSMQ4aBqx1s2ttfxv2GTFP EpV/osa3+QHKhq/gttWBdzNjFOpONzD/sl0BTqJNk9TseVr8GFMhAZ+xYDBXIQfSsp/3 +N8Gfw7PTH8EeVbyDi1fb/2qOurXesmkUg8Xr6XT8YkrBPZlwwnzSEdZ+lA+L0HqJrOB 3Fxp9heNnkNjqeCafZGYrLjKe7om+OjYdy1CVTWV3N+TYp0urk/e91dlLHhw2s78uHWt RsTTgOBQFtm36U9SKxvpNluXyjFdGwtv99nadTG5WMrtqvKq4/u2R8Nu1G2Y4l1/d2uQ +eXg== X-Gm-Message-State: AOJu0YxFtgWxJwOdxvG2SMOTFZw1CHCu8OHJZE/QGYrd2i+i/XgtXdzq dr9l4Qp1veIxGsLXOveGnTaTXnyV6Ek= X-Google-Smtp-Source: AGHT+IHw3RXzxrHumO0PLCij09Fx4mBvbjVE0KusBHHue8zL8GHu36J5whrPoL84poRm2Peb0CjQoQ== X-Received: by 2002:a05:600c:458d:b0:405:4776:735a with SMTP id r13-20020a05600c458d00b004054776735amr649859wmo.2.1700776744986; Thu, 23 Nov 2023 13:59:04 -0800 (PST) Received: from ?IPV6:2a01:e0a:1dc:b1c0:fc8d:30b8:64d5:2ae8? ([2a01:e0a:1dc:b1c0:fc8d:30b8:64d5:2ae8]) by smtp.gmail.com with ESMTPSA id o7-20020a05600c510700b0040b36ad5413sm2995518wms.46.2023.11.23.13.59.03 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 23 Nov 2023 13:59:04 -0800 (PST) Content-Type: multipart/mixed; boundary="------------1VLGoPQTWT3GdNaNImTzmE8A" Message-ID: Date: Thu, 23 Nov 2023 22:59:03 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird From: =?UTF-8?Q?Fran=C3=A7ois_Dumont?= Subject: [PATCH 5/5][_Hashtable] Prefer to insert after last node To: libstdc++ Cc: gcc-patches Content-Language: en-US X-Spam-Status: No, score=-9.4 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: This is a multi-part message in MIME format. --------------1VLGoPQTWT3GdNaNImTzmE8A Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit     libstdc++: [_Hashtable] Prefer to insert after last node     When inserting an element into an empty bucket we currently insert the new node     after the before-begin node so in first position. The drawback of doing this is     that we are forced to update the bucket that was containing this before-begin     node to point to the newly inserted node. To do so we need at best to do a modulo     to find this bucket and at worst, when hash code is not cached, also compute it.     To avoid this side effect it is better to insert after the last node. To do so     we are introducing a helper type _HintPolicy that have 3 resposibilities.     1. When the gnu versioned namespace is used we add a _M_last member to _Hashtable,     _HintPolicy is then in charge of maintaining it. For this purpose _HintPolicy is     using the RAII pattern, it resets the _M_last at destruction level. It also maintain     its own _M_last, all mutable operations are updating it when needed.     2. When the gnu versioned namespace is not used _HintPolicy will still maintain its     _M_last member using initially the user provided hint if any and if it is actually     the container last node that is to say a dereferenceable node with its next node being     null. All mutable operations can also update the contextual _HintPolicy instance     whenever they detect the last node during their process.     3. As long as we haven't been able to detect the container last node _HintPolicy     is used to keep a cache of the before-begin bucket index so that we do not need to     compute it afterward for example in the context of range insertion.     libstdc++-v3/ChangeLog:             * include/bits/hashtable.h [_GLIBCXX_INLINE_VERSION](_Hashtable<>::_M_last): New, the container last node.             (_Hashtable<>::_HintPolicy): New.             (_Hashtable<>::_M_get_hint(__node_ptr)): New.             (_Hashtable<>::_M_get_hint_policy(__node_ptr)): New. (_Hashtable<>::_M_check_for_last(__node_base_ptr)): New.             (_Hashtable<>::_M_set_last(__node_ptr)): New.             (_Hashtable<>::_M_get_last()): New.             (_Hashtable<>::_M_compute_hash_code(__node_ptr, const key_type&)): Remove.             (_Hashtable<>::_InsertInfo): New struct.             (_Hashtable<>::_M_get_insert_info): New, return latter. (_Hashtable<>::operator=(initializer_list<>)): Adapt to instantiate a _HintPolicy.             (_Hashtable<>::_M_insert_bucket_begin): Add _HintPolicy& parameter and use it             to optimize insertion in an empty bucket.             (_Hashtable<>::_M_insert_unique_node): Add _HintPolicy& parameter.             (_Hashtable<>::_M_insert_multi_node): Likewise and add _InsertInfo parameter. (_Hashtable<>::_M_emplace_unique(_HintPolicy&, _Args&&...)): New. (_Hashtable<>::_M_emplace_multi(_HintPolicy&, _Args&&...)): New.             (_Hashtable<>::_M_emplace): Adapt to use latters.             (_Hashtable<>::_M_insert_unique): Add _HintPolicy& parameter.             (_Hashtable<>::_M_insert_unique_aux): Add _HintPolicy& parameter.             (_Hashtable<>::_M_insert): Adapt to use latter.             (_Hashtable<>::emplace_hint(const_iterator, _Args&&...)): Adapt.             (_hashtable<>::rehash(size_type)): Adapt.             (_Hashtable<>::_M_reinsert_node(const_iterator, node_type&&)):             Add hint parameter, adapt to use it for _HintPolicy instantiation.             (_Hashtable<>::_M_reinsert_node_multi): Likewise.             (_Hashtable<>::_M_merge_unique): Adapt.             (_Hashtable<>::_M_rehash): Add _HintPolicy& parameter.             (_Hashtable<>::_Hashtable<_InputIte>()): Adapt.             (_Hashtable<>::_M_assign): Call _M_set_last.             (_Hashtable<>::_M_reset()): Reset _M_last. (_Hashtable<>::_M_move_assign(_Hashtable&&, true_type)): Move _M_last.             (_Hashtable<>(_Hashtable&&, __node_alloc_type&&, true_type)): Copy _M_last.             (_Hashtable<>(_Hashtable&&, __node_alloc_type&&, false_type)): Copy _M_last.             (_Hashtable<>::_M_insert_range): Adapt.             (_Hashtable<>::_M_erase): Call _M_check_for_last.             (_Hashtable<>::erase): Likewise.             * include/bits/hashtable_policy.h:             (_Map_base<>::operator[](const key_type&)): Use hint policy.             (_Map_base<>::operator[](key_type&&)): Likewise.             (_Insert_base<>::insert(const_iterator, const value_type&)): Likewise using hint.             (_Insert_base<>::try_emplace): Likewise. (_Insert_base<>::_M_insert_range<>(_InputIte, _InputIte, true_type)): Use hint policy. (_Insert_base<>::_M_insert_range<>(_InputIte, _InputIte, false_type)): Use hint policy.             (_Insert<>::insert(const_iterator, value_type&&)): Likewise.             * include/bits/unordered_map.h (unordered_map<>::insert(node_type&&)): Pass cend as             hint.             (unordered_map<>::insert(const_iterator, node_type&&)): Adapt to use hint.             * include/bits/unordered_set.h (unordered_set<>::insert(node_type&&)): Pass cend as             hint.             (unordered_set<>::insert(const_iterator, node_type&&)): Adapt to use hint.             * testsuite/23_containers/unordered_multimap/insert/hint.cc: Adapt implementation             specific tests. Tested under Linux x64 Ok to commit ? François --------------1VLGoPQTWT3GdNaNImTzmE8A Content-Type: text/plain; charset=UTF-8; name="hashtable_last_node.txt" Content-Disposition: attachment; filename="hashtable_last_node.txt" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMvaGFzaHRhYmxlLmggYi9s aWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL2hhc2h0YWJsZS5oCmluZGV4IGFlYzc3YzM0YTU4 Li5kNzU4YjA1NGIwMCAxMDA2NDQKLS0tIGEvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9o YXNodGFibGUuaAorKysgYi9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL2hhc2h0YWJsZS5o CkBAIC00MDMsNiArNDAzLDU5IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9O CiAgICAgICAvLyBudW1lcm91cyBjaGVja3MgaW4gdGhlIGNvZGUgdG8gYXZvaWQgMCBtb2R1 bHVzLgogICAgICAgX19ub2RlX2Jhc2VfcHRyCQlfTV9zaW5nbGVfYnVja2V0CT0gbnVsbHB0 cjsKIAorI2lmIF9HTElCQ1hYX0lOTElORV9WRVJTSU9OCisgICAgICAvLyBUaGUgbGFzdCBj b250YWluZXIgbm9kZSB0byBvcHRpbWl6ZSBpbnNlcnRpb24gaW4gZW1wdHkgYnVja2V0cy4K KyAgICAgIF9fbm9kZV9wdHIJCV9NX2xhc3QJCQk9IG51bGxwdHI7CisjZW5kaWYKKworICAg ICAgY2xhc3MgX0hpbnRQb2xpY3kKKyAgICAgIHsKKwlfSGFzaHRhYmxlJiBfTV9odGI7CisJ X19ub2RlX3B0ciBfTV9sYXN0OworCXN0ZDo6c2l6ZV90IF9NX2JiZWdpbl9pbmRleDsKKwli b29sIF9NX2luaXRpYWxpemVkID0gZmFsc2U7CisKKyAgICAgIHB1YmxpYzoKKwlfSGludFBv bGljeShfSGFzaHRhYmxlJiBfX2h0YmwsIF9fbm9kZV9wdHIgX19sYXN0KQorCTogX01faHRi KF9faHRibCksIF9NX2xhc3QoX19sYXN0KQorCXsgfQorCisjaWYgX0dMSUJDWFhfSU5MSU5F X1ZFUlNJT04KKwl+X0hpbnRQb2xpY3koKQorCXsgX01faHRiLl9NX2xhc3QgPSBfTV9sYXN0 OyB9CisjZW5kaWYKKworCXN0ZDo6c2l6ZV90CisJX01fZ2V0X2JiZWdpbl9ia3QoX19ub2Rl X3B0ciBfX24pIGNvbnN0CisJeworCSAgaWYgKCFfTV9pbml0aWFsaXplZCkKKwkgICAgcmV0 dXJuIF9NX2h0Yi5fTV9idWNrZXRfaW5kZXgoKl9fbik7CisJICByZXR1cm4gX01fYmJlZ2lu X2luZGV4OworCX0KKworCXZvaWQKKwlfTV9zdG9yZV9iYmVnaW5fYmt0KHN0ZDo6c2l6ZV90 IF9fYmt0KQorCXsKKwkgIF9NX2JiZWdpbl9pbmRleCA9IF9fYmt0OworCSAgX01faW5pdGlh bGl6ZWQgPSB0cnVlOworCX0KKworCWNvbnN0ZXhwciBfX25vZGVfcHRyCisJX01fZ2V0X2hp bnQoKQorCXsgcmV0dXJuIF9NX2xhc3Q7IH0KKworCXZvaWQKKwlfTV9zZXRfbGFzdChfX25v ZGVfcHRyIF9fbikKKwl7IF9NX2xhc3QgPSBfX247IH0KKworCXZvaWQKKwlfTV9jaGVja2Vk X3NldChfX25vZGVfcHRyIF9fbikKKwl7CisJICBpZiAoIV9fbiB8fCAhX19uLT5fTV9ueHQp CisJICAgIF9NX2xhc3QgPSBfX247CisJfQorICAgICAgfTsKKwogICAgICAgdm9pZAogICAg ICAgX01fdXBkYXRlX2JiZWdpbigpCiAgICAgICB7CkBAIC00MjUsNiArNDc4LDUxIEBAIF9H TElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAgICAgICBfTV91c2VzX3NpbmdsZV9i dWNrZXQoKSBjb25zdAogICAgICAgeyByZXR1cm4gX01fdXNlc19zaW5nbGVfYnVja2V0KF9N X2J1Y2tldHMpOyB9CiAKKyAgICAgIF9fbm9kZV9wdHIKKyAgICAgIF9NX2dldF9oaW50KFtb bWF5YmVfdW51c2VkXV0gX19ub2RlX3B0ciBfX3Vzcl9oaW50ID0gbnVsbHB0cikgY29uc3QK KyAgICAgIHsKKyNpZiBfR0xJQkNYWF9JTkxJTkVfVkVSU0lPTgorCXJldHVybiBfTV9sYXN0 OworI2Vsc2UKKwlyZXR1cm4gX191c3JfaGludCAmJiAhX191c3JfaGludC0+X01fbnh0ID8g X191c3JfaGludCA6IG51bGxwdHI7CisjZW5kaWYKKyAgICAgIH0KKworICAgICAgX0hpbnRQ b2xpY3kKKyAgICAgIF9NX2dldF9oaW50X3BvbGljeShfX25vZGVfcHRyIF9fdXNyX2hpbnQg PSBudWxscHRyKQorICAgICAgeyByZXR1cm4gX0hpbnRQb2xpY3koKnRoaXMsIF9NX2dldF9o aW50KF9fdXNyX2hpbnQpKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9jaGVja19mb3Jf bGFzdChbW21heWJlX3VudXNlZF1dIF9fbm9kZV9iYXNlX3B0ciBfX3ByZXZfbikKKyAgICAg IHsKKyNpZiBfR0xJQkNYWF9JTkxJTkVfVkVSU0lPTgorCWlmICghX19wcmV2X24tPl9NX254 dCkKKwkgIHsKKwkgICAgX01fbGFzdCA9IF9fcHJldl9uID09ICZfTV9iZWZvcmVfYmVnaW4K KwkgICAgICA/IG51bGxwdHIKKwkgICAgICA6IHN0YXRpY19jYXN0PF9fbm9kZV9wdHI+KF9f cHJldl9uKTsKKwkgIH0KKyNlbmRpZgorICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBf TV9zZXRfbGFzdChbW21heWJlX3VudXNlZF1dIF9fbm9kZV9wdHIgX19uKQorICAgICAgewor I2lmIF9HTElCQ1hYX0lOTElORV9WRVJTSU9OCisJX01fbGFzdCA9IF9fbjsKKyNlbmRpZgor ICAgICAgfQorCisgICAgICBjb25zdGV4cHIgX19ub2RlX3B0cgorICAgICAgX01fZ2V0X2xh c3QoKQorICAgICAgeworI2lmIF9HTElCQ1hYX0lOTElORV9WRVJTSU9OCisJcmV0dXJuIF9N X2xhc3Q7CisjZWxzZQorCXJldHVybiBudWxscHRyOworI2VuZGlmCisgICAgICB9CisKICAg ICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90CiAgICAgICBfX3NtYWxsX3NpemVfdGhyZXNo b2xkKCkgbm9leGNlcHQKICAgICAgIHsKQEAgLTYxMiwxMSArNzEwLDEzIEBAIF9HTElCQ1hY X0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAJLy8gV2UgY29uc2lkZXIgdGhhdCBhbGwgZWxl bWVudHMgb2YgX19sIGFyZSBnb2luZyB0byBiZSBpbnNlcnRlZC4KIAlhdXRvIF9fbF9ia3Rf Y291bnQgPSBfTV9yZWhhc2hfcG9saWN5Ll9NX2JrdF9mb3JfZWxlbWVudHMoX19sLnNpemUo KSk7CiAKKwlhdXRvIF9faGludF9wb2xpY3kgPSBfTV9nZXRfaGludF9wb2xpY3koKTsKKwog CS8vIERvIG5vdCBzaHJpbmsgdG8ga2VlcCBwb3RlbnRpYWwgdXNlciByZXNlcnZhdGlvbi4K IAlpZiAoX01fYnVja2V0X2NvdW50IDwgX19sX2JrdF9jb3VudCkKLQkgIHJlaGFzaChfX2xf Ymt0X2NvdW50KTsKKwkgIF9NX3JlaGFzaChfX2hpbnRfcG9saWN5LCBfX2xfYmt0X2NvdW50 KTsKIAotCV9NX2luc2VydF9yYW5nZShfX2wuYmVnaW4oKSwgX19sLmVuZCgpLCBfX3JvYW4p OworCV9NX2luc2VydF9yYW5nZShfX2wuYmVnaW4oKSwgX19sLmVuZCgpLCBfX2hpbnRfcG9s aWN5LCBfX3JvYW4pOwogCXJldHVybiAqdGhpczsKICAgICAgIH0KIApAQCAtODM4LDMwICs5 MzgsNTMgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KIAogICAgICAgLy8g SW5zZXJ0IGEgbm9kZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgYnVja2V0LgogICAgICAgdm9p ZAotICAgICAgX01faW5zZXJ0X2J1Y2tldF9iZWdpbihzaXplX3R5cGUgX19ia3QsIF9fbm9k ZV9wdHIgX19ub2RlKQorICAgICAgX01faW5zZXJ0X2J1Y2tldF9iZWdpbihfSGludFBvbGlj eSYgX19oaW50X3BvbGljeSwKKwkJCSAgICAgc2l6ZV90eXBlIF9fYmt0LCBfX25vZGVfcHRy IF9fbm9kZSkKICAgICAgIHsKKwlfX25vZGVfYmFzZV9wdHIgX19wcmV2OwogCWlmIChfTV9i dWNrZXRzW19fYmt0XSkKIAkgIHsKIAkgICAgLy8gQnVja2V0IGlzIG5vdCBlbXB0eSwgd2Ug anVzdCBuZWVkIHRvIGluc2VydCB0aGUgbmV3IG5vZGUKIAkgICAgLy8gYWZ0ZXIgdGhlIGJ1 Y2tldCBiZWZvcmUgYmVnaW4uCi0JICAgIF9fbm9kZS0+X01fbnh0ID0gX01fYnVja2V0c1tf X2JrdF0tPl9NX254dDsKLQkgICAgX01fYnVja2V0c1tfX2JrdF0tPl9NX254dCA9IF9fbm9k ZTsKKwkgICAgX19wcmV2ID0gX01fYnVja2V0c1tfX2JrdF07CisJICAgIGlmICghX19wcmV2 LT5fTV9ueHQpCisJICAgICAgX19oaW50X3BvbGljeS5fTV9zZXRfbGFzdChfX25vZGUpOwog CSAgfQogCWVsc2UKIAkgIHsKLQkgICAgLy8gVGhlIGJ1Y2tldCBpcyBlbXB0eSwgdGhlIG5l dyBub2RlIGlzIGluc2VydGVkIGF0IHRoZQotCSAgICAvLyBiZWdpbm5pbmcgb2YgdGhlIHNp bmdseS1saW5rZWQgbGlzdCBhbmQgdGhlIGJ1Y2tldCB3aWxsCi0JICAgIC8vIGNvbnRhaW4g X01fYmVmb3JlX2JlZ2luIHBvaW50ZXIuCi0JICAgIF9fbm9kZS0+X01fbnh0ID0gX01fYmVm b3JlX2JlZ2luLl9NX254dDsKLQkgICAgX01fYmVmb3JlX2JlZ2luLl9NX254dCA9IF9fbm9k ZTsKLQotCSAgICBpZiAoX19ub2RlLT5fTV9ueHQpCi0JICAgICAgLy8gV2UgbXVzdCB1cGRh dGUgZm9ybWVyIGJlZ2luIGJ1Y2tldCB0aGF0IGlzIHBvaW50aW5nIHRvCi0JICAgICAgLy8g X01fYmVmb3JlX2JlZ2luLgotCSAgICAgIF9NX2J1Y2tldHNbX01fYnVja2V0X2luZGV4KCpf X25vZGUtPl9NX25leHQoKSldID0gX19ub2RlOwotCi0JICAgIF9NX2J1Y2tldHNbX19ia3Rd ID0gJl9NX2JlZm9yZV9iZWdpbjsKKwkgICAgLy8gSWYgd2UgaGF2ZSBhIGhpbnQsIHRoZSBs YXN0IGNvbnRhaW5lciBub2RlLCBpbnNlcnQgYWZ0ZXIuCisJICAgIF9fbm9kZV9wdHIgX19o aW50ID0gX19oaW50X3BvbGljeS5fTV9nZXRfaGludCgpOworCSAgICBpZiAoX19oaW50KQor CSAgICAgIHsKKwkJX19wcmV2ID0gX19oaW50OworCQlfX2hpbnRfcG9saWN5Ll9NX3NldF9s YXN0KF9fbm9kZSk7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQkvLyBUaGUg YnVja2V0IGlzIGVtcHR5LCB0aGUgbmV3IG5vZGUgaXMgaW5zZXJ0ZWQgYXQgdGhlCisJCS8v IGJlZ2lubmluZyBvZiB0aGUgc2luZ2x5LWxpbmtlZCBsaXN0IGFuZCB0aGUgYnVja2V0IHdp bGwKKwkJLy8gY29udGFpbiBfTV9iZWZvcmVfYmVnaW4gcG9pbnRlci4KKwkJX19wcmV2ID0g Jl9NX2JlZm9yZV9iZWdpbjsKKworCQlpZiAoX19wcmV2LT5fTV9ueHQpCisJCSAgeworCQkg ICAgLy8gV2UgbXVzdCB1cGRhdGUgZm9ybWVyIGJlZ2luIGJ1Y2tldCB0aGF0IGlzIHBvaW50 aW5nIHRvCisJCSAgICAvLyBfTV9iZWZvcmVfYmVnaW4uCisJCSAgICBzaXplX3R5cGUgX19i Yl9ia3QgPSBfX2hpbnRfcG9saWN5Ll9NX2dldF9iYmVnaW5fYmt0KAorCQkgICAgICBzdGF0 aWNfY2FzdDxfX25vZGVfcHRyPihfX3ByZXYtPl9NX254dCkpOworCQkgICAgX01fYnVja2V0 c1tfX2JiX2JrdF0gPSBfX25vZGU7CisJCSAgfQorCQllbHNlCisJCSAgX19oaW50X3BvbGlj eS5fTV9zZXRfbGFzdChfX25vZGUpOworCisJCV9faGludF9wb2xpY3kuX01fc3RvcmVfYmJl Z2luX2JrdChfX2JrdCk7CisJICAgICAgfQorCisJICAgIF9NX2J1Y2tldHNbX19ia3RdID0g X19wcmV2OwogCSAgfQorCisJX19ub2RlLT5fTV9ueHQgPSBfX3ByZXYtPl9NX254dDsKKwlf X3ByZXYtPl9NX254dCA9IF9fbm9kZTsKICAgICAgIH0KIAogICAgICAgLy8gUmVtb3ZlIHRo ZSBidWNrZXQgZmlyc3Qgbm9kZQpAQCAtODg3LDQ0ICsxMDEwLDc2IEBAIF9HTElCQ1hYX0JF R0lOX05BTUVTUEFDRV9WRVJTSU9OCiAgICAgICBfX25vZGVfYmFzZV9wdHIKICAgICAgIF9N X2dldF9wcmV2aW91c19ub2RlKHNpemVfdHlwZSBfX2JrdCwgX19ub2RlX3B0ciBfX24pOwog Ci0gICAgICBwYWlyPF9fbm9kZV9wdHIsIF9faGFzaF9jb2RlPgotICAgICAgX01fY29tcHV0 ZV9oYXNoX2NvZGUoX19ub2RlX3B0ciBfX2hpbnQsIGNvbnN0IGtleV90eXBlJiBfX2spIGNv bnN0OworICAgICAgc3RydWN0IF9JbnNlcnRJbmZvCisgICAgICB7CisJX19ub2RlX2Jhc2Vf cHRyCV9NX3ByZXY7CisJX19ub2RlX3B0cglfTV9lcXVpX247CisJX19oYXNoX2NvZGUJX01f Y29kZTsKKyAgICAgIH07CisKKyAgICAgIF9JbnNlcnRJbmZvCisgICAgICBfTV9nZXRfaW5z ZXJ0X2luZm8oX0hpbnRQb2xpY3kmIF9faGludF9wb2xpY3ksIGNvbnN0IGtleV90eXBlJiBf X2ssCisJCQkgX19ub2RlX3B0ciBfX24gPSBudWxscHRyKSBjb25zdDsKIAogICAgICAgLy8g SW5zZXJ0IG5vZGUgX19uIHdpdGggaGFzaCBjb2RlIF9fY29kZSwgaW4gYnVja2V0IF9fYmt0 IGlmIG5vCiAgICAgICAvLyByZWhhc2ggKGFzc3VtZXMgbm8gZWxlbWVudCB3aXRoIHNhbWUg a2V5IGFscmVhZHkgcHJlc2VudCkuCiAgICAgICAvLyBUYWtlcyBvd25lcnNoaXAgb2YgX19u IGlmIGluc2VydGlvbiBzdWNjZWVkcywgdGhyb3dzIG90aGVyd2lzZS4KICAgICAgIGl0ZXJh dG9yCi0gICAgICBfTV9pbnNlcnRfdW5pcXVlX25vZGUoc2l6ZV90eXBlIF9fYmt0LCBfX2hh c2hfY29kZSwKKyAgICAgIF9NX2luc2VydF91bmlxdWVfbm9kZShfSGludFBvbGljeSYgX19o aW50X3BvbGljeSwKKwkJCSAgICBzaXplX3R5cGUgX19ia3QsIF9faGFzaF9jb2RlLAogCQkJ ICAgIF9fbm9kZV9wdHIgX19uLCBzaXplX3R5cGUgX19uX2VsdCA9IDEpOwogCi0gICAgICAv LyBJbnNlcnQgbm9kZSBfX24gd2l0aCBrZXkgX19rIGFuZCBoYXNoIGNvZGUgX19jb2RlLgor ICAgICAgLy8gSW5zZXJ0IG5vZGUgX19uIGFmdGVyIF9fcHJldiBpZiBhbnkuCiAgICAgICAv LyBUYWtlcyBvd25lcnNoaXAgb2YgX19uIGlmIGluc2VydGlvbiBzdWNjZWVkcywgdGhyb3dz IG90aGVyd2lzZS4KICAgICAgIGl0ZXJhdG9yCi0gICAgICBfTV9pbnNlcnRfbXVsdGlfbm9k ZShfX25vZGVfcHRyIF9faGludCwKLQkJCSAgIF9faGFzaF9jb2RlIF9fY29kZSwgX19ub2Rl X3B0ciBfX24pOworICAgICAgX01faW5zZXJ0X211bHRpX25vZGUoX0hpbnRQb2xpY3kmIF9f aGludF9wb2xpY3ksCisJCQkgICBjb25zdCBfSW5zZXJ0SW5mbyYgX19pbmZvLCBfX25vZGVf cHRyIF9fbik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXN0ZDo6 cGFpcjxpdGVyYXRvciwgYm9vbD4KKwlfTV9lbXBsYWNlX3VuaXF1ZShfSGludFBvbGljeSYs IF9BcmdzJiYuLi4gX19hcmdzKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0Fy Z3M+CisJaXRlcmF0b3IKKwlfTV9lbXBsYWNlX211bHRpKF9IaW50UG9saWN5JiwgX0FyZ3Mm Ji4uLiBfX2FyZ3MpOwogCiAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KIAlz dGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+Ci0JX01fZW1wbGFjZSh0cnVlX3R5cGUgX191a3Ms IF9BcmdzJiYuLi4gX19hcmdzKTsKKwlfTV9lbXBsYWNlKHRydWVfdHlwZSAvKl9fdWtzKi8s IF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIGF1dG8gX19oaW50X3BvbGljeSA9IF9NX2dl dF9oaW50X3BvbGljeSgpOworCSAgcmV0dXJuIF9NX2VtcGxhY2VfdW5pcXVlKF9faGludF9w b2xpY3ksCisJCQkJICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwl9CiAK ICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgogCWl0ZXJhdG9yCi0JX01fZW1w bGFjZShmYWxzZV90eXBlIF9fdWtzLCBfQXJncyYmLi4uIF9fYXJncykKLQl7IHJldHVybiBf TV9lbXBsYWNlKGNlbmQoKSwgX191a3MsIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4u Lik7IH0KKwlfTV9lbXBsYWNlKGZhbHNlX3R5cGUgLypfX3VrcyovLCBfQXJncyYmLi4uIF9f YXJncykKKwl7CisJICBhdXRvIF9faGludF9wb2xpY3kgPSBfTV9nZXRfaGludF9wb2xpY3ko KTsKKwkgIHJldHVybiBfTV9lbXBsYWNlX211bHRpKF9faGludF9wb2xpY3ksCisJCQkJICBz dGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCX0KIAotICAgICAgLy8gRW1wbGFj ZSB3aXRoIGhpbnQsIHVzZWxlc3Mgd2hlbiBrZXlzIGFyZSB1bmlxdWUuCiAgICAgICB0ZW1w bGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KIAlpdGVyYXRvcgotCV9NX2VtcGxhY2UoY29uc3Rf aXRlcmF0b3IsIHRydWVfdHlwZSBfX3VrcywgX0FyZ3MmJi4uLiBfX2FyZ3MpCi0JeyByZXR1 cm4gX01fZW1wbGFjZShfX3Vrcywgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKS5m aXJzdDsgfQorCV9NX2VtcGxhY2UoX0hpbnRQb2xpY3kmIF9faGludF9wb2xpY3ksCisJCSAg IHRydWVfdHlwZSAvKl9fdWtzKi8sIF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIHJldHVy biBfTV9lbXBsYWNlX3VuaXF1ZShfX2hpbnRfcG9saWN5LAorCQkJCSAgIHN0ZDo6Zm9yd2Fy ZDxfQXJncz4oX19hcmdzKS4uLikuZmlyc3Q7CisJfQogCiAgICAgICB0ZW1wbGF0ZTx0eXBl bmFtZS4uLiBfQXJncz4KIAlpdGVyYXRvcgotCV9NX2VtcGxhY2UoY29uc3RfaXRlcmF0b3Is IGZhbHNlX3R5cGUgX191a3MsIF9BcmdzJiYuLi4gX19hcmdzKTsKKwlfTV9lbXBsYWNlKF9I aW50UG9saWN5JiBfX2hpbnRfcG9saWN5LAorCQkgICBmYWxzZV90eXBlIC8qX191a3MqLywg X0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyByZXR1cm4gX01fZW1wbGFjZV9tdWx0aShfX2hpbnRf cG9saWN5LCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CiAKICAgICAgIHRl bXBsYXRlPHR5cGVuYW1lIF9LdCwgdHlwZW5hbWUgX0FyZywgdHlwZW5hbWUgX05vZGVHZW5l cmF0b3I+CiAJc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgotCV9NX2luc2VydF91bmlxdWUo X0t0JiYsIF9BcmcmJiwgX05vZGVHZW5lcmF0b3ImKTsKKwlfTV9pbnNlcnRfdW5pcXVlKF9I aW50UG9saWN5JiBfX2hpbnRfcG9saWN5LAorCQkJIF9LdCYmLCBfQXJnJiYsIF9Ob2RlR2Vu ZXJhdG9yJik7CiAKICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LdD4KIAlzdGF0aWMgX19j b25kaXRpb25hbF90PApAQCAtOTQ0LDkgKzEwOTksMTAgQEAgX0dMSUJDWFhfQkVHSU5fTkFN RVNQQUNFX1ZFUlNJT04KIAogICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZywgdHlwZW5h bWUgX05vZGVHZW5lcmF0b3I+CiAJc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgotCV9NX2lu c2VydF91bmlxdWVfYXV4KF9BcmcmJiBfX2FyZywgX05vZGVHZW5lcmF0b3ImIF9fbm9kZV9n ZW4pCisJX01faW5zZXJ0X3VuaXF1ZV9hdXgoX0hpbnRQb2xpY3kmIF9faGludF9wb2xpY3ks CisJCQkgICAgIF9BcmcmJiBfX2FyZywgX05vZGVHZW5lcmF0b3ImIF9fbm9kZV9nZW4pCiAJ ewotCSAgcmV0dXJuIF9NX2luc2VydF91bmlxdWUoCisJICByZXR1cm4gX01faW5zZXJ0X3Vu aXF1ZShfX2hpbnRfcG9saWN5LAogCSAgICBfU19mb3J3YXJkX2tleShfRXh0cmFjdEtleXt9 KHN0ZDo6Zm9yd2FyZDxfQXJnPihfX2FyZykpKSwKIAkgICAgc3RkOjpmb3J3YXJkPF9Bcmc+ KF9fYXJnKSwgX19ub2RlX2dlbik7CiAJfQpAQCAtOTU2LDkgKzExMTIsMTAgQEAgX0dMSUJD WFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KIAlfTV9pbnNlcnQoX0FyZyYmIF9fYXJnLCBf Tm9kZUdlbmVyYXRvciYgX19ub2RlX2dlbiwKIAkJICB0cnVlX3R5cGUgLyogX191a3MgKi8p CiAJeworCSAgYXV0byBfX2hpbnRfcG9saWN5ID0gX01fZ2V0X2hpbnRfcG9saWN5KCk7CiAJ ICB1c2luZyBfX3RvX3ZhbHVlCiAJICAgID0gX19kZXRhaWw6Ol9Db252ZXJ0VG9WYWx1ZVR5 cGU8X0V4dHJhY3RLZXksIHZhbHVlX3R5cGU+OwotCSAgcmV0dXJuIF9NX2luc2VydF91bmlx dWVfYXV4KAorCSAgcmV0dXJuIF9NX2luc2VydF91bmlxdWVfYXV4KF9faGludF9wb2xpY3ks CiAJICAgIF9fdG9fdmFsdWV7fShzdGQ6OmZvcndhcmQ8X0FyZz4oX19hcmcpKSwgX19ub2Rl X2dlbik7CiAJfQogCkBAIC05NjcsMzIgKzExMjQsMzUgQEAgX0dMSUJDWFhfQkVHSU5fTkFN RVNQQUNFX1ZFUlNJT04KIAlfTV9pbnNlcnQoX0FyZyYmIF9fYXJnLCBfTm9kZUdlbmVyYXRv ciYgX19ub2RlX2dlbiwKIAkJICBmYWxzZV90eXBlIF9fdWtzKQogCXsKKwkgIGF1dG8gX19o aW50X3BvbGljeSA9IF9NX2dldF9oaW50X3BvbGljeSgpOwogCSAgdXNpbmcgX190b192YWx1 ZQogCSAgICA9IF9fZGV0YWlsOjpfQ29udmVydFRvVmFsdWVUeXBlPF9FeHRyYWN0S2V5LCB2 YWx1ZV90eXBlPjsKLQkgIHJldHVybiBfTV9pbnNlcnQoY2VuZCgpLAorCSAgcmV0dXJuIF9N X2luc2VydChfX2hpbnRfcG9saWN5LAogCSAgICBfX3RvX3ZhbHVle30oc3RkOjpmb3J3YXJk PF9Bcmc+KF9fYXJnKSksIF9fbm9kZV9nZW4sIF9fdWtzKTsKIAl9CiAKLSAgICAgIC8vIElu c2VydCB3aXRoIGhpbnQsIG5vdCB1c2VkIHdoZW4ga2V5cyBhcmUgdW5pcXVlLgorICAgICAg Ly8gSW5zZXJ0IHdpdGggaGludCB3aGVuIGtleXMgYXJlIHVuaXF1ZS4KICAgICAgIHRlbXBs YXRlPHR5cGVuYW1lIF9BcmcsIHR5cGVuYW1lIF9Ob2RlR2VuZXJhdG9yPgogCWl0ZXJhdG9y Ci0JX01faW5zZXJ0KGNvbnN0X2l0ZXJhdG9yLCBfQXJnJiYgX19hcmcsCi0JCSAgX05vZGVH ZW5lcmF0b3ImIF9fbm9kZV9nZW4sIHRydWVfdHlwZSBfX3VrcykKKwlfTV9pbnNlcnQoX0hp bnRQb2xpY3kmIF9faGludF9wb2xpY3ksIF9BcmcmJiBfX2FyZywKKwkJICBfTm9kZUdlbmVy YXRvciYgX19ub2RlX2dlbiwgdHJ1ZV90eXBlIC8qIF9fdWtzICovKQogCXsKLQkgIHJldHVy bgotCSAgICBfTV9pbnNlcnQoc3RkOjpmb3J3YXJkPF9Bcmc+KF9fYXJnKSwgX19ub2RlX2dl biwgX191a3MpLmZpcnN0OworCSAgdXNpbmcgX190b192YWx1ZQorCSAgICA9IF9fZGV0YWls OjpfQ29udmVydFRvVmFsdWVUeXBlPF9FeHRyYWN0S2V5LCB2YWx1ZV90eXBlPjsKKwkgIHJl dHVybiBfTV9pbnNlcnRfdW5pcXVlX2F1eChfX2hpbnRfcG9saWN5LAorCSAgICBfX3RvX3Zh bHVle30oc3RkOjpmb3J3YXJkPF9Bcmc+KF9fYXJnKSksIF9fbm9kZV9nZW4pLmZpcnN0Owog CX0KIAogICAgICAgLy8gSW5zZXJ0IHdpdGggaGludCB3aGVuIGtleXMgYXJlIG5vdCB1bmlx dWUuCiAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnLCB0eXBlbmFtZSBfTm9kZUdlbmVy YXRvcj4KIAlpdGVyYXRvcgotCV9NX2luc2VydChjb25zdF9pdGVyYXRvciwgX0FyZyYmLAor CV9NX2luc2VydChfSGludFBvbGljeSYgX19oaW50X3BvbGljeSwgX0FyZyYmIF9fYXJnLAog CQkgIF9Ob2RlR2VuZXJhdG9yJiwgZmFsc2VfdHlwZSBfX3Vrcyk7CiAKICAgICAgIHRlbXBs YXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfTm9kZUdlbmVyYXRvcj4K IAl2b2lkCiAJX01faW5zZXJ0X3JhbmdlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1 dEl0ZXJhdG9yIF9fbGFzdCwKLQkJCV9Ob2RlR2VuZXJhdG9yJik7CisJCQlfSGludFBvbGlj eSYsIF9Ob2RlR2VuZXJhdG9yJik7CiAKICAgICAgIHNpemVfdHlwZQogICAgICAgX01fZXJh c2UodHJ1ZV90eXBlIF9fdWtzLCBjb25zdCBrZXlfdHlwZSYpOwpAQCAtMTAxNCw3ICsxMTc0 LDggQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KIAlpdGVyYXRvcgogCWVt cGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX2hpbnQsIF9BcmdzJiYuLi4gX19hcmdzKQog CXsKLQkgIHJldHVybiBfTV9lbXBsYWNlKF9faGludCwgX191bmlxdWVfa2V5c3t9LAorCSAg YXV0byBfX2hpbnRfcG9saWN5ID0gX01fZ2V0X2hpbnRfcG9saWN5KF9faGludC5fTV9jdXIp OworCSAgcmV0dXJuIF9NX2VtcGxhY2UoX19oaW50X3BvbGljeSwgX191bmlxdWVfa2V5c3t9 LAogCQkJICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CiAJfQogCkBAIC0x MDQxLDcgKzEyMDIsMTEgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KIAog ICAgICAgLy8gU2V0IG51bWJlciBvZiBidWNrZXRzIGtlZXBpbmcgaXQgYXBwcm9wcmlhdGUg Zm9yIGNvbnRhaW5lcidzIG51bWJlcgogICAgICAgLy8gb2YgZWxlbWVudHMuCi0gICAgICB2 b2lkIHJlaGFzaChzaXplX3R5cGUgX19ia3RfY291bnQpOworICAgICAgdm9pZCByZWhhc2go c2l6ZV90eXBlIF9fYmt0X2NvdW50KQorICAgICAgeworCWF1dG8gX19oaW50X3BvbGljeSA9 IF9NX2dldF9oaW50X3BvbGljeSgpOworCV9NX3JlaGFzaChfX2hpbnRfcG9saWN5LCBfX2Jr dF9jb3VudCk7CisgICAgICB9CiAKICAgICAgIC8vIERSIDExODkuCiAgICAgICAvLyByZXNl cnZlLCBpZiBwcmVzZW50LCBjb21lcyBmcm9tIF9SZWhhc2hfYmFzZS4KQEAgLTEwNDksNyAr MTIxNCw3IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAjaWYgX19jcGx1 c3BsdXMgPiAyMDE0MDJMCiAgICAgICAvLy8gUmUtaW5zZXJ0IGFuIGV4dHJhY3RlZCBub2Rl IGludG8gYSBjb250YWluZXIgd2l0aCB1bmlxdWUga2V5cy4KICAgICAgIGluc2VydF9yZXR1 cm5fdHlwZQotICAgICAgX01fcmVpbnNlcnRfbm9kZShub2RlX3R5cGUmJiBfX25oKQorICAg ICAgX01fcmVpbnNlcnRfbm9kZShjb25zdF9pdGVyYXRvciBfX2hpbnQsIG5vZGVfdHlwZSYm IF9fbmgpCiAgICAgICB7CiAJaW5zZXJ0X3JldHVybl90eXBlIF9fcmV0OwogCWlmIChfX25o LmVtcHR5KCkpCkBAIC0xMDU4LDE0ICsxMjIzLDIyIEBAIF9HTElCQ1hYX0JFR0lOX05BTUVT UEFDRV9WRVJTSU9OCiAJICB7CiAJICAgIF9fZ2xpYmN4eF9hc3NlcnQoZ2V0X2FsbG9jYXRv cigpID09IF9fbmguZ2V0X2FsbG9jYXRvcigpKTsKIAorCSAgICBhdXRvIF9faGludF9wb2xp Y3kgPSBfTV9nZXRfaGludF9wb2xpY3koX19oaW50Ll9NX2N1cik7CiAJICAgIF9fbm9kZV9w dHIgX19uID0gbnVsbHB0cjsKIAkgICAgY29uc3Qga2V5X3R5cGUmIF9fayA9IF9fbmguX01f a2V5KCk7CiAJICAgIGNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSBzaXplKCk7CiAJICAgIGlm IChfX3NpemUgPD0gX19zbWFsbF9zaXplX3RocmVzaG9sZCgpKQogCSAgICAgIHsKLQkJZm9y IChfX24gPSBfTV9iZWdpbigpOyBfX247IF9fbiA9IF9fbi0+X01fbmV4dCgpKQotCQkgIGlm ICh0aGlzLT5fTV9rZXlfZXF1YWxzKF9faywgKl9fbikpCi0JCSAgICBicmVhazsKKwkJX19u b2RlX3B0ciBfX2xhc3RfbiA9IG51bGxwdHI7CisJCWZvciAoX19uID0gX01fYmVnaW4oKTsg X19uOworCQkgICAgIF9fbGFzdF9uID0gX19uLCBfX24gPSBfX24tPl9NX25leHQoKSkKKwkJ ICB7CisJCSAgICBpZiAodGhpcy0+X01fa2V5X2VxdWFscyhfX2ssICpfX24pKQorCQkgICAg ICBicmVhazsKKwkJICB9CisKKwkJaWYgKCFfX24pCisJCSAgX19oaW50X3BvbGljeS5fTV9z ZXRfbGFzdChfX2xhc3Rfbik7CiAJICAgICAgfQogCiAJICAgIF9faGFzaF9jb2RlIF9fY29k ZTsKQEAgLTEwODYsOCArMTI1OSw4IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJT SU9OCiAJICAgICAgfQogCSAgICBlbHNlCiAJICAgICAgewotCQlfX3JldC5wb3NpdGlvbgot CQkgID0gX01faW5zZXJ0X3VuaXF1ZV9ub2RlKF9fYmt0LCBfX2NvZGUsIF9fbmguX01fcHRy KTsKKwkJX19yZXQucG9zaXRpb24gPSBfTV9pbnNlcnRfdW5pcXVlX25vZGUoCisJCSAgX19o aW50X3BvbGljeSwgX19ia3QsIF9fY29kZSwgX19uaC5fTV9wdHIpOwogCQlfX25oLl9NX3B0 ciA9IG51bGxwdHI7CiAJCV9fcmV0Lmluc2VydGVkID0gdHJ1ZTsKIAkgICAgICB9CkBAIC0x MTA0LDEwICsxMjc3LDEwIEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAK IAlfX2dsaWJjeHhfYXNzZXJ0KGdldF9hbGxvY2F0b3IoKSA9PSBfX25oLmdldF9hbGxvY2F0 b3IoKSk7CiAKKwlhdXRvIF9faGludF9wb2xpY3kgPSBfTV9nZXRfaGludF9wb2xpY3koX19o aW50Ll9NX2N1cik7CiAJY29uc3Qga2V5X3R5cGUmIF9fayA9IF9fbmguX01fa2V5KCk7Ci0J YXV0byBfX2NvZGUgPSB0aGlzLT5fTV9oYXNoX2NvZGUoX19rKTsKLQlhdXRvIF9fcmV0Ci0J ICA9IF9NX2luc2VydF9tdWx0aV9ub2RlKF9faGludC5fTV9jdXIsIF9fY29kZSwgX19uaC5f TV9wdHIpOworCWF1dG8gX19pbmZvID0gX01fZ2V0X2luc2VydF9pbmZvKF9faGludF9wb2xp Y3ksIF9fayk7CisJYXV0byBfX3JldCA9IF9NX2luc2VydF9tdWx0aV9ub2RlKF9faGludF9w b2xpY3ksIF9faW5mbywgX19uaC5fTV9wdHIpOwogCV9fbmguX01fcHRyID0gbnVsbHB0cjsK IAlyZXR1cm4gX19yZXQ7CiAgICAgICB9CkBAIC0xMTQ3LDYgKzEzMjAsMTggQEAgX0dMSUJD WFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KIAkgIHJldHVybiB0aGlzLT5fTV9oYXNoX2Nv ZGUoX19rKTsKIAl9CiAKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9IMj4KKwlfSW5zZXJ0 SW5mbworCV9NX2dldF9pbnNlcnRfaW5mbyhjb25zdCBfSDImLCBfSGludFBvbGljeSYgX19o aW50X3BvbGljeSwKKwkJCSAgIF9fbm9kZV9wdHIgX19uLCBjb25zdCBrZXlfdHlwZSYgX19r KQorCXsKKwkgIGlmIGNvbnN0ZXhwciAoc3RkOjppc19zYW1lX3Y8X0gyLCBfSGFzaD4pCisJ ICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc19lbXB0eV92PF9IYXNoPikKKwkgICAgICByZXR1 cm4gX01fZ2V0X2luc2VydF9pbmZvKF9faGludF9wb2xpY3ksIF9faywgX19uKTsKKworCSAg cmV0dXJuIF9NX2dldF9pbnNlcnRfaW5mbyhfX2hpbnRfcG9saWN5LCBfX2spOworCX0KKwog ICAgIHB1YmxpYzoKICAgICAgIC8vIEV4dHJhY3QgYSBub2RlLgogICAgICAgbm9kZV90eXBl CkBAIC0xMTc4LDYgKzEzNjMsNyBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lP TgogCSAgICAgIG5vZGVfdHlwZT4sICJOb2RlIHR5cGVzIGFyZSBjb21wYXRpYmxlIik7CiAJ ICBfX2dsaWJjeHhfYXNzZXJ0KGdldF9hbGxvY2F0b3IoKSA9PSBfX3NyYy5nZXRfYWxsb2Nh dG9yKCkpOwogCisJICBhdXRvIF9faGludF9wb2xpY3kgPSBfTV9nZXRfaGludF9wb2xpY3ko KTsKIAkgIGF1dG8gX19uX2VsdCA9IF9fc3JjLnNpemUoKTsKIAkgIGZvciAoYXV0byBfX2kg PSBfX3NyYy5jYmVnaW4oKSwgX19lbmQgPSBfX3NyYy5jZW5kKCk7IF9faSAhPSBfX2VuZDsp CiAJICAgIHsKQEAgLTExODYsOCArMTM3MiwxMCBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BB Q0VfVkVSU0lPTgogCSAgICAgIGNvbnN0IGtleV90eXBlJiBfX2sgPSBfRXh0cmFjdEtleXt9 KCpfX3Bvcyk7CiAJICAgICAgaWYgKF9fc2l6ZSA8PSBfX3NtYWxsX3NpemVfdGhyZXNob2xk KCkpCiAJCXsKKwkJICBfX25vZGVfcHRyIF9fbGFzdF9uID0gbnVsbHB0cjsKIAkJICBib29s IF9fZm91bmQgPSBmYWxzZTsKLQkJICBmb3IgKGF1dG8gX19uID0gX01fYmVnaW4oKTsgX19u OyBfX24gPSBfX24tPl9NX25leHQoKSkKKwkJICBmb3IgKGF1dG8gX19uID0gX01fYmVnaW4o KTsgX19uOworCQkgICAgICAgX19sYXN0X24gPSBfX24sIF9fbiA9IF9fbi0+X01fbmV4dCgp KQogCQkgICAgaWYgKHRoaXMtPl9NX2tleV9lcXVhbHMoX19rLCAqX19uKSkKIAkJICAgICAg ewogCQkJX19mb3VuZCA9IHRydWU7CkBAIC0xMjAwLDYgKzEzODgsOCBAQCBfR0xJQkNYWF9C RUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCQkJLS1fX25fZWx0OwogCQkgICAgICBjb250aW51 ZTsKIAkJICAgIH0KKwkJICBlbHNlCisJCSAgICBfX2hpbnRfcG9saWN5Ll9NX3NldF9sYXN0 KF9fbGFzdF9uKTsKIAkJfQogCiAJICAgICAgX19oYXNoX2NvZGUgX19jb2RlCkBAIC0xMjA5 LDcgKzEzOTksOCBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCQkgIHx8 IF9NX2ZpbmRfbm9kZShfX2JrdCwgX19rLCBfX2NvZGUpID09IG51bGxwdHIpCiAJCXsKIAkJ ICBhdXRvIF9fbmggPSBfX3NyYy5leHRyYWN0KF9fcG9zKTsKLQkJICBfTV9pbnNlcnRfdW5p cXVlX25vZGUoX19ia3QsIF9fY29kZSwgX19uaC5fTV9wdHIsIF9fbl9lbHQpOworCQkgIF9N X2luc2VydF91bmlxdWVfbm9kZSgKKwkJICAgIF9faGludF9wb2xpY3ksIF9fYmt0LCBfX2Nv ZGUsIF9fbmguX01fcHRyLCBfX25fZWx0KTsKIAkJICBfX25oLl9NX3B0ciA9IG51bGxwdHI7 CiAJCSAgX19uX2VsdCA9IDE7CiAJCX0KQEAgLTEyMjcsMjcgKzE0MTgsMjkgQEAgX0dMSUJD WFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KIAkgICAgICBub2RlX3R5cGU+LCAiTm9kZSB0 eXBlcyBhcmUgY29tcGF0aWJsZSIpOwogCSAgX19nbGliY3h4X2Fzc2VydChnZXRfYWxsb2Nh dG9yKCkgPT0gX19zcmMuZ2V0X2FsbG9jYXRvcigpKTsKIAotCSAgX19ub2RlX3B0ciBfX2hp bnQgPSBudWxscHRyOworCSAgYXV0byBfX2hpbnRfcG9saWN5ID0gX01fZ2V0X2hpbnRfcG9s aWN5KCk7CiAJICB0aGlzLT5yZXNlcnZlKHNpemUoKSArIF9fc3JjLnNpemUoKSk7CiAJICBm b3IgKGF1dG8gX19pID0gX19zcmMuY2JlZ2luKCksIF9fZW5kID0gX19zcmMuY2VuZCgpOyBf X2kgIT0gX19lbmQ7KQogCSAgICB7CiAJICAgICAgYXV0byBfX3BvcyA9IF9faSsrOwogCSAg ICAgIGNvbnN0IGtleV90eXBlJiBfX2sgPSBfRXh0cmFjdEtleXt9KCpfX3Bvcyk7Ci0JICAg ICAgX19oYXNoX2NvZGUgX19jb2RlCi0JCT0gX01fc3JjX2hhc2hfY29kZShfX3NyYy5oYXNo X2Z1bmN0aW9uKCksIF9faywgKl9fcG9zLl9NX2N1cik7CisJICAgICAgYXV0byBfX2luZm8g PSBfTV9nZXRfaW5zZXJ0X2luZm8oX19zcmMuaGFzaF9mdW5jdGlvbigpLAorCQkJCQlfX2hp bnRfcG9saWN5LCBfX3Bvcy5fTV9jdXIsIF9fayk7CiAJICAgICAgYXV0byBfX25oID0gX19z cmMuZXh0cmFjdChfX3Bvcyk7Ci0JICAgICAgX19oaW50ID0gX01faW5zZXJ0X211bHRpX25v ZGUoX19oaW50LCBfX2NvZGUsIF9fbmguX01fcHRyKS5fTV9jdXI7CisJICAgICAgX01faW5z ZXJ0X211bHRpX25vZGUoX19oaW50X3BvbGljeSwgX19pbmZvLCBfX25oLl9NX3B0cik7CiAJ ICAgICAgX19uaC5fTV9wdHIgPSBudWxscHRyOwogCSAgICB9CiAJfQogI2VuZGlmIC8vIEMr KzE3CiAKICAgICBwcml2YXRlOgorICAgICAgdm9pZCBfTV9yZWhhc2goX0hpbnRQb2xpY3km LCBzaXplX3R5cGUgX19ia3RfY291bnQpOworCiAgICAgICAvLyBIZWxwZXIgcmVoYXNoIG1l dGhvZCB1c2VkIHdoZW4ga2V5cyBhcmUgdW5pcXVlLgotICAgICAgdm9pZCBfTV9yZWhhc2go c2l6ZV90eXBlIF9fYmt0X2NvdW50LCB0cnVlX3R5cGUgX191a3MpOworICAgICAgdm9pZCBf TV9yZWhhc2goX0hpbnRQb2xpY3kmLCBzaXplX3R5cGUgX19ia3RfY291bnQsIHRydWVfdHlw ZSBfX3Vrcyk7CiAKICAgICAgIC8vIEhlbHBlciByZWhhc2ggbWV0aG9kIHVzZWQgd2hlbiBr ZXlzIGNhbiBiZSBub24tdW5pcXVlLgotICAgICAgdm9pZCBfTV9yZWhhc2goc2l6ZV90eXBl IF9fYmt0X2NvdW50LCBmYWxzZV90eXBlIF9fdWtzKTsKKyAgICAgIHZvaWQgX01fcmVoYXNo KF9IaW50UG9saWN5Jiwgc2l6ZV90eXBlIF9fYmt0X2NvdW50LCBmYWxzZV90eXBlIF9fdWtz KTsKICAgICB9OwogCiAgIC8vIERlZmluaXRpb25zIG9mIGNsYXNzIHRlbXBsYXRlIF9IYXNo dGFibGUncyBvdXQtb2YtbGluZSBtZW1iZXIgZnVuY3Rpb25zLgpAQCAtMTMwOCw4ICsxNTAx LDkgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KIAkgICAgX01fYnVja2V0 X2NvdW50ID0gX19ia3RfY291bnQ7CiAJICB9CiAKKwlhdXRvIF9faGludF9wb2xpY3kgPSBf TV9nZXRfaGludF9wb2xpY3koKTsKIAlfX2FsbG9jX25vZGVfZ2VuX3QgX19ub2RlX2dlbigq dGhpcyk7Ci0JX01faW5zZXJ0X3JhbmdlKF9fZiwgX19sLCBfX25vZGVfZ2VuKTsKKwlfTV9p bnNlcnRfcmFuZ2UoX19mLCBfX2wsIF9faGludF9wb2xpY3ksIF9fbm9kZV9nZW4pOwogICAg ICAgfQogCiAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlw ZW5hbWUgX0FsbG9jLApAQCAtMTQ1NCw2ICsxNjQ4LDggQEAgX0dMSUJDWFhfQkVHSU5fTkFN RVNQQUNFX1ZFUlNJT04KIAkJICBfTV9idWNrZXRzW19fYmt0XSA9IF9fcHJldl9uOwogCQlf X3ByZXZfbiA9IF9fdGhpc19uOwogCSAgICAgIH0KKworCSAgICBfTV9zZXRfbGFzdChfX3By ZXZfbik7CiAJICB9CiAJX19jYXRjaCguLi4pCiAJICB7CkBAIC0xNDc5LDYgKzE2NzUsNyBA QCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogICAgICAgX01fYnVja2V0cyA9 ICZfTV9zaW5nbGVfYnVja2V0OwogICAgICAgX01fYmVmb3JlX2JlZ2luLl9NX254dCA9IG51 bGxwdHI7CiAgICAgICBfTV9lbGVtZW50X2NvdW50ID0gMDsKKyAgICAgIF9NX3NldF9sYXN0 KG51bGxwdHIpOwogICAgIH0KIAogICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFt ZSBfVmFsdWUsIHR5cGVuYW1lIF9BbGxvYywKQEAgLTE1MDksOSArMTcwNiwxMSBAQCBfR0xJ QkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogICAgICAgX01fYmVmb3JlX2JlZ2luLl9N X254dCA9IF9faHQuX01fYmVmb3JlX2JlZ2luLl9NX254dDsKICAgICAgIF9NX2VsZW1lbnRf Y291bnQgPSBfX2h0Ll9NX2VsZW1lbnRfY291bnQ7CiAgICAgICBzdGQ6Ol9fYWxsb2Nfb25f bW92ZSh0aGlzLT5fTV9ub2RlX2FsbG9jYXRvcigpLCBfX2h0Ll9NX25vZGVfYWxsb2NhdG9y KCkpOworICAgICAgX01fc2V0X2xhc3QoX19odC5fTV9nZXRfbGFzdCgpKTsKIAogICAgICAg Ly8gRml4IGJ1Y2tldCBjb250YWluaW5nIHRoZSBfTV9iZWZvcmVfYmVnaW4gcG9pbnRlciB0 aGF0IGNhbid0IGJlIG1vdmVkLgogICAgICAgX01fdXBkYXRlX2JiZWdpbigpOworCiAgICAg ICBfX2h0Ll9NX3Jlc2V0KCk7CiAgICAgfQogCkBAIC0xNTc1LDYgKzE3NzQsOSBAQCBfR0xJ QkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogICAgICAgX01fYmVmb3JlX2JlZ2luKF9f aHQuX01fYmVmb3JlX2JlZ2luLl9NX254dCksCiAgICAgICBfTV9lbGVtZW50X2NvdW50KF9f aHQuX01fZWxlbWVudF9jb3VudCksCiAgICAgICBfTV9yZWhhc2hfcG9saWN5KF9faHQuX01f cmVoYXNoX3BvbGljeSkKKyNpZiBfR0xJQkNYWF9JTkxJTkVfVkVSU0lPTgorICAgICwgX01f bGFzdChfX2h0Ll9NX2xhc3QpCisjZW5kaWYKICAgICB7CiAgICAgICAvLyBVcGRhdGUgYnVj a2V0cyBpZiBfX2h0IGlzIHVzaW5nIGl0cyBzaW5nbGUgYnVja2V0LgogICAgICAgaWYgKF9f aHQuX01fdXNlc19zaW5nbGVfYnVja2V0KCkpCkBAIC0xNjM4LDYgKzE4NDAsOCBAQCBfR0xJ QkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCSAgZWxzZQogCSAgICBfTV9idWNrZXRz ID0gX19odC5fTV9idWNrZXRzOwogCisJICBfTV9zZXRfbGFzdChfX2h0Ll9NX2dldF9sYXN0 KCkpOworCiAJICAvLyBGaXggYnVja2V0IGNvbnRhaW5pbmcgdGhlIF9NX2JlZm9yZV9iZWdp biBwb2ludGVyIHRoYXQgY2FuJ3QgYmUKIAkgIC8vIG1vdmVkLgogCSAgX01fdXBkYXRlX2Ji ZWdpbihfX2h0Ll9NX2JlZ2luKCkpOwpAQCAtMjE0Nyw3ICsyMzUxLDcgQEAgX0dMSUJDWFhf QkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KICAgICAgIGF1dG8KICAgICAgIF9IYXNodGFibGU8 X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCiAJCSBfSGFzaCwg X1JhbmdlSGFzaCwgX1VudXNlZCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgotICAgICAg X01fZW1wbGFjZSh0cnVlX3R5cGUgLyogX191a3MgKi8sIF9BcmdzJiYuLi4gX19hcmdzKQor ICAgICAgX01fZW1wbGFjZV91bmlxdWUoX0hpbnRQb2xpY3kmIF9faGludF9wb2xpY3ksIF9B cmdzJiYuLi4gX19hcmdzKQogICAgICAgLT4gcGFpcjxpdGVyYXRvciwgYm9vbD4KICAgICAg IHsKIAkvLyBGaXJzdCBidWlsZCB0aGUgbm9kZSB0byBnZXQgYWNjZXNzIHRvIHRoZSBoYXNo IGNvZGUKQEAgLTIxNTYsMTAgKzIzNjAsMTQgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNF X1ZFUlNJT04KIAljb25zdCBzaXplX3R5cGUgX19zaXplID0gc2l6ZSgpOwogCWlmIChfX3Np emUgPD0gX19zbWFsbF9zaXplX3RocmVzaG9sZCgpKQogCSAgewotCSAgICBmb3IgKGF1dG8g X19pdCA9IF9NX2JlZ2luKCk7IF9faXQ7IF9faXQgPSBfX2l0LT5fTV9uZXh0KCkpCi0JICAg ICAgaWYgKHRoaXMtPl9NX2tleV9lcXVhbHMoX19rLCAqX19pdCkpCisJICAgIF9fbm9kZV9w dHIgX19sYXN0X24gPSBudWxscHRyOworCSAgICBmb3IgKGF1dG8gX19uID0gX01fYmVnaW4o KTsgX19uOworCQkgX19sYXN0X24gPSBfX24sIF9fbiA9IF9fbi0+X01fbmV4dCgpKQorCSAg ICAgIGlmICh0aGlzLT5fTV9rZXlfZXF1YWxzKF9faywgKl9fbikpCiAJCS8vIFRoZXJlIGlz IGFscmVhZHkgYW4gZXF1aXZhbGVudCBub2RlLCBubyBpbnNlcnRpb24KLQkJcmV0dXJuIHsg aXRlcmF0b3IoX19pdCksIGZhbHNlIH07CisJCXJldHVybiB7IGl0ZXJhdG9yKF9fbiksIGZh bHNlIH07CisKKwkgICAgX19oaW50X3BvbGljeS5fTV9zZXRfbGFzdChfX2xhc3Rfbik7CiAJ ICB9CiAKIAlfX2hhc2hfY29kZSBfX2NvZGUgPSB0aGlzLT5fTV9oYXNoX2NvZGUoX19rKTsK QEAgLTIxNzAsNyArMjM3OCw4IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9O CiAJICAgIHJldHVybiB7IGl0ZXJhdG9yKF9fcCksIGZhbHNlIH07CiAKIAkvLyBJbnNlcnQg dGhlIG5vZGUKLQlhdXRvIF9fcG9zID0gX01faW5zZXJ0X3VuaXF1ZV9ub2RlKF9fYmt0LCBf X2NvZGUsIF9fbm9kZS5fTV9ub2RlKTsKKwlhdXRvIF9fcG9zID0gX01faW5zZXJ0X3VuaXF1 ZV9ub2RlKF9faGludF9wb2xpY3ksIF9fYmt0LCBfX2NvZGUsCisJCQkJCSAgIF9fbm9kZS5f TV9ub2RlKTsKIAlfX25vZGUuX01fbm9kZSA9IG51bGxwdHI7CiAJcmV0dXJuIHsgX19wb3Ms IHRydWUgfTsKICAgICAgIH0KQEAgLTIxODMsMTcgKzIzOTIsMTUgQEAgX0dMSUJDWFhfQkVH SU5fTkFNRVNQQUNFX1ZFUlNJT04KICAgICAgIGF1dG8KICAgICAgIF9IYXNodGFibGU8X0tl eSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCiAJCSBfSGFzaCwgX1Jh bmdlSGFzaCwgX1VudXNlZCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgotICAgICAgX01f ZW1wbGFjZShjb25zdF9pdGVyYXRvciBfX2hpbnQsIGZhbHNlX3R5cGUgLyogX191a3MgKi8s Ci0JCSBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIF9NX2VtcGxhY2VfbXVsdGkoX0hpbnRQ b2xpY3kmIF9faGludF9wb2xpY3ksIF9BcmdzJiYuLi4gX19hcmdzKQogICAgICAgLT4gaXRl cmF0b3IKICAgICAgIHsKIAkvLyBGaXJzdCBidWlsZCB0aGUgbm9kZSB0byBnZXQgaXRzIGhh c2ggY29kZS4KIAlfU2NvcGVkX25vZGUgX19ub2RlIHsgdGhpcywgc3RkOjpmb3J3YXJkPF9B cmdzPihfX2FyZ3MpLi4uICB9OwogCWNvbnN0IGtleV90eXBlJiBfX2sgPSBfRXh0cmFjdEtl eXt9KF9fbm9kZS5fTV9ub2RlLT5fTV92KCkpOwogCi0JYXV0byBfX3JlcyA9IHRoaXMtPl9N X2NvbXB1dGVfaGFzaF9jb2RlKF9faGludC5fTV9jdXIsIF9fayk7Ci0JYXV0byBfX3Bvcwot CSAgPSBfTV9pbnNlcnRfbXVsdGlfbm9kZShfX3Jlcy5maXJzdCwgX19yZXMuc2Vjb25kLCBf X25vZGUuX01fbm9kZSk7CisJYXV0byBfX2luZm8gPSBfTV9nZXRfaW5zZXJ0X2luZm8oX19o aW50X3BvbGljeSwgX19rKTsKKwlhdXRvIF9fcG9zID0gX01faW5zZXJ0X211bHRpX25vZGUo X19oaW50X3BvbGljeSwgX19pbmZvLCBfX25vZGUuX01fbm9kZSk7CiAJX19ub2RlLl9NX25v ZGUgPSBudWxscHRyOwogCXJldHVybiBfX3BvczsKICAgICAgIH0KQEAgLTIyMDUsMjYgKzI0 MTIsMzIgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KICAgICBhdXRvCiAg ICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVh bCwKIAkgICAgICAgX0hhc2gsIF9SYW5nZUhhc2gsIF9VbnVzZWQsIF9SZWhhc2hQb2xpY3ks IF9UcmFpdHM+OjoKLSAgICBfTV9jb21wdXRlX2hhc2hfY29kZShfX25vZGVfcHRyIF9faGlu dCwgY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKLSAgICAtPiBwYWlyPF9fbm9kZV9wdHIs IF9faGFzaF9jb2RlPgorICAgIF9NX2dldF9pbnNlcnRfaW5mbyhfSGludFBvbGljeSYgX19o aW50X3BvbGljeSwgY29uc3Qga2V5X3R5cGUmIF9faywKKwkJICAgICAgIF9fbm9kZV9wdHIg X19lcXVpX24pIGNvbnN0CisgICAgLT4gX0luc2VydEluZm8KICAgICB7CiAgICAgICBpZiAo c2l6ZSgpIDw9IF9fc21hbGxfc2l6ZV90aHJlc2hvbGQoKSkKIAl7Ci0JICBpZiAoX19oaW50 KQotCSAgICB7Ci0JICAgICAgZm9yIChhdXRvIF9faXQgPSBfX2hpbnQ7IF9faXQ7IF9faXQg PSBfX2l0LT5fTV9uZXh0KCkpCi0JCWlmICh0aGlzLT5fTV9rZXlfZXF1YWxzKF9faywgKl9f aXQpKQotCQkgIHJldHVybiB7IF9faXQsIHRoaXMtPl9NX2hhc2hfY29kZSgqX19pdCkgfTsK LQkgICAgfQotCi0JICBmb3IgKGF1dG8gX19pdCA9IF9NX2JlZ2luKCk7IF9faXQgIT0gX19o aW50OyBfX2l0ID0gX19pdC0+X01fbmV4dCgpKQotCSAgICBpZiAodGhpcy0+X01fa2V5X2Vx dWFscyhfX2ssICpfX2l0KSkKLQkgICAgICByZXR1cm4geyBfX2l0LCB0aGlzLT5fTV9oYXNo X2NvZGUoKl9faXQpIH07CisJICBfX25vZGVfcHRyIF9fbGFzdF9uID0gbnVsbHB0cjsKKwkg IF9fbm9kZV9iYXNlX3B0ciBfX3ByZXYKKwkgICAgPSBjb25zdF9jYXN0PF9fbm9kZV9iYXNl X3B0cj4oJl9NX2JlZm9yZV9iZWdpbik7CisJICBmb3IgKGF1dG8gX19uID0gc3RhdGljX2Nh c3Q8X19ub2RlX3B0cj4oX19wcmV2LT5fTV9ueHQpOyBfX247CisJICAgICAgIF9fcHJldiA9 IF9fbGFzdF9uID0gX19uLCBfX24gPSBfX24tPl9NX25leHQoKSkKKwkgICAgaWYgKHRoaXMt Pl9NX2tleV9lcXVhbHMoX19rLCAqX19uKSkKKwkgICAgICByZXR1cm4KKwkJeworCQkgIF9f cHJldiwgX19uLAorCQkgIF9faGFzaF9jYWNoZWQ6OnZhbHVlID8gdGhpcy0+X01faGFzaF9j b2RlKCpfX24pIDogMAorCQl9OwogCi0JICBfX2hpbnQgPSBudWxscHRyOworCSAgX19oaW50 X3BvbGljeS5fTV9zZXRfbGFzdChfX2xhc3Rfbik7CiAJfQogCi0gICAgICByZXR1cm4geyBf X2hpbnQsIHRoaXMtPl9NX2hhc2hfY29kZShfX2spIH07CisgICAgICByZXR1cm4KKwl7CisJ ICBudWxscHRyLCBudWxscHRyLAorCSAgX19lcXVpX24gPyB0aGlzLT5fTV9oYXNoX2NvZGUo Kl9fZXF1aV9uKSA6IHRoaXMtPl9NX2hhc2hfY29kZShfX2spCisJfTsKICAgICB9CiAKICAg dGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfQWxs b2MsCkBAIC0yMjM0LDcgKzI0NDcsOCBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVS U0lPTgogICAgIGF1dG8KICAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBf RXh0cmFjdEtleSwgX0VxdWFsLAogCSAgICAgICBfSGFzaCwgX1JhbmdlSGFzaCwgX1VudXNl ZCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgotICAgIF9NX2luc2VydF91bmlxdWVfbm9k ZShzaXplX3R5cGUgX19ia3QsIF9faGFzaF9jb2RlIF9fY29kZSwKKyAgICBfTV9pbnNlcnRf dW5pcXVlX25vZGUoX0hpbnRQb2xpY3kmIF9faGludF9wb2xpY3ksCisJCQkgIHNpemVfdHlw ZSBfX2JrdCwgX19oYXNoX2NvZGUgX19jb2RlLAogCQkJICBfX25vZGVfcHRyIF9fbm9kZSwg c2l6ZV90eXBlIF9fbl9lbHQpCiAgICAgLT4gaXRlcmF0b3IKICAgICB7CkBAIC0yMjQ1LDcg KzI0NTksNyBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCiAgICAgICBp ZiAoX19kb19yZWhhc2guZmlyc3QpCiAJewotCSAgX01fcmVoYXNoKF9fZG9fcmVoYXNoLnNl Y29uZCwgdHJ1ZV90eXBle30pOworCSAgX01fcmVoYXNoKF9faGludF9wb2xpY3ksIF9fZG9f cmVoYXNoLnNlY29uZCwgdHJ1ZV90eXBle30pOwogCSAgX19ia3QgPSBfTV9idWNrZXRfaW5k ZXgoX19jb2RlKTsKIAl9CiAKQEAgLTIyNTMsNyArMjQ2Nyw3IEBAIF9HTElCQ1hYX0JFR0lO X05BTUVTUEFDRV9WRVJTSU9OCiAgICAgICB0aGlzLT5fTV9zdG9yZV9jb2RlKCpfX25vZGUs IF9fY29kZSk7CiAKICAgICAgIC8vIEFsd2F5cyBpbnNlcnQgYXQgdGhlIGJlZ2lubmluZyBv ZiB0aGUgYnVja2V0LgotICAgICAgX01faW5zZXJ0X2J1Y2tldF9iZWdpbihfX2JrdCwgX19u b2RlKTsKKyAgICAgIF9NX2luc2VydF9idWNrZXRfYmVnaW4oX19oaW50X3BvbGljeSwgX19i a3QsIF9fbm9kZSk7CiAgICAgICArK19NX2VsZW1lbnRfY291bnQ7CiAgICAgICByZXR1cm4g aXRlcmF0b3IoX19ub2RlKTsKICAgICB9CkBAIC0yMjY1LDggKzI0NzksOCBAQCBfR0xJQkNY WF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogICAgIGF1dG8KICAgICBfSGFzaHRhYmxlPF9L ZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAogCSAgICAgICBfSGFz aCwgX1JhbmdlSGFzaCwgX1VudXNlZCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgotICAg IF9NX2luc2VydF9tdWx0aV9ub2RlKF9fbm9kZV9wdHIgX19oaW50LAotCQkJIF9faGFzaF9j b2RlIF9fY29kZSwgX19ub2RlX3B0ciBfX25vZGUpCisgICAgX01faW5zZXJ0X211bHRpX25v ZGUoX0hpbnRQb2xpY3kmIF9faGludF9wb2xpY3ksCisJCQkgY29uc3QgX0luc2VydEluZm8m IF9faW5mbywgX19ub2RlX3B0ciBfX25vZGUpCiAgICAgLT4gaXRlcmF0b3IKICAgICB7CiAg ICAgICBfX3JlaGFzaF9ndWFyZF90IF9fcmVoYXNoX2d1YXJkKF9NX3JlaGFzaF9wb2xpY3kp OwpAQCAtMjI3NCw0MiArMjQ4OCw1MyBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVS U0lPTgogCT0gX01fcmVoYXNoX3BvbGljeS5fTV9uZWVkX3JlaGFzaChfTV9idWNrZXRfY291 bnQsIF9NX2VsZW1lbnRfY291bnQsIDEpOwogCiAgICAgICBpZiAoX19kb19yZWhhc2guZmly c3QpCi0JX01fcmVoYXNoKF9fZG9fcmVoYXNoLnNlY29uZCwgZmFsc2VfdHlwZXt9KTsKKwlf TV9yZWhhc2goX19oaW50X3BvbGljeSwgX19kb19yZWhhc2guc2Vjb25kLCBmYWxzZV90eXBl e30pOwogCiAgICAgICBfX3JlaGFzaF9ndWFyZC5fTV9ndWFyZGVkX29iaiA9IG51bGxwdHI7 CisgICAgICBhdXRvIF9fY29kZSA9IF9faW5mby5fTV9jb2RlOwogICAgICAgdGhpcy0+X01f c3RvcmVfY29kZSgqX19ub2RlLCBfX2NvZGUpOwogICAgICAgY29uc3Qga2V5X3R5cGUmIF9f ayA9IF9FeHRyYWN0S2V5e30oX19ub2RlLT5fTV92KCkpOwotICAgICAgc2l6ZV90eXBlIF9f Ymt0ID0gX01fYnVja2V0X2luZGV4KF9fY29kZSk7CisgICAgICBhdXRvIF9fcHJldiA9IF9f aW5mby5fTV9wcmV2OworICAgICAgY29uc3QgYm9vbCBfX2hhc19wcmV2ID0gX19wcmV2ICE9 IG51bGxwdHI7CisgICAgICBzaXplX3R5cGUgX19ia3Q7CiAKICAgICAgIC8vIEZpbmQgdGhl IG5vZGUgYmVmb3JlIGFuIGVxdWl2YWxlbnQgb25lIG9yIHVzZSBoaW50IGlmIGl0IGV4aXN0 cyBhbmQKICAgICAgIC8vIGlmIGl0IGlzIGVxdWl2YWxlbnQuCi0gICAgICBfX25vZGVfYmFz ZV9wdHIgX19wcmV2Ci0JPSBfX2J1aWx0aW5fZXhwZWN0KF9faGludCAhPSBudWxscHRyLCBm YWxzZSkKLQkgICYmIHRoaXMtPl9NX2VxdWFscyhfX2ssIF9fY29kZSwgKl9faGludCkKLQkg ICAgPyBfX2hpbnQKLQkgICAgOiBfTV9maW5kX2JlZm9yZV9ub2RlKF9fYmt0LCBfX2ssIF9f Y29kZSk7CisgICAgICBpZiAoIV9faGFzX3ByZXYpCisJeworCSAgX19ia3QgPSBfTV9idWNr ZXRfaW5kZXgoX19jb2RlKTsKKwkgIF9fcHJldiA9IF9NX2ZpbmRfYmVmb3JlX25vZGUoX19i a3QsIF9faywgX19jb2RlKTsKKwl9CiAKICAgICAgIGlmIChfX3ByZXYpCiAJewogCSAgLy8g SW5zZXJ0IGFmdGVyIHRoZSBub2RlIGJlZm9yZSB0aGUgZXF1aXZhbGVudCBvbmUuCiAJICBf X25vZGUtPl9NX254dCA9IF9fcHJldi0+X01fbnh0OwogCSAgX19wcmV2LT5fTV9ueHQgPSBf X25vZGU7Ci0JICBpZiAoX19idWlsdGluX2V4cGVjdChfX3ByZXYgPT0gX19oaW50LCBmYWxz ZSkpCi0JICAgIC8vIGhpbnQgbWlnaHQgYmUgdGhlIGxhc3QgYnVja2V0IG5vZGUsIGluIHRo aXMgY2FzZSB3ZSBuZWVkIHRvCi0JICAgIC8vIHVwZGF0ZSBuZXh0IGJ1Y2tldC4KLQkgICAg aWYgKF9fbm9kZS0+X01fbnh0Ci0JCSYmICF0aGlzLT5fTV9lcXVhbHMoX19rLCBfX2NvZGUs ICpfX25vZGUtPl9NX25leHQoKSkpCi0JICAgICAgewotCQlzaXplX3R5cGUgX19uZXh0X2Jr dCA9IF9NX2J1Y2tldF9pbmRleCgqX19ub2RlLT5fTV9uZXh0KCkpOwotCQlpZiAoX19uZXh0 X2JrdCAhPSBfX2JrdCkKLQkJICBfTV9idWNrZXRzW19fbmV4dF9ia3RdID0gX19ub2RlOwot CSAgICAgIH0KKworCSAgLy8gX19oaW50IG1pZ2h0IGJlIHRoZSBsYXN0IGJ1Y2tldCBub2Rl LCBpbiB0aGlzIGNhc2Ugd2UgbmVlZCB0bworCSAgLy8gdXBkYXRlIG5leHQgYnVja2V0Lgor CSAgaWYgKF9faGFzX3ByZXYgJiYgX19ub2RlLT5fTV9ueHQgIT0gX19pbmZvLl9NX2VxdWlf bikKKwkgICAgeworCSAgICAgIGNvbnN0IGF1dG8gX19ueHQgPSBfX25vZGUtPl9NX25leHQo KTsKKwkgICAgICBpZiAoIXRoaXMtPl9NX2VxdWFscyhfX2ssIF9fY29kZSwgKl9fbnh0KSkK KwkJeworCQkgIHNpemVfdHlwZSBfX25leHRfYmt0ID0gX01fYnVja2V0X2luZGV4KCpfX254 dCk7CisJCSAgaWYgKF9fbmV4dF9ia3QgIT0gX01fYnVja2V0X2luZGV4KF9fY29kZSkpCisJ CSAgICBfTV9idWNrZXRzW19fbmV4dF9ia3RdID0gX19ub2RlOworCQl9CisJICAgIH0KKwor CSAgX19oaW50X3BvbGljeS5fTV9jaGVja2VkX3NldChfX25vZGUpOwogCX0KICAgICAgIGVs c2UKLQkvLyBUaGUgaW5zZXJ0ZWQgbm9kZSBoYXMgbm8gZXF1aXZhbGVudCBpbiB0aGUgaGFz aHRhYmxlLiBXZSBtdXN0Ci0JLy8gaW5zZXJ0IHRoZSBuZXcgbm9kZSBhdCB0aGUgYmVnaW5u aW5nIG9mIHRoZSBidWNrZXQgdG8gcHJlc2VydmUKLQkvLyBlcXVpdmFsZW50IGVsZW1lbnRz JyByZWxhdGl2ZSBwb3NpdGlvbnMuCi0JX01faW5zZXJ0X2J1Y2tldF9iZWdpbihfX2JrdCwg X19ub2RlKTsKKwl7CisJICAvLyBUaGUgaW5zZXJ0ZWQgbm9kZSBoYXMgbm8gZXF1aXZhbGVu dCBpbiB0aGUgaGFzaHRhYmxlLiBXZSBtdXN0CisJICAvLyBpbnNlcnQgdGhlIG5ldyBub2Rl IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1Y2tldCB0byBwcmVzZXJ2ZQorCSAgLy8gZXF1 aXZhbGVudCBlbGVtZW50cycgcmVsYXRpdmUgcG9zaXRpb25zLgorCSAgX01faW5zZXJ0X2J1 Y2tldF9iZWdpbihfX2hpbnRfcG9saWN5LCBfX2JrdCwgX19ub2RlKTsKKwl9CisKICAgICAg ICsrX01fZWxlbWVudF9jb3VudDsKICAgICAgIHJldHVybiBpdGVyYXRvcihfX25vZGUpOwog ICAgIH0KQEAgLTIzMjMsMTUgKzI1NDgsMjEgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNF X1ZFUlNJT04KICAgICAgIGF1dG8KICAgICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBf QWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCiAJCSBfSGFzaCwgX1JhbmdlSGFzaCwgX1Vu dXNlZCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgotICAgICAgX01faW5zZXJ0X3VuaXF1 ZShfS3QmJiBfX2ssIF9BcmcmJiBfX3YsCisgICAgICBfTV9pbnNlcnRfdW5pcXVlKF9IaW50 UG9saWN5JiBfX2hpbnRfcG9saWN5LCBfS3QmJiBfX2ssIF9BcmcmJiBfX3YsCiAJCSAgICAg ICBfTm9kZUdlbmVyYXRvciYgX19ub2RlX2dlbikKICAgICAgIC0+IHBhaXI8aXRlcmF0b3Is IGJvb2w+CiAgICAgICB7CiAJY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9IHNpemUoKTsKIAlp ZiAoX19zaXplIDw9IF9fc21hbGxfc2l6ZV90aHJlc2hvbGQoKSkKLQkgIGZvciAoYXV0byBf X2l0ID0gX01fYmVnaW4oKTsgX19pdDsgX19pdCA9IF9faXQtPl9NX25leHQoKSkKLQkgICAg aWYgKHRoaXMtPl9NX2tleV9lcXVhbHNfdHIoX19rLCAqX19pdCkpCi0JICAgICAgcmV0dXJu IHsgaXRlcmF0b3IoX19pdCksIGZhbHNlIH07CisJICB7CisJICAgIF9fbm9kZV9wdHIgX19s YXN0X24gPSBudWxscHRyOworCSAgICBmb3IgKGF1dG8gX19uID0gX01fYmVnaW4oKTsgX19u OworCQkgX19sYXN0X24gPSBfX24sIF9fbiA9IF9fbi0+X01fbmV4dCgpKQorCSAgICAgIGlm ICh0aGlzLT5fTV9rZXlfZXF1YWxzX3RyKF9faywgKl9fbikpCisJCXJldHVybiB7IGl0ZXJh dG9yKF9fbiksIGZhbHNlIH07CisKKwkgICAgX19oaW50X3BvbGljeS5fTV9zZXRfbGFzdChf X2xhc3Rfbik7CisJICB9CiAKIAlfX2hhc2hfY29kZSBfX2NvZGUgPSB0aGlzLT5fTV9oYXNo X2NvZGVfdHIoX19rKTsKIAlzaXplX3R5cGUgX19ia3QgPSBfTV9idWNrZXRfaW5kZXgoX19j b2RlKTsKQEAgLTIzNDYsOCArMjU3Nyw5IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9W RVJTSU9OCiAJCQkJICAgICBfX25vZGVfZ2VuKSwKIAkgIHRoaXMKIAl9OworCiAJYXV0byBf X3BvcwotCSAgPSBfTV9pbnNlcnRfdW5pcXVlX25vZGUoX19ia3QsIF9fY29kZSwgX19ub2Rl Ll9NX25vZGUpOworCSAgPSBfTV9pbnNlcnRfdW5pcXVlX25vZGUoX19oaW50X3BvbGljeSwg X19ia3QsIF9fY29kZSwgX19ub2RlLl9NX25vZGUpOwogCV9fbm9kZS5fTV9ub2RlID0gbnVs bHB0cjsKIAlyZXR1cm4geyBfX3BvcywgdHJ1ZSB9OwogICAgICAgfQpAQCAtMjM2MSwyMCAr MjU5MywxOSBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogICAgICAgYXV0 bwogICAgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXks IF9FcXVhbCwKIAkJIF9IYXNoLCBfUmFuZ2VIYXNoLCBfVW51c2VkLCBfUmVoYXNoUG9saWN5 LCBfVHJhaXRzPjo6Ci0gICAgICBfTV9pbnNlcnQoY29uc3RfaXRlcmF0b3IgX19oaW50LCBf QXJnJiYgX192LAotCQlfTm9kZUdlbmVyYXRvciYgX19ub2RlX2dlbiwKLQkJZmFsc2VfdHlw ZSAvKiBfX3VrcyAqLykKKyAgICAgIF9NX2luc2VydChfSGludFBvbGljeSYgX19oaW50X3Bv bGljeSwgX0FyZyYmIF9fdiwKKwkJX05vZGVHZW5lcmF0b3ImIF9fbm9kZV9nZW4sIGZhbHNl X3R5cGUgLyogX191a3MgKi8pCiAgICAgICAtPiBpdGVyYXRvcgogICAgICAgewogCS8vIEZp cnN0IGFsbG9jYXRlIG5ldyBub2RlIHNvIHRoYXQgd2UgZG9uJ3QgZG8gYW55dGhpbmcgaWYg aXQgdGhyb3dzLgotCV9TY29wZWRfbm9kZSBfX25vZGV7IF9fbm9kZV9nZW4oc3RkOjpmb3J3 YXJkPF9Bcmc+KF9fdikpLCB0aGlzIH07CisJX1Njb3BlZF9ub2RlIF9fbm9kZSB7IF9fbm9k ZV9nZW4oc3RkOjpmb3J3YXJkPF9Bcmc+KF9fdikpLCB0aGlzIH07CiAKIAkvLyBTZWNvbmQg Y29tcHV0ZSB0aGUgaGFzaCBjb2RlIHNvIHRoYXQgd2UgZG9uJ3QgcmVoYXNoIGlmIGl0IHRo cm93cy4KLQlhdXRvIF9fcmVzID0gdGhpcy0+X01fY29tcHV0ZV9oYXNoX2NvZGUoCi0JICBf X2hpbnQuX01fY3VyLCBfRXh0cmFjdEtleXt9KF9fbm9kZS5fTV9ub2RlLT5fTV92KCkpKTsK LQotCWF1dG8gX19wb3MKLQkgID0gX01faW5zZXJ0X211bHRpX25vZGUoX19yZXMuZmlyc3Qs IF9fcmVzLnNlY29uZCwgX19ub2RlLl9NX25vZGUpOworCWF1dG8gX19pbmZvID0KKwkgIF9N X2dldF9pbnNlcnRfaW5mbyhfX2hpbnRfcG9saWN5LAorCQkJICAgICBfRXh0cmFjdEtleXt9 KF9fbm9kZS5fTV9ub2RlLT5fTV92KCkpKTsKKwlhdXRvIF9fcG9zID0gX01faW5zZXJ0X211 bHRpX25vZGUoX19oaW50X3BvbGljeSwKKwkJCQkJICBfX2luZm8sIF9fbm9kZS5fTV9ub2Rl KTsKIAlfX25vZGUuX01fbm9kZSA9IG51bGxwdHI7CiAJcmV0dXJuIF9fcG9zOwogICAgICAg fQpAQCAtMjM4OCwxMCArMjYxOSwxMCBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVS U0lPTgogICAgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RL ZXksIF9FcXVhbCwKIAkJIF9IYXNoLCBfUmFuZ2VIYXNoLCBfVW51c2VkLCBfUmVoYXNoUG9s aWN5LCBfVHJhaXRzPjo6CiAgICAgICBfTV9pbnNlcnRfcmFuZ2UoX0lucHV0SXRlcmF0b3Ig X19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAotCQkgICAgICBfTm9kZUdlbmVyYXRv ciYgX19ub2RlX2dlbikKKwkJICAgICAgX0hpbnRQb2xpY3kmIF9faGludF9wb2xpY3ksIF9O b2RlR2VuZXJhdG9yJiBfX25vZGVfZ2VuKQogICAgICAgewogCWZvciAoOyBfX2ZpcnN0ICE9 IF9fbGFzdDsgKytfX2ZpcnN0KQotCSAgX01faW5zZXJ0KCpfX2ZpcnN0LCBfX25vZGVfZ2Vu LCBfX3VuaXF1ZV9rZXlze30pOworCSAgX01faW5zZXJ0KF9faGludF9wb2xpY3ksICpfX2Zp cnN0LCBfX25vZGVfZ2VuLCBfX3VuaXF1ZV9rZXlze30pOwogICAgICAgfQogCiAgIHRlbXBs YXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0FsbG9jLApA QCAtMjQzOCw3ICsyNjY5LDcgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04K ICAgICAgIGl0ZXJhdG9yIF9fcmVzdWx0KF9fbi0+X01fbmV4dCgpKTsKICAgICAgIHRoaXMt Pl9NX2RlYWxsb2NhdGVfbm9kZShfX24pOwogICAgICAgLS1fTV9lbGVtZW50X2NvdW50Owot CisgICAgICBfTV9jaGVja19mb3JfbGFzdChfX3ByZXZfbik7CiAgICAgICByZXR1cm4gX19y ZXN1bHQ7CiAgICAgfQogCkBAIC0yNTQ3LDcgKzI3NzgsOSBAQCBfR0xJQkNYWF9CRUdJTl9O QU1FU1BBQ0VfVkVSU0lPTgogCV9NX3JlbW92ZV9idWNrZXRfYmVnaW4oX19ia3QsIF9fbl9s YXN0LCBfX25fbGFzdF9ia3QpOwogICAgICAgZWxzZSBpZiAoX19uX2xhc3RfYmt0ICE9IF9f Ymt0KQogCV9NX2J1Y2tldHNbX19uX2xhc3RfYmt0XSA9IF9fcHJldl9uOworCiAgICAgICBf X3ByZXZfbi0+X01fbnh0ID0gX19uX2xhc3Q7CisgICAgICBfTV9jaGVja19mb3JfbGFzdChf X3ByZXZfbik7CiAgICAgICByZXR1cm4gX19yZXN1bHQ7CiAgICAgfQogCkBAIC0yNTk1LDYg KzI4MjgsNyBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogICAgICAgaWYg KF9fbiAmJiAoX19uX2JrdCAhPSBfX2JrdCB8fCBfX2lzX2J1Y2tldF9iZWdpbikpCiAJX01f YnVja2V0c1tfX25fYmt0XSA9IF9fcHJldl9uOwogICAgICAgX19wcmV2X24tPl9NX254dCA9 IF9fbjsKKyAgICAgIF9NX2NoZWNrX2Zvcl9sYXN0KF9fcHJldl9uKTsKICAgICAgIHJldHVy biBpdGVyYXRvcihfX24pOwogICAgIH0KIApAQCAtMjYxMiw2ICsyODQ2LDcgQEAgX0dMSUJD WFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KIAkJICAgICAgIF9NX2J1Y2tldF9jb3VudCAq IHNpemVvZihfX25vZGVfYmFzZV9wdHIpKTsKICAgICAgIF9NX2VsZW1lbnRfY291bnQgPSAw OwogICAgICAgX01fYmVmb3JlX2JlZ2luLl9NX254dCA9IG51bGxwdHI7CisgICAgICBfTV9z ZXRfbGFzdChudWxscHRyKTsKICAgICB9CiAKICAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwg dHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfQWxsb2MsCkBAIC0yNjIxLDcgKzI4NTYsNyBA QCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogICAgIHZvaWQKICAgICBfSGFz aHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAogCSAg ICAgICBfSGFzaCwgX1JhbmdlSGFzaCwgX1VudXNlZCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0 cz46OgotICAgIHJlaGFzaChzaXplX3R5cGUgX19ia3RfY291bnQpCisgICAgX01fcmVoYXNo KF9IaW50UG9saWN5JiBfX2hpbnRfcG9saWN5LCBzaXplX3R5cGUgX19ia3RfY291bnQpCiAg ICAgewogICAgICAgX19yZWhhc2hfZ3VhcmRfdCBfX3JlaGFzaF9ndWFyZChfTV9yZWhhc2hf cG9saWN5KTsKICAgICAgIF9fYmt0X2NvdW50CkBAIC0yNjMxLDcgKzI4NjYsNyBAQCBfR0xJ QkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCiAgICAgICBpZiAoX19ia3RfY291bnQg IT0gX01fYnVja2V0X2NvdW50KQogCXsKLQkgIF9NX3JlaGFzaChfX2JrdF9jb3VudCwgX191 bmlxdWVfa2V5c3t9KTsKKwkgIF9NX3JlaGFzaChfX2hpbnRfcG9saWN5LCBfX2JrdF9jb3Vu dCwgX191bmlxdWVfa2V5c3t9KTsKIAkgIF9fcmVoYXNoX2d1YXJkLl9NX2d1YXJkZWRfb2Jq ID0gbnVsbHB0cjsKIAl9CiAgICAgfQpAQCAtMjY0NCw5ICsyODc5LDExIEBAIF9HTElCQ1hY X0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAgICAgdm9pZAogICAgIF9IYXNodGFibGU8X0tl eSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCiAJICAgICAgIF9IYXNo LCBfUmFuZ2VIYXNoLCBfVW51c2VkLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6Ci0gICAg X01fcmVoYXNoKHNpemVfdHlwZSBfX2JrdF9jb3VudCwgdHJ1ZV90eXBlIC8qIF9fdWtzICov KQorICAgIF9NX3JlaGFzaChfSGludFBvbGljeSYgX19oaW50X3BvbGljeSwKKwkgICAgICBz aXplX3R5cGUgX19ia3RfY291bnQsIHRydWVfdHlwZSAvKiBfX3VrcyAqLykKICAgICB7CiAg ICAgICBfX2J1Y2tldHNfcHRyIF9fbmV3X2J1Y2tldHMgPSBfTV9hbGxvY2F0ZV9idWNrZXRz KF9fYmt0X2NvdW50KTsKKyAgICAgIF9fbm9kZV9wdHIgX19wcmV2X3AgPSBudWxscHRyOwog ICAgICAgX19ub2RlX3B0ciBfX3AgPSBfTV9iZWdpbigpOwogICAgICAgX01fYmVmb3JlX2Jl Z2luLl9NX254dCA9IG51bGxwdHI7CiAgICAgICBzdGQ6OnNpemVfdCBfX2JiZWdpbl9ia3Qg PSAwOwpAQCAtMjY3MCwxMiArMjkwNywxNCBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0Vf VkVSU0lPTgogCSAgICAgIF9fbmV3X2J1Y2tldHNbX19ia3RdLT5fTV9ueHQgPSBfX3A7CiAJ ICAgIH0KIAorCSAgX19wcmV2X3AgPSBfX3A7CiAJICBfX3AgPSBfX25leHQ7CiAJfQogCiAg ICAgICBfTV9kZWFsbG9jYXRlX2J1Y2tldHMoKTsKICAgICAgIF9NX2J1Y2tldF9jb3VudCA9 IF9fYmt0X2NvdW50OwogICAgICAgX01fYnVja2V0cyA9IF9fbmV3X2J1Y2tldHM7CisgICAg ICBfX2hpbnRfcG9saWN5Ll9NX3NldF9sYXN0KF9fcHJldl9wKTsKICAgICB9CiAKICAgLy8g UmVoYXNoIHdoZW4gdGhlcmUgY2FuIGJlIGVxdWl2YWxlbnQgZWxlbWVudHMsIHByZXNlcnZl IHRoZWlyIHJlbGF0aXZlCkBAIC0yNjg3LDcgKzI5MjYsOCBAQCBfR0xJQkNYWF9CRUdJTl9O QU1FU1BBQ0VfVkVSU0lPTgogICAgIHZvaWQKICAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1 ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAogCSAgICAgICBfSGFzaCwgX1Jhbmdl SGFzaCwgX1VudXNlZCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgotICAgIF9NX3JlaGFz aChzaXplX3R5cGUgX19ia3RfY291bnQsIGZhbHNlX3R5cGUgLyogX191a3MgKi8pCisgICAg X01fcmVoYXNoKF9IaW50UG9saWN5JiBfX2hpbnRfcG9saWN5LAorCSAgICAgIHNpemVfdHlw ZSBfX2JrdF9jb3VudCwgZmFsc2VfdHlwZSAvKiBfX3VrcyAqLykKICAgICB7CiAgICAgICBf X2J1Y2tldHNfcHRyIF9fbmV3X2J1Y2tldHMgPSBfTV9hbGxvY2F0ZV9idWNrZXRzKF9fYmt0 X2NvdW50KTsKICAgICAgIF9fbm9kZV9wdHIgX19wID0gX01fYmVnaW4oKTsKQEAgLTI3NTAs NiArMjk5MCw3IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAJCSAgX19u ZXdfYnVja2V0c1tfX2JrdF0tPl9NX254dCA9IF9fcDsKIAkJfQogCSAgICB9CisKIAkgIF9f cHJldl9wID0gX19wOwogCSAgX19wcmV2X2JrdCA9IF9fYmt0OwogCSAgX19wID0gX19uZXh0 OwpAQCAtMjc2Nyw2ICszMDA4LDcgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJ T04KICAgICAgIF9NX2RlYWxsb2NhdGVfYnVja2V0cygpOwogICAgICAgX01fYnVja2V0X2Nv dW50ID0gX19ia3RfY291bnQ7CiAgICAgICBfTV9idWNrZXRzID0gX19uZXdfYnVja2V0czsK KyAgICAgIF9faGludF9wb2xpY3kuX01fc2V0X2xhc3QoX19wcmV2X3ApOwogICAgIH0KIAog I2lmIF9fY3BsdXNwbHVzID4gMjAxNDAyTApkaWZmIC0tZ2l0IGEvbGlic3RkYysrLXYzL2lu Y2x1ZGUvYml0cy9oYXNodGFibGVfcG9saWN5LmggYi9saWJzdGRjKystdjMvaW5jbHVkZS9i aXRzL2hhc2h0YWJsZV9wb2xpY3kuaAppbmRleCA5Zjc3NTUyMmNmZi4uYzg5MDVmNTkyODkg MTAwNjQ0Ci0tLSBhL2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMvaGFzaHRhYmxlX3BvbGlj eS5oCisrKyBiL2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMvaGFzaHRhYmxlX3BvbGljeS5o CkBAIC04NDgsOCArODQ4LDkgQEAgbmFtZXNwYWNlIF9fZGV0YWlsCiAJc3RkOjp0dXBsZTxj b25zdCBrZXlfdHlwZSY+KF9fayksCiAJc3RkOjp0dXBsZTw+KCkKICAgICAgIH07Ci0gICAg ICBhdXRvIF9fcG9zCi0JPSBfX2gtPl9NX2luc2VydF91bmlxdWVfbm9kZShfX2JrdCwgX19j b2RlLCBfX25vZGUuX01fbm9kZSk7CisgICAgICBhdXRvIF9faGludF9wb2xpY3kgPSBfX2gt Pl9NX2dldF9oaW50X3BvbGljeSgpOworICAgICAgYXV0byBfX3BvcyA9ICBfX2gtPl9NX2lu c2VydF91bmlxdWVfbm9kZShfX2hpbnRfcG9saWN5LCBfX2JrdCwgX19jb2RlLAorCQkJCQkg ICAgICAgX19ub2RlLl9NX25vZGUpOwogICAgICAgX19ub2RlLl9NX25vZGUgPSBudWxscHRy OwogICAgICAgcmV0dXJuIF9fcG9zLT5zZWNvbmQ7CiAgICAgfQpAQCAtODc1LDggKzg3Niw5 IEBAIG5hbWVzcGFjZSBfX2RldGFpbAogCXN0ZDo6Zm9yd2FyZF9hc190dXBsZShzdGQ6Om1v dmUoX19rKSksCiAJc3RkOjp0dXBsZTw+KCkKICAgICAgIH07Ci0gICAgICBhdXRvIF9fcG9z Ci0JPSBfX2gtPl9NX2luc2VydF91bmlxdWVfbm9kZShfX2JrdCwgX19jb2RlLCBfX25vZGUu X01fbm9kZSk7CisgICAgICBhdXRvIF9faGludF9wb2xpY3kgPSBfX2gtPl9NX2dldF9oaW50 X3BvbGljeSgpOworICAgICAgYXV0byBfX3BvcyA9IF9faC0+X01faW5zZXJ0X3VuaXF1ZV9u b2RlKF9faGludF9wb2xpY3ksIF9fYmt0LCBfX2NvZGUsCisJCQkJCSAgICAgIF9fbm9kZS5f TV9ub2RlKTsKICAgICAgIF9fbm9kZS5fTV9ub2RlID0gbnVsbHB0cjsKICAgICAgIHJldHVy biBfX3Bvcy0+c2Vjb25kOwogICAgIH0KQEAgLTk2NCwxMyArOTY2LDE0IEBAIG5hbWVzcGFj ZSBfX2RldGFpbAogICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faGludCwgY29uc3Qg dmFsdWVfdHlwZSYgX192KQogICAgICAgewogCV9faGFzaHRhYmxlJiBfX2ggPSBfTV9jb25q dXJlX2hhc2h0YWJsZSgpOwotCV9fbm9kZV9nZW5fdHlwZSBfX25vZGVfZ2VuKF9faCk7CQot CXJldHVybiBfX2guX01faW5zZXJ0KF9faGludCwgX192LCBfX25vZGVfZ2VuLCBfX3VuaXF1 ZV9rZXlze30pOworCWF1dG8gX19oaW50X3BvbGljeSA9IF9faC5fTV9nZXRfaGludF9wb2xp Y3koX19oaW50Ll9NX2N1cik7CisJX19ub2RlX2dlbl90eXBlIF9fbm9kZV9nZW4oX19oKTsK KwlyZXR1cm4gX19oLl9NX2luc2VydChfX2hpbnRfcG9saWN5LCBfX3YsIF9fbm9kZV9nZW4s IF9fdW5pcXVlX2tleXN7fSk7CiAgICAgICB9CiAKICAgICAgIHRlbXBsYXRlPHR5cGVuYW1l IF9LVHlwZSwgdHlwZW5hbWUuLi4gX0FyZ3M+CiAJc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29s PgotCXRyeV9lbXBsYWNlKGNvbnN0X2l0ZXJhdG9yLCBfS1R5cGUmJiBfX2ssIF9BcmdzJiYu Li4gX19hcmdzKQorCXRyeV9lbXBsYWNlKGNvbnN0X2l0ZXJhdG9yIF9faGludCwgX0tUeXBl JiYgX19rLCBfQXJncyYmLi4uIF9fYXJncykKIAl7CiAJICBfX2hhc2h0YWJsZSYgX19oID0g X01fY29uanVyZV9oYXNodGFibGUoKTsKIAkgIGF1dG8gX19jb2RlID0gX19oLl9NX2hhc2hf Y29kZShfX2spOwpAQCAtOTg0LDggKzk4Nyw5IEBAIG5hbWVzcGFjZSBfX2RldGFpbAogCSAg ICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoc3RkOjpmb3J3YXJkPF9LVHlwZT4oX19rKSksCiAJ ICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncyku Li4pCiAJICAgIH07Ci0JICBhdXRvIF9faXQKLQkgICAgPSBfX2guX01faW5zZXJ0X3VuaXF1 ZV9ub2RlKF9fYmt0LCBfX2NvZGUsIF9fbm9kZS5fTV9ub2RlKTsKKwkgIGF1dG8gX19oaW50 X3BvbGljeSA9IF9faC5fTV9nZXRfaGludF9wb2xpY3koX19oaW50Ll9NX2N1cik7CisJICBh dXRvIF9faXQgPSBfX2guX01faW5zZXJ0X3VuaXF1ZV9ub2RlKF9faGludF9wb2xpY3ksIF9f Ymt0LCBfX2NvZGUsCisJCQkJCQlfX25vZGUuX01fbm9kZSk7CiAJICBfX25vZGUuX01fbm9k ZSA9IG51bGxwdHI7CiAJICByZXR1cm4geyBfX2l0LCB0cnVlIH07CiAJfQpAQCAtMTAxMyw4 ICsxMDE3LDkgQEAgbmFtZXNwYWNlIF9fZGV0YWlsCiAJCSAgICAgIHRydWVfdHlwZSAvKiBf X3VrcyAqLykKICAgICAgIHsKIAlfX2hhc2h0YWJsZSYgX19oID0gX01fY29uanVyZV9oYXNo dGFibGUoKTsKKwlhdXRvIF9faGludF9wb2xpY3kgPSBfX2guX01fZ2V0X2hpbnRfcG9saWN5 KCk7CiAJX19ub2RlX2dlbl90eXBlIF9fbm9kZV9nZW4oX19oKTsKLQlfX2guX01faW5zZXJ0 X3JhbmdlKF9fZmlyc3QsIF9fbGFzdCwgX19ub2RlX2dlbik7CisJX19oLl9NX2luc2VydF9y YW5nZShfX2ZpcnN0LCBfX2xhc3QsIF9faGludF9wb2xpY3ksIF9fbm9kZV9nZW4pOwogICAg ICAgfQogCiAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlw ZW5hbWUgX0FsbG9jLApAQCAtMTAzNyw2ICsxMDQyLDcgQEAgbmFtZXNwYWNlIF9fZGV0YWls CiAJICByZXR1cm47CiAKIAlfX2hhc2h0YWJsZSYgX19oID0gX01fY29uanVyZV9oYXNodGFi bGUoKTsKKwlhdXRvIF9faGludF9wb2xpY3kgPSBfX2guX01fZ2V0X2hpbnRfcG9saWN5KCk7 CiAJX19yZWhhc2hfZ3VhcmRfdCBfX3JlaGFzaF9ndWFyZChfX2guX01fcmVoYXNoX3BvbGlj eSk7CiAJX19wYWlyX3R5cGUgX19kb19yZWhhc2gKIAkgID0gX19oLl9NX3JlaGFzaF9wb2xp Y3kuX01fbmVlZF9yZWhhc2goX19oLl9NX2J1Y2tldF9jb3VudCwKQEAgLTEwNDQsMTEgKzEw NTAsMTEgQEAgbmFtZXNwYWNlIF9fZGV0YWlsCiAJCQkJCQlfX25fZWx0KTsKIAogCWlmIChf X2RvX3JlaGFzaC5maXJzdCkKLQkgIF9faC5fTV9yZWhhc2goX19kb19yZWhhc2guc2Vjb25k LCBfX3Vrcyk7CisJICBfX2guX01fcmVoYXNoKF9faGludF9wb2xpY3ksIF9fZG9fcmVoYXNo LnNlY29uZCwgX191a3MpOwogCiAJX19yZWhhc2hfZ3VhcmQuX01fZ3VhcmRlZF9vYmogPSBu dWxscHRyOwogCV9fbm9kZV9nZW5fdHlwZSBfX25vZGVfZ2VuKF9faCk7Ci0JX19oLl9NX2lu c2VydF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIF9fbm9kZV9nZW4pOworCV9faC5fTV9pbnNl cnRfcmFuZ2UoX19maXJzdCwgX19sYXN0LCBfX2hpbnRfcG9saWN5LCBfX25vZGVfZ2VuKTsK ICAgICAgIH0KIAogICAvKioKQEAgLTExMDIsOCArMTEwOCw5IEBAIG5hbWVzcGFjZSBfX2Rl dGFpbAogICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faGludCwgdmFsdWVfdHlwZSYm IF9fdikKICAgICAgIHsKIAlfX2hhc2h0YWJsZSYgX19oID0gdGhpcy0+X01fY29uanVyZV9o YXNodGFibGUoKTsKKwlhdXRvIF9faGludF9wb2xpY3kgPSBfX2guX01fZ2V0X2hpbnRfcG9s aWN5KF9faGludC5fTV9jdXIpOwogCV9fbm9kZV9nZW5fdHlwZSBfX25vZGVfZ2VuKF9faCk7 Ci0JcmV0dXJuIF9faC5fTV9pbnNlcnQoX19oaW50LCBzdGQ6Om1vdmUoX192KSwgX19ub2Rl X2dlbiwKKwlyZXR1cm4gX19oLl9NX2luc2VydChfX2hpbnRfcG9saWN5LCBzdGQ6Om1vdmUo X192KSwgX19ub2RlX2dlbiwKIAkJCSAgICAgX191bmlxdWVfa2V5c3t9KTsKICAgICAgIH0K ICAgICB9OwpAQCAtMTE1Myw3ICsxMTYwLDggQEAgbmFtZXNwYWNlIF9fZGV0YWlsCiAJaW5z ZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faGludCwgX1BhaXImJiBfX3YpCiAJewogCSAgX19oYXNo dGFibGUmIF9faCA9IHRoaXMtPl9NX2Nvbmp1cmVfaGFzaHRhYmxlKCk7Ci0JICByZXR1cm4g X19oLl9NX2VtcGxhY2UoX19oaW50LCBfX3VuaXF1ZV9rZXlze30sCisJICBhdXRvIF9faGlu dF9wb2xpY3kgPSBfX2guX01fZ2V0X2hpbnRfcG9saWN5KF9faGludC5fTV9jdXIpOworCSAg cmV0dXJuIF9faC5fTV9lbXBsYWNlKF9faGludF9wb2xpY3ksIF9fdW5pcXVlX2tleXN7fSwK IAkJCQlzdGQ6OmZvcndhcmQ8X1BhaXI+KF9fdikpOwogCX0KICAgIH07CmRpZmYgLS1naXQg YS9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL3Vub3JkZXJlZF9tYXAuaCBiL2xpYnN0ZGMr Ky12My9pbmNsdWRlL2JpdHMvdW5vcmRlcmVkX21hcC5oCmluZGV4IDFjOTlhODNiYzFlLi5l NWRmOTdjOTIyOSAxMDA2NDQKLS0tIGEvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy91bm9y ZGVyZWRfbWFwLmgKKysrIGIvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy91bm9yZGVyZWRf bWFwLmgKQEAgLTQ0MywxMiArNDQzLDEyIEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9D T05UQUlORVIKICAgICAgIC8vLyBSZS1pbnNlcnQgYW4gZXh0cmFjdGVkIG5vZGUuCiAgICAg ICBpbnNlcnRfcmV0dXJuX3R5cGUKICAgICAgIGluc2VydChub2RlX3R5cGUmJiBfX25oKQot ICAgICAgeyByZXR1cm4gX01faC5fTV9yZWluc2VydF9ub2RlKHN0ZDo6bW92ZShfX25oKSk7 IH0KKyAgICAgIHsgcmV0dXJuIF9NX2guX01fcmVpbnNlcnRfbm9kZShjZW5kKCksIHN0ZDo6 bW92ZShfX25oKSk7IH0KIAogICAgICAgLy8vIFJlLWluc2VydCBhbiBleHRyYWN0ZWQgbm9k ZS4KICAgICAgIGl0ZXJhdG9yCi0gICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IsIG5vZGVf dHlwZSYmIF9fbmgpCi0gICAgICB7IHJldHVybiBfTV9oLl9NX3JlaW5zZXJ0X25vZGUoc3Rk Ojptb3ZlKF9fbmgpKS5wb3NpdGlvbjsgfQorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9y IF9faGludCwgbm9kZV90eXBlJiYgX19uaCkKKyAgICAgIHsgcmV0dXJuIF9NX2guX01fcmVp bnNlcnRfbm9kZShfX2hpbnQsIHN0ZDo6bW92ZShfX25oKSkucG9zaXRpb247IH0KICNlbmRp ZiAvLyBDKysxNwogCiAjaWZkZWYgX19nbGliY3h4X3Vub3JkZXJlZF9tYXBfdHJ5X2VtcGxh Y2UgLy8gQysrID49IDE3ICYmIEhPU1RFRApkaWZmIC0tZ2l0IGEvbGlic3RkYysrLXYzL2lu Y2x1ZGUvYml0cy91bm9yZGVyZWRfc2V0LmggYi9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRz L3Vub3JkZXJlZF9zZXQuaAppbmRleCBmM2IwYzA3OGJhYS4uOTE1Y2Q0ZmI3MDAgMTAwNjQ0 Ci0tLSBhL2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMvdW5vcmRlcmVkX3NldC5oCisrKyBi L2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMvdW5vcmRlcmVkX3NldC5oCkBAIC01MDQsMTIg KzUwNCwxMiBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCiAgICAgICAv Ly8gUmUtaW5zZXJ0IGFuIGV4dHJhY3RlZCBub2RlLgogICAgICAgaW5zZXJ0X3JldHVybl90 eXBlCiAgICAgICBpbnNlcnQobm9kZV90eXBlJiYgX19uaCkKLSAgICAgIHsgcmV0dXJuIF9N X2guX01fcmVpbnNlcnRfbm9kZShzdGQ6Om1vdmUoX19uaCkpOyB9CisgICAgICB7IHJldHVy biBfTV9oLl9NX3JlaW5zZXJ0X25vZGUoY2VuZCgpLCBzdGQ6Om1vdmUoX19uaCkpOyB9CiAK ICAgICAgIC8vLyBSZS1pbnNlcnQgYW4gZXh0cmFjdGVkIG5vZGUuCiAgICAgICBpdGVyYXRv cgotICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yLCBub2RlX3R5cGUmJiBfX25oKQotICAg ICAgeyByZXR1cm4gX01faC5fTV9yZWluc2VydF9ub2RlKHN0ZDo6bW92ZShfX25oKSkucG9z aXRpb247IH0KKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX2hpbnQsIG5vZGVfdHlw ZSYmIF9fbmgpCisgICAgICB7IHJldHVybiBfTV9oLl9NX3JlaW5zZXJ0X25vZGUoX19oaW50 LCBzdGQ6Om1vdmUoX19uaCkpLnBvc2l0aW9uOyB9CiAjZW5kaWYgLy8gQysrMTcKIAogICAg ICAgLy8vQHsKZGlmZiAtLWdpdCBhL2xpYnN0ZGMrKy12My90ZXN0c3VpdGUvMjNfY29udGFp bmVycy91bm9yZGVyZWRfbXVsdGltYXAvaW5zZXJ0L2hpbnQuY2MgYi9saWJzdGRjKystdjMv dGVzdHN1aXRlLzIzX2NvbnRhaW5lcnMvdW5vcmRlcmVkX211bHRpbWFwL2luc2VydC9oaW50 LmNjCmluZGV4IGQwZWQ2MGM2Nzk5Li4xZGI3MWI4ZjMwYiAxMDA2NDQKLS0tIGEvbGlic3Rk YysrLXYzL3Rlc3RzdWl0ZS8yM19jb250YWluZXJzL3Vub3JkZXJlZF9tdWx0aW1hcC9pbnNl cnQvaGludC5jYworKysgYi9saWJzdGRjKystdjMvdGVzdHN1aXRlLzIzX2NvbnRhaW5lcnMv dW5vcmRlcmVkX211bHRpbWFwL2luc2VydC9oaW50LmNjCkBAIC00MCwxMSArNDAsMTIgQEAg dm9pZCB0ZXN0MDEoKQogICBWRVJJRlkoIGl0MiAhPSBtLmVuZCgpICk7CiAgIFZFUklGWSgg aXQyICE9IGl0MSApOwogICBWRVJJRlkoIGl0Mi0+c2Vjb25kID09IDIgKTsKLSAgVkVSSUZZ KCBpdDIgPT0gc3RkOjpuZXh0KGl0MSkgKTsKKyAgVkVSSUZZKCBzdGQ6Om5leHQoaXQyKSA9 PSBpdDEgKTsKIAorICBpdDEgPSBpdDI7CiAgIFBhaXIgcCgwLCAxKTsKICAgaXQyID0gbS5p bnNlcnQoaXQxLCBwKTsKLSAgVkVSSUZZKCBpdDIgPT0gc3RkOjpuZXh0KGl0MSkgKTsKKyAg VkVSSUZZKCBzdGQ6Om5leHQoaXQyKSA9PSBpdDEgKTsKIH0KIAogc3RydWN0IGhhc2hlcgpA QCAtNzEsMTMgKzcyLDEzIEBAIHZvaWQgdGVzdDAyKCkKICAgVkVSSUZZKCBtLmJ1Y2tldF9z aXplKG0uYnVja2V0KGl0My0+Zmlyc3QpKSA9PSAxICk7CiAKICAgYXV0byBpdDQgPSBtLmlu c2VydChpdDEsIFBhaXIoMCwgMSkpOwotICBWRVJJRlkoIGl0NCA9PSBzdGQ6Om5leHQoaXQx KSApOworICBWRVJJRlkoIHN0ZDo6bmV4dChpdDQpID09IGl0MSApOwogICBWRVJJRlkoIG0u YnVja2V0X3NpemUobS5idWNrZXQoaXQxLT5maXJzdCkpID09IDMgKTsKICAgVkVSSUZZKCBt LmJ1Y2tldF9zaXplKG0uYnVja2V0KGl0My0+Zmlyc3QpKSA9PSAxICk7CiAKICAgUGFpciBw KDEsIDEpOwogICBpdDQgPSBtLmluc2VydChpdDIsIHApOwotICBWRVJJRlkoIGl0NCA9PSBz dGQ6Om5leHQoaXQyKSApOworICBWRVJJRlkoIHN0ZDo6bmV4dChpdDQpID09IGl0MiApOwog ICBWRVJJRlkoIG0uYnVja2V0X3NpemUobS5idWNrZXQoaXQxLT5maXJzdCkpID09IDQgKTsK ICAgYXV0byByYW5nZSA9IG0uZXF1YWxfcmFuZ2UoMCk7CiAgIFZFUklGWSggc3RkOjpkaXN0 YW5jZShyYW5nZS5maXJzdCwgcmFuZ2Uuc2Vjb25kKSA9PSAyICk7CkBAIC0xMDQsMTEgKzEw NSwxMiBAQCB2b2lkIHRlc3QwMygpCiAgIFZFUklGWSggaXQyICE9IG0uZW5kKCkgKTsKICAg VkVSSUZZKCBpdDIgIT0gaXQxICk7CiAgIFZFUklGWSggaXQyLT5zZWNvbmQgPT0gMiApOwot ICBWRVJJRlkoIGl0MiA9PSBzdGQ6Om5leHQoaXQxKSApOworICBWRVJJRlkoIHN0ZDo6bmV4 dChpdDIpID09IGl0MSApOwogCisgIGl0MSA9IGl0MjsKICAgUGFpciBwKDAsIDEpOwogICBp dDIgPSBtLmVtcGxhY2VfaGludChpdDEsIHApOwotICBWRVJJRlkoIGl0MiA9PSBzdGQ6Om5l eHQoaXQxKSApOworICBWRVJJRlkoIHN0ZDo6bmV4dChpdDIpID09IGl0MSApOwogfQogCiBp bnQgbWFpbigpCg== --------------1VLGoPQTWT3GdNaNImTzmE8A--