From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x32a.google.com (mail-wm1-x32a.google.com [IPv6:2a00:1450:4864:20::32a]) by sourceware.org (Postfix) with ESMTPS id 09AF43858D32; Mon, 24 Jul 2023 11:02:58 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 09AF43858D32 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-wm1-x32a.google.com with SMTP id 5b1f17b1804b1-3fc04692e20so40180805e9.0; Mon, 24 Jul 2023 04:02:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1690196576; x=1690801376; h=subject:from:cc:to:content-language:user-agent:mime-version:date :message-id:from:to:cc:subject:date:message-id:reply-to; bh=I1T14vJcmND1U6cCJ5BLAnncqdkLloa3TT6foxXYaT8=; b=eYJWM13ldpyBF/MGB456GlGPRITl/cEWB6YmPKnVDW44V5RKGpQzm6LWM4a6AICuRl FrihXNjg+DpmzNqvJTECP4iReWJskE/iWr5NyHFrvr+7g1F9jqJVANUXMfiYtiFR0Jz7 5Oj9896U3g+rafVlD3+8Ta1Io/IEyUyivemWngfzVypUm33s4EuLZuVtw7BMOnmOzdfx EZkxzAA+DSr8xnj/0Y/tD3YXRUr1kteBqD0ALKiA2qzjyt3MsjWnPc8l6Jb94PuhzaoF pfPyT1AbNJ6Aifn6pdmIAiYQBWvJVZT+/EKJIhijIUvsOtJyoSoNmkshbqmwNEyLrp8l bd0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1690196576; x=1690801376; h=subject:from:cc:to:content-language:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=I1T14vJcmND1U6cCJ5BLAnncqdkLloa3TT6foxXYaT8=; b=HxQOOGJptKx47CMpy5vlvla0AlDoXgEdC785E2lfiAiOwNUehHuVMU83zs+pC92ZRx ihBaFI9P9Bhdxs51YbhXCo9GSp2uHmuJSgr2PFTq+3IllF0SOrmrCD3dzDTkiK9r8ccp 9FapjsKoH7L7mR3gIjTNfi0RDfbA9uVr6du0uKIWF7r7baoNhm+Iu++STd0WJid6HIor 3j994h3suj1xawK4RCwnOVo+734L1Z6bO6LaYP7mR/oTwAKE2j+4Ukjpb6yFjHAfUCOZ zf+trZW/8iIn4VSMSxbh2pGu6v9Jh0mK5kXqNZRUpocX2bT6604I13qveBcihzsmCUrD +ARg== X-Gm-Message-State: ABy/qLaQ10iBTAnrqFBp/BnG8QE8GGzDZxXIckj0GS9jaOefYQNSWipI dReOIKAd1aBR14gGSL7tZOl01xjxA88= X-Google-Smtp-Source: APBJJlFoeZlXr3fEhMf/fb+QhefAiXWuqGmzQMOy37yFwPpFnHxuVhJBt9G0UJgWyQjX64yK/vF9lQ== X-Received: by 2002:a5d:560e:0:b0:317:53e7:d7c2 with SMTP id l14-20020a5d560e000000b0031753e7d7c2mr3731937wrv.11.1690196575787; Mon, 24 Jul 2023 04:02:55 -0700 (PDT) Received: from [192.168.42.235] (pop.92-184-112-237.mobile.abo.orange.fr. [92.184.112.237]) by smtp.gmail.com with ESMTPSA id y4-20020a5d4704000000b00313f9085119sm393571wrq.113.2023.07.24.04.02.37 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 24 Jul 2023 04:02:54 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------98RCh09GJNQwwavetG2ltuVU" Message-ID: <6841b337-c7a0-55d7-a513-e655c99df01a@gmail.com> Date: Mon, 24 Jul 2023 13:02:29 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.11.0 Content-Language: en-US To: libstdc++ Cc: gcc-patches From: =?UTF-8?Q?Fran=c3=a7ois_Dumont?= Subject: [PATCH][Hashtable] Performance optimization through use of insertion hint X-Spam-Status: No, score=-9.6 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. --------------98RCh09GJNQwwavetG2ltuVU Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit     libstdc++: [_Hashtable] Make more use of insertion hint     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 when hash code is not cached also compute it.     To avoid this side effect it is better to insert after the last node. Adding     a member to keep track of this last node would be an abi breaking change. Still we     can ask the user to maintain and provide this last node as an insertion hint.     Adapt range insertion methods to try to detect the last node and then use it as     the insertion hint.     libstdc++-v3/ChangeLog:             * include/bits/hashtable_policy.h:             (_Insert_base::try_emplace): Adapt to use hint.             (_Insert_base::_M_insert_range): Try to detect container last node and use it             as hint for insertions.             (_Hash_code_base::_M_hash_code(const _Hash&, const _Hash_node_value<>&)): Remove.             (_Hash_code_base::_M_hash_code<_H2>(const _H2&, const _Hash_node_value<>&)): Remove.             * include/bits/hashtable.h             (_Hashtable<>::_M_insert_bucket_begin): Add hint parameter and use it when inserting             into an empty bucket if hint is the last container node.             (_Hashtable<>::_InsertInfo): New struct.             (_Hashtable<>::_M_get_insert_info): New, return latter.             (_Hashtable<>::_M_insert_multi_node): Add _InsertInfo parameter.             (_Hashtable<>::_M_insert_unique_node): Add __node_ptr hint parameter.             (_Hashtable<>::_M_emplace_unique(__node_ptr, _Args&&...)): New.             (_Hashtable<>::_M_emplace_multi(__node_ptr, _Args&&...)): New.             (_Hashtable<>::_M_emplace()): Adapt to use latters.             (_Hashtable<>::_M_insert_unique): Add __node_ptr parameter.             (_Hashtable<>::_M_insert_unique_aux): Add __node_ptr parameter.             (_Hashtable<>::_M_insert(__node_ptr, _Arg&&, const _NodeGenerator&, true_type)):             Use latter.             (_Hashtable<>::_M_reinsert_node(const_iterator, node_type&&)):             Add hint parameter, adapt to use it.             (_Hashtable<>::_M_reinsert_node_multi): Use hint parameter if available to extract             hash code.             (_Hashtable<>::_M_compute_hash_code(const _Hash&, __node_ptr, __node_ptr,             const key_type&)): New. (_Hashtable<>::_M_compute_hash_code<_H2>(const _H2&, __node_ptr, __node_ptr,             const key_type&)): New.             (_Hashtable<>::_M_merge_unique): Adapt to use latter. Implement small size             optimization.             (_Hashtable<>::_M_get_insert_info(const _Hash&, __node_ptr, __node_ptr,             const key_type&)): New. (_Hashtable<>::_M_get_insert_info<_H2>(const _H2&, __node_ptr, __node_ptr,             const key_type&)): New.             (_Hashtable<>::_M_merge_multi): Adapt to use latter.             * 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 x86_64. Here is the performance results of this patch, before: unordered_multiset_hint.cc-thread    hash code NOT cached 2000000 insertions w/o hint      94r   94u    0s 191999712mem    0pf unordered_multiset_hint.cc-thread    hash code NOT cached 2000000 insertions with perfect hint      95r   94u    0s 191999712mem 0pf unordered_multiset_hint.cc-thread    hash code NOT cached 2000000 insertions with bad hint      94r   94u    0s 191999712mem    0pf unordered_multiset_hint.cc-thread    hash code NOT cached 2000000 range insertions      88r   88u    0s 191999712mem    0pf unordered_multiset_hint.cc-thread    hash code cached 2000000 insertions w/o hint      91r   91u    0s 191999712mem    0pf unordered_multiset_hint.cc-thread    hash code cached 2000000 insertions with perfect hint      92r   93u    0s 191999712mem 0pf unordered_multiset_hint.cc-thread    hash code cached 2000000 insertions with bad hint      93r   93u    0s 191999712mem    0pf unordered_multiset_hint.cc-thread    hash code cached 2000000 range insertions      88r   88u    0s 191999712mem    0pf unordered_set_hint.cc-thread    hash code NOT cached 2000000 insertions w/o hint      94r   95u    0s 191999712mem    0pf unordered_set_hint.cc-thread    hash code NOT cached 2000000 insertions with perfect hint      94r   95u    0s 191999712mem 0pf unordered_set_hint.cc-thread    hash code NOT cached 2000000 insertions with bad hint      94r   94u    0s 191999712mem    0pf unordered_set_hint.cc-thread    hash code NOT cached 2000000 range insertions      90r   90u    0s 191999712mem    0pf unordered_set_hint.cc-thread    hash code cached 2000000 insertions w/o hint      68r   68u    0s 223999264mem    0pf unordered_set_hint.cc-thread    hash code cached 2000000 insertions with perfect hint      67r   67u    0s 223999264mem 0pf unordered_set_hint.cc-thread    hash code cached 2000000 insertions with bad hint      68r   68u    0s 223999264mem    0pf unordered_set_hint.cc-thread    hash code cached 2000000 range insertions      62r   62u    0s 223999264mem    0pf After: unordered_multiset_hint.cc-thread    hash code NOT cached 2000000 insertions w/o hint      93r   93u    0s 191999712mem    0pf unordered_multiset_hint.cc-thread    hash code NOT cached 2000000 insertions with perfect hint      58r   59u    0s 191999712mem 0pf unordered_multiset_hint.cc-thread    hash code NOT cached 2000000 insertions with bad hint      93r   94u    0s 191999712mem    0pf unordered_multiset_hint.cc-thread    hash code NOT cached 2000000 range insertions      52r   51u    0s 191999712mem    0pf unordered_multiset_hint.cc-thread    hash code cached 2000000 insertions w/o hint      96r   95u    0s 191999712mem    0pf unordered_multiset_hint.cc-thread    hash code cached 2000000 insertions with perfect hint      61r   62u    0s 191999712mem 0pf unordered_multiset_hint.cc-thread    hash code cached 2000000 insertions with bad hint      94r   94u    0s 191999712mem    0pf unordered_multiset_hint.cc-thread    hash code cached 2000000 range insertions      52r   52u    0s 191999712mem    0pf unordered_set_hint.cc-thread    hash code NOT cached 2000000 insertions w/o hint      96r   95u    0s 191999712mem    0pf unordered_set_hint.cc-thread    hash code NOT cached 2000000 insertions with perfect hint      58r   59u    0s 191999712mem 0pf unordered_set_hint.cc-thread    hash code NOT cached 2000000 insertions with bad hint      94r   94u    0s 191999712mem    0pf unordered_set_hint.cc-thread    hash code NOT cached 2000000 range insertions      52r   52u    0s 191999712mem    0pf unordered_set_hint.cc-thread    hash code cached 2000000 insertions w/o hint      70r   69u    0s 223999264mem    0pf unordered_set_hint.cc-thread    hash code cached 2000000 insertions with perfect hint      67r   67u    0s 223999264mem 0pf unordered_set_hint.cc-thread    hash code cached 2000000 insertions with bad hint      67r   67u    0s 223999264mem    0pf unordered_set_hint.cc-thread    hash code cached 2000000 range insertions      63r   62u    0s 223999264mem    0pf Ok to commit ? François --------------98RCh09GJNQwwavetG2ltuVU Content-Type: text/x-patch; charset=UTF-8; name="hashtable.patch" Content-Disposition: attachment; filename="hashtable.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMvaGFzaHRhYmxlLmggYi9s aWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL2hhc2h0YWJsZS5oCmluZGV4IDk1NGExYzdhNThk Li40Yjg0YjU2NmFlYSAxMDA2NDQKLS0tIGEvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9o YXNodGFibGUuaAorKysgYi9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL2hhc2h0YWJsZS5o CkBAIC04MzUsMzAgKzgzNSw0NSBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lP TgogCiAgICAgICAvLyBJbnNlcnQgYSBub2RlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBidWNr ZXQuCiAgICAgICB2b2lkCi0gICAgICBfTV9pbnNlcnRfYnVja2V0X2JlZ2luKHNpemVfdHlw ZSBfX2JrdCwgX19ub2RlX3B0ciBfX25vZGUpCisgICAgICBfTV9pbnNlcnRfYnVja2V0X2Jl Z2luKF9fbm9kZV9iYXNlX3B0ciBfX2hpbnQsCisJCQkgICAgIHNpemVfdHlwZSBfX2JrdCwg X19ub2RlX3B0ciBfX25vZGUpCiAgICAgICB7CisJX19ub2RlX2Jhc2VfcHRyIF9fcHJldjsK IAlpZiAoX01fYnVja2V0c1tfX2JrdF0pCiAJICB7CiAJICAgIC8vIEJ1Y2tldCBpcyBub3Qg ZW1wdHksIHdlIGp1c3QgbmVlZCB0byBpbnNlcnQgdGhlIG5ldyBub2RlCiAJICAgIC8vIGFm dGVyIHRoZSBidWNrZXQgYmVmb3JlIGJlZ2luLgotCSAgICBfX25vZGUtPl9NX254dCA9IF9N X2J1Y2tldHNbX19ia3RdLT5fTV9ueHQ7Ci0JICAgIF9NX2J1Y2tldHNbX19ia3RdLT5fTV9u eHQgPSBfX25vZGU7CisJICAgIF9fcHJldiA9IF9NX2J1Y2tldHNbX19ia3RdOwogCSAgfQog CWVsc2UKIAkgIHsKLQkgICAgLy8gVGhlIGJ1Y2tldCBpcyBlbXB0eSwgdGhlIG5ldyBub2Rl IGlzIGluc2VydGVkIGF0IHRoZQotCSAgICAvLyBiZWdpbm5pbmcgb2YgdGhlIHNpbmdseS1s aW5rZWQgbGlzdCBhbmQgdGhlIGJ1Y2tldCB3aWxsCi0JICAgIC8vIGNvbnRhaW4gX01fYmVm b3JlX2JlZ2luIHBvaW50ZXIuCi0JICAgIF9fbm9kZS0+X01fbnh0ID0gX01fYmVmb3JlX2Jl Z2luLl9NX254dDsKLQkgICAgX01fYmVmb3JlX2JlZ2luLl9NX254dCA9IF9fbm9kZTsKLQot CSAgICBpZiAoX19ub2RlLT5fTV9ueHQpCi0JICAgICAgLy8gV2UgbXVzdCB1cGRhdGUgZm9y bWVyIGJlZ2luIGJ1Y2tldCB0aGF0IGlzIHBvaW50aW5nIHRvCi0JICAgICAgLy8gX01fYmVm b3JlX2JlZ2luLgotCSAgICAgIF9NX2J1Y2tldHNbX01fYnVja2V0X2luZGV4KCpfX25vZGUt Pl9NX25leHQoKSldID0gX19ub2RlOwotCi0JICAgIF9NX2J1Y2tldHNbX19ia3RdID0gJl9N X2JlZm9yZV9iZWdpbjsKKwkgICAgLy8gQmFzZWQgb24gYmVuY2hlcyB1c2luZyBsYXN0IG5v ZGUgaXMgbm90IGludGVyZXN0ZWQgd2hlbiBoYXNoIGNvZGUgaXMKKwkgICAgLy8gY2FjaGVk IGluIGNhc2Ugb2YgdW5pcXVlIGtleXMuCisJICAgIGlmICghKF9fdW5pcXVlX2tleXM6OnZh bHVlICYmIF9faGFzaF9jYWNoZWQ6OnZhbHVlKSAmJgorCQlfX2hpbnQgJiYgIV9faGludC0+ X01fbnh0KQorCSAgICAgIF9fcHJldiA9IF9faGludDsKKwkgICAgZWxzZQorCSAgICAgIHsK KwkJLy8gVGhlIGJ1Y2tldCBpcyBlbXB0eSwgdGhlIG5ldyBub2RlIGlzIGluc2VydGVkIGF0 IHRoZQorCQkvLyBiZWdpbm5pbmcgb2YgdGhlIHNpbmdseS1saW5rZWQgbGlzdCBhbmQgdGhl IGJ1Y2tldCB3aWxsCisJCS8vIGNvbnRhaW4gX01fYmVmb3JlX2JlZ2luIHBvaW50ZXIuCisJ CV9fcHJldiA9ICZfTV9iZWZvcmVfYmVnaW47CisKKwkJaWYgKF9fcHJldi0+X01fbnh0KQor CQkgIHsKKwkJICAgIC8vIFdlIG11c3QgdXBkYXRlIGZvcm1lciBiZWdpbiBidWNrZXQgdGhh dCBpcyBwb2ludGluZyB0bworCQkgICAgLy8gX01fYmVmb3JlX2JlZ2luLgorCQkgICAgc2l6 ZV90eXBlIF9fYmJfYmt0ID0gX01fYnVja2V0X2luZGV4KAorCQkJCSpzdGF0aWNfY2FzdDxf X25vZGVfcHRyPihfX3ByZXYtPl9NX254dCkpOworCQkgICAgX01fYnVja2V0c1tfX2JiX2Jr dF0gPSBfX25vZGU7CisJCSAgfQorCSAgICAgIH0KKworCSAgICBfTV9idWNrZXRzW19fYmt0 XSA9IF9fcHJldjsKIAkgIH0KKworCV9fbm9kZS0+X01fbnh0ID0gX19wcmV2LT5fTV9ueHQ7 CisJX19wcmV2LT5fTV9ueHQgPSBfX25vZGU7CiAgICAgICB9CiAKICAgICAgIC8vIFJlbW92 ZSB0aGUgYnVja2V0IGZpcnN0IG5vZGUKQEAgLTg4NCw0NCArODk5LDY0IEBAIF9HTElCQ1hY X0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAgICAgICBfX25vZGVfYmFzZV9wdHIKICAgICAg IF9NX2dldF9wcmV2aW91c19ub2RlKHNpemVfdHlwZSBfX2JrdCwgX19ub2RlX3B0ciBfX24p OwogCi0gICAgICBwYWlyPF9fbm9kZV9wdHIsIF9faGFzaF9jb2RlPgotICAgICAgX01fY29t cHV0ZV9oYXNoX2NvZGUoX19ub2RlX3B0ciBfX2hpbnQsIGNvbnN0IGtleV90eXBlJiBfX2sp IGNvbnN0OworICAgICAgc3RydWN0IF9JbnNlcnRJbmZvCisgICAgICB7CisJX19ub2RlX2Jh c2VfcHRyCV9NX3ByZXY7CisJX19ub2RlX3B0cglfTV9lcXVpX247CisJX19ub2RlX3B0cglf TV9oaW50OworCV9faGFzaF9jb2RlCV9NX2NvZGU7CisgICAgICB9OworCisgICAgICBfSW5z ZXJ0SW5mbworICAgICAgX01fZ2V0X2luc2VydF9pbmZvKF9fbm9kZV9wdHIgX19oaW50LCBj b25zdCBrZXlfdHlwZSYgX19rLAorCQkJIF9fbm9kZV9wdHIgX19uID0gbnVsbHB0cikgY29u c3Q7CiAKICAgICAgIC8vIEluc2VydCBub2RlIF9fbiB3aXRoIGhhc2ggY29kZSBfX2NvZGUs IGluIGJ1Y2tldCBfX2JrdCBpZiBubwogICAgICAgLy8gcmVoYXNoIChhc3N1bWVzIG5vIGVs ZW1lbnQgd2l0aCBzYW1lIGtleSBhbHJlYWR5IHByZXNlbnQpLgogICAgICAgLy8gVGFrZXMg b3duZXJzaGlwIG9mIF9fbiBpZiBpbnNlcnRpb24gc3VjY2VlZHMsIHRocm93cyBvdGhlcndp c2UuCiAgICAgICBpdGVyYXRvcgotICAgICAgX01faW5zZXJ0X3VuaXF1ZV9ub2RlKHNpemVf dHlwZSBfX2JrdCwgX19oYXNoX2NvZGUsCisgICAgICBfTV9pbnNlcnRfdW5pcXVlX25vZGUo X19ub2RlX3B0ciBfX2hpbnQsIHNpemVfdHlwZSBfX2JrdCwgX19oYXNoX2NvZGUsCiAJCQkg ICAgX19ub2RlX3B0ciBfX24sIHNpemVfdHlwZSBfX25fZWx0ID0gMSk7CiAKLSAgICAgIC8v IEluc2VydCBub2RlIF9fbiB3aXRoIGtleSBfX2sgYW5kIGhhc2ggY29kZSBfX2NvZGUuCisg ICAgICAvLyBJbnNlcnQgbm9kZSBfX24gYWZ0ZXIgX19wcmV2IGlmIGFueS4KICAgICAgIC8v IFRha2VzIG93bmVyc2hpcCBvZiBfX24gaWYgaW5zZXJ0aW9uIHN1Y2NlZWRzLCB0aHJvd3Mg b3RoZXJ3aXNlLgogICAgICAgaXRlcmF0b3IKLSAgICAgIF9NX2luc2VydF9tdWx0aV9ub2Rl KF9fbm9kZV9wdHIgX19oaW50LAotCQkJICAgX19oYXNoX2NvZGUgX19jb2RlLCBfX25vZGVf cHRyIF9fbik7CisgICAgICBfTV9pbnNlcnRfbXVsdGlfbm9kZShjb25zdCBfSW5zZXJ0SW5m byYgX19pbmZvLCBfX25vZGVfcHRyIF9fbik7CiAKICAgICAgIHRlbXBsYXRlPHR5cGVuYW1l Li4uIF9BcmdzPgogCXN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KLQlfTV9lbXBsYWNlKHRy dWVfdHlwZSBfX3VrcywgX0FyZ3MmJi4uLiBfX2FyZ3MpOworCV9NX2VtcGxhY2VfdW5pcXVl KF9fbm9kZV9wdHIgX19oaW50LCBfQXJncyYmLi4uIF9fYXJncyk7CiAKICAgICAgIHRlbXBs YXRlPHR5cGVuYW1lLi4uIF9BcmdzPgogCWl0ZXJhdG9yCi0JX01fZW1wbGFjZShmYWxzZV90 eXBlIF9fdWtzLCBfQXJncyYmLi4uIF9fYXJncykKLQl7IHJldHVybiBfTV9lbXBsYWNlKGNl bmQoKSwgX191a3MsIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKwlfTV9l bXBsYWNlX211bHRpKF9fbm9kZV9wdHIgX19oaW50LCBfQXJncyYmLi4uIF9fYXJncyk7CisK KyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXN0ZDo6cGFpcjxpdGVyYXRv ciwgYm9vbD4KKwlfTV9lbXBsYWNlKHRydWVfdHlwZSAvKl9fdWtzKi8sIF9BcmdzJiYuLi4g X19hcmdzKQorCXsgcmV0dXJuIF9NX2VtcGxhY2VfdW5pcXVlKG51bGxwdHIsIHN0ZDo6Zm9y d2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUu Li4gX0FyZ3M+CisJaXRlcmF0b3IKKwlfTV9lbXBsYWNlKGZhbHNlX3R5cGUgLypfX3Vrcyov LCBfQXJncyYmLi4uIF9fYXJncykKKwl7IHJldHVybiBfTV9lbXBsYWNlX211bHRpKG51bGxw dHIsIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KIAotICAgICAgLy8gRW1w bGFjZSB3aXRoIGhpbnQsIHVzZWxlc3Mgd2hlbiBrZXlzIGFyZSB1bmlxdWUuCiAgICAgICB0 ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KIAlpdGVyYXRvcgotCV9NX2VtcGxhY2UoY29u c3RfaXRlcmF0b3IsIHRydWVfdHlwZSBfX3VrcywgX0FyZ3MmJi4uLiBfX2FyZ3MpCi0JeyBy ZXR1cm4gX01fZW1wbGFjZShfX3Vrcywgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4u KS5maXJzdDsgfQorCV9NX2VtcGxhY2UoX19ub2RlX3B0ciBfX2hpbnQsIHRydWVfdHlwZSAv Kl9fdWtzKi8sIF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIHJldHVybiBfTV9lbXBsYWNl X3VuaXF1ZShfX2hpbnQsCisJCQkJICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4u KS5maXJzdDsKKwl9CiAKICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgogCWl0 ZXJhdG9yCi0JX01fZW1wbGFjZShjb25zdF9pdGVyYXRvciwgZmFsc2VfdHlwZSBfX3Vrcywg X0FyZ3MmJi4uLiBfX2FyZ3MpOworCV9NX2VtcGxhY2UoX19ub2RlX3B0ciBfX2hpbnQsIGZh bHNlX3R5cGUgLypfX3VrcyovLCBfQXJncyYmLi4uIF9fYXJncykKKwl7IHJldHVybiBfTV9l bXBsYWNlX211bHRpKF9faGludCwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsg fQogCiAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS3QsIHR5cGVuYW1lIF9BcmcsIHR5cGVu YW1lIF9Ob2RlR2VuZXJhdG9yPgogCXN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KLQlfTV9p bnNlcnRfdW5pcXVlKF9LdCYmLCBfQXJnJiYsIGNvbnN0IF9Ob2RlR2VuZXJhdG9yJik7CisJ X01faW5zZXJ0X3VuaXF1ZShfX25vZGVfcHRyLCBfS3QmJiwgX0FyZyYmLCBjb25zdCBfTm9k ZUdlbmVyYXRvciYpOwogCiAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS3Q+CiAJc3RhdGlj IF9fY29uZGl0aW9uYWxfdDwKQEAgLTk0MSw5ICs5NzYsMTAgQEAgX0dMSUJDWFhfQkVHSU5f TkFNRVNQQUNFX1ZFUlNJT04KIAogICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZywgdHlw ZW5hbWUgX05vZGVHZW5lcmF0b3I+CiAJc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgotCV9N X2luc2VydF91bmlxdWVfYXV4KF9BcmcmJiBfX2FyZywgY29uc3QgX05vZGVHZW5lcmF0b3Im IF9fbm9kZV9nZW4pCisJX01faW5zZXJ0X3VuaXF1ZV9hdXgoX19ub2RlX3B0ciBfX2hpbnQs CisJCQkgICAgIF9BcmcmJiBfX2FyZywgY29uc3QgX05vZGVHZW5lcmF0b3ImIF9fbm9kZV9n ZW4pCiAJewotCSAgcmV0dXJuIF9NX2luc2VydF91bmlxdWUoCisJICByZXR1cm4gX01faW5z ZXJ0X3VuaXF1ZShfX2hpbnQsCiAJICAgIF9TX2ZvcndhcmRfa2V5KF9FeHRyYWN0S2V5e30o c3RkOjpmb3J3YXJkPF9Bcmc+KF9fYXJnKSkpLAogCSAgICBzdGQ6OmZvcndhcmQ8X0FyZz4o X19hcmcpLCBfX25vZGVfZ2VuKTsKIAl9CkBAIC05NTUsNyArOTkxLDcgQEAgX0dMSUJDWFhf QkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KIAl7CiAJICB1c2luZyBfX3RvX3ZhbHVlCiAJICAg ID0gX19kZXRhaWw6Ol9Db252ZXJ0VG9WYWx1ZVR5cGU8X0V4dHJhY3RLZXksIHZhbHVlX3R5 cGU+OwotCSAgcmV0dXJuIF9NX2luc2VydF91bmlxdWVfYXV4KAorCSAgcmV0dXJuIF9NX2lu c2VydF91bmlxdWVfYXV4KG51bGxwdHIsCiAJICAgIF9fdG9fdmFsdWV7fShzdGQ6OmZvcndh cmQ8X0FyZz4oX19hcmcpKSwgX19ub2RlX2dlbik7CiAJfQogCkBAIC05NjYsMjUgKzEwMDIs MjcgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KIAl7CiAJICB1c2luZyBf X3RvX3ZhbHVlCiAJICAgID0gX19kZXRhaWw6Ol9Db252ZXJ0VG9WYWx1ZVR5cGU8X0V4dHJh Y3RLZXksIHZhbHVlX3R5cGU+OwotCSAgcmV0dXJuIF9NX2luc2VydChjZW5kKCksCisJICBy ZXR1cm4gX01faW5zZXJ0KG51bGxwdHIsCiAJICAgIF9fdG9fdmFsdWV7fShzdGQ6OmZvcndh cmQ8X0FyZz4oX19hcmcpKSwgX19ub2RlX2dlbiwgX191a3MpOwogCX0KIAotICAgICAgLy8g SW5zZXJ0IHdpdGggaGludCwgbm90IHVzZWQgd2hlbiBrZXlzIGFyZSB1bmlxdWUuCisgICAg ICAvLyBJbnNlcnQgd2l0aCBoaW50IHdoZW4ga2V5cyBhcmUgdW5pcXVlLgogICAgICAgdGVt cGxhdGU8dHlwZW5hbWUgX0FyZywgdHlwZW5hbWUgX05vZGVHZW5lcmF0b3I+CiAJaXRlcmF0 b3IKLQlfTV9pbnNlcnQoY29uc3RfaXRlcmF0b3IsIF9BcmcmJiBfX2FyZywKLQkJICBjb25z dCBfTm9kZUdlbmVyYXRvciYgX19ub2RlX2dlbiwgdHJ1ZV90eXBlIF9fdWtzKQorCV9NX2lu c2VydChfX25vZGVfcHRyIF9faGludCwgX0FyZyYmIF9fYXJnLAorCQkgIGNvbnN0IF9Ob2Rl R2VuZXJhdG9yJiBfX25vZGVfZ2VuLCB0cnVlX3R5cGUgLyogX191a3MgKi8pCiAJewotCSAg cmV0dXJuCi0JICAgIF9NX2luc2VydChzdGQ6OmZvcndhcmQ8X0FyZz4oX19hcmcpLCBfX25v ZGVfZ2VuLCBfX3VrcykuZmlyc3Q7CisJICB1c2luZyBfX3RvX3ZhbHVlCisJICAgID0gX19k ZXRhaWw6Ol9Db252ZXJ0VG9WYWx1ZVR5cGU8X0V4dHJhY3RLZXksIHZhbHVlX3R5cGU+Owor CSAgcmV0dXJuIF9NX2luc2VydF91bmlxdWVfYXV4KF9faGludCwKKwkgICAgX190b192YWx1 ZXt9KHN0ZDo6Zm9yd2FyZDxfQXJnPihfX2FyZykpLCBfX25vZGVfZ2VuKS5maXJzdDsKIAl9 CiAKICAgICAgIC8vIEluc2VydCB3aXRoIGhpbnQgd2hlbiBrZXlzIGFyZSBub3QgdW5pcXVl LgogICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZywgdHlwZW5hbWUgX05vZGVHZW5lcmF0 b3I+CiAJaXRlcmF0b3IKLQlfTV9pbnNlcnQoY29uc3RfaXRlcmF0b3IsIF9BcmcmJiwKLQkJ ICBjb25zdCBfTm9kZUdlbmVyYXRvciYsIGZhbHNlX3R5cGUgX191a3MpOworCV9NX2luc2Vy dChfX25vZGVfcHRyIF9faGludCwgX0FyZyYmIF9fYXJnLAorCQkgIGNvbnN0IF9Ob2RlR2Vu ZXJhdG9yJiBfX25vZGVfZ2VuLCBmYWxzZV90eXBlIC8qIF9fdWtzICovKTsKIAogICAgICAg c2l6ZV90eXBlCiAgICAgICBfTV9lcmFzZSh0cnVlX3R5cGUgX191a3MsIGNvbnN0IGtleV90 eXBlJik7CkBAIC0xMDA2LDcgKzEwNDQsNyBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0Vf VkVSU0lPTgogCWl0ZXJhdG9yCiAJZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJhdG9yIF9faGlu dCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCiAJewotCSAgcmV0dXJuIF9NX2VtcGxhY2UoX19oaW50 LCBfX3VuaXF1ZV9rZXlze30sCisJICByZXR1cm4gX01fZW1wbGFjZShfX2hpbnQuX01fY3Vy LCBfX3VuaXF1ZV9rZXlze30sCiAJCQkgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3Mp Li4uKTsKIAl9CiAKQEAgLTEwNDEsNyArMTA3OSw3IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVT UEFDRV9WRVJTSU9OCiAjaWYgX19jcGx1c3BsdXMgPiAyMDE0MDJMCiAgICAgICAvLy8gUmUt aW5zZXJ0IGFuIGV4dHJhY3RlZCBub2RlIGludG8gYSBjb250YWluZXIgd2l0aCB1bmlxdWUg a2V5cy4KICAgICAgIGluc2VydF9yZXR1cm5fdHlwZQotICAgICAgX01fcmVpbnNlcnRfbm9k ZShub2RlX3R5cGUmJiBfX25oKQorICAgICAgX01fcmVpbnNlcnRfbm9kZShjb25zdF9pdGVy YXRvciBfX2hpbnQsIG5vZGVfdHlwZSYmIF9fbmgpCiAgICAgICB7CiAJaW5zZXJ0X3JldHVy bl90eXBlIF9fcmV0OwogCWlmIChfX25oLmVtcHR5KCkpCkBAIC0xMDYyLDcgKzExMDAsOCBA QCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCSAgICBlbHNlCiAJICAgICAg ewogCQlfX3JldC5wb3NpdGlvbgotCQkgID0gX01faW5zZXJ0X3VuaXF1ZV9ub2RlKF9fYmt0 LCBfX2NvZGUsIF9fbmguX01fcHRyKTsKKwkJICA9IF9NX2luc2VydF91bmlxdWVfbm9kZShf X2hpbnQuX01fY3VyLAorCQkJCQkgIF9fYmt0LCBfX2NvZGUsIF9fbmguX01fcHRyKTsKIAkJ X19uaC5fTV9wdHIgPSBudWxscHRyOwogCQlfX3JldC5pbnNlcnRlZCA9IHRydWU7CiAJICAg ICAgfQpAQCAtMTA4MCwxMSArMTExOSwxMCBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0Vf VkVSU0lPTgogCV9fZ2xpYmN4eF9hc3NlcnQoZ2V0X2FsbG9jYXRvcigpID09IF9fbmguZ2V0 X2FsbG9jYXRvcigpKTsKIAogCWNvbnN0IGtleV90eXBlJiBfX2sgPSBfX25oLl9NX2tleSgp OwotCWF1dG8gX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKF9fayk7Ci0JYXV0byBfX3Jl dAotCSAgPSBfTV9pbnNlcnRfbXVsdGlfbm9kZShfX2hpbnQuX01fY3VyLCBfX2NvZGUsIF9f bmguX01fcHRyKTsKKwlhdXRvIF9faW5mbyA9IF9NX2dldF9pbnNlcnRfaW5mbyhfX2hpbnQu X01fY3VyLCBfX2spOworCWF1dG8gX19pdCA9IF9NX2luc2VydF9tdWx0aV9ub2RlKF9faW5m bywgX19uaC5fTV9wdHIpOwogCV9fbmguX01fcHRyID0gbnVsbHB0cjsKLQlyZXR1cm4gX19y ZXQ7CisJcmV0dXJuIF9faXQ7CiAgICAgICB9CiAKICAgICBwcml2YXRlOgpAQCAtMTEzMCw2 ICsxMTY4LDE3IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAJcmV0dXJu IF9fbmg7CiAgICAgICB9CiAKKyAgICBwcml2YXRlOgorICAgICAgX19oYXNoX2NvZGUKKyAg ICAgIF9NX2NvbXB1dGVfaGFzaF9jb2RlKGNvbnN0IF9IYXNoJiwgX19ub2RlX3B0ciBfX24s IGNvbnN0IGtleV90eXBlJikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2hhc2hfY29kZSgq X19uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSDI+CisJX19oYXNoX2NvZGUK KwlfTV9jb21wdXRlX2hhc2hfY29kZShjb25zdCBfSDImLCBfX25vZGVfcHRyLCBjb25zdCBr ZXlfdHlwZSYgX19rKQorCXsgcmV0dXJuIHRoaXMtPl9NX2hhc2hfY29kZShfX2spOyB9CisK KyAgICBwdWJsaWM6CiAgICAgICAvLy8gTWVyZ2UgZnJvbSBhIGNvbXBhdGlibGUgY29udGFp bmVyIGludG8gb25lIHdpdGggdW5pcXVlIGtleXMuCiAgICAgICB0ZW1wbGF0ZTx0eXBlbmFt ZSBfQ29tcGF0aWJsZV9IYXNodGFibGU+CiAJdm9pZApAQCAtMTEzOSwxOCArMTE4OCw0OCBA QCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCSAgICAgIG5vZGVfdHlwZT4s ICJOb2RlIHR5cGVzIGFyZSBjb21wYXRpYmxlIik7CiAJICBfX2dsaWJjeHhfYXNzZXJ0KGdl dF9hbGxvY2F0b3IoKSA9PSBfX3NyYy5nZXRfYWxsb2NhdG9yKCkpOwogCisJICBfX25vZGVf cHRyIF9faGludCA9IG51bGxwdHI7CiAJICBhdXRvIF9fbl9lbHQgPSBfX3NyYy5zaXplKCk7 CiAJICBmb3IgKGF1dG8gX19pID0gX19zcmMuY2JlZ2luKCksIF9fZW5kID0gX19zcmMuY2Vu ZCgpOyBfX2kgIT0gX19lbmQ7KQogCSAgICB7CiAJICAgICAgYXV0byBfX3BvcyA9IF9faSsr OwogCSAgICAgIGNvbnN0IGtleV90eXBlJiBfX2sgPSBfRXh0cmFjdEtleXt9KCpfX3Bvcyk7 Ci0JICAgICAgX19oYXNoX2NvZGUgX19jb2RlCi0JCT0gdGhpcy0+X01faGFzaF9jb2RlKF9f c3JjLmhhc2hfZnVuY3Rpb24oKSwgKl9fcG9zLl9NX2N1cik7CisJICAgICAgaWYgKHNpemUo KSA8PSBfX3NtYWxsX3NpemVfdGhyZXNob2xkKCkpCisJCXsKKwkJICBfX25vZGVfcHRyIF9f bGFzdF9uID0gbnVsbHB0cjsKKwkJICBib29sIF9fZm91bmQgPSBmYWxzZTsKKwkJICBmb3Ig KGF1dG8gX19uID0gX01fYmVnaW4oKTsgX19uOworCQkgICAgICAgX19sYXN0X24gPSBfX24s IF9fbiA9IF9fbi0+X01fbmV4dCgpKQorCQkgICAgaWYgKHRoaXMtPl9NX2tleV9lcXVhbHMo X19rLCAqX19uKSkKKwkJICAgICAgeworCQkJX19mb3VuZCA9IHRydWU7CisJCQlicmVhazsK KwkJICAgICAgfQorCisJCSAgaWYgKF9fZm91bmQpCisJCSAgICB7CisJCSAgICAgIGlmIChf X25fZWx0ICE9IDEpCisJCQktLV9fbl9lbHQ7CisJCSAgICAgIGNvbnRpbnVlOworCQkgICAg fQorCQkgIGVsc2UgaWYgKCFfX2hpbnQpCisJCSAgICBfX2hpbnQgPSBfX2xhc3RfbjsKKwkJ fQorCisJICAgICAgX19oYXNoX2NvZGUgX19jb2RlID0KKwkJX01fY29tcHV0ZV9oYXNoX2Nv ZGUoX19zcmMuaGFzaF9mdW5jdGlvbigpLCBfX3Bvcy5fTV9jdXIsIF9fayk7CiAJICAgICAg c2l6ZV90eXBlIF9fYmt0ID0gX01fYnVja2V0X2luZGV4KF9fY29kZSk7Ci0JICAgICAgaWYg KF9NX2ZpbmRfbm9kZShfX2JrdCwgX19rLCBfX2NvZGUpID09IG51bGxwdHIpCisJICAgICAg aWYgKHNpemUoKSA8PSBfX3NtYWxsX3NpemVfdGhyZXNob2xkKCkKKwkJICB8fCBfTV9maW5k X25vZGUoX19ia3QsIF9faywgX19jb2RlKSA9PSBudWxscHRyKQogCQl7CiAJCSAgYXV0byBf X25oID0gX19zcmMuZXh0cmFjdChfX3Bvcyk7Ci0JCSAgX01faW5zZXJ0X3VuaXF1ZV9ub2Rl KF9fYmt0LCBfX2NvZGUsIF9fbmguX01fcHRyLCBfX25fZWx0KTsKKwkJICBhdXRvIF9fcG9z ID0gX01faW5zZXJ0X3VuaXF1ZV9ub2RlKAorCQkgICAgX19oaW50LCBfX2JrdCwgX19jb2Rl LCBfX25oLl9NX3B0ciwgX19uX2VsdCkuX01fY3VyOworCisJCSAgLy8gS2VlcCBvbmx5IHRo ZSBsYXN0IG5vZGUgYXMgYW4gaW5zZXJ0aW9uIGhpbnQuCisJCSAgaWYgKCFfX3Bvcy0+X01f bnh0KQorCQkgICAgX19oaW50ID0gX19wb3M7CisKIAkJICBfX25oLl9NX3B0ciA9IG51bGxw dHI7CiAJCSAgX19uX2VsdCA9IDE7CiAJCX0KQEAgLTExNTksNiArMTIzOCwyMiBAQCBfR0xJ QkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCSAgICB9CiAJfQogCisgICAgcHJpdmF0 ZToKKyAgICAgIF9JbnNlcnRJbmZvCisgICAgICBfTV9nZXRfaW5zZXJ0X2luZm8oY29uc3Qg X0hhc2gmLCBfX25vZGVfcHRyIF9faGludCwgX19ub2RlX3B0ciBfX24sCisJCQkgY29uc3Qg a2V5X3R5cGUmIF9faykKKyAgICAgIHsKKwkvLyBTYW1lIF9IYXNoIGZ1bmN0b3IsIHdlIGNh biByZXVzZSBfX24gaGFzaCBjb2RlLgorCXJldHVybiBfTV9nZXRfaW5zZXJ0X2luZm8oX19o aW50LCBfX2ssIF9fbik7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9I Mj4KKwlfSW5zZXJ0SW5mbworCV9NX2dldF9pbnNlcnRfaW5mbyhjb25zdCBfSDImLCBfX25v ZGVfcHRyIF9faGludCwgX19ub2RlX3B0ciwKKwkJCSAgIGNvbnN0IGtleV90eXBlJiBfX2sp CisJeyByZXR1cm4gX01fZ2V0X2luc2VydF9pbmZvKF9faGludCwgX19rKTsgfQorCisgICAg cHVibGljOgogICAgICAgLy8vIE1lcmdlIGZyb20gYSBjb21wYXRpYmxlIGNvbnRhaW5lciBp bnRvIG9uZSB3aXRoIGVxdWl2YWxlbnQga2V5cy4KICAgICAgIHRlbXBsYXRlPHR5cGVuYW1l IF9Db21wYXRpYmxlX0hhc2h0YWJsZT4KIAl2b2lkCkBAIC0xMTczLDEwICsxMjY4LDE3IEBA IF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAJICBmb3IgKGF1dG8gX19pID0g X19zcmMuY2JlZ2luKCksIF9fZW5kID0gX19zcmMuY2VuZCgpOyBfX2kgIT0gX19lbmQ7KQog CSAgICB7CiAJICAgICAgYXV0byBfX3BvcyA9IF9faSsrOwotCSAgICAgIF9faGFzaF9jb2Rl IF9fY29kZQotCQk9IHRoaXMtPl9NX2hhc2hfY29kZShfX3NyYy5oYXNoX2Z1bmN0aW9uKCks ICpfX3Bvcy5fTV9jdXIpOworCSAgICAgIGNvbnN0IGtleV90eXBlJiBfX2sgPSBfRXh0cmFj dEtleXt9KCpfX3Bvcyk7CisJICAgICAgYXV0byBfX2luZm8gPSBfTV9nZXRfaW5zZXJ0X2lu Zm8oX19zcmMuaGFzaF9mdW5jdGlvbigpLAorCQkJCQkgICAgICAgX19oaW50LCBfX3Bvcy5f TV9jdXIsIF9fayk7CiAJICAgICAgYXV0byBfX25oID0gX19zcmMuZXh0cmFjdChfX3Bvcyk7 Ci0JICAgICAgX19oaW50ID0gX01faW5zZXJ0X211bHRpX25vZGUoX19oaW50LCBfX2NvZGUs IF9fbmguX01fcHRyKS5fTV9jdXI7CisJICAgICAgYXV0byBfX2luc2VydGVkX24gPQorCQlf TV9pbnNlcnRfbXVsdGlfbm9kZShfX2luZm8sIF9fbmguX01fcHRyKS5fTV9jdXI7CisKKwkg ICAgICAvLyBLZWVwIG9ubHkgdGhlIGxhc3Qgbm9kZSBhcyBhbiBpbnNlcnRpb24gaGludC4K KwkgICAgICBpZiAoIV9faW5zZXJ0ZWRfbi0+X01fbnh0KQorCQlfX2hpbnQgPSBfX2luc2Vy dGVkX247CisKIAkgICAgICBfX25oLl9NX3B0ciA9IG51bGxwdHI7CiAJICAgIH0KIAl9CkBA IC0xMjUyLDkgKzEzNTQsMTUgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04K IAkgICAgX01fYnVja2V0X2NvdW50ID0gX19ia3RfY291bnQ7CiAJICB9CiAKKwlfX25vZGVf cHRyIF9faGludCA9IG51bGxwdHI7CiAJX19hbGxvY19ub2RlX2dlbl90IF9fbm9kZV9nZW4o KnRoaXMpOwogCWZvciAoOyBfX2YgIT0gX19sOyArK19fZikKLQkgIF9NX2luc2VydCgqX19m LCBfX25vZGVfZ2VuLCBfX3Vrcyk7CisJICB7CisJICAgIF9fbm9kZV9wdHIgX19pbnNlcnRf cG9zCisJICAgICAgPSBfTV9pbnNlcnQoX19oaW50LCAqX19mLCBfX25vZGVfZ2VuLCBfX3Vr cykuX01fY3VyOworCSAgICBpZiAoIV9faW5zZXJ0X3Bvcy0+X01fbnh0KQorCSAgICAgIF9f aGludCA9IF9faW5zZXJ0X3BvczsKKwkgIH0KICAgICAgIH0KIAogICB0ZW1wbGF0ZTx0eXBl bmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9BbGxvYywKQEAgLTE2ODEs OSArMTc4OSw5IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAgICAgewog ICAgICAgaWYgKHNpemUoKSA8PSBfX3NtYWxsX3NpemVfdGhyZXNob2xkKCkpCiAJewotCSAg Zm9yIChhdXRvIF9faXQgPSBfTV9iZWdpbigpOyBfX2l0OyBfX2l0ID0gX19pdC0+X01fbmV4 dCgpKQotCSAgICBpZiAodGhpcy0+X01fa2V5X2VxdWFscyhfX2ssICpfX2l0KSkKLQkgICAg ICByZXR1cm4gaXRlcmF0b3IoX19pdCk7CisJICBmb3IgKGF1dG8gX19uID0gX01fYmVnaW4o KTsgX19uOyBfX24gPSBfX24tPl9NX25leHQoKSkKKwkgICAgaWYgKHRoaXMtPl9NX2tleV9l cXVhbHMoX19rLCAqX19uKSkKKwkgICAgICByZXR1cm4gaXRlcmF0b3IoX19uKTsKIAkgIHJl dHVybiBlbmQoKTsKIAl9CiAKQEAgLTE3MDQsOSArMTgxMiw5IEBAIF9HTElCQ1hYX0JFR0lO X05BTUVTUEFDRV9WRVJTSU9OCiAgICAgewogICAgICAgaWYgKHNpemUoKSA8PSBfX3NtYWxs X3NpemVfdGhyZXNob2xkKCkpCiAJewotCSAgZm9yIChhdXRvIF9faXQgPSBfTV9iZWdpbigp OyBfX2l0OyBfX2l0ID0gX19pdC0+X01fbmV4dCgpKQotCSAgICBpZiAodGhpcy0+X01fa2V5 X2VxdWFscyhfX2ssICpfX2l0KSkKLQkgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoX19p dCk7CisJICBmb3IgKGF1dG8gX19uID0gX01fYmVnaW4oKTsgX19uOyBfX24gPSBfX24tPl9N X25leHQoKSkKKwkgICAgaWYgKHRoaXMtPl9NX2tleV9lcXVhbHMoX19rLCAqX19uKSkKKwkg ICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoX19uKTsKIAkgIHJldHVybiBlbmQoKTsKIAl9 CiAKQEAgLTIwMzYsNyArMjE0NCw3IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJT SU9OCiAgICAgICBhdXRvCiAgICAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9j LCBfRXh0cmFjdEtleSwgX0VxdWFsLAogCQkgX0hhc2gsIF9SYW5nZUhhc2gsIF9VbnVzZWQs IF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKLSAgICAgIF9NX2VtcGxhY2UodHJ1ZV90eXBl IC8qIF9fdWtzICovLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIF9NX2VtcGxhY2VfdW5p cXVlKF9fbm9kZV9wdHIgX19oaW50LCBfQXJncyYmLi4uIF9fYXJncykKICAgICAgIC0+IHBh aXI8aXRlcmF0b3IsIGJvb2w+CiAgICAgICB7CiAJLy8gRmlyc3QgYnVpbGQgdGhlIG5vZGUg dG8gZ2V0IGFjY2VzcyB0byB0aGUgaGFzaCBjb2RlCkBAIC0yMDQ0LDEwICsyMTUyLDE0IEBA IF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAJY29uc3Qga2V5X3R5cGUmIF9f ayA9IF9FeHRyYWN0S2V5e30oX19ub2RlLl9NX25vZGUtPl9NX3YoKSk7CiAJaWYgKHNpemUo KSA8PSBfX3NtYWxsX3NpemVfdGhyZXNob2xkKCkpCiAJICB7Ci0JICAgIGZvciAoYXV0byBf X2l0ID0gX01fYmVnaW4oKTsgX19pdDsgX19pdCA9IF9faXQtPl9NX25leHQoKSkKLQkgICAg ICBpZiAodGhpcy0+X01fa2V5X2VxdWFscyhfX2ssICpfX2l0KSkKKwkgICAgX19ub2RlX3B0 ciBfX2xhc3RfbiA9IG51bGxwdHI7CisJICAgIGZvciAoYXV0byBfX24gPSBfTV9iZWdpbigp OyBfX247CisJCSBfX2xhc3RfbiA9IF9fbiwgX19uID0gX19uLT5fTV9uZXh0KCkpCisJICAg ICAgaWYgKHRoaXMtPl9NX2tleV9lcXVhbHMoX19rLCAqX19uKSkKIAkJLy8gVGhlcmUgaXMg YWxyZWFkeSBhbiBlcXVpdmFsZW50IG5vZGUsIG5vIGluc2VydGlvbgotCQlyZXR1cm4geyBp dGVyYXRvcihfX2l0KSwgZmFsc2UgfTsKKwkJcmV0dXJuIHsgaXRlcmF0b3IoX19uKSwgZmFs c2UgfTsKKworCSAgICBfX2hpbnQgPSBfX2xhc3RfbjsKIAkgIH0KIAogCV9faGFzaF9jb2Rl IF9fY29kZSA9IHRoaXMtPl9NX2hhc2hfY29kZShfX2spOwpAQCAtMjA1OCw3ICsyMTcwLDgg QEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KIAkgICAgcmV0dXJuIHsgaXRl cmF0b3IoX19wKSwgZmFsc2UgfTsKIAogCS8vIEluc2VydCB0aGUgbm9kZQotCWF1dG8gX19w b3MgPSBfTV9pbnNlcnRfdW5pcXVlX25vZGUoX19ia3QsIF9fY29kZSwgX19ub2RlLl9NX25v ZGUpOworCWF1dG8gX19wb3MgPSBfTV9pbnNlcnRfdW5pcXVlX25vZGUoX19oaW50LCBfX2Jr dCwgX19jb2RlLAorCQkJCQkgICBfX25vZGUuX01fbm9kZSk7CiAJX19ub2RlLl9NX25vZGUg PSBudWxscHRyOwogCXJldHVybiB7IF9fcG9zLCB0cnVlIH07CiAgICAgICB9CkBAIC0yMDcx LDE3ICsyMTg0LDE1IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAgICAg ICBhdXRvCiAgICAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFj dEtleSwgX0VxdWFsLAogCQkgX0hhc2gsIF9SYW5nZUhhc2gsIF9VbnVzZWQsIF9SZWhhc2hQ b2xpY3ksIF9UcmFpdHM+OjoKLSAgICAgIF9NX2VtcGxhY2UoY29uc3RfaXRlcmF0b3IgX19o aW50LCBmYWxzZV90eXBlIC8qIF9fdWtzICovLAotCQkgX0FyZ3MmJi4uLiBfX2FyZ3MpCisg ICAgICBfTV9lbXBsYWNlX211bHRpKF9fbm9kZV9wdHIgX19oaW50LCBfQXJncyYmLi4uIF9f YXJncykKICAgICAgIC0+IGl0ZXJhdG9yCiAgICAgICB7CiAJLy8gRmlyc3QgYnVpbGQgdGhl IG5vZGUgdG8gZ2V0IGl0cyBoYXNoIGNvZGUuCiAJX1Njb3BlZF9ub2RlIF9fbm9kZSB7IHRo aXMsIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLiAgfTsKIAljb25zdCBrZXlfdHlw ZSYgX19rID0gX0V4dHJhY3RLZXl7fShfX25vZGUuX01fbm9kZS0+X01fdigpKTsKIAotCWF1 dG8gX19yZXMgPSB0aGlzLT5fTV9jb21wdXRlX2hhc2hfY29kZShfX2hpbnQuX01fY3VyLCBf X2spOwotCWF1dG8gX19wb3MKLQkgID0gX01faW5zZXJ0X211bHRpX25vZGUoX19yZXMuZmly c3QsIF9fcmVzLnNlY29uZCwgX19ub2RlLl9NX25vZGUpOworCWF1dG8gX19pbmZvID0gX01f Z2V0X2luc2VydF9pbmZvKF9faGludCwgX19rKTsKKwlhdXRvIF9fcG9zID0gX01faW5zZXJ0 X211bHRpX25vZGUoX19pbmZvLCBfX25vZGUuX01fbm9kZSk7CiAJX19ub2RlLl9NX25vZGUg PSBudWxscHRyOwogCXJldHVybiBfX3BvczsKICAgICAgIH0KQEAgLTIwOTMsMjYgKzIyMDQs MzIgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KICAgICBhdXRvCiAgICAg X0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwK IAkgICAgICAgX0hhc2gsIF9SYW5nZUhhc2gsIF9VbnVzZWQsIF9SZWhhc2hQb2xpY3ksIF9U cmFpdHM+OjoKLSAgICBfTV9jb21wdXRlX2hhc2hfY29kZShfX25vZGVfcHRyIF9faGludCwg Y29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKLSAgICAtPiBwYWlyPF9fbm9kZV9wdHIsIF9f aGFzaF9jb2RlPgorICAgIF9NX2dldF9pbnNlcnRfaW5mbyhfX25vZGVfcHRyIF9faGludCwg Y29uc3Qga2V5X3R5cGUmIF9faywKKwkJICAgICAgIF9fbm9kZV9wdHIgX19lcXVpX24pIGNv bnN0CisgICAgLT4gX0luc2VydEluZm8KICAgICB7CiAgICAgICBpZiAoc2l6ZSgpIDw9IF9f c21hbGxfc2l6ZV90aHJlc2hvbGQoKSkKIAl7Ci0JICBpZiAoX19oaW50KQotCSAgICB7Ci0J ICAgICAgZm9yIChhdXRvIF9faXQgPSBfX2hpbnQ7IF9faXQ7IF9faXQgPSBfX2l0LT5fTV9u ZXh0KCkpCi0JCWlmICh0aGlzLT5fTV9rZXlfZXF1YWxzKF9faywgKl9faXQpKQotCQkgIHJl dHVybiB7IF9faXQsIHRoaXMtPl9NX2hhc2hfY29kZSgqX19pdCkgfTsKLQkgICAgfQotCi0J ICBmb3IgKGF1dG8gX19pdCA9IF9NX2JlZ2luKCk7IF9faXQgIT0gX19oaW50OyBfX2l0ID0g X19pdC0+X01fbmV4dCgpKQotCSAgICBpZiAodGhpcy0+X01fa2V5X2VxdWFscyhfX2ssICpf X2l0KSkKLQkgICAgICByZXR1cm4geyBfX2l0LCB0aGlzLT5fTV9oYXNoX2NvZGUoKl9faXQp IH07CisJICBfX25vZGVfcHRyIF9fbGFzdF9uID0gbnVsbHB0cjsKKwkgIF9fbm9kZV9iYXNl X3B0ciBfX3ByZXYKKwkgICAgPSBjb25zdF9jYXN0PF9fbm9kZV9iYXNlX3B0cj4oJl9NX2Jl Zm9yZV9iZWdpbik7CisJICBmb3IgKGF1dG8gX19uID0gc3RhdGljX2Nhc3Q8X19ub2RlX3B0 cj4oX19wcmV2LT5fTV9ueHQpOyBfX247CisJICAgICAgIF9fcHJldiA9IF9fbGFzdF9uID0g X19uLCBfX24gPSBfX24tPl9NX25leHQoKSkKKwkgICAgaWYgKHRoaXMtPl9NX2tleV9lcXVh bHMoX19rLCAqX19uKSkKKwkgICAgICByZXR1cm4KKwkJeworCQkgIF9fcHJldiwgX19uLCBf X2hpbnQsCisJCSAgX19oYXNoX2NhY2hlZDo6dmFsdWUgPyB0aGlzLT5fTV9oYXNoX2NvZGUo Kl9fbikgOiAwCisJCX07CiAKLQkgIF9faGludCA9IG51bGxwdHI7CisJICBfX2hpbnQgPSBf X2xhc3RfbjsKIAl9CiAKLSAgICAgIHJldHVybiB7IF9faGludCwgdGhpcy0+X01faGFzaF9j b2RlKF9faykgfTsKKyAgICAgIHJldHVybgorCXsKKwkgIG51bGxwdHIsIG51bGxwdHIsIF9f aGludCwKKwkgIF9fZXF1aV9uID8gdGhpcy0+X01faGFzaF9jb2RlKCpfX2VxdWlfbikgOiB0 aGlzLT5fTV9oYXNoX2NvZGUoX19rKQorCX07CiAgICAgfQogCiAgIHRlbXBsYXRlPHR5cGVu YW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0FsbG9jLApAQCAtMjEyMiw3 ICsyMjM5LDggQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KICAgICBhdXRv CiAgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9F cXVhbCwKIAkgICAgICAgX0hhc2gsIF9SYW5nZUhhc2gsIF9VbnVzZWQsIF9SZWhhc2hQb2xp Y3ksIF9UcmFpdHM+OjoKLSAgICBfTV9pbnNlcnRfdW5pcXVlX25vZGUoc2l6ZV90eXBlIF9f Ymt0LCBfX2hhc2hfY29kZSBfX2NvZGUsCisgICAgX01faW5zZXJ0X3VuaXF1ZV9ub2RlKF9f bm9kZV9wdHIgX19oaW50LAorCQkJICBzaXplX3R5cGUgX19ia3QsIF9faGFzaF9jb2RlIF9f Y29kZSwKIAkJCSAgX19ub2RlX3B0ciBfX25vZGUsIHNpemVfdHlwZSBfX25fZWx0KQogICAg IC0+IGl0ZXJhdG9yCiAgICAgewpAQCAtMjE0MCw3ICsyMjU4LDcgQEAgX0dMSUJDWFhfQkVH SU5fTkFNRVNQQUNFX1ZFUlNJT04KICAgICAgIHRoaXMtPl9NX3N0b3JlX2NvZGUoKl9fbm9k ZSwgX19jb2RlKTsKIAogICAgICAgLy8gQWx3YXlzIGluc2VydCBhdCB0aGUgYmVnaW5uaW5n IG9mIHRoZSBidWNrZXQuCi0gICAgICBfTV9pbnNlcnRfYnVja2V0X2JlZ2luKF9fYmt0LCBf X25vZGUpOworICAgICAgX01faW5zZXJ0X2J1Y2tldF9iZWdpbihfX2hpbnQsIF9fYmt0LCBf X25vZGUpOwogICAgICAgKytfTV9lbGVtZW50X2NvdW50OwogICAgICAgcmV0dXJuIGl0ZXJh dG9yKF9fbm9kZSk7CiAgICAgfQpAQCAtMjE1Miw4ICsyMjcwLDcgQEAgX0dMSUJDWFhfQkVH SU5fTkFNRVNQQUNFX1ZFUlNJT04KICAgICBhdXRvCiAgICAgX0hhc2h0YWJsZTxfS2V5LCBf VmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKIAkgICAgICAgX0hhc2gsIF9S YW5nZUhhc2gsIF9VbnVzZWQsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKLSAgICBfTV9p bnNlcnRfbXVsdGlfbm9kZShfX25vZGVfcHRyIF9faGludCwKLQkJCSBfX2hhc2hfY29kZSBf X2NvZGUsIF9fbm9kZV9wdHIgX19ub2RlKQorICAgIF9NX2luc2VydF9tdWx0aV9ub2RlKGNv bnN0IF9JbnNlcnRJbmZvJiBfX2luZm8sIF9fbm9kZV9wdHIgX19ub2RlKQogICAgIC0+IGl0 ZXJhdG9yCiAgICAgewogICAgICAgY29uc3QgX19yZWhhc2hfc3RhdGUmIF9fc2F2ZWRfc3Rh dGUgPSBfTV9yZWhhc2hfcG9saWN5Ll9NX3N0YXRlKCk7CkBAIC0yMTYzLDM5ICsyMjgwLDQ2 IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAgICAgICBpZiAoX19kb19y ZWhhc2guZmlyc3QpCiAJX01fcmVoYXNoKF9fZG9fcmVoYXNoLnNlY29uZCwgX19zYXZlZF9z dGF0ZSk7CiAKKyAgICAgIGF1dG8gX19jb2RlID0gX19pbmZvLl9NX2NvZGU7CiAgICAgICB0 aGlzLT5fTV9zdG9yZV9jb2RlKCpfX25vZGUsIF9fY29kZSk7CiAgICAgICBjb25zdCBrZXlf dHlwZSYgX19rID0gX0V4dHJhY3RLZXl7fShfX25vZGUtPl9NX3YoKSk7Ci0gICAgICBzaXpl X3R5cGUgX19ia3QgPSBfTV9idWNrZXRfaW5kZXgoX19jb2RlKTsKKyAgICAgIGF1dG8gX19w cmV2ID0gX19pbmZvLl9NX3ByZXY7CisgICAgICBjb25zdCBib29sIF9faGFzX3ByZXYgPSBf X3ByZXYgIT0gbnVsbHB0cjsKKyAgICAgIHNpemVfdHlwZSBfX2JrdDsKIAogICAgICAgLy8g RmluZCB0aGUgbm9kZSBiZWZvcmUgYW4gZXF1aXZhbGVudCBvbmUgb3IgdXNlIGhpbnQgaWYg aXQgZXhpc3RzIGFuZAogICAgICAgLy8gaWYgaXQgaXMgZXF1aXZhbGVudC4KLSAgICAgIF9f bm9kZV9iYXNlX3B0ciBfX3ByZXYKLQk9IF9fYnVpbHRpbl9leHBlY3QoX19oaW50ICE9IG51 bGxwdHIsIGZhbHNlKQotCSAgJiYgdGhpcy0+X01fZXF1YWxzKF9faywgX19jb2RlLCAqX19o aW50KQotCSAgICA/IF9faGludAotCSAgICA6IF9NX2ZpbmRfYmVmb3JlX25vZGUoX19ia3Qs IF9faywgX19jb2RlKTsKKyAgICAgIGlmICghX19oYXNfcHJldikKKwl7CisJICBfX2JrdCA9 IF9NX2J1Y2tldF9pbmRleChfX2NvZGUpOworCSAgX19wcmV2ID0gX01fZmluZF9iZWZvcmVf bm9kZShfX2JrdCwgX19rLCBfX2NvZGUpOworCX0KIAogICAgICAgaWYgKF9fcHJldikKIAl7 CiAJICAvLyBJbnNlcnQgYWZ0ZXIgdGhlIG5vZGUgYmVmb3JlIHRoZSBlcXVpdmFsZW50IG9u ZS4KIAkgIF9fbm9kZS0+X01fbnh0ID0gX19wcmV2LT5fTV9ueHQ7CiAJICBfX3ByZXYtPl9N X254dCA9IF9fbm9kZTsKLQkgIGlmIChfX2J1aWx0aW5fZXhwZWN0KF9fcHJldiA9PSBfX2hp bnQsIGZhbHNlKSkKLQkgICAgLy8gaGludCBtaWdodCBiZSB0aGUgbGFzdCBidWNrZXQgbm9k ZSwgaW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8KLQkgICAgLy8gdXBkYXRlIG5leHQgYnVja2V0 LgotCSAgICBpZiAoX19ub2RlLT5fTV9ueHQKLQkJJiYgIXRoaXMtPl9NX2VxdWFscyhfX2ss IF9fY29kZSwgKl9fbm9kZS0+X01fbmV4dCgpKSkKLQkgICAgICB7Ci0JCXNpemVfdHlwZSBf X25leHRfYmt0ID0gX01fYnVja2V0X2luZGV4KCpfX25vZGUtPl9NX25leHQoKSk7Ci0JCWlm IChfX25leHRfYmt0ICE9IF9fYmt0KQotCQkgIF9NX2J1Y2tldHNbX19uZXh0X2JrdF0gPSBf X25vZGU7Ci0JICAgICAgfQorCisJICAvLyBfX2hpbnQgbWlnaHQgYmUgdGhlIGxhc3QgYnVj a2V0IG5vZGUsIGluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvCisJICAvLyB1cGRhdGUgbmV4dCBi dWNrZXQuCisJICBpZiAoX19oYXNfcHJldiAmJiBfX25vZGUtPl9NX254dCAhPSBfX2luZm8u X01fZXF1aV9uKQorCSAgICB7CisJICAgICAgY29uc3QgYXV0byBfX254dCA9IF9fbm9kZS0+ X01fbmV4dCgpOworCSAgICAgIGlmICghdGhpcy0+X01fZXF1YWxzKF9faywgX19jb2RlLCAq X19ueHQpKQorCQl7CisJCSAgc2l6ZV90eXBlIF9fbmV4dF9ia3QgPSBfTV9idWNrZXRfaW5k ZXgoKl9fbnh0KTsKKwkJICBpZiAoX19uZXh0X2JrdCAhPSBfTV9idWNrZXRfaW5kZXgoX19j b2RlKSkKKwkJICAgIF9NX2J1Y2tldHNbX19uZXh0X2JrdF0gPSBfX25vZGU7CisJCX0KKwkg ICAgfQogCX0KICAgICAgIGVsc2UKIAkvLyBUaGUgaW5zZXJ0ZWQgbm9kZSBoYXMgbm8gZXF1 aXZhbGVudCBpbiB0aGUgaGFzaHRhYmxlLiBXZSBtdXN0CiAJLy8gaW5zZXJ0IHRoZSBuZXcg bm9kZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWNrZXQgdG8gcHJlc2VydmUKIAkvLyBl cXVpdmFsZW50IGVsZW1lbnRzJyByZWxhdGl2ZSBwb3NpdGlvbnMuCi0JX01faW5zZXJ0X2J1 Y2tldF9iZWdpbihfX2JrdCwgX19ub2RlKTsKKwlfTV9pbnNlcnRfYnVja2V0X2JlZ2luKF9f aW5mby5fTV9oaW50LCBfX2JrdCwgX19ub2RlKTsKKwogICAgICAgKytfTV9lbGVtZW50X2Nv dW50OwogICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9fbm9kZSk7CiAgICAgfQpAQCAtMjIwOSwx NCArMjMzMywyMCBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogICAgICAg YXV0bwogICAgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RL ZXksIF9FcXVhbCwKIAkJIF9IYXNoLCBfUmFuZ2VIYXNoLCBfVW51c2VkLCBfUmVoYXNoUG9s aWN5LCBfVHJhaXRzPjo6Ci0gICAgICBfTV9pbnNlcnRfdW5pcXVlKF9LdCYmIF9faywgX0Fy ZyYmIF9fdiwKKyAgICAgIF9NX2luc2VydF91bmlxdWUoX19ub2RlX3B0ciBfX2hpbnQsIF9L dCYmIF9faywgX0FyZyYmIF9fdiwKIAkJICAgICAgIGNvbnN0IF9Ob2RlR2VuZXJhdG9yJiBf X25vZGVfZ2VuKQogICAgICAgLT4gcGFpcjxpdGVyYXRvciwgYm9vbD4KICAgICAgIHsKIAlp ZiAoc2l6ZSgpIDw9IF9fc21hbGxfc2l6ZV90aHJlc2hvbGQoKSkKLQkgIGZvciAoYXV0byBf X2l0ID0gX01fYmVnaW4oKTsgX19pdDsgX19pdCA9IF9faXQtPl9NX25leHQoKSkKLQkgICAg aWYgKHRoaXMtPl9NX2tleV9lcXVhbHNfdHIoX19rLCAqX19pdCkpCi0JICAgICAgcmV0dXJu IHsgaXRlcmF0b3IoX19pdCksIGZhbHNlIH07CisJICB7CisJICAgIF9fbm9kZV9wdHIgX19s YXN0X24gPSBudWxscHRyOworCSAgICBmb3IgKGF1dG8gX19uID0gX01fYmVnaW4oKTsgX19u OworCQkgX19sYXN0X24gPSBfX24sIF9fbiA9IF9fbi0+X01fbmV4dCgpKQorCSAgICAgIGlm ICh0aGlzLT5fTV9rZXlfZXF1YWxzX3RyKF9faywgKl9fbikpCisJCXJldHVybiB7IGl0ZXJh dG9yKF9fbiksIGZhbHNlIH07CisKKwkgICAgX19oaW50ID0gX19sYXN0X247CisJICB9CiAK IAlfX2hhc2hfY29kZSBfX2NvZGUgPSB0aGlzLT5fTV9oYXNoX2NvZGVfdHIoX19rKTsKIAlz aXplX3R5cGUgX19ia3QgPSBfTV9idWNrZXRfaW5kZXgoX19jb2RlKTsKQEAgLTIyMzEsOCAr MjM2MSw5IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAJCQkJICAgICBf X25vZGVfZ2VuKSwKIAkgIHRoaXMKIAl9OworCiAJYXV0byBfX3BvcwotCSAgPSBfTV9pbnNl cnRfdW5pcXVlX25vZGUoX19ia3QsIF9fY29kZSwgX19ub2RlLl9NX25vZGUpOworCSAgPSBf TV9pbnNlcnRfdW5pcXVlX25vZGUoX19oaW50LCBfX2JrdCwgX19jb2RlLCBfX25vZGUuX01f bm9kZSk7CiAJX19ub2RlLl9NX25vZGUgPSBudWxscHRyOwogCXJldHVybiB7IF9fcG9zLCB0 cnVlIH07CiAgICAgICB9CkBAIC0yMjQ2LDIwICsyMzc3LDE4IEBAIF9HTElCQ1hYX0JFR0lO X05BTUVTUEFDRV9WRVJTSU9OCiAgICAgICBhdXRvCiAgICAgICBfSGFzaHRhYmxlPF9LZXks IF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAogCQkgX0hhc2gsIF9SYW5n ZUhhc2gsIF9VbnVzZWQsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKLSAgICAgIF9NX2lu c2VydChjb25zdF9pdGVyYXRvciBfX2hpbnQsIF9BcmcmJiBfX3YsCi0JCWNvbnN0IF9Ob2Rl R2VuZXJhdG9yJiBfX25vZGVfZ2VuLAorICAgICAgX01faW5zZXJ0KF9fbm9kZV9wdHIgX19o aW50LCBfQXJnJiYgX192LCBjb25zdCBfTm9kZUdlbmVyYXRvciYgX19ub2RlX2dlbiwKIAkJ ZmFsc2VfdHlwZSAvKiBfX3VrcyAqLykKICAgICAgIC0+IGl0ZXJhdG9yCiAgICAgICB7CiAJ Ly8gRmlyc3QgYWxsb2NhdGUgbmV3IG5vZGUgc28gdGhhdCB3ZSBkb24ndCBkbyBhbnl0aGlu ZyBpZiBpdCB0aHJvd3MuCi0JX1Njb3BlZF9ub2RlIF9fbm9kZXsgX19ub2RlX2dlbihzdGQ6 OmZvcndhcmQ8X0FyZz4oX192KSksIHRoaXMgfTsKKwlfU2NvcGVkX25vZGUgX19ub2RlIHsg X19ub2RlX2dlbihzdGQ6OmZvcndhcmQ8X0FyZz4oX192KSksIHRoaXMgfTsKIAogCS8vIFNl Y29uZCBjb21wdXRlIHRoZSBoYXNoIGNvZGUgc28gdGhhdCB3ZSBkb24ndCByZWhhc2ggaWYg aXQgdGhyb3dzLgotCWF1dG8gX19yZXMgPSB0aGlzLT5fTV9jb21wdXRlX2hhc2hfY29kZSgK LQkgIF9faGludC5fTV9jdXIsIF9FeHRyYWN0S2V5e30oX19ub2RlLl9NX25vZGUtPl9NX3Yo KSkpOworCWF1dG8gX19pbmZvID0KKwkgIF9NX2dldF9pbnNlcnRfaW5mbyhfX2hpbnQsIF9F eHRyYWN0S2V5e30oX19ub2RlLl9NX25vZGUtPl9NX3YoKSkpOworCWF1dG8gX19wb3MgPSBf TV9pbnNlcnRfbXVsdGlfbm9kZShfX2luZm8sIF9fbm9kZS5fTV9ub2RlKTsKIAotCWF1dG8g X19wb3MKLQkgID0gX01faW5zZXJ0X211bHRpX25vZGUoX19yZXMuZmlyc3QsIF9fcmVzLnNl Y29uZCwgX19ub2RlLl9NX25vZGUpOwogCV9fbm9kZS5fTV9ub2RlID0gbnVsbHB0cjsKIAly ZXR1cm4gX19wb3M7CiAgICAgICB9CmRpZmYgLS1naXQgYS9saWJzdGRjKystdjMvaW5jbHVk ZS9iaXRzL2hhc2h0YWJsZV9wb2xpY3kuaCBiL2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMv aGFzaHRhYmxlX3BvbGljeS5oCmluZGV4IDM0N2Q0NjhlYTg2Li40ODRkN2E5ZWVkMiAxMDA2 NDQKLS0tIGEvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9oYXNodGFibGVfcG9saWN5LmgK KysrIGIvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9oYXNodGFibGVfcG9saWN5LmgKQEAg LTgxOCw3ICs4MTgsNyBAQCBuYW1lc3BhY2UgX19kZXRhaWwKIAlzdGQ6OnR1cGxlPD4oKQog ICAgICAgfTsKICAgICAgIGF1dG8gX19wb3MKLQk9IF9faC0+X01faW5zZXJ0X3VuaXF1ZV9u b2RlKF9fYmt0LCBfX2NvZGUsIF9fbm9kZS5fTV9ub2RlKTsKKwk9IF9faC0+X01faW5zZXJ0 X3VuaXF1ZV9ub2RlKG51bGxwdHIsIF9fYmt0LCBfX2NvZGUsIF9fbm9kZS5fTV9ub2RlKTsK ICAgICAgIF9fbm9kZS5fTV9ub2RlID0gbnVsbHB0cjsKICAgICAgIHJldHVybiBfX3Bvcy0+ c2Vjb25kOwogICAgIH0KQEAgLTg0NSw3ICs4NDUsNyBAQCBuYW1lc3BhY2UgX19kZXRhaWwK IAlzdGQ6OnR1cGxlPD4oKQogICAgICAgfTsKICAgICAgIGF1dG8gX19wb3MKLQk9IF9faC0+ X01faW5zZXJ0X3VuaXF1ZV9ub2RlKF9fYmt0LCBfX2NvZGUsIF9fbm9kZS5fTV9ub2RlKTsK Kwk9IF9faC0+X01faW5zZXJ0X3VuaXF1ZV9ub2RlKG51bGxwdHIsIF9fYmt0LCBfX2NvZGUs IF9fbm9kZS5fTV9ub2RlKTsKICAgICAgIF9fbm9kZS5fTV9ub2RlID0gbnVsbHB0cjsKICAg ICAgIHJldHVybiBfX3Bvcy0+c2Vjb25kOwogICAgIH0KQEAgLTkzMywxMyArOTMzLDEzIEBA IG5hbWVzcGFjZSBfX2RldGFpbAogICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faGlu dCwgY29uc3QgdmFsdWVfdHlwZSYgX192KQogICAgICAgewogCV9faGFzaHRhYmxlJiBfX2gg PSBfTV9jb25qdXJlX2hhc2h0YWJsZSgpOwotCV9fbm9kZV9nZW5fdHlwZSBfX25vZGVfZ2Vu KF9faCk7CQotCXJldHVybiBfX2guX01faW5zZXJ0KF9faGludCwgX192LCBfX25vZGVfZ2Vu LCBfX3VuaXF1ZV9rZXlze30pOworCV9fbm9kZV9nZW5fdHlwZSBfX25vZGVfZ2VuKF9faCk7 CisJcmV0dXJuIF9faC5fTV9pbnNlcnQoX19oaW50Ll9NX2N1ciwgX192LCBfX25vZGVfZ2Vu LCBfX3VuaXF1ZV9rZXlze30pOwogICAgICAgfQogCiAgICAgICB0ZW1wbGF0ZTx0eXBlbmFt ZSBfS1R5cGUsIHR5cGVuYW1lLi4uIF9BcmdzPgogCXN0ZDo6cGFpcjxpdGVyYXRvciwgYm9v bD4KLQl0cnlfZW1wbGFjZShjb25zdF9pdGVyYXRvciwgX0tUeXBlJiYgX19rLCBfQXJncyYm Li4uIF9fYXJncykKKwl0cnlfZW1wbGFjZShjb25zdF9pdGVyYXRvciBfX2hpbnQsIF9LVHlw ZSYmIF9faywgX0FyZ3MmJi4uLiBfX2FyZ3MpCiAJewogCSAgX19oYXNodGFibGUmIF9faCA9 IF9NX2Nvbmp1cmVfaGFzaHRhYmxlKCk7CiAJICBhdXRvIF9fY29kZSA9IF9faC5fTV9oYXNo X2NvZGUoX19rKTsKQEAgLTk1NCw3ICs5NTQsOCBAQCBuYW1lc3BhY2UgX19kZXRhaWwKIAkg ICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4u LikKIAkgICAgfTsKIAkgIGF1dG8gX19pdAotCSAgICA9IF9faC5fTV9pbnNlcnRfdW5pcXVl X25vZGUoX19ia3QsIF9fY29kZSwgX19ub2RlLl9NX25vZGUpOworCSAgICA9IF9faC5fTV9p bnNlcnRfdW5pcXVlX25vZGUoX19oaW50Ll9NX2N1ciwKKwkJCQkJX19ia3QsIF9fY29kZSwg X19ub2RlLl9NX25vZGUpOwogCSAgX19ub2RlLl9NX25vZGUgPSBudWxscHRyOwogCSAgcmV0 dXJuIHsgX19pdCwgdHJ1ZSB9OwogCX0KQEAgLTk4NSw5ICs5ODYsMTYgQEAgbmFtZXNwYWNl IF9fZGV0YWlsCiAgICAgICBfTV9pbnNlcnRfcmFuZ2UoX0lucHV0SXRlcmF0b3IgX19maXJz dCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAogCQkgICAgICBjb25zdCBfTm9kZUdldHRlciYg X19ub2RlX2dlbiwgdHJ1ZV90eXBlIF9fdWtzKQogICAgICAgeworCXVzaW5nIF9fbm9kZV9w dHIgPSB0eXBlbmFtZSBfX2hhc2h0YWJsZTo6X19ub2RlX3B0cjsKIAlfX2hhc2h0YWJsZSYg X19oID0gX01fY29uanVyZV9oYXNodGFibGUoKTsKKwlfX25vZGVfcHRyIF9faGludCA9IG51 bGxwdHI7CiAJZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCi0JICBfX2gu X01faW5zZXJ0KCpfX2ZpcnN0LCBfX25vZGVfZ2VuLCBfX3Vrcyk7CisJICB7CisJICAgIF9f bm9kZV9wdHIgX19pbnNlcnRfcG9zCisJICAgICAgPSBfX2guX01faW5zZXJ0KF9faGludCwg Kl9fZmlyc3QsIF9fbm9kZV9nZW4sIF9fdWtzKS5fTV9jdXI7CisJICAgIGlmICghX19pbnNl cnRfcG9zLT5fTV9ueHQpCisJICAgICAgX19oaW50ID0gX19pbnNlcnRfcG9zOworCSAgfQog ICAgICAgfQogCiAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwg dHlwZW5hbWUgX0FsbG9jLApAQCAtMTAwMiw2ICsxMDEwLDcgQEAgbmFtZXNwYWNlIF9fZGV0 YWlsCiAgICAgICBfTV9pbnNlcnRfcmFuZ2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lu cHV0SXRlcmF0b3IgX19sYXN0LAogCQkgICAgICBjb25zdCBfTm9kZUdldHRlciYgX19ub2Rl X2dlbiwgZmFsc2VfdHlwZSBfX3VrcykKICAgICAgIHsKKwl1c2luZyBfX25vZGVfcHRyID0g dHlwZW5hbWUgX19oYXNodGFibGU6Ol9fbm9kZV9wdHI7CiAJdXNpbmcgX19yZWhhc2hfdHlw ZSA9IHR5cGVuYW1lIF9faGFzaHRhYmxlOjpfX3JlaGFzaF90eXBlOwogCXVzaW5nIF9fcmVo YXNoX3N0YXRlID0gdHlwZW5hbWUgX19oYXNodGFibGU6Ol9fcmVoYXNoX3N0YXRlOwogCXVz aW5nIHBhaXJfdHlwZSA9IHN0ZDo6cGFpcjxib29sLCBzdGQ6OnNpemVfdD47CkBAIC0xMDIw LDggKzEwMjksMTQgQEAgbmFtZXNwYWNlIF9fZGV0YWlsCiAJaWYgKF9fZG9fcmVoYXNoLmZp cnN0KQogCSAgX19oLl9NX3JlaGFzaChfX2RvX3JlaGFzaC5zZWNvbmQsIF9fc2F2ZWRfc3Rh dGUpOwogCisJX19ub2RlX3B0ciBfX2hpbnQgPSBudWxscHRyOwogCWZvciAoOyBfX2ZpcnN0 ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQotCSAgX19oLl9NX2luc2VydCgqX19maXJzdCwgX19u b2RlX2dlbiwgX191a3MpOworCSAgeworCSAgICBfX25vZGVfcHRyIF9faW5zZXJ0X3Bvcwor CSAgICAgID0gX19oLl9NX2luc2VydChfX2hpbnQsICpfX2ZpcnN0LCBfX25vZGVfZ2VuLCBf X3VrcykuX01fY3VyOworCSAgICBpZiAoIV9faW5zZXJ0X3Bvcy0+X01fbnh0KQorCSAgICAg IF9faGludCA9IF9faW5zZXJ0X3BvczsKKwkgIH0KICAgICAgIH0KIAogICAvKioKQEAgLTEw NzYsNyArMTA5MSw3IEBAIG5hbWVzcGFjZSBfX2RldGFpbAogICAgICAgewogCV9faGFzaHRh YmxlJiBfX2ggPSB0aGlzLT5fTV9jb25qdXJlX2hhc2h0YWJsZSgpOwogCV9fbm9kZV9nZW5f dHlwZSBfX25vZGVfZ2VuKF9faCk7Ci0JcmV0dXJuIF9faC5fTV9pbnNlcnQoX19oaW50LCBz dGQ6Om1vdmUoX192KSwgX19ub2RlX2dlbiwKKwlyZXR1cm4gX19oLl9NX2luc2VydChfX2hp bnQuX01fY3VyLCBzdGQ6Om1vdmUoX192KSwgX19ub2RlX2dlbiwKIAkJCSAgICAgX191bmlx dWVfa2V5c3t9KTsKICAgICAgIH0KICAgICB9OwpAQCAtMTEyNiw3ICsxMTQxLDcgQEAgbmFt ZXNwYWNlIF9fZGV0YWlsCiAJaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faGludCwgX1BhaXIm JiBfX3YpCiAJewogCSAgX19oYXNodGFibGUmIF9faCA9IHRoaXMtPl9NX2Nvbmp1cmVfaGFz aHRhYmxlKCk7Ci0JICByZXR1cm4gX19oLl9NX2VtcGxhY2UoX19oaW50LCBfX3VuaXF1ZV9r ZXlze30sCisJICByZXR1cm4gX19oLl9NX2VtcGxhY2UoX19oaW50Ll9NX2N1ciwgX191bmlx dWVfa2V5c3t9LAogCQkJCXN0ZDo6Zm9yd2FyZDxfUGFpcj4oX192KSk7CiAJfQogICAgfTsK QEAgLTEzMTUsMTkgKzEzMzAsNiBAQCBuYW1lc3BhY2UgX19kZXRhaWwKIAkgIHJldHVybiBf TV9oYXNoKCkoX19rKTsKIAl9CiAKLSAgICAgIF9faGFzaF9jb2RlCi0gICAgICBfTV9oYXNo X2NvZGUoY29uc3QgX0hhc2gmLAotCQkgICBjb25zdCBfSGFzaF9ub2RlX3ZhbHVlPF9WYWx1 ZSwgdHJ1ZT4mIF9fbikgY29uc3QKLSAgICAgIHsgcmV0dXJuIF9fbi5fTV9oYXNoX2NvZGU7 IH0KLQotICAgICAgLy8gQ29tcHV0ZSBoYXNoIGNvZGUgdXNpbmcgX0hhc2ggYXMgX19uIF9N X2hhc2hfY29kZSwgaWYgcHJlc2VudCwgd2FzCi0gICAgICAvLyBjb21wdXRlZCB1c2luZyBf SDIuCi0gICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSDI+Ci0JX19oYXNoX2NvZGUKLQlfTV9o YXNoX2NvZGUoY29uc3QgX0gyJiwKLQkJY29uc3QgX0hhc2hfbm9kZV92YWx1ZTxfVmFsdWUs IF9fY2FjaGVfaGFzaF9jb2RlPiYgX19uKSBjb25zdAotCXsgcmV0dXJuIF9NX2hhc2hfY29k ZShfRXh0cmFjdEtleXt9KF9fbi5fTV92KCkpKTsgfQotCiAgICAgICBfX2hhc2hfY29kZQog ICAgICAgX01faGFzaF9jb2RlKGNvbnN0IF9IYXNoX25vZGVfdmFsdWU8X1ZhbHVlLCBmYWxz ZT4mIF9fbikgY29uc3QKICAgICAgIHsgcmV0dXJuIF9NX2hhc2hfY29kZShfRXh0cmFjdEtl eXt9KF9fbi5fTV92KCkpKTsgfQpAQCAtMTk5OSwxOSArMjAwMSwyMCBAQCBuYW1lc3BhY2Ug X19kZXRhaWwKICAgICAgIF9IYXNodGFibGVfYWxsb2M8X05vZGVBbGxvYz46Ol9NX2FsbG9j YXRlX25vZGUoX0FyZ3MmJi4uLiBfX2FyZ3MpCiAgICAgICAtPiBfX25vZGVfcHRyCiAgICAg ICB7Ci0JYXV0byBfX25wdHIgPSBfX25vZGVfYWxsb2NfdHJhaXRzOjphbGxvY2F0ZShfTV9u b2RlX2FsbG9jYXRvcigpLCAxKTsKKwlhdXRvJiBfX2FsbG9jID0gX01fbm9kZV9hbGxvY2F0 b3IoKTsKKwlhdXRvIF9fbnB0ciA9IF9fbm9kZV9hbGxvY190cmFpdHM6OmFsbG9jYXRlKF9f YWxsb2MsIDEpOworCiAJX19ub2RlX3B0ciBfX24gPSBzdGQ6Ol9fdG9fYWRkcmVzcyhfX25w dHIpOwogCV9fdHJ5CiAJICB7CiAJICAgIDo6bmV3ICgodm9pZCopX19uKSBfX25vZGVfdHlw ZTsKLQkgICAgX19ub2RlX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9NX25vZGVfYWxsb2Nh dG9yKCksCi0JCQkJCSAgIF9fbi0+X01fdmFscHRyKCksCisJICAgIF9fbm9kZV9hbGxvY190 cmFpdHM6OmNvbnN0cnVjdChfX2FsbG9jLCBfX24tPl9NX3ZhbHB0cigpLAogCQkJCQkgICBz dGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOwogCSAgICByZXR1cm4gX19uOwogCSAg fQogCV9fY2F0Y2goLi4uKQogCSAgewotCSAgICBfX25vZGVfYWxsb2NfdHJhaXRzOjpkZWFs bG9jYXRlKF9NX25vZGVfYWxsb2NhdG9yKCksIF9fbnB0ciwgMSk7CisJICAgIF9fbm9kZV9h bGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19hbGxvYywgX19ucHRyLCAxKTsKIAkgICAgX190 aHJvd19leGNlcHRpb25fYWdhaW47CiAJICB9CiAgICAgICB9CmRpZmYgLS1naXQgYS9saWJz dGRjKystdjMvaW5jbHVkZS9iaXRzL3Vub3JkZXJlZF9tYXAuaCBiL2xpYnN0ZGMrKy12My9p bmNsdWRlL2JpdHMvdW5vcmRlcmVkX21hcC5oCmluZGV4IDJmNjNiYzVmMWZhLi5kNmJlY2I4 M2VlOCAxMDA2NDQKLS0tIGEvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy91bm9yZGVyZWRf bWFwLmgKKysrIGIvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy91bm9yZGVyZWRfbWFwLmgK QEAgLTQ0MywxMiArNDQzLDEyIEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT05UQUlO RVIKICAgICAgIC8vLyBSZS1pbnNlcnQgYW4gZXh0cmFjdGVkIG5vZGUuCiAgICAgICBpbnNl cnRfcmV0dXJuX3R5cGUKICAgICAgIGluc2VydChub2RlX3R5cGUmJiBfX25oKQotICAgICAg eyByZXR1cm4gX01faC5fTV9yZWluc2VydF9ub2RlKHN0ZDo6bW92ZShfX25oKSk7IH0KKyAg ICAgIHsgcmV0dXJuIF9NX2guX01fcmVpbnNlcnRfbm9kZShjZW5kKCksIHN0ZDo6bW92ZShf X25oKSk7IH0KIAogICAgICAgLy8vIFJlLWluc2VydCBhbiBleHRyYWN0ZWQgbm9kZS4KICAg ICAgIGl0ZXJhdG9yCi0gICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IsIG5vZGVfdHlwZSYm IF9fbmgpCi0gICAgICB7IHJldHVybiBfTV9oLl9NX3JlaW5zZXJ0X25vZGUoc3RkOjptb3Zl KF9fbmgpKS5wb3NpdGlvbjsgfQorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faGlu dCwgbm9kZV90eXBlJiYgX19uaCkKKyAgICAgIHsgcmV0dXJuIF9NX2guX01fcmVpbnNlcnRf bm9kZShfX2hpbnQsIHN0ZDo6bW92ZShfX25oKSkucG9zaXRpb247IH0KIAogI2RlZmluZSBf X2NwcF9saWJfdW5vcmRlcmVkX21hcF90cnlfZW1wbGFjZSAyMDE0MTFMCiAgICAgICAvKioK ZGlmZiAtLWdpdCBhL2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMvdW5vcmRlcmVkX3NldC5o IGIvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy91bm9yZGVyZWRfc2V0LmgKaW5kZXggZjNi MGMwNzhiYWEuLjkxNWNkNGZiNzAwIDEwMDY0NAotLS0gYS9saWJzdGRjKystdjMvaW5jbHVk ZS9iaXRzL3Vub3JkZXJlZF9zZXQuaAorKysgYi9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRz L3Vub3JkZXJlZF9zZXQuaApAQCAtNTA0LDEyICs1MDQsMTIgQEAgX0dMSUJDWFhfQkVHSU5f TkFNRVNQQUNFX0NPTlRBSU5FUgogICAgICAgLy8vIFJlLWluc2VydCBhbiBleHRyYWN0ZWQg bm9kZS4KICAgICAgIGluc2VydF9yZXR1cm5fdHlwZQogICAgICAgaW5zZXJ0KG5vZGVfdHlw ZSYmIF9fbmgpCi0gICAgICB7IHJldHVybiBfTV9oLl9NX3JlaW5zZXJ0X25vZGUoc3RkOjpt b3ZlKF9fbmgpKTsgfQorICAgICAgeyByZXR1cm4gX01faC5fTV9yZWluc2VydF9ub2RlKGNl bmQoKSwgc3RkOjptb3ZlKF9fbmgpKTsgfQogCiAgICAgICAvLy8gUmUtaW5zZXJ0IGFuIGV4 dHJhY3RlZCBub2RlLgogICAgICAgaXRlcmF0b3IKLSAgICAgIGluc2VydChjb25zdF9pdGVy YXRvciwgbm9kZV90eXBlJiYgX19uaCkKLSAgICAgIHsgcmV0dXJuIF9NX2guX01fcmVpbnNl cnRfbm9kZShzdGQ6Om1vdmUoX19uaCkpLnBvc2l0aW9uOyB9CisgICAgICBpbnNlcnQoY29u c3RfaXRlcmF0b3IgX19oaW50LCBub2RlX3R5cGUmJiBfX25oKQorICAgICAgeyByZXR1cm4g X01faC5fTV9yZWluc2VydF9ub2RlKF9faGludCwgc3RkOjptb3ZlKF9fbmgpKS5wb3NpdGlv bjsgfQogI2VuZGlmIC8vIEMrKzE3CiAKICAgICAgIC8vL0B7CmRpZmYgLS1naXQgYS9saWJz dGRjKystdjMvdGVzdHN1aXRlLzIzX2NvbnRhaW5lcnMvdW5vcmRlcmVkX211bHRpbWFwL2lu c2VydC9oaW50LmNjIGIvbGlic3RkYysrLXYzL3Rlc3RzdWl0ZS8yM19jb250YWluZXJzL3Vu b3JkZXJlZF9tdWx0aW1hcC9pbnNlcnQvaGludC5jYwppbmRleCBkMGVkNjBjNjc5OS4uMWRi NzFiOGYzMGIgMTAwNjQ0Ci0tLSBhL2xpYnN0ZGMrKy12My90ZXN0c3VpdGUvMjNfY29udGFp bmVycy91bm9yZGVyZWRfbXVsdGltYXAvaW5zZXJ0L2hpbnQuY2MKKysrIGIvbGlic3RkYysr LXYzL3Rlc3RzdWl0ZS8yM19jb250YWluZXJzL3Vub3JkZXJlZF9tdWx0aW1hcC9pbnNlcnQv aGludC5jYwpAQCAtNDAsMTEgKzQwLDEyIEBAIHZvaWQgdGVzdDAxKCkKICAgVkVSSUZZKCBp dDIgIT0gbS5lbmQoKSApOwogICBWRVJJRlkoIGl0MiAhPSBpdDEgKTsKICAgVkVSSUZZKCBp dDItPnNlY29uZCA9PSAyICk7Ci0gIFZFUklGWSggaXQyID09IHN0ZDo6bmV4dChpdDEpICk7 CisgIFZFUklGWSggc3RkOjpuZXh0KGl0MikgPT0gaXQxICk7CiAKKyAgaXQxID0gaXQyOwog ICBQYWlyIHAoMCwgMSk7CiAgIGl0MiA9IG0uaW5zZXJ0KGl0MSwgcCk7Ci0gIFZFUklGWSgg aXQyID09IHN0ZDo6bmV4dChpdDEpICk7CisgIFZFUklGWSggc3RkOjpuZXh0KGl0MikgPT0g aXQxICk7CiB9CiAKIHN0cnVjdCBoYXNoZXIKQEAgLTcxLDEzICs3MiwxMyBAQCB2b2lkIHRl c3QwMigpCiAgIFZFUklGWSggbS5idWNrZXRfc2l6ZShtLmJ1Y2tldChpdDMtPmZpcnN0KSkg PT0gMSApOwogCiAgIGF1dG8gaXQ0ID0gbS5pbnNlcnQoaXQxLCBQYWlyKDAsIDEpKTsKLSAg VkVSSUZZKCBpdDQgPT0gc3RkOjpuZXh0KGl0MSkgKTsKKyAgVkVSSUZZKCBzdGQ6Om5leHQo aXQ0KSA9PSBpdDEgKTsKICAgVkVSSUZZKCBtLmJ1Y2tldF9zaXplKG0uYnVja2V0KGl0MS0+ Zmlyc3QpKSA9PSAzICk7CiAgIFZFUklGWSggbS5idWNrZXRfc2l6ZShtLmJ1Y2tldChpdDMt PmZpcnN0KSkgPT0gMSApOwogCiAgIFBhaXIgcCgxLCAxKTsKICAgaXQ0ID0gbS5pbnNlcnQo aXQyLCBwKTsKLSAgVkVSSUZZKCBpdDQgPT0gc3RkOjpuZXh0KGl0MikgKTsKKyAgVkVSSUZZ KCBzdGQ6Om5leHQoaXQ0KSA9PSBpdDIgKTsKICAgVkVSSUZZKCBtLmJ1Y2tldF9zaXplKG0u YnVja2V0KGl0MS0+Zmlyc3QpKSA9PSA0ICk7CiAgIGF1dG8gcmFuZ2UgPSBtLmVxdWFsX3Jh bmdlKDApOwogICBWRVJJRlkoIHN0ZDo6ZGlzdGFuY2UocmFuZ2UuZmlyc3QsIHJhbmdlLnNl Y29uZCkgPT0gMiApOwpAQCAtMTA0LDExICsxMDUsMTIgQEAgdm9pZCB0ZXN0MDMoKQogICBW RVJJRlkoIGl0MiAhPSBtLmVuZCgpICk7CiAgIFZFUklGWSggaXQyICE9IGl0MSApOwogICBW RVJJRlkoIGl0Mi0+c2Vjb25kID09IDIgKTsKLSAgVkVSSUZZKCBpdDIgPT0gc3RkOjpuZXh0 KGl0MSkgKTsKKyAgVkVSSUZZKCBzdGQ6Om5leHQoaXQyKSA9PSBpdDEgKTsKIAorICBpdDEg PSBpdDI7CiAgIFBhaXIgcCgwLCAxKTsKICAgaXQyID0gbS5lbXBsYWNlX2hpbnQoaXQxLCBw KTsKLSAgVkVSSUZZKCBpdDIgPT0gc3RkOjpuZXh0KGl0MSkgKTsKKyAgVkVSSUZZKCBzdGQ6 Om5leHQoaXQyKSA9PSBpdDEgKTsKIH0KIAogaW50IG1haW4oKQpkaWZmIC0tZ2l0IGEvbGli c3RkYysrLXYzL3Rlc3RzdWl0ZS9wZXJmb3JtYW5jZS8yM19jb250YWluZXJzL2luc2VydC91 bm9yZGVyZWRfbXVsdGlzZXRfaGludC5jYyBiL2xpYnN0ZGMrKy12My90ZXN0c3VpdGUvcGVy Zm9ybWFuY2UvMjNfY29udGFpbmVycy9pbnNlcnQvdW5vcmRlcmVkX211bHRpc2V0X2hpbnQu Y2MKaW5kZXggMTI1YThhNjE1YjcuLjFlMjUwMjIwOWYxIDEwMDY0NAotLS0gYS9saWJzdGRj KystdjMvdGVzdHN1aXRlL3BlcmZvcm1hbmNlLzIzX2NvbnRhaW5lcnMvaW5zZXJ0L3Vub3Jk ZXJlZF9tdWx0aXNldF9oaW50LmNjCisrKyBiL2xpYnN0ZGMrKy12My90ZXN0c3VpdGUvcGVy Zm9ybWFuY2UvMjNfY29udGFpbmVycy9pbnNlcnQvdW5vcmRlcmVkX211bHRpc2V0X2hpbnQu Y2MKQEAgLTI3LDMxMCArMjcsMTcwIEBACiBuYW1lc3BhY2UKIHsKICAgY29uc3QgaW50IHN6 ID0gMjAwMDAwMDsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgcGF0dGVybiA9ICJ0ZXN0IHN0cmlu ZyAjIjsKLSAgY29uc3QgaW50IG5iX2NvcGllcyA9IDEwMDsKKyAgY29uc3Qgc3RkOjpzdHJp bmcgcGF0dGVybiA9ICJsb25nIGVub3VnaCB0ZXN0IHN0cmluZyAjIjsKIAotICAvLyBTcGVj aWFsIHN0ZDo6c3RyaW5nIGhhc2hlciBiYXNlZCBvbiBzdGQ6Omhhc2g8c3RkOjpzdHJpbmc+ IGJ1dCBub3QgdGFnIGFzCi0gIC8vIHNsb3cgc28gdGhhdCBoYXNoIGNvZGUgaXMgbm90IGNh Y2hlZC4gSXQgaXMgZWFzaWVyIHRvIHNob3cgaW1wYWN0IG9mCi0gIC8vIGhpbnRpbmcgaW4g dGhpcyBjb250ZXh0LgorICAvLyBQZXJmZWN0IHN0ZDo6c3RyaW5nIGhhc2hlciBrbm93aW5n IGhvdyBzdHJpbmcgaW5zdGFuY2VzIGhhdmUgYmVlbgorICAvLyBnZW5lcmF0ZWQuIEl0IGlz IG5vdCB0YWcgYXMgc2xvdyBzbyB0aGF0IGhhc2ggY29kZSBpcyBub3QgY2FjaGVkLgorICAv LyBJdCBpcyBlYXNpZXIgdG8gc2hvdyBpbXBhY3Qgb2YgaGludCBpbiB0aGlzIGNvbnRleHQu CiAgIHN0cnVjdCBoYXNoZXIKICAgewogICAgIHN0ZDo6c2l6ZV90CiAgICAgb3BlcmF0b3Io KShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSBjb25zdCBub2V4Y2VwdAogICAgIHsKLSAgICAg IC8vc3RkOjppc3RyaW5nc3RyZWFtIGlzdHIoc3RyLnN1YnN0cihwYXR0ZXJuLnNpemUoKSkp OwotICAgICAgLy9zdGQ6OnNpemVfdCBzdHJfaW5kZXg7Ci0gICAgICAvL2lzdHIgPj4gc3Ry X2luZGV4OwotICAgICAgLy9yZXR1cm4gc3RyX2luZGV4OwogICAgICAgc3RkOjpoYXNoPHN0 ZDo6c3RyaW5nPiBzdGRfaGFzaGVyOwotICAgICAgcmV0dXJuIHN0ZF9oYXNoZXIoc3RyKTsK KyAgICAgIGF1dG8gaGFzaCA9IHN0ZF9oYXNoZXIocGF0dGVybik7CisgICAgICBzdGQ6Omlz dHJpbmdzdHJlYW0gaXNzdHIoc3RyLnN1YnN0cihwYXR0ZXJuLmxlbmd0aCgpKSk7CisgICAg ICBpbnQgaWR4OworICAgICAgaXNzdHIgPj4gaWR4OworICAgICAgcmV0dXJuIChzdGQ6OnNp emVfdCkoaGFzaCAvIHN6KSAqIHN6ICsgaWR4OwogICAgIH0KICAgfTsKIAotICB1c2luZyB1 bXNfdCA9IHN0ZDo6dW5vcmRlcmVkX211bHRpc2V0PHN0ZDo6c3RyaW5nLCBoYXNoZXI+Owot Ci0gIHZvaWQKLSAgaW5zZXJ0X3dpdGhfcGVyZmVjdF9oaW50MShjb25zdCBzdGQ6OnZlY3Rv cjxzdGQ6OnN0cmluZz4mIHN0cnMsCi0JCQkgICAgdW1zX3QmIG1zKQotICB7Ci0gICAgc3Rk Ojp2ZWN0b3I8dHlwZW5hbWUgdW1zX3Q6Oml0ZXJhdG9yPiBoaW50czsKLSAgICBoaW50cy5y ZXNlcnZlKHN0cnMuc2l6ZSgpKTsKLSAgICBmb3IgKGF1dG8gc3RyIDogc3RycykKLSAgICAg IGhpbnRzLnB1c2hfYmFjayhtcy5pbnNlcnQoc3RyKSk7Ci0KLSAgICBmb3IgKGludCBqID0g MTsgaiAhPSBuYl9jb3BpZXM7ICsraikKLSAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7 IGkgIT0gc3Rycy5zaXplKCk7ICsraSkKLQltcy5pbnNlcnQoaGludHNbaV0sIHN0cnNbaV0p OwotICB9Ci0KLSAgdm9pZAotICBpbnNlcnRfd2l0aF9wZXJmZWN0X2hpbnQyKGNvbnN0IHN0 ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgc3RycywKLQkJCSAgICB1bXNfdCYgbXMpCi0gIHsK LSAgICBzdGQ6OnZlY3Rvcjx0eXBlbmFtZSB1bXNfdDo6aXRlcmF0b3I+IGhpbnRzOwotICAg IGhpbnRzLnJlc2VydmUoc3Rycy5zaXplKCkpOwotICAgIGZvciAoYXV0byBzdHIgOiBzdHJz KQotICAgICAgaGludHMucHVzaF9iYWNrKG1zLmluc2VydChzdHIpKTsKLQotICAgIGZvciAo c3RkOjpzaXplX3QgaSA9IDA7IGkgIT0gc3Rycy5zaXplKCk7ICsraSkKLSAgICAgIGZvciAo aW50IGogPSAxOyBqICE9IG5iX2NvcGllczsgKytqKQotCW1zLmluc2VydChoaW50c1tpXSwg c3Ryc1tpXSk7Ci0gIH0KLQotICAvLyBBbHdheXMgaW5zZXJ0IHdpdGggdGhlIHJlc3VsdCBv ZiB0aGUgcHJldmlvdXMgaW5zZXJ0aW9uLiBUaGUgcmVzdWx0IG9mCi0gIC8vIHRoZSBwcmV2 aW91cyBpbnNlcnRpb24gd2lsbCBuZXZlciBiZSBmb2xsb3dlZCBieSBhbiBlcXVpdmFsZW50 IG5vZGUKLSAgLy8gcmVzdWx0aW5nIGluIGEgcmUtY29tcHV0YXRpb24gb2YgaXRzIGhhc2gg Y29kZSB3aGljaCBpcyBleHBlbnNpdmUuCi0gIHZvaWQKLSAgaW5zZXJ0X3dpdGhfZ29vZF9o aW50KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgc3RycywKLQkJCXVtc190JiBt cykKLSAgewotICAgIHN0ZDo6dmVjdG9yPHR5cGVuYW1lIHVtc190OjppdGVyYXRvcj4gaGlu dHM7Ci0gICAgaGludHMucmVzZXJ2ZShzdHJzLnNpemUoKSk7Ci0gICAgZm9yIChhdXRvIHN0 ciA6IHN0cnMpCi0gICAgICBoaW50cy5wdXNoX2JhY2sobXMuaW5zZXJ0KHN0cikpOwotCi0g ICAgZm9yIChpbnQgaiA9IDE7IGogIT0gbmJfY29waWVzOyArK2opCi0gICAgICBmb3IgKHN0 ZDo6c2l6ZV90IGkgPSAwOyBpICE9IHN0cnMuc2l6ZSgpOyArK2kpCi0JaGludHNbaV0gPSBt cy5pbnNlcnQoaGludHNbaV0sIHN0cnNbaV0pOwotICB9Ci0KLSAgLy8gTm90ZSB0aGF0IHRo ZSBmb2xsb3dpbmcgdXNlIGNhc2UgaXMgcGFydGljdWxhcmx5IGJhZCBlc3BlY2lhbGx5IGNv bXBhcmVkIHRvCi0gIC8vIHRoZSBzb2x1dGlvbiB3aXRob3V0IGhpbnQgYmVjYXVzZSB3aXRo b3V0IGhpbnQgdGhlIGZpcnN0IGluc2VydGlvbiB3aWxsIHB1dAotICAvLyBpdCBmaXJzdCBp biB0aGUgYnVja2V0IGFuZCBmb2xsb3dpbmcgaW5zZXJ0aW9ucyB3aWxsIGRldGVjdCBpdCBh bmQgaW5zZXJ0Ci0gIC8vIGp1c3QgYmVmb3JlLiBCeSBnaXZpbmcgYSBoaW50IGluc2VydGlv biB3aWxsIGJlIGRvbmUganVzdCBhZnRlciBmb3JjaW5nIHRvCi0gIC8vIGNoZWNrIGlmIGl0 IGhhcyBubyBpbXBhY3Qgb24gdGhlIGZvbGxvd2luZyBidWNrZXQuCi0gIHZvaWQKLSAgaW5z ZXJ0X3dpdGhfYmFkX2hpbnQoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBzdHJz LAotCQkgICAgICAgdW1zX3QmIG1zKQotICB7Ci0gICAgc3RkOjp2ZWN0b3I8dHlwZW5hbWUg dW1zX3Q6Oml0ZXJhdG9yPiBoaW50czsKLSAgICBoaW50cy5yZXNlcnZlKHN0cnMuc2l6ZSgp KTsKLSAgICBmb3IgKGF1dG8gc3RyIDogc3RycykKLSAgICAgIGhpbnRzLnB1c2hfYmFjayht cy5pbnNlcnQoc3RyKSk7Ci0KLSAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpICE9IHN0 cnMuc2l6ZSgpOyArK2kpCi0gICAgICBmb3IgKGludCBqID0gMTsgaiAhPSBuYl9jb3BpZXM7 ICsraikKLQloaW50c1tpXSA9IG1zLmluc2VydChoaW50c1tpXSwgc3Ryc1tpXSk7Ci0gIH0K LQotICB2b2lkCi0gIGluc2VydF93aXRob3V0X2hpbnQxKGNvbnN0IHN0ZDo6dmVjdG9yPHN0 ZDo6c3RyaW5nPiYgc3RycywKLQkJICAgICAgIHVtc190JiBtcykKLSAgewotICAgIHN0ZDo6 dmVjdG9yPHR5cGVuYW1lIHVtc190OjppdGVyYXRvcj4gaGludHM7Ci0gICAgaGludHMucmVz ZXJ2ZShzdHJzLnNpemUoKSk7Ci0gICAgZm9yIChhdXRvIHN0ciA6IHN0cnMpCi0gICAgICBo aW50cy5wdXNoX2JhY2sobXMuaW5zZXJ0KHN0cikpOwotCi0gICAgZm9yIChpbnQgaiA9IDE7 IGogIT0gbmJfY29waWVzOyArK2opCi0gICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBp ICE9IHN0cnMuc2l6ZSgpOyArK2kpCi0JaGludHNbaV0gPSBtcy5pbnNlcnQoc3Ryc1tpXSk7 Ci0gIH0KLQotICAvLyBUaGlzIHZlcnNpb24gaXMgdGhlIGJlc3Qgb25lIGlmIHlvdSBpbnNl cnQgYWxsIGVxdWl2YWxlbnQgZWxlbWVudHMgYXQgdGhlCi0gIC8vIHNhbWUgdGltZS4gSXQg ZGVtb25zdHJhdGVzIHRoYXQgbW9zdCBvZiB0aGUgdGltZSBpdCBpcyBiZXR0ZXIgbm90IHRv IGdpdmUKLSAgLy8gYW55IGhpbnQgdW5sZXNzIHlvdSBoYXZlIHdyaXR0ZW4gYSBiZW5jaG1h cmsgZm9yIHlvdXIgYXBwbGljYXRpb24gc2hvd2luZwotICAvLyB0aGF0IGl0IGRvZXMgaGF2 ZSBhIHBvc2l0aXZlIGVmZmVjdC4KLSAgdm9pZAotICBpbnNlcnRfd2l0aG91dF9oaW50Mihj b25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHN0cnMsCi0JCSAgICAgICB1bXNfdCYg bXMpCisgIC8vIExpa2UgcHJldmlvdXMgaGFzaGVyIGJ1dCB0YWdnZWQgYXMgc2xvdy4KKyAg c3RydWN0IHNsb3dfaGFzaGVyCiAgIHsKLSAgICBzdGQ6OnZlY3Rvcjx0eXBlbmFtZSB1bXNf dDo6aXRlcmF0b3I+IGhpbnRzOwotICAgIGhpbnRzLnJlc2VydmUoc3Rycy5zaXplKCkpOwot ICAgIGZvciAoYXV0byBzdHIgOiBzdHJzKQotICAgICAgaGludHMucHVzaF9iYWNrKG1zLmlu c2VydChzdHIpKTsKLQotICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgIT0gc3Rycy5z aXplKCk7ICsraSkKLSAgICAgIGZvciAoaW50IGogPSAxOyBqICE9IG5iX2NvcGllczsgKytq KQotCWhpbnRzW2ldID0gbXMuaW5zZXJ0KHN0cnNbaV0pOwotICB9CisgICAgc3RkOjpzaXpl X3QKKyAgICBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIGNvbnN0IG5vZXhj ZXB0CisgICAgeyByZXR1cm4gaGFzaGVye30oc3RyKTsgfQorICB9OwogCi0gIHZvaWQKLSAg aW5zZXJ0X3dpdGhfYW55X2hpbnQxKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYg c3RycywKLQkJCXVtc190JiBtcykKLSAgewotICAgIHN0ZDo6dmVjdG9yPHR5cGVuYW1lIHVt c190OjppdGVyYXRvcj4gaGludHM7Ci0gICAgaGludHMucmVzZXJ2ZShzdHJzLnNpemUoKSk7 Ci0gICAgZm9yIChhdXRvIHN0ciA6IHN0cnMpCi0gICAgICBoaW50cy5wdXNoX2JhY2sobXMu aW5zZXJ0KG1zLmJlZ2luKCksIHN0cikpOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSGFzaD4K KyAgICB1c2luZyB1bXNfdCA9IHN0ZDo6dW5vcmRlcmVkX211bHRpc2V0PHN0ZDo6c3RyaW5n LCBfSGFzaD47CiAKLSAgICBzdGQ6OnNpemVfdCBvZmZzZXQgPSBzdHJzLnNpemUoKSAvIDI7 Ci0gICAgZm9yIChpbnQgaiA9IDE7IGogIT0gbmJfY29waWVzOyArK2opCi0gICAgICBmb3Ig KHN0ZDo6c2l6ZV90IGkgPSAwOyBpICE9IHN0cnMuc2l6ZSgpOyArK2kpCisgIHRlbXBsYXRl PHR5cGVuYW1lIF9IYXNoPgorICAgIHZvaWQKKyAgICBpbnNlcnRfd2l0aF9wZXJmZWN0X2hp bnQoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBzdHJzLAorCQkJICAgICB1bXNf dDxfSGFzaD4mIG1zKQorICAgIHsKKyAgICAgIGF1dG8gaGludCA9IG1zLmVuZCgpOworICAg ICAgZm9yIChhdXRvIHN0ciA6IHN0cnMpCiAJewotCSAgbXMuaW5zZXJ0KGhpbnRzWyhpICsg b2Zmc2V0KSAlIGhpbnRzLnNpemUoKV0sIHN0cnNbaV0pOwotCSAgKytvZmZzZXQ7CisJICBh dXRvIGluc2VydF9wb3MgPSBtcy5pbnNlcnQoaGludCwgc3RyKTsKKwkgIGlmIChzdGQ6Om5l eHQoaW5zZXJ0X3BvcykgPT0gbXMuZW5kKCkpCisJICAgIGhpbnQgPSBpbnNlcnRfcG9zOwog CX0KLSAgfQotCi0gIHZvaWQKLSAgaW5zZXJ0X3dpdGhfYW55X2hpbnQyKGNvbnN0IHN0ZDo6 dmVjdG9yPHN0ZDo6c3RyaW5nPiYgc3RycywKLQkJCXVtc190JiBtcykKLSAgewotICAgIHN0 ZDo6dmVjdG9yPHR5cGVuYW1lIHVtc190OjppdGVyYXRvcj4gaGludHM7Ci0gICAgaGludHMu cmVzZXJ2ZShzdHJzLnNpemUoKSk7Ci0gICAgZm9yIChhdXRvIHN0ciA6IHN0cnMpCi0gICAg ICBoaW50cy5wdXNoX2JhY2sobXMuaW5zZXJ0KG1zLmJlZ2luKCksIHN0cikpOworICAgIH0K IAotICAgIHN0ZDo6c2l6ZV90IG9mZnNldCA9IHN0cnMuc2l6ZSgpIC8gMjsKLSAgICBmb3Ig KHN0ZDo6c2l6ZV90IGkgPSAwOyBpICE9IHN0cnMuc2l6ZSgpOyArK2kpCi0gICAgICBmb3Ig KGludCBqID0gMTsgaiAhPSBuYl9jb3BpZXM7ICsraikKKyAgdGVtcGxhdGU8dHlwZW5hbWUg X0hhc2g+CisgICAgdm9pZAorICAgIGluc2VydF93aXRoX2JhZF9oaW50KGNvbnN0IHN0ZDo6 dmVjdG9yPHN0ZDo6c3RyaW5nPiYgc3RycywKKwkJCSB1bXNfdDxfSGFzaD4mIG1zKQorICAg IHsKKyAgICAgIGF1dG8gaGludCA9IG1zLmJlZ2luKCk7CisgICAgICBmb3IgKGF1dG8gc3Ry IDogc3RycykKIAl7Ci0JICBtcy5pbnNlcnQoaGludHNbKGkgKyBvZmZzZXQpICUgaGludHMu c2l6ZSgpXSwgc3Ryc1tpXSk7Ci0JICArK29mZnNldDsKKwkgIGF1dG8gaW5zZXJ0X3BvcyA9 IG1zLmluc2VydChoaW50LCBzdHIpOworCSAgaWYgKHN0ZDo6bmV4dChpbnNlcnRfcG9zKSA9 PSBoaW50KQorCSAgICBoaW50ID0gbXMuYmVnaW4oKTsKIAl9Ci0gIH0KLX0KLQotaW50IG1h aW4oKQotewotICB1c2luZyBuYW1lc3BhY2UgX19nbnVfdGVzdDsKLQotICBjb25zdCBpbnQg bmJfaXRlciA9IDEwOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJzOwotICBz dHJzLnJlc2VydmUoc3ogLyBuYl9jb3BpZXMpOworICAgIH0KIAotICBmb3IgKGludCBpID0g MDsgaSAhPSBzeiAvIG5iX2NvcGllczsgKytpKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSGFz aD4KKyAgICB2b2lkCisgICAgaW5zZXJ0X3dpdGhvdXRfaGludChjb25zdCBzdGQ6OnZlY3Rv cjxzdGQ6OnN0cmluZz4mIHN0cnMsCisJCQl1bXNfdDxfSGFzaD4mIG1zKQogICAgIHsKLSAg ICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3N0cjsKLSAgICAgIG9zc3RyIDw8IHBhdHRlcm4g PDwgaTsKLSAgICAgIHN0cnMucHVzaF9iYWNrKG9zc3RyLnN0cigpKTsKKyAgICAgIGZvciAo YXV0byBzdHIgOiBzdHJzKQorCW1zLmluc2VydChzdHIpOwogICAgIH0KIAotICB1bXNfdCBt czsKLSAgLy8gVXNlIGEgbGFyZ2UgbG9hZCBmYWN0b3IgdG8gbWFrZSB0aGUgY29udGV4dCBp ZGVhbCBmb3IgdXNpbmcgaGludCBiZWNhdXNlIHdlCi0gIC8vIHdpbGwgaGF2ZSBtYW55IGVs ZW1lbnRzIHBlciBidWNrZXQuCi0gIG1zLm1heF9sb2FkX2ZhY3RvcigxMC4wZik7Ci0gIG1z LnJlc2VydmUoc3opOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSGFzaD4KKyAgICB2b2lkCisg ICAgaW5zZXJ0X3JhbmdlKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgc3RycywK KwkJIHVtc190PF9IYXNoPiYgbXMpCisgICAgeyBtcy5pbnNlcnQoc3Rycy5iZWdpbigpLCBz dHJzLmVuZCgpKTsgfQorfQogCi0gIC8vIFdhcm0gdXAuCit0ZW1wbGF0ZTx0eXBlbmFtZSBf SGFzaD4KKyAgdm9pZCBiZW5jaChjb25zdCBjaGFyKiBjdHgpCiAgIHsKLSAgICBmb3IgKGF1 dG8gc3RyIDogc3RycykKLSAgICAgIGZvciAoaW50IGogPSAwOyBqICE9IG5iX2NvcGllczsg KytqKQotCW1zLmluc2VydChzdHIpOwotICB9Ci0KLSAgdGltZV9jb3VudGVyIHRpbWVfbm9f aGludDEsIHRpbWVfYW55X2hpbnQxLCB0aW1lX2JhZF9oaW50LCB0aW1lX3BlcmZlY3RfaGlu dDE7Ci0gIHRpbWVfY291bnRlciB0aW1lX25vX2hpbnQyLCB0aW1lX2FueV9oaW50MiwgdGlt ZV9nb29kX2hpbnQsIHRpbWVfcGVyZmVjdF9oaW50MjsKLSAgcmVzb3VyY2VfY291bnRlciBy ZXNvdXJjZV9ub19oaW50MSwgcmVzb3VyY2VfYW55X2hpbnQxLCByZXNvdXJjZV9iYWRfaGlu dCwKLSAgICByZXNvdXJjZV9wZXJmZWN0X2hpbnQxOwotICByZXNvdXJjZV9jb3VudGVyIHJl c291cmNlX25vX2hpbnQyLCByZXNvdXJjZV9hbnlfaGludDIsIHJlc291cmNlX2dvb2RfaGlu dCwKLSAgICByZXNvdXJjZV9wZXJmZWN0X2hpbnQyOwotCi0gIGZvciAoaW50IGkgPSAwOyBp ICE9IG5iX2l0ZXI7ICsraSkKLSAgICB7Ci0gICAgICAvLyBCYWQgaGludAotICAgICAgewot CW1zLmNsZWFyKCk7Ci0Jc3RhcnRfY291bnRlcnModGltZV9iYWRfaGludCwgcmVzb3VyY2Vf YmFkX2hpbnQpOwotCWluc2VydF93aXRoX2JhZF9oaW50KHN0cnMsIG1zKTsKLQlzdG9wX2Nv dW50ZXJzKHRpbWVfYmFkX2hpbnQsIHJlc291cmNlX2JhZF9oaW50KTsKLSAgICAgIH0KKyAg ICB1c2luZyBuYW1lc3BhY2UgX19nbnVfdGVzdDsKIAotICAgICAgLy8gTm8gaGludAotICAg ICAgewotCW1zLmNsZWFyKCk7Ci0Jc3RhcnRfY291bnRlcnModGltZV9ub19oaW50MSwgcmVz b3VyY2Vfbm9faGludDEpOwotCWluc2VydF93aXRob3V0X2hpbnQxKHN0cnMsIG1zKTsKLQlz dG9wX2NvdW50ZXJzKHRpbWVfbm9faGludDEsIHJlc291cmNlX25vX2hpbnQxKTsKLSAgICAg IH0KLQotICAgICAgLy8gQW55IGhpbnQKLSAgICAgIHsKLQltcy5jbGVhcigpOwotCXN0YXJ0 X2NvdW50ZXJzKHRpbWVfYW55X2hpbnQxLCByZXNvdXJjZV9hbnlfaGludDEpOwotCWluc2Vy dF93aXRoX2FueV9oaW50MShzdHJzLCBtcyk7Ci0Jc3RvcF9jb3VudGVycyh0aW1lX2FueV9o aW50MSwgcmVzb3VyY2VfYW55X2hpbnQxKTsKLSAgICAgIH0KKyAgICBjb25zdCBpbnQgbmJf aXRlciA9IDEwOwogCi0gICAgICAvLyBHb29kIGhpbnQKLSAgICAgIHsKLQltcy5jbGVhcigp OwotCXN0YXJ0X2NvdW50ZXJzKHRpbWVfZ29vZF9oaW50LCByZXNvdXJjZV9nb29kX2hpbnQp OwotCWluc2VydF93aXRoX2dvb2RfaGludChzdHJzLCBtcyk7Ci0Jc3RvcF9jb3VudGVycyh0 aW1lX2dvb2RfaGludCwgcmVzb3VyY2VfZ29vZF9oaW50KTsKLSAgICAgIH0KLQotICAgICAg Ly8gTm8gaGludAotICAgICAgewotCW1zLmNsZWFyKCk7Ci0Jc3RhcnRfY291bnRlcnModGlt ZV9ub19oaW50MiwgcmVzb3VyY2Vfbm9faGludDIpOwotCWluc2VydF93aXRob3V0X2hpbnQy KHN0cnMsIG1zKTsKLQlzdG9wX2NvdW50ZXJzKHRpbWVfbm9faGludDIsIHJlc291cmNlX25v X2hpbnQyKTsKLSAgICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyczsK KyAgICBzdHJzLnJlc2VydmUoc3opOwogCi0gICAgICAvLyBQZXJmZWN0IGhpbnQKKyAgICBm b3IgKGludCBpID0gMDsgaSAhPSBzejsgKytpKQogICAgICAgewotCW1zLmNsZWFyKCk7Ci0J c3RhcnRfY291bnRlcnModGltZV9wZXJmZWN0X2hpbnQyLCByZXNvdXJjZV9wZXJmZWN0X2hp bnQyKTsKLQlpbnNlcnRfd2l0aF9wZXJmZWN0X2hpbnQyKHN0cnMsIG1zKTsKLQlzdG9wX2Nv dW50ZXJzKHRpbWVfcGVyZmVjdF9oaW50MiwgcmVzb3VyY2VfcGVyZmVjdF9oaW50Mik7CisJ c3RkOjpvc3RyaW5nc3RyZWFtIG9zc3RyOworCW9zc3RyIDw8IHBhdHRlcm4gPDwgaTsKKwlz dHJzLnB1c2hfYmFjayhvc3N0ci5zdHIoKSk7CiAgICAgICB9CiAKLSAgICAgIC8vIEFueSBo aW50Ci0gICAgICB7Ci0JbXMuY2xlYXIoKTsKLQlzdGFydF9jb3VudGVycyh0aW1lX2FueV9o aW50MiwgcmVzb3VyY2VfYW55X2hpbnQyKTsKLQlpbnNlcnRfd2l0aF9hbnlfaGludDIoc3Ry cywgbXMpOwotCXN0b3BfY291bnRlcnModGltZV9hbnlfaGludDIsIHJlc291cmNlX2FueV9o aW50Mik7Ci0gICAgICB9CisgICAgdW1zX3Q8X0hhc2g+IG1zOworICAgIG1zLnJlc2VydmUo c3opOwogCi0gICAgICAvLyBQZXJmZWN0IGhpbnQKLSAgICAgIHsKLQltcy5jbGVhcigpOwot CXN0YXJ0X2NvdW50ZXJzKHRpbWVfcGVyZmVjdF9oaW50MSwgcmVzb3VyY2VfcGVyZmVjdF9o aW50MSk7Ci0JaW5zZXJ0X3dpdGhfcGVyZmVjdF9oaW50MShzdHJzLCBtcyk7Ci0Jc3RvcF9j b3VudGVycyh0aW1lX3BlcmZlY3RfaGludDEsIHJlc291cmNlX3BlcmZlY3RfaGludDEpOwot ICAgICAgfQorICAgIC8vIFdhcm0gdXAuCisgICAgeworICAgICAgZm9yIChhdXRvIHN0ciA6 IHN0cnMpCisJbXMuaW5zZXJ0KHN0cik7CiAgICAgfQogCi0gIHN0ZDo6b3N0cmluZ3N0cmVh bSBvc3RyOwotICBvc3RyIDw8ICJ1bm9yZGVyZWRfc2V0ICIgPDwgbmJfY29waWVzIDw8ICIg WCAiIDw8IHN6IC8gbmJfY29waWVzCi0gICAgICAgPDwgIiBpbnNlcnRpb25zIHcvbyBoaW50 IjsKLSAgcmVwb3J0X3BlcmZvcm1hbmNlKF9fRklMRV9fLCBvc3RyLnN0cigpLmNfc3RyKCks Ci0JCSAgICAgdGltZV9ub19oaW50MSwgcmVzb3VyY2Vfbm9faGludDEpOwotCi0gIG9zdHIu c3RyKCIiKTsKLSAgb3N0ciA8PCAidW5vcmRlcmVkX3NldCAiIDw8IG5iX2NvcGllcyA8PCAi IFggIiA8PCBzeiAvIG5iX2NvcGllcwotICAgICAgIDw8ICIgaW5zZXJ0aW9ucyB3aXRoIGFu eSBoaW50IjsKLSAgcmVwb3J0X3BlcmZvcm1hbmNlKF9fRklMRV9fLCBvc3RyLnN0cigpLmNf c3RyKCksCi0JCSAgICAgdGltZV9hbnlfaGludDEsIHJlc291cmNlX2FueV9oaW50MSk7Cisg ICAgdGltZV9jb3VudGVyIHRpbWVfbm9faGludCwgdGltZV9iYWRfaGludCwgdGltZV9wZXJm ZWN0X2hpbnQsCisgICAgICB0aW1lX3JhbmdlOworICAgIHJlc291cmNlX2NvdW50ZXIgcmVz b3VyY2Vfbm9faGludCwgcmVzb3VyY2VfYmFkX2hpbnQsIHJlc291cmNlX3BlcmZlY3RfaGlu dCwKKyAgICAgIHJlc291cmNlX3JhbmdlOwogCi0gIG9zdHIuc3RyKCIiKTsKLSAgb3N0ciA8 PCAidW5vcmRlcmVkX3NldCAiIDw8IG5iX2NvcGllcyA8PCAiIFggIiA8PCBzeiAvIG5iX2Nv cGllcwotICAgICAgIDw8ICIgaW5zZXJ0aW9ucyB3aXRoIGdvb2QgaGludCI7Ci0gIHJlcG9y dF9wZXJmb3JtYW5jZShfX0ZJTEVfXywgb3N0ci5zdHIoKS5jX3N0cigpLAotCQkgICAgIHRp bWVfZ29vZF9oaW50LCByZXNvdXJjZV9nb29kX2hpbnQpOworICAgIGZvciAoaW50IGkgPSAw OyBpICE9IG5iX2l0ZXI7ICsraSkKKyAgICAgIHsKKwkvLyBCYWQgaGludAorCXsKKwkgIG1z LmNsZWFyKCk7CisJICBzdGFydF9jb3VudGVycyh0aW1lX2JhZF9oaW50LCByZXNvdXJjZV9i YWRfaGludCk7CisJICBpbnNlcnRfd2l0aF9iYWRfaGludChzdHJzLCBtcyk7CisJICBzdG9w X2NvdW50ZXJzKHRpbWVfYmFkX2hpbnQsIHJlc291cmNlX2JhZF9oaW50KTsKKwl9CiAKLSAg b3N0ci5zdHIoIiIpOwotICBvc3RyIDw8ICJ1bm9yZGVyZWRfc2V0ICIgPDwgbmJfY29waWVz IDw8ICIgWCAiIDw8IHN6IC8gbmJfY29waWVzCi0gICAgICAgPDwgIiBpbnNlcnRpb25zIHdp dGggcGVyZmVjdCBoaW50IjsKLSAgcmVwb3J0X3BlcmZvcm1hbmNlKF9fRklMRV9fLCBvc3Ry LnN0cigpLmNfc3RyKCksCi0JCSAgICAgdGltZV9wZXJmZWN0X2hpbnQxLCByZXNvdXJjZV9w ZXJmZWN0X2hpbnQxKTsKKwkvLyBObyBoaW50CisJeworCSAgbXMuY2xlYXIoKTsKKwkgIHN0 YXJ0X2NvdW50ZXJzKHRpbWVfbm9faGludCwgcmVzb3VyY2Vfbm9faGludCk7CisJICBpbnNl cnRfd2l0aG91dF9oaW50KHN0cnMsIG1zKTsKKwkgIHN0b3BfY291bnRlcnModGltZV9ub19o aW50LCByZXNvdXJjZV9ub19oaW50KTsKKwl9CiAKLSAgb3N0ci5zdHIoIiIpOwotICBvc3Ry IDw8ICJ1bm9yZGVyZWRfc2V0ICIgPDwgc3ogLyBuYl9jb3BpZXMgPDwgIiBYICIgPDwgbmJf Y29waWVzCi0gICAgICAgPDwgIiBpbnNlcnRpb25zIHcvbyBoaW50IjsKLSAgcmVwb3J0X3Bl cmZvcm1hbmNlKF9fRklMRV9fLCBvc3RyLnN0cigpLmNfc3RyKCksCi0JCSAgICAgdGltZV9u b19oaW50MiwgcmVzb3VyY2Vfbm9faGludDIpOworCS8vIFBlcmZlY3QgaGludAorCXsKKwkg IG1zLmNsZWFyKCk7CisJICBzdGFydF9jb3VudGVycyh0aW1lX3BlcmZlY3RfaGludCwgcmVz b3VyY2VfcGVyZmVjdF9oaW50KTsKKwkgIGluc2VydF93aXRoX3BlcmZlY3RfaGludChzdHJz LCBtcyk7CisJICBzdG9wX2NvdW50ZXJzKHRpbWVfcGVyZmVjdF9oaW50LCByZXNvdXJjZV9w ZXJmZWN0X2hpbnQpOworCX0KIAotICBvc3RyLnN0cigiIik7Ci0gIG9zdHIgPDwgInVub3Jk ZXJlZF9zZXQgIiA8PCBzeiAvIG5iX2NvcGllcyA8PCAiIFggIiA8PCBuYl9jb3BpZXMKLSAg ICAgICA8PCAiIGluc2VydGlvbnMgd2l0aCBhbnkgaGludCI7Ci0gIHJlcG9ydF9wZXJmb3Jt YW5jZShfX0ZJTEVfXywgb3N0ci5zdHIoKS5jX3N0cigpLAotCQkgICAgIHRpbWVfYW55X2hp bnQyLCByZXNvdXJjZV9hbnlfaGludDIpOworCS8vIFJhbmdlIGluc2VydAorCXsKKwkgIG1z LmNsZWFyKCk7CisJICBzdGFydF9jb3VudGVycyh0aW1lX3JhbmdlLCByZXNvdXJjZV9yYW5n ZSk7CisJICBpbnNlcnRfcmFuZ2Uoc3RycywgbXMpOworCSAgc3RvcF9jb3VudGVycyh0aW1l X3JhbmdlLCByZXNvdXJjZV9yYW5nZSk7CisJfQorICAgICAgfQogCi0gIG9zdHIuc3RyKCIi KTsKLSAgb3N0ciA8PCAidW5vcmRlcmVkX3NldCAiIDw8IHN6IC8gbmJfY29waWVzIDw8ICIg WCAiIDw8IG5iX2NvcGllcwotICAgICAgIDw8ICIgaW5zZXJ0aW9ucyB3aXRoIGJhZCBoaW50 IjsKLSAgcmVwb3J0X3BlcmZvcm1hbmNlKF9fRklMRV9fLCBvc3RyLnN0cigpLmNfc3RyKCks Ci0JCSAgICAgdGltZV9iYWRfaGludCwgcmVzb3VyY2VfYmFkX2hpbnQpOworICAgIHN0ZDo6 b3N0cmluZ3N0cmVhbSBvc3RyOworICAgIG9zdHIgPDwgY3R4IDw8ICcgJyA8PCBzeiA8PCAi IGluc2VydGlvbnMgdy9vIGhpbnQiOworICAgIHJlcG9ydF9wZXJmb3JtYW5jZShfX0ZJTEVf Xywgb3N0ci5zdHIoKS5jX3N0cigpLAorCQkgICAgICAgdGltZV9ub19oaW50LCByZXNvdXJj ZV9ub19oaW50KTsKKworICAgIG9zdHIuc3RyKCIiKTsKKyAgICBvc3RyIDw8IGN0eCA8PCAn ICcgPDwgc3ogPDwgIiBpbnNlcnRpb25zIHdpdGggcGVyZmVjdCBoaW50IjsKKyAgICByZXBv cnRfcGVyZm9ybWFuY2UoX19GSUxFX18sIG9zdHIuc3RyKCkuY19zdHIoKSwKKwkJICAgICAg IHRpbWVfcGVyZmVjdF9oaW50LCByZXNvdXJjZV9wZXJmZWN0X2hpbnQpOworCisgICAgb3N0 ci5zdHIoIiIpOworICAgIG9zdHIgPDwgY3R4IDw8ICcgJyA8PCBzeiA8PCAiIGluc2VydGlv bnMgd2l0aCBiYWQgaGludCI7CisgICAgcmVwb3J0X3BlcmZvcm1hbmNlKF9fRklMRV9fLCBv c3RyLnN0cigpLmNfc3RyKCksCisJCSAgICAgICB0aW1lX2JhZF9oaW50LCByZXNvdXJjZV9i YWRfaGludCk7CisKKyAgICBvc3RyLnN0cigiIik7CisgICAgb3N0ciA8PCBjdHggPDwgJyAn IDw8IHN6IDw8ICIgcmFuZ2UgaW5zZXJ0aW9ucyI7CisgICAgcmVwb3J0X3BlcmZvcm1hbmNl KF9fRklMRV9fLCBvc3RyLnN0cigpLmNfc3RyKCksCisJCSAgICAgICB0aW1lX3JhbmdlLCBy ZXNvdXJjZV9yYW5nZSk7CisgIH0KIAotICBvc3RyLnN0cigiIik7Ci0gIG9zdHIgPDwgInVu b3JkZXJlZF9zZXQgIiA8PCBzeiAvIG5iX2NvcGllcyA8PCAiIFggIiA8PCBuYl9jb3BpZXMK LSAgICAgICA8PCAiIGluc2VydGlvbnMgd2l0aCBwZXJmZWN0IGhpbnQiOwotICByZXBvcnRf cGVyZm9ybWFuY2UoX19GSUxFX18sIG9zdHIuc3RyKCkuY19zdHIoKSwKLQkJICAgICB0aW1l X3BlcmZlY3RfaGludDIsIHJlc291cmNlX3BlcmZlY3RfaGludDIpOworaW50IG1haW4oKQor eworICBiZW5jaDxoYXNoZXI+KCJoYXNoIGNvZGUgTk9UIGNhY2hlZCIpOworICBiZW5jaDxz bG93X2hhc2hlcj4oImhhc2ggY29kZSBjYWNoZWQiKTsKICAgcmV0dXJuIDA7CiB9CmRpZmYg LS1naXQgYS9saWJzdGRjKystdjMvdGVzdHN1aXRlL3BlcmZvcm1hbmNlLzIzX2NvbnRhaW5l cnMvaW5zZXJ0L3Vub3JkZXJlZF9zZXRfaGludC5jYyBiL2xpYnN0ZGMrKy12My90ZXN0c3Vp dGUvcGVyZm9ybWFuY2UvMjNfY29udGFpbmVycy9pbnNlcnQvdW5vcmRlcmVkX3NldF9oaW50 LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4wMTk3YmEzMWI4 YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnN0ZGMrKy12My90ZXN0c3VpdGUvcGVyZm9ybWFu Y2UvMjNfY29udGFpbmVycy9pbnNlcnQvdW5vcmRlcmVkX3NldF9oaW50LmNjCkBAIC0wLDAg KzEsMTg2IEBACisvLyB7IGRnLWRvIHJ1biB7IHRhcmdldCBjKysxMSB9IH0KKworI2luY2x1 ZGUgPHRlc3RzdWl0ZV9wZXJmb3JtYW5jZS5oPgorCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNp bmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHVub3JkZXJl ZF9zZXQ+CisKK25hbWVzcGFjZQoreworICBjb25zdCBpbnQgc3ogPSAyMDAwMDAwOworICBj b25zdCBzdGQ6OnN0cmluZyBwYXR0ZXJuID0gImxvbmcgZW5vdWdoIHRlc3Qgc3RyaW5nICMi OworCisgIC8vIFBlcmZlY3Qgc3RkOjpzdHJpbmcgaGFzaGVyIGtub3dpbmcgaG93IHN0cmlu ZyBpbnN0YW5jZXMgaGF2ZSBiZWVuCisgIC8vIGdlbmVyYXRlZC4gSXQgaXMgbm90IHRhZyBh cyBzbG93IHNvIHRoYXQgaGFzaCBjb2RlIGlzIG5vdCBjYWNoZWQuCisgIC8vIEl0IGlzIGVh c2llciB0byBzaG93IGltcGFjdCBvZiBoaW50IGluIHRoaXMgY29udGV4dC4KKyAgc3RydWN0 IGhhc2hlcgorICB7CisgICAgc3RkOjpzaXplX3QKKyAgICBvcGVyYXRvcigpKGNvbnN0IHN0 ZDo6c3RyaW5nJiBzdHIpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgc3RkOjpoYXNo PHN0ZDo6c3RyaW5nPiBzdGRfaGFzaGVyOworICAgICAgYXV0byBoYXNoID0gc3RkX2hhc2hl cihwYXR0ZXJuKTsKKyAgICAgIHN0ZDo6aXN0cmluZ3N0cmVhbSBpc3N0cihzdHIuc3Vic3Ry KHBhdHRlcm4ubGVuZ3RoKCkpKTsKKyAgICAgIGludCBpZHg7CisgICAgICBpc3N0ciA+PiBp ZHg7CisgICAgICByZXR1cm4gKHN0ZDo6c2l6ZV90KShoYXNoIC8gc3opICogc3ogKyBpZHg7 CisgICAgfQorICB9OworCisgIC8vIExpa2UgcHJldmlvdXMgaGFzaGVyIGJ1dCB0YWdnZWQg YXMgc2xvdy4KKyAgc3RydWN0IHNsb3dfaGFzaGVyCisgIHsKKyAgICBzdGQ6OnNpemVfdAor ICAgIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgY29uc3Qgbm9leGNlcHQK KyAgICB7IHJldHVybiBoYXNoZXJ7fShzdHIpOyB9CisgIH07CisKKyAgdGVtcGxhdGU8dHlw ZW5hbWUgX0hhc2g+CisgICAgdXNpbmcgdXNfdCA9IHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6 OnN0cmluZywgX0hhc2g+OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9IYXNoPgorICAgIHZv aWQKKyAgICBpbnNlcnRfd2l0aF9wZXJmZWN0X2hpbnQoY29uc3Qgc3RkOjp2ZWN0b3I8c3Rk OjpzdHJpbmc+JiBzdHJzLAorCQkJICAgICB1c190PF9IYXNoPiYgcykKKyAgICB7CisgICAg ICBhdXRvIGhpbnQgPSBzLmVuZCgpOworICAgICAgZm9yIChhdXRvIHN0ciA6IHN0cnMpCisJ eworCSAgYXV0byBpbnNlcnRfcG9zID0gcy5pbnNlcnQoaGludCwgc3RyKTsKKwkgIGlmIChz dGQ6Om5leHQoaW5zZXJ0X3BvcykgPT0gcy5lbmQoKSkKKwkgICAgaGludCA9IGluc2VydF9w b3M7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSGFzaD4KKyAgICB2b2lk CisgICAgaW5zZXJ0X3dpdGhfYmFkX2hpbnQoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJp bmc+JiBzdHJzLAorCQkJIHVzX3Q8X0hhc2g+JiBzKQorICAgIHsKKyAgICAgIGF1dG8gaGlu dCA9IHMuYmVnaW4oKTsKKyAgICAgIGZvciAoYXV0byBzdHIgOiBzdHJzKQorCXsKKwkgIGF1 dG8gaW5zZXJ0X3BvcyA9IHMuaW5zZXJ0KGhpbnQsIHN0cik7CisJICBpZiAoc3RkOjpuZXh0 KGluc2VydF9wb3MpID09IGhpbnQpCisJICAgIGhpbnQgPSBzLmJlZ2luKCk7CisJfQorICAg IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSGFzaD4KKyAgICB2b2lkCisgICAgaW5zZXJ0 X3dpdGhvdXRfaGludChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHN0cnMsCisJ CQl1c190PF9IYXNoPiYgcykKKyAgICB7CisgICAgICBmb3IgKGF1dG8gc3RyIDogc3RycykK KwlzLmluc2VydChzdHIpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSGFzaD4K KyAgICB2b2lkCisgICAgaW5zZXJ0X3JhbmdlKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3Ry aW5nPiYgc3RycywKKwkJIHVzX3Q8X0hhc2g+JiBzKQorICAgIHsgcy5pbnNlcnQoc3Rycy5i ZWdpbigpLCBzdHJzLmVuZCgpKTsgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfSGFzaD4K KyAgdm9pZCBiZW5jaChjb25zdCBjaGFyKiBjdHgpCisgIHsKKyAgICB1c2luZyBuYW1lc3Bh Y2UgX19nbnVfdGVzdDsKKworICAgIGNvbnN0IGludCBuYl9pdGVyID0gMTA7CisKKyAgICBz dGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyczsKKyAgICBzdHJzLnJlc2VydmUoc3opOwor CisgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gc3o7ICsraSkKKyAgICAgIHsKKwlzdGQ6Om9z dHJpbmdzdHJlYW0gb3NzdHI7CisJb3NzdHIgPDwgcGF0dGVybiA8PCBpOworCXN0cnMucHVz aF9iYWNrKG9zc3RyLnN0cigpKTsKKyAgICAgIH0KKworICAgIHVzX3Q8X0hhc2g+IHM7Cisg ICAgcy5yZXNlcnZlKHN6KTsKKworICAgIC8vIFdhcm0gdXAuCisgICAgeworICAgICAgZm9y IChhdXRvIHN0ciA6IHN0cnMpCisJcy5pbnNlcnQoc3RyKTsKKyAgICB9CisKKyAgICB0aW1l X2NvdW50ZXIgdGltZV9ub19oaW50LCB0aW1lX2JhZF9oaW50LCB0aW1lX3BlcmZlY3RfaGlu dCwKKyAgICAgIHRpbWVfcmFuZ2U7CisgICAgcmVzb3VyY2VfY291bnRlciByZXNvdXJjZV9u b19oaW50LCByZXNvdXJjZV9iYWRfaGludCwgcmVzb3VyY2VfcGVyZmVjdF9oaW50LAorICAg ICAgcmVzb3VyY2VfcmFuZ2U7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSAhPSBuYl9pdGVy OyArK2kpCisgICAgICB7CisJLy8gQmFkIGhpbnQKKwl7CisJICBzLmNsZWFyKCk7CisJICBz dGFydF9jb3VudGVycyh0aW1lX2JhZF9oaW50LCByZXNvdXJjZV9iYWRfaGludCk7CisJICBp bnNlcnRfd2l0aF9iYWRfaGludChzdHJzLCBzKTsKKwkgIHN0b3BfY291bnRlcnModGltZV9i YWRfaGludCwgcmVzb3VyY2VfYmFkX2hpbnQpOworCX0KKworCS8vIE5vIGhpbnQKKwl7CisJ ICBzLmNsZWFyKCk7CisJICBzdGFydF9jb3VudGVycyh0aW1lX25vX2hpbnQsIHJlc291cmNl X25vX2hpbnQpOworCSAgaW5zZXJ0X3dpdGhvdXRfaGludChzdHJzLCBzKTsKKwkgIHN0b3Bf Y291bnRlcnModGltZV9ub19oaW50LCByZXNvdXJjZV9ub19oaW50KTsKKwl9CisKKwkvLyBQ ZXJmZWN0IGhpbnQKKwl7CisJICBzLmNsZWFyKCk7CisJICBzdGFydF9jb3VudGVycyh0aW1l X3BlcmZlY3RfaGludCwgcmVzb3VyY2VfcGVyZmVjdF9oaW50KTsKKwkgIGluc2VydF93aXRo X3BlcmZlY3RfaGludChzdHJzLCBzKTsKKwkgIHN0b3BfY291bnRlcnModGltZV9wZXJmZWN0 X2hpbnQsIHJlc291cmNlX3BlcmZlY3RfaGludCk7CisJfQorCisJLy8gUmFuZ2UgaW5zZXJ0 CisJeworCSAgcy5jbGVhcigpOworCSAgc3RhcnRfY291bnRlcnModGltZV9yYW5nZSwgcmVz b3VyY2VfcmFuZ2UpOworCSAgaW5zZXJ0X3JhbmdlKHN0cnMsIHMpOworCSAgc3RvcF9jb3Vu dGVycyh0aW1lX3JhbmdlLCByZXNvdXJjZV9yYW5nZSk7CisJfQorICAgICAgfQorCisgICAg c3RkOjpvc3RyaW5nc3RyZWFtIG9zdHI7CisgICAgb3N0ciA8PCBjdHggPDwgJyAnIDw8IHN6 IDw8ICIgaW5zZXJ0aW9ucyB3L28gaGludCI7CisgICAgcmVwb3J0X3BlcmZvcm1hbmNlKF9f RklMRV9fLCBvc3RyLnN0cigpLmNfc3RyKCksCisJCSAgICAgICB0aW1lX25vX2hpbnQsIHJl c291cmNlX25vX2hpbnQpOworCisgICAgb3N0ci5zdHIoIiIpOworICAgIG9zdHIgPDwgY3R4 IDw8ICcgJyA8PCBzeiA8PCAiIGluc2VydGlvbnMgd2l0aCBwZXJmZWN0IGhpbnQiOworICAg IHJlcG9ydF9wZXJmb3JtYW5jZShfX0ZJTEVfXywgb3N0ci5zdHIoKS5jX3N0cigpLAorCQkg ICAgICAgdGltZV9wZXJmZWN0X2hpbnQsIHJlc291cmNlX3BlcmZlY3RfaGludCk7CisKKyAg ICBvc3RyLnN0cigiIik7CisgICAgb3N0ciA8PCBjdHggPDwgJyAnIDw8IHN6IDw8ICIgaW5z ZXJ0aW9ucyB3aXRoIGJhZCBoaW50IjsKKyAgICByZXBvcnRfcGVyZm9ybWFuY2UoX19GSUxF X18sIG9zdHIuc3RyKCkuY19zdHIoKSwKKwkJICAgICAgIHRpbWVfYmFkX2hpbnQsIHJlc291 cmNlX2JhZF9oaW50KTsKKworICAgIG9zdHIuc3RyKCIiKTsKKyAgICBvc3RyIDw8IGN0eCA8 PCAnICcgPDwgc3ogPDwgIiByYW5nZSBpbnNlcnRpb25zIjsKKyAgICByZXBvcnRfcGVyZm9y bWFuY2UoX19GSUxFX18sIG9zdHIuc3RyKCkuY19zdHIoKSwKKwkJICAgICAgIHRpbWVfcmFu Z2UsIHJlc291cmNlX3JhbmdlKTsKKyAgfQorCituYW1lc3BhY2Ugc3RkCit7CisgIHRlbXBs YXRlPD4KKyAgICBzdHJ1Y3QgX19pc19mYXN0X2hhc2g8c2xvd19oYXNoZXI+IDogc3RkOjpm YWxzZV90eXBlCisgICAgeyB9OworfQorCitpbnQgbWFpbigpCit7CisgIGJlbmNoPGhhc2hl cj4oImhhc2ggY29kZSBOT1QgY2FjaGVkIik7CisgIGJlbmNoPHNsb3dfaGFzaGVyPigiaGFz aCBjb2RlIGNhY2hlZCIpOworICByZXR1cm4gMDsKK30K --------------98RCh09GJNQwwavetG2ltuVU--