From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ed1-x52d.google.com (mail-ed1-x52d.google.com [IPv6:2a00:1450:4864:20::52d]) by sourceware.org (Postfix) with ESMTPS id 2A89F3884526; Thu, 2 Feb 2023 18:20:47 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 2A89F3884526 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-ed1-x52d.google.com with SMTP id u21so2942839edv.3; Thu, 02 Feb 2023 10:20:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=subject:from:cc:to:content-language:user-agent:mime-version:date :message-id:from:to:cc:subject:date:message-id:reply-to; bh=UkJCWmz27y1O2R27kbj7bIdUlDi/fi81IbcKojKL5hA=; b=c7m1b8vaV2PFqn5hlsW1zkck/ndXTKWlAz1VpM0Zcx+KHKbLk2R4PNwLCo7a3+pN8B PAauLzTE9XQmMa9r5W+hLKoj8WjFNeLr2CL/z0o/T8StfQOgRCu+V4G2CymVh81bU4xM kofh/FK5WfwGB56zOSX2C9GhhpDGixNbBeLz4jgmdQ80HmF+8wmv/N637d4HND1AGNQ1 dUKPrSiM0mz6JMOXiDsVQH9qUVMSTPTaYXyM0+EOKwtlwl9zIA8yQB4aAmuHAZHQjA6E uVUzhBOkMH3PzOfUmknxSvaQDH/R1RQ/DCv6ePV/qY/VhNkaX5c+PEIwH/GpsSvvmUYl UDcg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; 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=UkJCWmz27y1O2R27kbj7bIdUlDi/fi81IbcKojKL5hA=; b=leKdDxMZ43da8xZpDle/N8pkRPPuyeGq0kZ7XulLNW5i282rBOJsy67e6K+fj1TEng 8bMtP8+qe+ctr4ckY6aEEVTiKvsBd0TwMh5pt7S6MKkjT2D8p1QsUr37n44ungDufR22 MA6DfTX2+0Z0BueGs8bRRtTtsgsKdQij+LK7CrS3I687vbeAW2W5IJXJNNpi1LWYJlIG LhWCqcxZZnzMgf90VEOpbHQyMvWxNn0v712g7EbtPEvcxdqMC0MLht7m2jo65Sa5POyn 3t2jxKt0SsJbQtoUCFm80LvzcVLxlvWx25Bxb15DwiLE3a66t/WrS++AxYx4eAPcImfS ADXw== X-Gm-Message-State: AO0yUKUEovO3cwoIiNlV4N05As3Up8SL5CeTfmty/MN2M0ysCgiESP/+ XBYVMVNoR8UOauIRub6P49pT2ZFLXV4= X-Google-Smtp-Source: AK7set+u03D9bwnPqngJ9Gg96UerH0bPgYMqjGxkh3Obc79XwhIZbpBzKr/Y96BeZQj+K+FQ2X9l+Q== X-Received: by 2002:a50:950d:0:b0:47e:eaae:9a5b with SMTP id u13-20020a50950d000000b0047eeaae9a5bmr7662331eda.42.1675362045273; Thu, 02 Feb 2023 10:20:45 -0800 (PST) Received: from [10.11.1.53] ([109.190.253.11]) by smtp.googlemail.com with ESMTPSA id f21-20020a056402195500b0049be07c9ff5sm56273edz.4.2023.02.02.10.20.43 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 02 Feb 2023 10:20:44 -0800 (PST) Content-Type: multipart/mixed; boundary="------------inF18K7Ic2sduc4BFKqjb00J" Message-ID: Date: Thu, 2 Feb 2023 19:20:26 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2 Content-Language: fr To: "libstdc++@gcc.gnu.org" Cc: gcc-patches From: =?UTF-8?Q?Fran=c3=a7ois_Dumont?= Subject: [PATCH] libstdc++: Limit allocations in _Rb_tree X-Spam-Status: No, score=-6.4 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,KAM_SHORT,RCVD_IN_ABUSEAT,RCVD_IN_BARRACUDACENTRAL,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP 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. --------------inF18K7Ic2sduc4BFKqjb00J Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit This is PR 96088 but this time for _Rb_tree based containers. I guess it won't go in for the moment but I wanted to submit it already because of the changes I had to do in stl_functions.h. It sounds like missing parts for C++11 move-semantic. I still need to run all tests to see if they can have side effects.      libstdc++: [_Rb_tree] Limit allocation on iterator insertion [PR 96088]     Detect when invoking the comparer require an allocation and in this case     create a temporary instance that will be moved to storage location if the     insertion eventually takes place. Avoid to allocate a node otherwise.     libstdc++-v3/ChangeLog:             PR libstdc++/96088             * include/bits/stl_function.h             (std::less<>::operator()): Add noexcept qualification.             (std::greater::operator()): Likewise. (std::_Identity<>::operator<_Tp2>(_Tp2&&)): New perfect forwarding operator. (std::_Select1st<>::operator<_Pair2>(_Pair2&&)): New move operator.             * include/bits/stl_tree.h (_Rb_tree<>::_ConvertToValueType<>): New helper type.             (_Rb_tree<>::_M_get_insert_unique_pos_tr): New.             (_Rb_tree<>::_S_forward_key): New.             (_Rb_tree<>::_M_emplace_unique_kv): New.             (_Rb_tree<>::_M_emplace_unique_aux): New, use latter.             (_Rb_tree<>::_M_emplace_unique): New, use latter.             * testsuite/23_containers/map/96088.cc: New test case.             * testsuite/23_containers/multimap/96088.cc: New test case.             * testsuite/23_containers/multiset/96088.cc: New test case.             * testsuite/23_containers/set/96088.cc: New test case. Ok to commit ? François --------------inF18K7Ic2sduc4BFKqjb00J Content-Type: text/x-patch; charset=UTF-8; name="pr96088_tree.patch" Content-Disposition: attachment; filename="pr96088_tree.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMvc3RsX2Z1bmN0aW9uLmgg Yi9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL3N0bF9mdW5jdGlvbi5oCmluZGV4IGZhMDNm MzJiMWI4Li41ZTA0YzgyNjI5YiAxMDA2NDQKLS0tIGEvbGlic3RkYysrLXYzL2luY2x1ZGUv Yml0cy9zdGxfZnVuY3Rpb24uaAorKysgYi9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL3N0 bF9mdW5jdGlvbi5oCkBAIC0zOTUsNiArMzk1LDcgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQ QUNFX1ZFUlNJT04KICAgICAgIF9HTElCQ1hYMTRfQ09OU1RFWFBSCiAgICAgICBib29sCiAg ICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QK KwlfR0xJQkNYWF9OT0VYQ0VQVF9JRiggbm9leGNlcHQoX194ID4gX195KSApCiAgICAgICB7 IHJldHVybiBfX3ggPiBfX3k7IH0KICAgICB9OwogCkBAIC00MDUsNiArNDA2LDcgQEAgX0dM SUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KICAgICAgIF9HTElCQ1hYMTRfQ09OU1RF WFBSCiAgICAgICBib29sCiAgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25z dCBfVHAmIF9feSkgY29uc3QKKwlfR0xJQkNYWF9OT0VYQ0VQVF9JRiggbm9leGNlcHQoX194 IDwgX195KSApCiAgICAgICB7IHJldHVybiBfX3ggPCBfX3k7IH0KICAgICB9OwogCkBAIC0x MTY1LDYgKzExNjcsMTMgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KICAg ICAgIGNvbnN0IF9UcCYKICAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gpIGNvbnN0 CiAgICAgICB7IHJldHVybiBfX3g7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wK KyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAyPgorICAgICAgX1RwMiYmCisgICAgICBvcGVy YXRvcigpKF9UcDImJiBfX3gpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6 OmZvcndhcmQ8X1RwMj4oX194KTsgfQorI2VuZGlmCiAgICAgfTsKIAogICAvLyBQYXJ0aWFs IHNwZWNpYWxpemF0aW9uLCBhdm9pZHMgY29uZnVzaW5nIGVycm9ycyBpbiBlLmcuIHN0ZDo6 c2V0PGNvbnN0IFQ+LgpAQCAtMTE5Miw2ICsxMjAxLDExIEBAIF9HTElCQ1hYX0JFR0lOX05B TUVTUEFDRV9WRVJTSU9OCiAJY29uc3QgdHlwZW5hbWUgX1BhaXIyOjpmaXJzdF90eXBlJgog CW9wZXJhdG9yKCkoY29uc3QgX1BhaXIyJiBfX3gpIGNvbnN0CiAJeyByZXR1cm4gX194LmZp cnN0OyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyMj4KKwl0eXBlbmFtZSBf UGFpcjI6OmZpcnN0X3R5cGUmJgorCW9wZXJhdG9yKCkoX1BhaXIyJiYgX194KSBjb25zdAor CXsgcmV0dXJuIHN0ZDo6bW92ZShfX3guZmlyc3QpOyB9CiAjZW5kaWYKICAgICB9OwogCmRp ZmYgLS1naXQgYS9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL3N0bF90cmVlLmggYi9saWJz dGRjKystdjMvaW5jbHVkZS9iaXRzL3N0bF90cmVlLmgKaW5kZXggM2MzMzFmYmM5NTIuLjgw OTZiYTk3ZjE4IDEwMDY0NAotLS0gYS9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL3N0bF90 cmVlLmgKKysrIGIvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9zdGxfdHJlZS5oCkBAIC01 MzQsNiArNTM0LDQyIEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAJX1Ji X3RyZWUmIF9NX3Q7CiAgICAgICB9OwogCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAor ICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0V4S2V5LCB0eXBlbmFtZSBfVmFsdWU+CisJc3Ry dWN0IF9Db252ZXJ0VG9WYWx1ZVR5cGU7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9W YWx1ZT4KKwlzdHJ1Y3QgX0NvbnZlcnRUb1ZhbHVlVHlwZTxzdGQ6Ol9JZGVudGl0eTxfVmFs dWU+LCBfVmFsdWU+CisJeworCSAgdGVtcGxhdGU8dHlwZW5hbWUgX0t0PgorCSAgICBjb25z dGV4cHIgX0t0JiYKKwkgICAgb3BlcmF0b3IoKShfS3QmJiBfX2spIGNvbnN0IG5vZXhjZXB0 CisJICAgIHsgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxfS3Q+KF9fayk7IH0KKwl9OworCisgICAg ICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWU+CisJc3RydWN0IF9Db252ZXJ0VG9WYWx1ZVR5 cGU8c3RkOjpfU2VsZWN0MXN0PF9WYWx1ZT4sIF9WYWx1ZT4KKwl7CisJICBjb25zdGV4cHIg X1ZhbHVlJiYKKwkgIG9wZXJhdG9yKCkoX1ZhbHVlJiYgX194KSBjb25zdCBub2V4Y2VwdAor CSAgeyByZXR1cm4gc3RkOjptb3ZlKF9feCk7IH0KKworCSAgY29uc3RleHByIGNvbnN0IF9W YWx1ZSYKKwkgIG9wZXJhdG9yKCkoY29uc3QgX1ZhbHVlJiBfX3gpIGNvbnN0IG5vZXhjZXB0 CisJICB7IHJldHVybiBfX3g7IH0KKworCSAgdGVtcGxhdGU8dHlwZW5hbWUgX0t0LCB0eXBl bmFtZSBfVnQ+CisJICAgIGNvbnN0ZXhwciBzdGQ6OnBhaXI8X0t0LCBfVnQ+JiYKKwkgICAg b3BlcmF0b3IoKShzdGQ6OnBhaXI8X0t0LCBfVnQ+JiYgX194KSBjb25zdCBub2V4Y2VwdAor CSAgICB7IHJldHVybiBzdGQ6Om1vdmUoX194KTsgfQorCisJICB0ZW1wbGF0ZTx0eXBlbmFt ZSBfS3QsIHR5cGVuYW1lIF9WdD4KKwkgICAgY29uc3RleHByIGNvbnN0IHN0ZDo6cGFpcjxf S3QsIF9WdD4mCisJICAgIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpwYWlyPF9LdCwgX1Z0PiYg X194KSBjb25zdCBub2V4Y2VwdAorCSAgICB7IHJldHVybiBfX3g7IH0KKyAgICAgIH07Cisj ZW5kaWYgLy8gQysrMTEKKwogICAgIHB1YmxpYzoKICAgICAgIHR5cGVkZWYgX0tleSAJCQkJ a2V5X3R5cGU7CiAgICAgICB0eXBlZGVmIF9WYWwgCQkJCXZhbHVlX3R5cGU7CkBAIC04MzAs NiArODY2LDEyIEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAgICAgICBw YWlyPF9CYXNlX3B0ciwgX0Jhc2VfcHRyPgogICAgICAgX01fZ2V0X2luc2VydF91bmlxdWVf cG9zKGNvbnN0IGtleV90eXBlJiBfX2spOwogCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAz TAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0t0PgorCXBhaXI8X0Jhc2VfcHRyLCBfQmFz ZV9wdHI+CisJX01fZ2V0X2luc2VydF91bmlxdWVfcG9zX3RyKGNvbnN0IF9LdCYgX19rKTsK KyNlbmRpZgorCiAgICAgICBwYWlyPF9CYXNlX3B0ciwgX0Jhc2VfcHRyPgogICAgICAgX01f Z2V0X2luc2VydF9lcXVhbF9wb3MoY29uc3Qga2V5X3R5cGUmIF9fayk7CiAKQEAgLTEwNzUs NiArMTExNyw0NSBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCSAgcmV0 dXJuIF9NX2luc2VydF9lcXVhbF8oX19wb3MsIHN0ZDo6Zm9yd2FyZDxfQXJnPihfX3gpLCBf X2FuKTsKIAl9CiAKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LdD4KKwlzdGF0aWMgX19j b25kaXRpb25hbF90PAorCV9fYW5kXzxfX2lzX25vdGhyb3dfaW52b2NhYmxlPF9Db21wYXJl JiwKKwkJCQkgICAgICBjb25zdCBrZXlfdHlwZSYsIGNvbnN0IGtleV90eXBlJj4sCisJICAg ICAgIF9fbm90XzxfX2lzX25vdGhyb3dfaW52b2NhYmxlPF9Db21wYXJlJiwKKwkJCQkJICAg ICBfS3QsIGNvbnN0IGtleV90eXBlJj4+Pjo6dmFsdWUsCisJICBrZXlfdHlwZSwgX0t0JiY+ CisJX1NfZm9yd2FyZF9rZXkoX0t0JiYgX19rKQorCXsgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxf S3Q+KF9fayk7IH0KKworICAgICAgc3RhdGljIGNvbnN0IGtleV90eXBlJgorICAgICAgX1Nf Zm9yd2FyZF9rZXkoY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICAgIHsgcmV0dXJuIF9fazsg fQorCisgICAgICBzdGF0aWMga2V5X3R5cGUmJgorICAgICAgX1NfZm9yd2FyZF9rZXkoa2V5 X3R5cGUmJiBfX2spCisgICAgICB7IHJldHVybiBzdGQ6Om1vdmUoX19rKTsgfQorCisgICAg ICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS3QsIHR5cGVuYW1lIF9Bcmc+CisJc3RkOjpwYWlyPGl0 ZXJhdG9yLCBib29sPgorCV9NX2VtcGxhY2VfdW5pcXVlX2t2KF9LdCYmLCBfQXJnJiYpOwor CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorCXBhaXI8aXRlcmF0b3IsIGJvb2w+ CisJX01fZW1wbGFjZV91bmlxdWVfYXV4KF9BcmcmJiBfX2FyZykKKwl7CisJICByZXR1cm4g X01fZW1wbGFjZV91bmlxdWVfa3YoCisJICAgIF9TX2ZvcndhcmRfa2V5KF9LZXlPZlZhbHVl e30oc3RkOjpmb3J3YXJkPF9Bcmc+KF9fYXJnKSkpLAorCSAgICBzdGQ6OmZvcndhcmQ8X0Fy Zz4oX19hcmcpKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisJcGFp cjxpdGVyYXRvciwgYm9vbD4KKwlfTV9lbXBsYWNlX3VuaXF1ZShfQXJnJiYgX19hcmcpCisJ eworCSAgdXNpbmcgX190b192YWx1ZSA9IF9Db252ZXJ0VG9WYWx1ZVR5cGU8X0tleU9mVmFs dWUsIHZhbHVlX3R5cGU+OworCSAgcmV0dXJuIF9NX2VtcGxhY2VfdW5pcXVlX2F1eChfX3Rv X3ZhbHVle30oc3RkOjpmb3J3YXJkPF9Bcmc+KF9fYXJnKSkpOworCX0KKwogICAgICAgdGVt cGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CiAJcGFpcjxpdGVyYXRvciwgYm9vbD4KIAlfTV9l bXBsYWNlX3VuaXF1ZShfQXJncyYmLi4uIF9fYXJncyk7CkBAIC0xNjcwLDYgKzE3NTEsMTkg QEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KIAlfUmJfdHJlZSYgX01fdDsK IAlfTGlua190eXBlIF9NX25vZGU7CiAgICAgICB9OworCisgICAgICB0ZW1wbGF0ZTx0eXBl bmFtZSBfS3QsIHR5cGVuYW1lIF9BcmcsIHR5cGVuYW1lIF9TZWxlY3RGc3Q+CisJc3RhdGlj IF9BdXRvX25vZGUKKwlfU19idWlsZF9ub2RlKF9SYl90cmVlJiBfX3QsIF9LdCYmIF9faywg X0FyZyYmIF9fYXJnLCBfU2VsZWN0RnN0KQorCXsKKwkgIHJldHVybgorCSAgICB7IF9fdCwg c3RkOjpmb3J3YXJkPF9LdD4oX19rKSwgc3RkOjpmb3J3YXJkPF9Bcmc+KF9fYXJnKS5zZWNv bmQgfTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LdCwgdHlwZW5hbWUgX0Fy Zz4KKwlzdGF0aWMgX0F1dG9fbm9kZQorCV9TX2J1aWxkX25vZGUoX1JiX3RyZWUmIF9fdCwg X0t0JiYgX19rLCBfQXJnJiYsIHN0ZDo6X0lkZW50aXR5PF9WYWw+KQorCXsgcmV0dXJuIHsg X190LCBzdGQ6OmZvcndhcmQ8X0t0PihfX2spIH07IH0KICNlbmRpZiAvLyBDKysxMQogICAg IH07CiAKQEAgLTIxMzEsNiArMjIyNSwzOSBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0Vf VkVSU0lPTgogICAgICAgcmV0dXJuIF9SZXMoX19qLl9NX25vZGUsIDApOwogICAgIH0KIAor I2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwg dHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisJICAgdHlwZW5hbWUgX0Nv bXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS3Q+Cisg ICAgICBhdXRvCisgICAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0Nv bXBhcmUsIF9BbGxvYz46OgorICAgICAgX01fZ2V0X2luc2VydF91bmlxdWVfcG9zX3RyKGNv bnN0IF9LdCYgX19rKQorICAgICAgLT4gcGFpcjxfQmFzZV9wdHIsIF9CYXNlX3B0cj4KKyAg ICAgIHsKKwl0eXBlZGVmIHBhaXI8X0Jhc2VfcHRyLCBfQmFzZV9wdHI+IF9SZXM7CisJX0xp bmtfdHlwZSBfX3ggPSBfTV9iZWdpbigpOworCV9CYXNlX3B0ciBfX3kgPSBfTV9lbmQoKTsK Kwlib29sIF9fY29tcCA9IHRydWU7CisJd2hpbGUgKF9feCAhPSAwKQorCSAgeworCSAgICBf X3kgPSBfX3g7CisJICAgIF9fY29tcCA9IF9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX19rLCBf U19rZXkoX194KSk7CisJICAgIF9feCA9IF9fY29tcCA/IF9TX2xlZnQoX194KSA6IF9TX3Jp Z2h0KF9feCk7CisJICB9CisJaXRlcmF0b3IgX19qID0gaXRlcmF0b3IoX195KTsKKwlpZiAo X19jb21wKQorCSAgeworCSAgICBpZiAoX19qID09IGJlZ2luKCkpCisJICAgICAgcmV0dXJu IF9SZXMoX194LCBfX3kpOworCSAgICBlbHNlCisJICAgICAgLS1fX2o7CisJICB9CisJaWYg KF9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9fai5fTV9ub2RlKSwgX19rKSkKKwkg IHJldHVybiBfUmVzKF9feCwgX195KTsKKwlyZXR1cm4gX1JlcyhfX2ouX01fbm9kZSwgMCk7 CisgICAgICB9CisjZW5kaWYKKwogICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFt ZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKIAkgICB0eXBlbmFtZSBfQ29tcGFyZSwg dHlwZW5hbWUgX0FsbG9jPgogICAgIHBhaXI8dHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1Zh bCwgX0tleU9mVmFsdWUsCkBAIC0yNDM4LDYgKzI1NjUsMjQgQEAgX0dMSUJDWFhfQkVHSU5f TkFNRVNQQUNFX1ZFUlNJT04KIAlyZXR1cm4ge2l0ZXJhdG9yKF9fcmVzLmZpcnN0KSwgZmFs c2V9OwogICAgICAgfQogCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9W YWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBl bmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0t0LCB0eXBlbmFtZSBfQXJn PgorICAgICAgYXV0bworICAgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUs IF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICAgIF9NX2VtcGxhY2VfdW5pcXVlX2t2KF9LdCYm IF9faywgX0FyZyYmIF9fYXJnKQorICAgICAgLT4gcGFpcjxpdGVyYXRvciwgYm9vbD4KKyAg ICAgIHsKKwlhdXRvIF9fcmVzID0gX01fZ2V0X2luc2VydF91bmlxdWVfcG9zX3RyKF9fayk7 CisJaWYgKF9fcmVzLnNlY29uZCkKKwkgIHsKKwkgICAgX0F1dG9fbm9kZSBfX3ogPSBfU19i dWlsZF9ub2RlKCp0aGlzLAorCSAgICAgIHN0ZDo6Zm9yd2FyZDxfS3Q+KF9fayksIHN0ZDo6 Zm9yd2FyZDxfQXJnPihfX2FyZyksIF9LZXlPZlZhbHVle30pOworCSAgICByZXR1cm4geyBf X3ouX01faW5zZXJ0KF9fcmVzKSwgdHJ1ZSB9OworCSAgfQorCXJldHVybiB7IGl0ZXJhdG9y KF9fcmVzLmZpcnN0KSwgZmFsc2UgfTsKKyAgICAgIH0KKwogICB0ZW1wbGF0ZTx0eXBlbmFt ZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKIAkgICB0eXBl bmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgogICAgIHRlbXBsYXRlPHR5cGVuYW1l Li4uIF9BcmdzPgpkaWZmIC0tZ2l0IGEvbGlic3RkYysrLXYzL3Rlc3RzdWl0ZS8yM19jb250 YWluZXJzL21hcC85NjA4OC5jYyBiL2xpYnN0ZGMrKy12My90ZXN0c3VpdGUvMjNfY29udGFp bmVycy9tYXAvOTYwODguY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw MDAuLjdkZDYyMTI5YzIzCi0tLSAvZGV2L251bGwKKysrIGIvbGlic3RkYysrLXYzL3Rlc3Rz dWl0ZS8yM19jb250YWluZXJzL21hcC85NjA4OC5jYwpAQCAtMCwwICsxLDI1MiBAQAorLy8g eyBkZy1kbyBydW4geyB0YXJnZXQgYysrMTcgfSB9CisvLyB7IGRnLXJlcXVpcmUtZWZmZWN0 aXZlLXRhcmdldCBzdGRfYWxsb2NhdG9yX25ldyB9CisKKy8vIENvcHlyaWdodCAoQykgMjAy MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMg cGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVl CisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBp dCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp dGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJz aW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0 aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkg b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBZb3Ugc2hv dWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZSBhbG9uZworLy8gd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5H My4gIElmIG5vdCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKwor Ly8gbGlic3RkYysrLzk2MDg4CisKKyNpbmNsdWRlIDxzdHJpbmdfdmlldz4KKyNpbmNsdWRl IDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1 ZGUgPHRlc3RzdWl0ZV9ob29rcy5oPgorI2luY2x1ZGUgPHJlcGxhY2VtZW50X21lbW9yeV9v cGVyYXRvcnMuaD4KKworc3RhdGljIGNvbnN0ZXhwciBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8 c3RkOjpwYWlyPGNvbnN0IGNoYXIqLCBpbnQ+PiBsc3QgPQorICB7IHsibG9uZ19zdHJfZm9y X2R5bmFtaWNfYWxsb2NhdGluZyIsIDF9IH07CisKK3ZvaWQKK3Rlc3QwMSgpCit7CisgIF9f Z251X3Rlc3Q6OmNvdW50ZXI6OnJlc2V0KCk7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBp bnQ+IG07CisgIG0uaW5zZXJ0KGxzdC5iZWdpbigpLCBsc3QuZW5kKCkpOworICBWRVJJRlko IG0uc2l6ZSgpID09IDEgKTsKKworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmNv dW50KCkgPT0gMiApOworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmdldCgpLl9N X2luY3JlbWVudHMgPT0gMiApOworCisgIG0uaW5zZXJ0KGxzdC5iZWdpbigpLCBsc3QuZW5k KCkpOworICBWRVJJRlkoIG0uc2l6ZSgpID09IDEgKTsKKworICBWRVJJRlkoIF9fZ251X3Rl c3Q6OmNvdW50ZXI6OmNvdW50KCkgPT0gMiApOworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNv dW50ZXI6OmdldCgpLl9NX2luY3JlbWVudHMgPT0gMyApOworfQorCit2b2lkCit0ZXN0MDIo KQoreworICBfX2dudV90ZXN0Ojpjb3VudGVyOjpyZXNldCgpOworICBzdGQ6Om1hcDxzdGQ6 OnN0cmluZywgaW50LCBzdGQ6Omxlc3M8c3RkOjpzdHJpbmdfdmlldz4+IG07CisgIG0uaW5z ZXJ0KGxzdC5iZWdpbigpLCBsc3QuZW5kKCkpOworICBWRVJJRlkoIG0uc2l6ZSgpID09IDEg KTsKKworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmNvdW50KCkgPT0gMiApOwor ICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmdldCgpLl9NX2luY3JlbWVudHMgPT0g MiApOworCisgIG0uaW5zZXJ0KGxzdC5iZWdpbigpLCBsc3QuZW5kKCkpOworICBWRVJJRlko IG0uc2l6ZSgpID09IDEgKTsKKworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmNv dW50KCkgPT0gMiApOworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmdldCgpLl9N X2luY3JlbWVudHMgPT0gMiApOworfQorCitib29sCitsZXNzX3N0cmluZ19mKGNvbnN0IHN0 ZDo6c3RyaW5nJiBsaHMsIGNvbnN0IHN0ZDo6c3RyaW5nJiByaHMpIG5vZXhjZXB0Cit7IHJl dHVybiBsaHMgPCByaHM7IH0KKwordm9pZAordGVzdDExKCkKK3sKKyAgdHlwZWRlZiBib29s ICgqbGVzc19zdHJpbmdfdCkoY29uc3Qgc3RkOjpzdHJpbmcmLAorCQkJCWNvbnN0IHN0ZDo6 c3RyaW5nJikgbm9leGNlcHQ7CisgIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OnJlc2V0KCk7Cisg IGxlc3Nfc3RyaW5nX3QgY29tcGFyZXIgPSAmbGVzc19zdHJpbmdfZjsKKyAgc3RkOjptYXA8 c3RkOjpzdHJpbmcsIGludCwgbGVzc19zdHJpbmdfdD4gbShjb21wYXJlcik7CisgIG0uaW5z ZXJ0KGxzdC5iZWdpbigpLCBsc3QuZW5kKCkpOworICBWRVJJRlkoIG0uc2l6ZSgpID09IDEg KTsKKworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmNvdW50KCkgPT0gMiApOwor ICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmdldCgpLl9NX2luY3JlbWVudHMgPT0g MiApOworCisgIG0uaW5zZXJ0KGxzdC5iZWdpbigpLCBsc3QuZW5kKCkpOworICBWRVJJRlko IG0uc2l6ZSgpID09IDEgKTsKKworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmNv dW50KCkgPT0gMiApOworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmdldCgpLl9N X2luY3JlbWVudHMgPT0gMyApOworfQorCitib29sCitsZXNzX3N0cmluZ192aWV3X2YoY29u c3Qgc3RkOjpzdHJpbmdfdmlldyYgbGhzLAorCQkgICBjb25zdCBzdGQ6OnN0cmluZ192aWV3 JiByaHMpIG5vZXhjZXB0Cit7IHJldHVybiBsaHMgPCByaHM7IH0KKwordm9pZAordGVzdDEy KCkKK3sKKyAgdHlwZWRlZiBib29sICgqbGVzc19zdHJpbmd2aWV3X3QpIChjb25zdCBzdGQ6 OnN0cmluZ192aWV3JiwKKwkJCQkgICAgIGNvbnN0IHN0ZDo6c3RyaW5nX3ZpZXcmKSBub2V4 Y2VwdDsKKyAgX19nbnVfdGVzdDo6Y291bnRlcjo6cmVzZXQoKTsKKyAgbGVzc19zdHJpbmd2 aWV3X3QgY29tcGFyZXIgPSAmbGVzc19zdHJpbmdfdmlld19mOworICBzdGQ6Om1hcDxzdGQ6 OnN0cmluZywgaW50LCBsZXNzX3N0cmluZ3ZpZXdfdD4gbShjb21wYXJlcik7CisgIG0uaW5z ZXJ0KGxzdC5iZWdpbigpLCBsc3QuZW5kKCkpOworICBWRVJJRlkoIG0uc2l6ZSgpID09IDEg KTsKKworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmNvdW50KCkgPT0gMiApOwor ICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmdldCgpLl9NX2luY3JlbWVudHMgPT0g MiApOworCisgIG0uaW5zZXJ0KGxzdC5iZWdpbigpLCBsc3QuZW5kKCkpOworICBWRVJJRlko IG0uc2l6ZSgpID09IDEgKTsKKworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmNv dW50KCkgPT0gMiApOworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmdldCgpLl9N X2luY3JlbWVudHMgPT0gMiApOworfQorCitzdHJ1Y3QgbGVzc19zdHJpbmdfZnVuY3Rvcgor eworICBib29sCisgIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpzdHJpbmcmIGxocywgY29uc3Qg c3RkOjpzdHJpbmcmIHJocykgY29uc3Qgbm9leGNlcHQKKyAgeyByZXR1cm4gbGhzIDwgcmhz OyB9Cit9OworCit2b2lkCit0ZXN0MjEoKQoreworICBfX2dudV90ZXN0Ojpjb3VudGVyOjpy ZXNldCgpOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50LCBsZXNzX3N0cmluZ19mdW5j dG9yPiBtOworICBtLmluc2VydChsc3QuYmVnaW4oKSwgbHN0LmVuZCgpKTsKKyAgVkVSSUZZ KCBtLnNpemUoKSA9PSAxICk7CisKKyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpj b3VudCgpID09IDIgKTsKKyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpnZXQoKS5f TV9pbmNyZW1lbnRzID09IDIgKTsKKworICBtLmluc2VydChsc3QuYmVnaW4oKSwgbHN0LmVu ZCgpKTsKKyAgVkVSSUZZKCBtLnNpemUoKSA9PSAxICk7CisKKyAgVkVSSUZZKCBfX2dudV90 ZXN0Ojpjb3VudGVyOjpjb3VudCgpID09IDIgKTsKKyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpj b3VudGVyOjpnZXQoKS5fTV9pbmNyZW1lbnRzID09IDMgKTsKK30KKworc3RydWN0IGxlc3Nf c3RyaW5nX3ZpZXdfbm9leGNlcHRfZnVuY3RvcgoreworICBib29sCisgIG9wZXJhdG9yKCko Y29uc3Qgc3RkOjpzdHJpbmdfdmlldyYgbGhzLAorCSAgICAgY29uc3Qgc3RkOjpzdHJpbmdf dmlldyYgcmhzKSBjb25zdCBub2V4Y2VwdAorICB7IHJldHVybiBsaHMgPCByaHM7IH0KK307 CisKK3ZvaWQKK3Rlc3QyMigpCit7CisgIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OnJlc2V0KCk7 CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQsIGxlc3Nfc3RyaW5nX3ZpZXdfbm9leGNl cHRfZnVuY3Rvcj4gbTsKKyAgbS5pbnNlcnQobHN0LmJlZ2luKCksIGxzdC5lbmQoKSk7Cisg IFZFUklGWSggbS5zaXplKCkgPT0gMSApOworCisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291 bnRlcjo6Y291bnQoKSA9PSAyICk7CisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6 Z2V0KCkuX01faW5jcmVtZW50cyA9PSAyICk7CisKKyAgbS5pbnNlcnQobHN0LmJlZ2luKCks IGxzdC5lbmQoKSk7CisgIFZFUklGWSggbS5zaXplKCkgPT0gMSApOworCisgIFZFUklGWSgg X19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQoKSA9PSAyICk7CisgIFZFUklGWSggX19nbnVf dGVzdDo6Y291bnRlcjo6Z2V0KCkuX01faW5jcmVtZW50cyA9PSAyICk7Cit9CisKK3N0cnVj dCBsZXNzX3N0cmluZ192aWV3X2Z1bmN0b3IKK3sKKyAgYm9vbAorICBvcGVyYXRvcigpKGNv bnN0IHN0ZDo6c3RyaW5nX3ZpZXcmIGxocywKKwkgICAgIGNvbnN0IHN0ZDo6c3RyaW5nX3Zp ZXcmIHJocykgY29uc3QKKyAgeyByZXR1cm4gbGhzIDwgcmhzOyB9Cit9OworCit2b2lkCit0 ZXN0MjMoKQoreworICBfX2dudV90ZXN0Ojpjb3VudGVyOjpyZXNldCgpOworICBzdGQ6Om1h cDxzdGQ6OnN0cmluZywgaW50LCBsZXNzX3N0cmluZ192aWV3X2Z1bmN0b3I+IG07CisgIG0u aW5zZXJ0KGxzdC5iZWdpbigpLCBsc3QuZW5kKCkpOworICBWRVJJRlkoIG0uc2l6ZSgpID09 IDEgKTsKKworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmNvdW50KCkgPT0gMiAp OworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmdldCgpLl9NX2luY3JlbWVudHMg PT0gMiApOworCisgIG0uaW5zZXJ0KGxzdC5iZWdpbigpLCBsc3QuZW5kKCkpOworICBWRVJJ RlkoIG0uc2l6ZSgpID09IDEgKTsKKworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6 OmNvdW50KCkgPT0gMiApOworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmdldCgp Ll9NX2luY3JlbWVudHMgPT0gMyApOworfQorCit2b2lkCit0ZXN0MDMoKQoreworICBzdGQ6 OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludD4+IHY7CisgIHYuaW5zZXJ0KHYu ZW5kKCksIGxzdC5iZWdpbigpLCBsc3QuZW5kKCkpOworCisgIGNvbnN0IGF1dG8gb3JpZ2lu ID0gX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQoKTsKKworICB7CisgICAgX19nbnVfdGVz dDo6Y291bnRlcjo6cmVzZXQoKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50LCBz dGQ6Omxlc3M8c3RkOjpzdHJpbmdfdmlldz4+IG07CisgICAgbS5pbnNlcnQodi5iZWdpbigp LCB2LmVuZCgpKTsKKyAgICBWRVJJRlkoIG0uc2l6ZSgpID09IDEgKTsKKworICAgIC8vIEFs bG9jYXRlIGEgbm9kZSBhbmQgdGhlIHN0ZDo6c3RyaW5nICh1bmxlc3MgQ09XKS4KKyAgICBj b25zdGV4cHIgc3RkOjpzaXplX3QgaW5jcmVtZW50cyA9IF9HTElCQ1hYX1VTRV9DWFgxMV9B QkkgPyAyIDogMTsKKworICAgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQo KSA9PSBvcmlnaW4gKyBpbmNyZW1lbnRzICk7CisgICAgVkVSSUZZKCBfX2dudV90ZXN0Ojpj b3VudGVyOjpnZXQoKS5fTV9pbmNyZW1lbnRzID09IGluY3JlbWVudHMgKTsKKworICAgIG0u aW5zZXJ0KHYuYmVnaW4oKSwgdi5lbmQoKSk7CisgICAgVkVSSUZZKCBtLnNpemUoKSA9PSAx ICk7CisKKyAgICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmNvdW50KCkgPT0gb3Jp Z2luICsgaW5jcmVtZW50cyApOworICAgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6 Z2V0KCkuX01faW5jcmVtZW50cyA9PSBpbmNyZW1lbnRzICk7CisgIH0KKyAgVkVSSUZZKCBf X2dudV90ZXN0Ojpjb3VudGVyOjpjb3VudCgpID09IG9yaWdpbiApOworCisgIHsKKyAgICBf X2dudV90ZXN0Ojpjb3VudGVyOjpyZXNldCgpOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5n LCBpbnQsIHN0ZDo6bGVzczxzdGQ6OnN0cmluZ192aWV3Pj4gbTsKKyAgICBtLmluc2VydChz dGQ6Om1ha2VfbW92ZV9pdGVyYXRvcih2LmJlZ2luKCkpLAorCSAgICAgc3RkOjptYWtlX21v dmVfaXRlcmF0b3Iodi5lbmQoKSkpOworICAgIFZFUklGWSggbS5zaXplKCkgPT0gMSApOwor CisgICAgLy8gQWxsb2NhdGUgYSBub2RlLiBTdHJpbmcgaXMgbW92ZWQuCisgICAgY29uc3Rl eHByIHN0ZDo6c2l6ZV90IGluY3JlbWVudHMgPSAxOworCisgICAgVkVSSUZZKCBfX2dudV90 ZXN0Ojpjb3VudGVyOjpjb3VudCgpID09IG9yaWdpbiArIGluY3JlbWVudHMgKTsKKyAgICBW RVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmdldCgpLl9NX2luY3JlbWVudHMgPT0gaW5j cmVtZW50cyApOworICB9Cit9CisKK2ludAorbWFpbigpCit7CisgIHRlc3QwMSgpOworICB0 ZXN0MDIoKTsKKyAgdGVzdDExKCk7CisgIHRlc3QxMigpOworICB0ZXN0MjEoKTsKKyAgdGVz dDIyKCk7CisgIHRlc3QwMygpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYnN0 ZGMrKy12My90ZXN0c3VpdGUvMjNfY29udGFpbmVycy9tdWx0aW1hcC85NjA4OC5jYyBiL2xp YnN0ZGMrKy12My90ZXN0c3VpdGUvMjNfY29udGFpbmVycy9tdWx0aW1hcC85NjA4OC5jYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uOTE5YzVlNTljNzEKLS0t IC9kZXYvbnVsbAorKysgYi9saWJzdGRjKystdjMvdGVzdHN1aXRlLzIzX2NvbnRhaW5lcnMv bXVsdGltYXAvOTYwODguY2MKQEAgLTAsMCArMSw2NSBAQAorLy8geyBkZy1kbyBydW4geyB0 YXJnZXQgYysrMTcgfSB9CisvLyB7IGRnLXJlcXVpcmUtZWZmZWN0aXZlLXRhcmdldCBzdGRf YWxsb2NhdG9yX25ldyB9CisKKy8vIENvcHlyaWdodCAoQykgMjAyMyBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05V IElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsg eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8v IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQg YnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMs IG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlz IGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz ZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp bXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2 ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworLy8g d2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUK Ky8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gbGlic3RkYysrLzk2 MDg4CisKKyNpbmNsdWRlIDxzdHJpbmdfdmlldz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5j bHVkZSA8bWFwPgorCisjaW5jbHVkZSA8dGVzdHN1aXRlX2hvb2tzLmg+CisjaW5jbHVkZSA8 cmVwbGFjZW1lbnRfbWVtb3J5X29wZXJhdG9ycy5oPgorCitzdGF0aWMgY29uc3RleHByIHN0 ZDo6aW5pdGlhbGl6ZXJfbGlzdDxzdGQ6OnBhaXI8Y29uc3QgY2hhciosIGludD4+IGxzdCA9 IHsKKyAgICB7Imxvbmdfc3RyX2Zvcl9keW5hbWljX2FsbG9jYXRpbmciLCAxfQorfTsKKwor dm9pZAordGVzdDAxKCkKK3sKKyAgX19nbnVfdGVzdDo6Y291bnRlcjo6cmVzZXQoKTsKKyAg c3RkOjptdWx0aW1hcDxzdGQ6OnN0cmluZywgaW50LAorCQlzdGQ6Omxlc3M8c3RkOjpzdHJp bmdfdmlldz4+IGZvbzsKKyAgZm9vLmluc2VydChsc3QuYmVnaW4oKSwgbHN0LmVuZCgpKTsK KyAgVkVSSUZZKCBmb28uc2l6ZSgpID09IDEgKTsKKworICBWRVJJRlkoIF9fZ251X3Rlc3Q6 OmNvdW50ZXI6OmNvdW50KCkgPT0gMiApOworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50 ZXI6OmdldCgpLl9NX2luY3JlbWVudHMgPT0gMiApOworfQorCit2b2lkCit0ZXN0MDIoKQor eworICBfX2dudV90ZXN0Ojpjb3VudGVyOjpyZXNldCgpOworICBzdGQ6Om11bHRpbWFwPHN0 ZDo6c3RyaW5nLCBpbnQ+IGZvbzsKKyAgZm9vLmluc2VydChsc3QuYmVnaW4oKSwgbHN0LmVu ZCgpKTsKKyAgVkVSSUZZKCBmb28uc2l6ZSgpID09IDEgKTsKKworICBWRVJJRlkoIF9fZ251 X3Rlc3Q6OmNvdW50ZXI6OmNvdW50KCkgPT0gMiApOworICBWRVJJRlkoIF9fZ251X3Rlc3Q6 OmNvdW50ZXI6OmdldCgpLl9NX2luY3JlbWVudHMgPT0gMiApOworfQorCitpbnQKK21haW4o KQoreworICB0ZXN0MDEoKTsKKyAgdGVzdDAyKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0t Z2l0IGEvbGlic3RkYysrLXYzL3Rlc3RzdWl0ZS8yM19jb250YWluZXJzL211bHRpc2V0Lzk2 MDg4LmNjIGIvbGlic3RkYysrLXYzL3Rlc3RzdWl0ZS8yM19jb250YWluZXJzL211bHRpc2V0 Lzk2MDg4LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4yY2Rj MDhhYmE1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnN0ZGMrKy12My90ZXN0c3VpdGUvMjNf Y29udGFpbmVycy9tdWx0aXNldC85NjA4OC5jYwpAQCAtMCwwICsxLDY0IEBACisvLyB7IGRn LWRvIHJ1biB7IHRhcmdldCBjKysxNyB9IH0KKy8vIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUt dGFyZ2V0IHN0ZF9hbGxvY2F0b3JfbmV3IH0KKworLy8gQ29weXJpZ2h0IChDKSAyMDIzIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0 IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8v IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVu ZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFz IHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy IHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24u CisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0 IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBG SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFlvdSBzaG91bGQg aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGFsb25nCisvLyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAg SWYgbm90IHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBs aWJzdGRjKysvOTYwODgKKworI2luY2x1ZGUgPHN0cmluZ192aWV3PgorI2luY2x1ZGUgPHN0 cmluZz4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDx0ZXN0c3VpdGVfaG9va3MuaD4K KyNpbmNsdWRlIDxyZXBsYWNlbWVudF9tZW1vcnlfb3BlcmF0b3JzLmg+CisKK3N0YXRpYyBj b25zdGV4cHIgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IGNoYXIqPiBsc3QgPSB7Cisg ICJsb25nX3N0cl9mb3JfZHluYW1pY19hbGxvY2F0aW5nIgorfTsKKwordm9pZAordGVzdDAx KCkKK3sKKyAgX19nbnVfdGVzdDo6Y291bnRlcjo6cmVzZXQoKTsKKyAgc3RkOjptdWx0aXNl dDxzdGQ6OnN0cmluZywgc3RkOjpsZXNzPHN0ZDo6c3RyaW5nX3ZpZXc+PiBmb287CisgIGZv by5pbnNlcnQobHN0LmJlZ2luKCksIGxzdC5lbmQoKSk7CisgIFZFUklGWSggZm9vLnNpemUo KSA9PSAxICk7CisKKyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpjb3VudCgpID09 IDIgKTsKKyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpnZXQoKS5fTV9pbmNyZW1l bnRzID09IDIgKTsKK30KKwordm9pZAordGVzdDAyKCkKK3sKKyAgX19nbnVfdGVzdDo6Y291 bnRlcjo6cmVzZXQoKTsKKyAgc3RkOjptdWx0aXNldDxzdGQ6OnN0cmluZz4gZm9vOworICBm b28uaW5zZXJ0KGxzdC5iZWdpbigpLCBsc3QuZW5kKCkpOworICBWRVJJRlkoIGZvby5zaXpl KCkgPT0gMSApOworCisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQoKSA9 PSAyICk7CisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Z2V0KCkuX01faW5jcmVt ZW50cyA9PSAyICk7Cit9CisKK2ludAorbWFpbigpCit7CisgIHRlc3QwMSgpOworICB0ZXN0 MDIoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJzdGRjKystdjMvdGVzdHN1 aXRlLzIzX2NvbnRhaW5lcnMvc2V0Lzk2MDg4LmNjIGIvbGlic3RkYysrLXYzL3Rlc3RzdWl0 ZS8yM19jb250YWluZXJzL3NldC85NjA4OC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAwMC4uM2VjYjdmODFlY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzdGRj KystdjMvdGVzdHN1aXRlLzIzX2NvbnRhaW5lcnMvc2V0Lzk2MDg4LmNjCkBAIC0wLDAgKzEs MjU0IEBACisvLyB7IGRnLWRvIHJ1biB7IHRhcmdldCBjKysxNyB9IH0KKy8vIHsgZGctcmVx dWlyZS1lZmZlY3RpdmUtdGFyZ2V0IHN0ZF9hbGxvY2F0b3JfbmV3IH0KKworLy8gQ29weXJp Z2h0IChDKSAyMDIzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRo aXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJy YXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv b3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55 IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0 aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdB UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNI QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0 aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisK Ky8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGFsb25nCisvLyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBm aWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNl bnNlcy8+LgorCisvLyBsaWJzdGRjKysvOTYwODgKKworI2luY2x1ZGUgPHN0cmluZ192aWV3 PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9y PgorCisjaW5jbHVkZSA8dGVzdHN1aXRlX2hvb2tzLmg+CisjaW5jbHVkZSA8cmVwbGFjZW1l bnRfbWVtb3J5X29wZXJhdG9ycy5oPgorCitzdGF0aWMgY29uc3RleHByIHN0ZDo6aW5pdGlh bGl6ZXJfbGlzdDxjb25zdCBjaGFyKj4gbHN0ID0geworICAibG9uZ19zdHJfZm9yX2R5bmFt aWNfYWxsb2NhdGluZyIKK307CisKK3ZvaWQKK3Rlc3QwMSgpCit7CisgIF9fZ251X3Rlc3Q6 OmNvdW50ZXI6OnJlc2V0KCk7CisgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nLCBzdGQ6OmdyZWF0 ZXI8c3RkOjpzdHJpbmc+PiBzOworICBzLmluc2VydChsc3QuYmVnaW4oKSwgbHN0LmVuZCgp KTsKKyAgVkVSSUZZKCBzLnNpemUoKSA9PSAxICk7CisKKyAgVkVSSUZZKCBfX2dudV90ZXN0 Ojpjb3VudGVyOjpjb3VudCgpID09IDIgKTsKKyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3Vu dGVyOjpnZXQoKS5fTV9pbmNyZW1lbnRzID09IDIgKTsKKworICBzLmluc2VydChsc3QuYmVn aW4oKSwgbHN0LmVuZCgpKTsKKyAgVkVSSUZZKCBzLnNpemUoKSA9PSAxICk7CisKKyAgVkVS SUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpjb3VudCgpID09IDIgKTsKKyAgVkVSSUZZKCBf X2dudV90ZXN0Ojpjb3VudGVyOjpnZXQoKS5fTV9pbmNyZW1lbnRzID09IDMgKTsKK30KKwor dm9pZAordGVzdDAyKCkKK3sKKyAgX19nbnVfdGVzdDo6Y291bnRlcjo6cmVzZXQoKTsKKyAg c3RkOjpzZXQ8c3RkOjpzdHJpbmcsIHN0ZDo6Z3JlYXRlcjxzdGQ6OnN0cmluZ192aWV3Pj4g czsKKyAgcy5pbnNlcnQobHN0LmJlZ2luKCksIGxzdC5lbmQoKSk7CisgIFZFUklGWSggcy5z aXplKCkgPT0gMSApOworCisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQo KSA9PSAyICk7CisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Z2V0KCkuX01faW5j cmVtZW50cyA9PSAyICk7CisKKyAgcy5pbnNlcnQobHN0LmJlZ2luKCksIGxzdC5lbmQoKSk7 CisgIFZFUklGWSggcy5zaXplKCkgPT0gMSApOworCisgIFZFUklGWSggX19nbnVfdGVzdDo6 Y291bnRlcjo6Y291bnQoKSA9PSAyICk7CisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRl cjo6Z2V0KCkuX01faW5jcmVtZW50cyA9PSAyICk7Cit9CisKK2Jvb2wKK2xlc3Nfc3RyaW5n X2YoY29uc3Qgc3RkOjpzdHJpbmcmIGxocywgY29uc3Qgc3RkOjpzdHJpbmcmIHJocykgbm9l eGNlcHQKK3sgcmV0dXJuIGxocyA8IHJoczsgfQorCit2b2lkCit0ZXN0MTEoKQoreworICB0 eXBlZGVmIGJvb2wgKCpsZXNzX3N0cmluZ190KShjb25zdCBzdGQ6OnN0cmluZyYsCisJCQkJ Y29uc3Qgc3RkOjpzdHJpbmcmKSBub2V4Y2VwdDsKKyAgX19nbnVfdGVzdDo6Y291bnRlcjo6 cmVzZXQoKTsKKyAgbGVzc19zdHJpbmdfdCBsZXNzID0gJmxlc3Nfc3RyaW5nX2Y7CisgIHN0 ZDo6c2V0PHN0ZDo6c3RyaW5nLCBsZXNzX3N0cmluZ190PiBzKGxlc3MpOworICBzLmluc2Vy dChsc3QuYmVnaW4oKSwgbHN0LmVuZCgpKTsKKyAgVkVSSUZZKCBzLnNpemUoKSA9PSAxICk7 CisKKyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpjb3VudCgpID09IDIgKTsKKyAg VkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpnZXQoKS5fTV9pbmNyZW1lbnRzID09IDIg KTsKKworICBzLmluc2VydChsc3QuYmVnaW4oKSwgbHN0LmVuZCgpKTsKKyAgVkVSSUZZKCBz LnNpemUoKSA9PSAxICk7CisKKyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpjb3Vu dCgpID09IDIgKTsKKyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpnZXQoKS5fTV9p bmNyZW1lbnRzID09IDMgKTsKK30KKworYm9vbAorbGVzc19zdHJpbmdfdmlld19mKGNvbnN0 IHN0ZDo6c3RyaW5nX3ZpZXcmIGxocywKKwkJICAgY29uc3Qgc3RkOjpzdHJpbmdfdmlldyYg cmhzKSBub2V4Y2VwdAoreyByZXR1cm4gbGhzIDwgcmhzOyB9CisKK3ZvaWQKK3Rlc3QxMigp Cit7CisgIHR5cGVkZWYgYm9vbCAoKmxlc3Nfc3RyaW5ndmlld190KShjb25zdCBzdGQ6OnN0 cmluZ192aWV3JiwKKwkJCQkgICAgY29uc3Qgc3RkOjpzdHJpbmdfdmlldyYpIG5vZXhjZXB0 OworICBfX2dudV90ZXN0Ojpjb3VudGVyOjpyZXNldCgpOworICBsZXNzX3N0cmluZ3ZpZXdf dCBsZXNzID0gJmxlc3Nfc3RyaW5nX3ZpZXdfZjsKKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmcs IGxlc3Nfc3RyaW5ndmlld190PiBzKGxlc3MpOworICBzLmluc2VydChsc3QuYmVnaW4oKSwg bHN0LmVuZCgpKTsKKyAgVkVSSUZZKCBzLnNpemUoKSA9PSAxICk7CisKKyAgVkVSSUZZKCBf X2dudV90ZXN0Ojpjb3VudGVyOjpjb3VudCgpID09IDIgKTsKKyAgVkVSSUZZKCBfX2dudV90 ZXN0Ojpjb3VudGVyOjpnZXQoKS5fTV9pbmNyZW1lbnRzID09IDIgKTsKKworICBzLmluc2Vy dChsc3QuYmVnaW4oKSwgbHN0LmVuZCgpKTsKKyAgVkVSSUZZKCBzLnNpemUoKSA9PSAxICk7 CisKKyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpjb3VudCgpID09IDIgKTsKKyAg VkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpnZXQoKS5fTV9pbmNyZW1lbnRzID09IDIg KTsKK30KKworc3RydWN0IGxlc3Nfc3RyaW5nX2Z1bmN0b3IKK3sKKyAgYm9vbAorICBvcGVy YXRvcigpKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaHMsIGNvbnN0IHN0ZDo6c3RyaW5nJiByaHMp IGNvbnN0IG5vZXhjZXB0CisgIHsgcmV0dXJuIGxocyA8IHJoczsgfQorfTsKKwordm9pZAor dGVzdDIxKCkKK3sKKyAgX19nbnVfdGVzdDo6Y291bnRlcjo6cmVzZXQoKTsKKyAgc3RkOjpz ZXQ8c3RkOjpzdHJpbmcsIGxlc3Nfc3RyaW5nX2Z1bmN0b3I+IHM7CisgIHMuaW5zZXJ0KGxz dC5iZWdpbigpLCBsc3QuZW5kKCkpOworICBWRVJJRlkoIHMuc2l6ZSgpID09IDEgKTsKKwor ICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmNvdW50KCkgPT0gMiApOworICBWRVJJ RlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmdldCgpLl9NX2luY3JlbWVudHMgPT0gMiApOwor CisgIHMuaW5zZXJ0KGxzdC5iZWdpbigpLCBsc3QuZW5kKCkpOworICBWRVJJRlkoIHMuc2l6 ZSgpID09IDEgKTsKKworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmNvdW50KCkg PT0gMiApOworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmdldCgpLl9NX2luY3Jl bWVudHMgPT0gMyApOworfQorCitzdHJ1Y3QgbGVzc19zdHJpbmdfdmlld19ub2V4Y2VwdF9m dW5jdG9yCit7CisgIGJvb2wKKyAgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnN0cmluZ192aWV3 JiBsaHMsCisJICAgICBjb25zdCBzdGQ6OnN0cmluZ192aWV3JiByaHMpIGNvbnN0IG5vZXhj ZXB0CisgIHsgcmV0dXJuIGxocyA8IHJoczsgfQorfTsKKwordm9pZAordGVzdDIyKCkKK3sK KyAgX19nbnVfdGVzdDo6Y291bnRlcjo6cmVzZXQoKTsKKyAgc3RkOjpzZXQ8c3RkOjpzdHJp bmcsIGxlc3Nfc3RyaW5nX3ZpZXdfbm9leGNlcHRfZnVuY3Rvcj4gczsKKyAgcy5pbnNlcnQo bHN0LmJlZ2luKCksIGxzdC5lbmQoKSk7CisgIFZFUklGWSggcy5zaXplKCkgPT0gMSApOwor CisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQoKSA9PSAyICk7CisgIFZF UklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Z2V0KCkuX01faW5jcmVtZW50cyA9PSAyICk7 CisKKyAgcy5pbnNlcnQobHN0LmJlZ2luKCksIGxzdC5lbmQoKSk7CisgIFZFUklGWSggcy5z aXplKCkgPT0gMSApOworCisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQo KSA9PSAyICk7CisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Z2V0KCkuX01faW5j cmVtZW50cyA9PSAyICk7Cit9CisKK3N0cnVjdCBsZXNzX3N0cmluZ192aWV3X2Z1bmN0b3IK K3sKKyAgYm9vbAorICBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6c3RyaW5nX3ZpZXcmIGxocywK KwkgICAgIGNvbnN0IHN0ZDo6c3RyaW5nX3ZpZXcmIHJocykgY29uc3QKKyAgeyByZXR1cm4g bGhzIDwgcmhzOyB9Cit9OworCit2b2lkCit0ZXN0MjMoKQoreworICBfX2dudV90ZXN0Ojpj b3VudGVyOjpyZXNldCgpOworICBzdGQ6OnNldDxzdGQ6OnN0cmluZywgbGVzc19zdHJpbmdf dmlld19mdW5jdG9yPiBzOworICBzLmluc2VydChsc3QuYmVnaW4oKSwgbHN0LmVuZCgpKTsK KyAgVkVSSUZZKCBzLnNpemUoKSA9PSAxICk7CisKKyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpj b3VudGVyOjpjb3VudCgpID09IDIgKTsKKyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVy OjpnZXQoKS5fTV9pbmNyZW1lbnRzID09IDIgKTsKKworICBzLmluc2VydChsc3QuYmVnaW4o KSwgbHN0LmVuZCgpKTsKKyAgVkVSSUZZKCBzLnNpemUoKSA9PSAxICk7CisKKyAgVkVSSUZZ KCBfX2dudV90ZXN0Ojpjb3VudGVyOjpjb3VudCgpID09IDIgKTsKKyAgVkVSSUZZKCBfX2du dV90ZXN0Ojpjb3VudGVyOjpnZXQoKS5fTV9pbmNyZW1lbnRzID09IDIgKTsKK30KKwordm9p ZAordGVzdDAzKCkKK3sKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHY7CisgIHYuaW5z ZXJ0KHYuZW5kKCksIGxzdC5iZWdpbigpLCBsc3QuZW5kKCkpOworCisgIGNvbnN0IGF1dG8g b3JpZ2luID0gX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQoKTsKKworICB7CisgICAgX19n bnVfdGVzdDo6Y291bnRlcjo6cmVzZXQoKTsKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZywg c3RkOjpsZXNzPHN0ZDo6c3RyaW5nX3ZpZXc+PiBzOworICAgIHMuaW5zZXJ0KHYuYmVnaW4o KSwgdi5lbmQoKSk7CisgICAgVkVSSUZZKCBzLnNpemUoKSA9PSAxICk7CisKKyAgICAvLyBB bGxvY2F0ZSBhIG5vZGUgYW5kIHRoZSBzdGQ6OnN0cmluZyAodW5sZXNzIENPVykuCisgICAg Y29uc3RleHByIHN0ZDo6c2l6ZV90IGluY3JlbWVudHMgPSBfR0xJQkNYWF9VU0VfQ1hYMTFf QUJJID8gMiA6IDE7CisKKyAgICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmNvdW50 KCkgPT0gb3JpZ2luICsgaW5jcmVtZW50cyApOworICAgIFZFUklGWSggX19nbnVfdGVzdDo6 Y291bnRlcjo6Z2V0KCkuX01faW5jcmVtZW50cyA9PSBpbmNyZW1lbnRzICk7CisKKyAgICBz Lmluc2VydCh2LmJlZ2luKCksIHYuZW5kKCkpOworICAgIFZFUklGWSggcy5zaXplKCkgPT0g MSApOworCisgICAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpjb3VudCgpID09IG9y aWdpbiArIGluY3JlbWVudHMgKTsKKyAgICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6 OmdldCgpLl9NX2luY3JlbWVudHMgPT0gaW5jcmVtZW50cyApOworICB9CisgIFZFUklGWSgg X19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQoKSA9PSBvcmlnaW4gKTsKKworICB7CisgICAg X19nbnVfdGVzdDo6Y291bnRlcjo6cmVzZXQoKTsKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmlu Zywgc3RkOjpsZXNzPHN0ZDo6c3RyaW5nX3ZpZXc+PiBzOworICAgIHMuaW5zZXJ0KHN0ZDo6 bWFrZV9tb3ZlX2l0ZXJhdG9yKHYuYmVnaW4oKSksCisJICAgICBzdGQ6Om1ha2VfbW92ZV9p dGVyYXRvcih2LmVuZCgpKSk7CisgICAgVkVSSUZZKCBzLnNpemUoKSA9PSAxICk7CisKKyAg ICAvLyBBbGxvY2F0ZSBhIG5vZGUsIHN0cmluZyBpcyBtb3ZlZC4KKyAgICBjb25zdGV4cHIg c3RkOjpzaXplX3QgaW5jcmVtZW50cyA9IDE7CisKKyAgICBWRVJJRlkoIF9fZ251X3Rlc3Q6 OmNvdW50ZXI6OmNvdW50KCkgPT0gb3JpZ2luICsgaW5jcmVtZW50cyApOworICAgIFZFUklG WSggX19nbnVfdGVzdDo6Y291bnRlcjo6Z2V0KCkuX01faW5jcmVtZW50cyA9PSBpbmNyZW1l bnRzICk7CisgIH0KK30KKworaW50CittYWluKCkKK3sKKyAgdGVzdDAxKCk7CisgIHRlc3Qw MigpOworICB0ZXN0MTEoKTsKKyAgdGVzdDEyKCk7CisgIHRlc3QyMSgpOworICB0ZXN0MjIo KTsKKyAgdGVzdDIzKCk7CisgIHRlc3QwMygpOworICByZXR1cm4gMDsKK30K --------------inF18K7Ic2sduc4BFKqjb00J--