From dev-return-6196-daniel=haxx.se@subversion.apache.org Wed Sep 1 02:28:51 2010 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on giant.haxx.se X-Spam-Level: X-Spam-Status: No, score=-1.5 required=3.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_RP_MATCHES_RCVD autolearn=ham version=3.3.1 Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by giant.haxx.se (8.14.3/8.14.3/Debian-9.1) with SMTP id o810Soov011824 for ; Wed, 1 Sep 2010 02:28:50 +0200 Received: (qmail 55297 invoked by uid 500); 1 Sep 2010 00:28:37 -0000 Mailing-List: contact dev-help@subversion.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Delivered-To: mailing list dev@subversion.apache.org Received: (qmail 55289 invoked by uid 99); 1 Sep 2010 00:28:37 -0000 Received: from Unknown (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 01 Sep 2010 00:28:37 +0000 X-ASF-Spam-Status: No, hits=0.0 required=10.0 tests=FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,SPF_PASS Received-SPF: pass (nike.apache.org: domain of ptburba@gmail.com designates 209.85.161.43 as permitted sender) Received: from [209.85.161.43] (HELO mail-fx0-f43.google.com) (209.85.161.43) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 01 Sep 2010 00:28:16 +0000 Received: by fxm9 with SMTP id 9so5369990fxm.16 for ; Tue, 31 Aug 2010 17:27:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:cc:content-type; bh=/9pkiDwwnYGc3h7x9/BHneQUsRt9BHTCWeBra5WiY6g=; b=NNt7IB2S1C6GJSzwJVeCyDkYVTtdI0RCY1PBmlhc02NSPjxw+YlKJus4jeUpvWj1PY ar+z4RlMlJRSztfyglSnLgezxuBccwAufij/FbMdaVbbTZ/yMQHXXDPM8KhBbgiYZP9u /BXMMzSYSoBmmnvKbbodhogeNG0pOUbyyHxyo= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; b=L83WyDNOV/7TdhDNwvteIyxxTaz5qksPAuCvboyxwzpx3x73jaU5G9SDQUjLCVizAt 4XjHHLydASLaCXL6cRK8UZGqcXSACr6lJLa+4ejDyHZE+RA9lO3UvZCCKqBxfwxva8LY qEFgMHcV0F9XtIraE205aj1iKWkFQawvHH0ZU= MIME-Version: 1.0 Received: by 10.223.104.148 with SMTP id p20mr6235174fao.11.1283300875687; Tue, 31 Aug 2010 17:27:55 -0700 (PDT) Received: by 10.223.108.72 with HTTP; Tue, 31 Aug 2010 17:27:55 -0700 (PDT) In-Reply-To: <1282824455.2329.710.camel@edith> References: <1282649108.32023.477.camel@edith> <1282824455.2329.710.camel@edith> Date: Tue, 31 Aug 2010 20:27:55 -0400 Message-ID: Subject: Re: RFC: How should Subversion handle OS-deleted paths? From: Paul Burba To: Julian Foad Cc: Subversion Development Content-Type: multipart/mixed; boundary=001636c5b312d5d832048f27c4e9 X-Virus-Checked: Checked by ClamAV on apache.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.3.5 (giant.haxx.se [80.67.6.50]); Wed, 01 Sep 2010 02:28:51 +0200 (CEST) X-Friend: Nope --001636c5b312d5d832048f27c4e9 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Thu, Aug 26, 2010 at 8:07 AM, Julian Foad wro= te: > On Wed, 2010-08-25, Paul Burba wrote: >> On Tue, Aug 24, 2010 at 7:25 AM, Julian Foad = wrote: > [...] >> Agreed, we simply can't be sure what the user's intention was...I'm >> beginning to be swayed to the idea that restoring the missing subtrees >> may not be the ideal approach... > > [...] >> > The pattern that's emerging from my thoughts is: throw an error if >> > logically we need to access the missing working version of the node. = =C2=A0If >> > we don't need to access it, just let it be. =C2=A0Never "restore" it u= nless >> > the user specifically requests so and says what kind of restoration is >> > required. >> > >> > For these reasons I think "merge" should also throw an error if it nee= ds >> > to merge changes into a missing node. =C2=A0(If instead it needs to de= lete >> > it, then it has the options I mentioned for "svn delete".) >> > >> > But I suspect part of the reason why "restore" seems an attractive >> > option is because Subversion isn't very friendly when "merge" stops wi= th >> > an error. =C2=A0We don't provide any way to resume the same merge, >> >> Quite right about the unfriendliness. =C2=A0Resuming the merge is really= a >> hit-or-miss proposition, depending on how much of the merge was done >> successfully prior to encountering the missing subtree. =C2=A0If it >> encountered early, before the application of any diffs, then things >> are ok, but after that things get ugly fast, particularly if the merge >> target originally had any local mods. >> >> It's worth noting again there there are *two* error-out approaches: >> >> i) Throw an error when a subtree the editor needs is found to be >> missing. =C2=A0This is what you are talking about here. >> >> ii) Identify any missing subtrees at the *start* of the merge and >> throw an error before any editor drives are done. =C2=A0Basically we >> disallow merges with missing subtrees due to OS-level deletes. > > You're right, I hadn't thought of erroring out before starting the > merge, and that is a much, much better option than erroring out in the > middle. > >> > and we >> > don't make it particularly easy to roll back the merge (although that'= s >> > getting better now that "revert" is, I hope, going to remove nodes tha= t >> > it created by copying), and we don't have any way at all to roll back = a >> > merge performed in a non-clean WC. =C2=A0So we're trying to avoid erro= ring >> > out. >> > >> > Long term, those difficult problems are are the problems we should be >> > looking to solve. =C2=A0Short term, I suppose it's useful to avoid err= oring >> > out as much as we can. >> >> Equally bad is the case with trunk right now, where we simply ignore >> missing directories, even if the merge would affect them - see >> http://subversion.tigris.org/issues/show_bug.cgi?id=3D2915#desc4 for an >> example. >> >> > If that's the important issue, and we recognize >> > it as such, then I could support the idea of "merge" doing this >> > "restore" while other commands don't. >> >> Given what you've said here and thinking anew about merge and missing >> subtrees, I think the best approach might simply be what we currently >> do with files: Skip the missing subtree and record non-inheritable >> mergeinfo so the missing subtree is handled correctly (i.e. the >> mergeinfo reflects the fact that the merge never touched the missing >> subtree). >> >> This has a few things going for it: >> >> A) It's consistent with 1.5-1.6's treatment of missing files. >> >> B) As Daniel hinted at in >> http://svn.haxx.se/dev/archive-2010-08/0189.shtml, it's consistent >> with how merge tracking treats every other type of "missing" subtree >> (e.g. shallow WCs, switches, paths missing due to authz restrictions). >> >> C) It makes no assumptions about what the user intended, it just deals >> with the fact that the subtrees are missing. >> >> D) It allows the merge to complete, no errors mid-merge. >> >> E) It allows the missing subtrees to be restored via update (either >> before or after the merge is committed) and for the merge to be >> repeated. =C2=A0The repeat merge will notice that the merge never touche= d >> the subtrees and will drive the editor such that only those subtrees >> have the merge repeated. >> >> Any thoughts to this approach? > > Another plus: > > =C2=A0F) It means the merge algorithm has one less case that can choke it= , > which is better than relying on a check to have been done beforehand. > It makes the subroutines easier to re-use (callable by GUIs etc.). =C2=A0= And > it could be extremely difficult to make sure that such an external check > exactly matches the merge code in all the corner cases. > > The only minus I can think of: In many ways we would serve our users > better by simply not allowing them to get into complex situations and > instead just disallowing such a merge. > > But the many advantages seem to outweigh that, and your suggestion > sounds close to perfect. > > If you can do that without much additional complexity, +1. I really thought that would be the case, as most of the logic is already in place to handle other types of missing subtrees. But after hacking on this entirely too long and finding new bugs at every turn, I had some serious second thoughts, mainly along the lines of, "Is all this complexity worth it?" I think "no" and have come to see the wisdom of something you said earlier: "You're right, I hadn't thought of erroring out before starting the merge, and that is a much, much better option than erroring out in the middle." This is relatively simple to do as the attached patch demonstrates. If there are no objections I will go in this direction instead. Note that there are a few test failures I still need to fix: FAIL: merge_tests.py 16: merge into missing must not break working copy FAIL: merge_tests.py 104: skipped files get correct mergeinfo set FAIL: merge_tree_conflict_tests.py 21: tree conflicts: tree missing, leaf = del FAIL: merge_tree_conflict_tests.py 20: tree conflicts: tree missing, leaf = edit FAIL: merge_authz_tests.py 1: skipped paths get overriding mergeinfo These all fail because they expect the old behavior of OS-deleted paths to be skipped and OS-deleted directories to create tree-conflicts. With the patch in place, if we try to merge to a target which is missing subtrees due to OS-level deletions, then we get an error like this: ### Oops, move rather than svn move: C:\SVN\src-branch-1.6.x-WCNG>move subversion\tests\cmdline\merge_authz_tests.py subversion\tests\cmdline\merge_auth_tests.py 1 file(s) moved. ### Let's merge: C:\SVN\src-branch-1.6.x-WCNG>svn merge ^^/subversion/trunk -c879766 ..\..\..\subversion\svn\util.c:902: (apr_err=3D195016) ..\..\..\subversion\libsvn_client\merge.c:10548: (apr_err=3D195016) ..\..\..\subversion\libsvn_client\merge.c:10504: (apr_err=3D195016) ..\..\..\subversion\libsvn_client\merge.c:10504: (apr_err=3D195016) ..\..\..\subversion\libsvn_client\merge.c:10476: (apr_err=3D195016) ..\..\..\subversion\libsvn_client\merge.c:8611: (apr_err=3D195016) ..\..\..\subversion\libsvn_client\merge.c:8096: (apr_err=3D195016) ..\..\..\subversion\libsvn_client\merge.c:5851: (apr_err=3D195016) svn: Merge tracking not allowed with missing subtrees; try restoring these items first: C:\SVN\src-branch-1.6.x-WCNG\subversion\tests\cmdline\merge_authz_tests.py ### Oh, I see where I screwed up: C:\SVN\src-branch-1.6.x-WCNG>svn st ? subversion\tests\cmdline\merge_auth_tests.py ! subversion\tests\cmdline\merge_authz_tests.py Note: In the interest of sanity, if there are many OS-deleted subtrees in a merge target, the error lists only the *roots* of the missing subtrees. [[[ Fix issue #2915 'Handle mergeinfo for subtrees missing due to removal by non-svn command'. With this change, if you attempt a merge-tracking aware merge to a WC which is missing subtrees due to an OS-level deletion, then an error is raised before any editor drives begin. The error message describes the root of each missing path. * subversion/libsvn_client/merge.c (get_mergeinfo_walk_baton): Add some new members for tracking sub- directories' dirents. (get_mergeinfo_walk_cb): (record_missing_subtree_roots): New function. (record_missing_subtree_roots): Use new function to flag missing subtree roots. (get_mergeinfo_paths): Raise a SVN_ERR_CLIENT_NOT_READY_TO_MERGE error if any unexpectedly missing subtrees are found. * subversion/tests/cmdline/merge_tests.py (merge_with_os_deleted_subtrees): New test, (test_list): Add merge_with_os_deleted_subtrees. ]]] Paul --001636c5b312d5d832048f27c4e9 Content-Type: text/plain; charset=US-ASCII; name="2915.The Error Out Approach.diff.txt" Content-Disposition: attachment; filename="2915.The Error Out Approach.diff.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gdjg69cj0 SW5kZXg6IHN1YnZlcnNpb24vbGlic3ZuX2NsaWVudC9tZXJnZS5jDQo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0g c3VidmVyc2lvbi9saWJzdm5fY2xpZW50L21lcmdlLmMJKHJldmlzaW9uIDk5MTM5NikNCisrKyBz dWJ2ZXJzaW9uL2xpYnN2bl9jbGllbnQvbWVyZ2UuYwkod29ya2luZyBjb3B5KQ0KQEAgLTUzMDIs NiArNTMwMiwxNyBAQA0KIHsKICAgLyogQXJyYXkgb2YgcGF0aHMgdGhhdCBoYXZlIGV4cGxpY2l0 IG1lcmdlaW5mbyBhbmQvb3IgYXJlIHN3aXRjaGVkLiAqLwogICBhcHJfYXJyYXlfaGVhZGVyX3Qg KmNoaWxkcmVuX3dpdGhfbWVyZ2VpbmZvOworCisgIC8qIEEgaGFzaCBvZiBNRVJHRV9UQVJHRVRf QUJTUEFUSCdzIHN1YmRpcmVjdG9yaWVzJyBkaXJlbnRzLiAgTWFwcworICAgICBjb25zdCBjaGFy ICogYWJzb2x1dGUgd29ya2luZyBjb3B5IHBhdGhzIHRvIGRpcmVudCBoYXNoZXMgYXMgb2J0YWlu ZWQKKyAgICAgYnkgc3ZuX2lvX2dldF9kaXJlbnRzMygpLiAgQ29udGVudHMgYXJlIGFsbG9jYXRl ZCBpbiBDQl9QT09MLiAqLworICBhcHJfaGFzaF90ICpzdWJ0cmVlX2RpcmVudHM7CisKKyAgLyog QSBoYXNoIHRvIGtlZXAgdHJhY2sgb2YgYW55IHN1YnRyZWVzIGluIHRoZSBtZXJnZSB0YXJnZXQg d2hpY2ggYXJlCisgICAgIHVuZXhwZWN0ZWRseSBtaXNzaW5nIGZyb20gZGlzay4gIE1hcHMgY29u c3QgY2hhciAqIGFic29sdXRlIHdvcmtpbmcKKyAgICAgY29weSBwYXRocyB0byB0aGUgc2FtZS4g IENvbnRlbnRzIGFyZSBhbGxvY2F0ZWQgaW4gQ0JfUE9PTC4gKi8KKyAgYXByX2hhc2hfdCAqbWlz c2luZ19zdWJ0cmVlczsKKwogICAvKiBNZXJnZSBzb3VyY2UgY2Fub25pY2FsIHBhdGguICovCiAg IGNvbnN0IGNoYXIqIG1lcmdlX3NyY19jYW5vbl9wYXRoOwogCkBAIC01MzIyLDkgKzUzMzMsMTE2 IEBADQogCiAgIC8qIFBvb2wgZnJvbSB3aGljaCB0byBhbGxvY2F0ZSBuZXcgZWxlbWVudHMgb2Yg Q0hJTERSRU5fV0lUSF9NRVJHRUlORk8uICovCiAgIGFwcl9wb29sX3QgKnBvb2w7CisKKyAgLyog UG9vbCB3aXRoIGEgbGlmZXRpbWUgZ3VhcmFudGVlZCBvdmVyIGFsbCB0aGUgZ2V0X21lcmdlaW5m b193YWxrX2NiCisgICAgIGNhbGxiYWNrcy4gKi8KKyAgYXByX3Bvb2xfdCAqY2JfcG9vbDsKIH07 CiAKKy8qIEhlbHBlciBmb3IgdGhlIHN2bl93Y19fbm9kZV9mb3VuZF9mdW5jX3QgY2FsbGJhY2sg Z2V0X21lcmdlaW5mb193YWxrX2NiKCkuCiAKKyAgIENoZWNrcyBmb3IgaXNzdWUgIzI5MTUgc3Vi dHJlZXMsIGkuZS4gdGhvc2UgdGhhdCB0aGUgV0MgdGhpbmtzIGFyZSBvbiBkaXNrCisgICBidXQg aGF2ZSBiZWVuIHJlbW92ZWQgZHVlIHRvIGFuIE9TLWxldmVsIGRlbGV0aW9uLgorCisgICBJZiB0 aGUgc3VwcG9zZWQgd29ya2luZyBwYXRoIExPQ0FMX0FCU1BBVEgsIG9mIGtpbmQgS0lORCwgaXMg dGhlIHJvb3QKKyAgIG9mIGEgbWlzc2luZyBzdWJ0cmVlLCB0aGVuIGFkZCBhIChjb25zdCBjaGFy ICopIFdDIGFic29sdXRlIHBhdGggdG8KKyAgIChjb25zdCBjaGFyICopIFdDIGFic29sdXRlIHBh dGggbWFwcGluZyB0byBNSVNTSU5HX1NVQlRSRUVTLCB3aGVyZSB0aGUKKyAgIHBhdGhzIGFyZSBi b3RoIGEgY29weSBvZiBMT0NBTF9BQlNQQVRILCBhbGxvY2F0ZWQgaW4gUkVTVUxUX1BPT0wuCisK KyAgIElmIExPQ0FMX0FCU1BBVEggaXMgYSBkaXJlY3RvcnkgYW5kIGlzIG5vdCBtaXNzaW5nIGZy b20gZGlzaywgdGhlbiBhZGQKKyAgIGEgKGNvbnN0IGNoYXIgKikgV0MgYWJzb2x1dGUgcGF0aCB0 byAoc3ZuX2lvX2RpcmVudDJfdCAqKSBkaXJlbnQgbWFwcGluZworICAgdG8gU1VCVFJFRV9ESVJF TlRTLCBhZ2FpbiBhbGxvY2F0ZWQgaW4gUkVTVUxUX1BPT0wgKHNlZQorICAgc3ZuX2lvX2dldF9k aXJlbnRzMykuCisKKyAgIFNDUkFUQ0hfUE9PTCBpcyB1c2VkIGZvciB0ZW1wb3JhcnkgYWxsb2Nh dGlvbnMuCisgICAKKyAgIE5vdGU6IFNpbmNlIHRoaXMgaXMgZWZmZXRpdmVseSBhIHN2bl93Y19f bm9kZV9mb3VuZF9mdW5jX3QgY2FsbGJhY2ssIGl0CisgICBtdXN0IGJlIGNhbGxlZCBpbiBkZXB0 aC1maXJzdCBvcmRlci4gKi8KK3N0YXRpYyBzdm5fZXJyb3JfdCAqCityZWNvcmRfbWlzc2luZ19z dWJ0cmVlX3Jvb3RzKGNvbnN0IGNoYXIgKmxvY2FsX2Fic3BhdGgsCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHN2bl9ub2RlX2tpbmRfdCBraW5kLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBhcHJfaGFzaF90ICpzdWJ0cmVlX2RpcmVudHMsCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGFwcl9oYXNoX3QgKm1pc3Npbmdfc3VidHJlZXMsCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGFwcl9wb29sX3QgKnJlc3VsdF9wb29sLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBhcHJfcG9vbF90ICpzY3JhdGNoX3Bvb2wpCit7CisgIHN2bl9ib29sZWFuX3Qg bWlzc2luZ19zdWJ0cmVlX3Jvb3QgPSBGQUxTRTsKKworICAvKiBDYWNoZSB0aGUgZGlyZW50cyBm b3IgZWFjaCBkaXJlY3RvcnkgaW4gU1VCVFJFRV9ESVJFTlRTLiAqLworICBpZiAoa2luZCA9PSBz dm5fbm9kZV9kaXIpCisgICAgeworICAgICAgLyogSWYgU1VCVFJFRV9ESVJFTlRTIGlzIGVtcHR5 IExPQ0FMX0FCU1BBVEggaXMgbWVyZ2UgdGFyZ2V0LiAqLworICAgICAgaWYgKGFwcl9oYXNoX2Nv dW50KHN1YnRyZWVfZGlyZW50cykgPT0gMCAKKyAgICAgICAgICB8fCBhcHJfaGFzaF9nZXQoc3Vi dHJlZV9kaXJlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdm5fZGlyZW50X2Rpcm5h bWUobG9jYWxfYWJzcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHNjcmF0Y2hfcG9vbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBBUFJfSEFTSF9LRVlfU1RSSU5HKSkKKyAgICAgICAgeworICAgICAgICAgIGFw cl9oYXNoX3QgKmRpcmVudHM7CisgICAgICAgICAgc3ZuX2Vycm9yX3QgKmVyciA9IHN2bl9pb19n ZXRfZGlyZW50czMoJmRpcmVudHMsIGxvY2FsX2Fic3BhdGgsCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgcmVzdWx0X3Bvb2wsCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaF9wb29sKTsK KyAgICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoQVBS X1NUQVRVU19JU19FTk9FTlQoZXJyLT5hcHJfZXJyKQorICAgICAgICAgICAgICAgICAgfHwgU1ZO X19BUFJfU1RBVFVTX0lTX0VOT1RESVIoZXJyLT5hcHJfZXJyKSkKKyAgICAgICAgICAgICAgICB7 CisgICAgICAgICAgICAgICAgICAvKiBXZSBjYW4ndCBnZXQgdGhpcyBkaXJlY3RvcnkncyBkaXJl bnRzLCBpdCdzIG1pc3NpbmcKKyAgICAgICAgICAgICAgICAgICAgIGZyb20gZGlzay4gKi8KKyAg ICAgICAgICAgICAgICAgIHN2bl9lcnJvcl9jbGVhcihlcnIpOworICAgICAgICAgICAgICAgICAg bWlzc2luZ19zdWJ0cmVlX3Jvb3QgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg ICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBl cnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAg ICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYXByX2hhc2hfc2V0KHN1YnRyZWVfZGlyZW50cywK KyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl9wc3RyZHVwKHJlc3VsdF9wb29sLCBsb2Nh bF9hYnNwYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQUl9IQVNIX0tFWV9TVFJJ TkcsIGRpcmVudHMpOworICAgICAgICAgICAgfSAgICAgIAorICAgICAgICB9CisgICAgfQorICBl bHNlIC8qIGtpbmQgIT0gc3ZuX25vZGVfZGlyICovCisgICAgeworICAgICAgLyogSXMgdGhpcyBu b24tZGlyZWN0b3J5IG1pc3NpbmcgZnJvbSBkaXNrPyAgQ2hlY2sgTE9DQUxfQUJTUEFUSCdzCisg ICAgICAgICBwYXJlbnQncyBkaXJlbnRzLiAqLworICAgICAgYXByX2hhc2hfdCAqcGFyZW50X2Rp cmVudHMgPSBhcHJfaGFzaF9nZXQoc3VidHJlZV9kaXJlbnRzLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZuX2RpcmVudF9kaXJuYW1lKGxvY2FsX2Fi c3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgc2NyYXRjaF9wb29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIEFQUl9IQVNIX0tFWV9TVFJJTkcpOworCisgICAgICAv KiBJZiB0aGUgcGFyZW50X2RpcmVudHMgaXMgTlVMTCwgdGhlbiBMT0NBTF9BQlNQQVRIIGlzIHRo ZQorICAgICAgICAgc3VidHJlZSBvZiBhIG1pc3Npbmcgc3VidHJlZS4gIFNpbmNlIHdlIG9ubHkg cmVwb3J0IHRoZSByb290cworICAgICAgICAgb2YgbWlzc2luZyBzdWJ0cmVlcyB0aGVyZSBpcyBu b3RoaW5nIG1vcmUgdG8gZG8gaW4gdGhhdCBjYXNlLiAqLworICAgICAgaWYgKHBhcmVudF9kaXJl bnRzKQorICAgICAgICB7CisgICAgICAgICAgc3ZuX2lvX2RpcmVudDJfdCAqZGlyZW50ID0KKyAg ICAgICAgICAgIGFwcl9oYXNoX2dldChwYXJlbnRfZGlyZW50cywKKyAgICAgICAgICAgICAgICAg ICAgICAgICBzdm5fZGlyZW50X2Jhc2VuYW1lKGxvY2FsX2Fic3BhdGgsIHNjcmF0Y2hfcG9vbCks CisgICAgICAgICAgICAgICAgICAgICAgICAgQVBSX0hBU0hfS0VZX1NUUklORyk7CisgICAgICAg ICAgaWYgKCFkaXJlbnQpCisgICAgICAgICAgICBtaXNzaW5nX3N1YnRyZWVfcm9vdCA9IFRSVUU7 CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGtpbmQgPT0gc3ZuX25vZGVfZGlyKQorICAgICAg ICB7CisgICAgICAgICAgbWlzc2luZ19zdWJ0cmVlX3Jvb3QgPSBGQUxTRTsKKyAgICAgICAgfQor ICAgIH0KKworICBpZiAobWlzc2luZ19zdWJ0cmVlX3Jvb3QpCisgICAgeworICAgICAgY29uc3Qg Y2hhciAqcGF0aCA9IGFwcl9wc3RyZHVwKHJlc3VsdF9wb29sLCBsb2NhbF9hYnNwYXRoKTsKKwor ICAgICAgYXByX2hhc2hfc2V0KG1pc3Npbmdfc3VidHJlZXMsIHBhdGgsCisgICAgICAgICAgICAg ICAgICAgQVBSX0hBU0hfS0VZX1NUUklORywgcGF0aCk7CisgICAgfQorCisgIHJldHVybiBTVk5f Tk9fRVJST1I7Cit9CisKIC8qIHN2bl93Y19fbm9kZV9mb3VuZF9mdW5jX3QgY2FsbGJhY2sgZm9y IGdldF9tZXJnZWluZm9fcGF0aHMoKS4KIAogICAgR2l2ZW4gTE9DQUxfQUJTUEFUSCBhbmQgV0Is IHdoZXJlIFdCIGlzIHN0cnVjdCBnZXRfbWVyZ2VpbmZvX3dhbGtfYmF0b24gKiwKQEAgLTU0MDAs NyArNTUxOCwxNiBAQA0KICAgICAgICAgICAgICAgICAgICAgICAgICAmJihraW5kID09IHN2bl9u b2RlX2RpcikKICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoc3RyY21wKGFic19wYXJlbnRf cGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdiLT5tZXJnZV90YXJn ZXRfYWJzcGF0aCkgPT0gMCkpOwotCisgIC8qIE1ha2Ugc3VyZSB3aGF0IHRoZSBXQyB0aGlua3Mg aXMgcHJlc2VudCBvbiBkaXNrIHJlYWxseSBpcy4gKi8KKyAgaWYgKCFhYnNlbnQKKyAgICAgICYm ICFkZWxldGVkCisgICAgICAmJiAhb2JzdHJ1Y3RlZCkKKyAgICBTVk5fRVJSKHJlY29yZF9taXNz aW5nX3N1YnRyZWVfcm9vdHMobG9jYWxfYWJzcGF0aCwga2luZCwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgd2ItPnN1YnRyZWVfZGlyZW50cywKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ItPm1pc3Npbmdfc3VidHJlZXMsCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdiLT5jYl9wb29sLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JhdGNoX3Bvb2wpKTsKKyAKICAg LyogU3RvcmUgUEFUSHMgd2l0aCBleHBsaWN0IG1lcmdlaW5mbywgd2hpY2ggYXJlIHN3aXRjaGVk LCBhcmUgbWlzc2luZwogICAgICBjaGlsZHJlbiBkdWUgdG8gYSBzcGFyc2UgY2hlY2tvdXQsIGFy ZSBzY2hlZHVsZWQgZm9yIGRlbGV0aW9uIGFyZSBhYnNlbnQKICAgICAgZnJvbSB0aGUgV0MsIGFy ZSBmaXJzdCBsZXZlbCBzdWIgZGlyZWN0b3JpZXMgcmVsYXRpdmUgdG8gbWVyZ2UgdGFyZ2V0IGlm CkBAIC01NjE4LDcgKzU3NDUsNyBAQA0KIC8qIEhlbHBlciBmb3IgZG9fZGlyZWN0b3J5X21lcmdl KCkKIAogICAgSWYgSE9OT1JfTUVSR0VJTkZPIGlzIFRSVUUsIHRoZW4gcGVyZm9ybSBhIGRlcHRo IGZpcnN0IHdhbGsgb2YgdGhlIHdvcmtpbmcKLSAgIGNvcHkgdHJlZSByb290ZWQgYXQgTUVSR0Vf Q01EX0JBVE9OLT5UQVJHRVRfQUJTUEFUSC4KKyAgIGNvcHkgdHJlZSByb290ZWQgYXQgTUVSR0Vf Q01EX0JBVE9OLT5UQVJHRVRfQUJTUEFUSCB0byBkZXB0aCBERVBUSC4KICAgIENyZWF0ZSBhbiBz dm5fY2xpZW50X19tZXJnZV9wYXRoX3QgKiBmb3IgYW55IHBhdGggd2hpY2ggbWVldHMgb25lIG9y IG1vcmUKICAgIG9mIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWE6CiAKQEAgLTU2NDYsNiArNTc3Myw5 IEBADQogICAgSWYgSE9OT1JfTUVSR0VJTkZPIGlzIEZBTFNFLCB0aGVuIGNyZWF0ZSBhbiBzdm5f Y2xpZW50X19tZXJnZV9wYXRoX3QgKiBvbmx5CiAgICBmb3IgTUVSR0VfQ01EX0JBVE9OLT5UQVJH RVRfQUJTUEFUSCAoaS5lLiBvbmx5IGNyaXRlcmlhIDcgaXMgYXBwbGllZCkuCiAKKyAgIElmIHN1 YnRyZWVzIHdpdGhpbiB0aGUgcmVxdWVzdGVkIERFUFRIIGFyZSB1bmV4cGVjdGVkbHkgbWlzc2lu ZyBkaXNrLAorICAgdGhlbiByYWlzZSBTVk5fRVJSX0NMSUVOVF9OT1RfUkVBRFlfVE9fTUVSR0Uu CisKICAgIFN0b3JlIHRoZSBzdm5fY2xpZW50X19tZXJnZV9wYXRoX3QgKidzIGluICpDSElMRFJF Tl9XSVRIX01FUkdFSU5GTyBpbgogICAgZGVwdGgtZmlyc3Qgb3JkZXIgYmFzZWQgb24gdGhlIHN2 bl9jbGllbnRfX21lcmdlX3BhdGhfdCAqcyBwYXRoIG1lbWJlciBhcwogICAgc29ydGVkIGJ5IHN2 bl9wYXRoX2NvbXBhcmVfcGF0aHMoKS4gIFNldCB0aGUgcmVtYWluaW5nX3JhbmdlcyBmaWVsZCBv ZiBlYWNoCkBAIC01Njg1LDYgKzU4MTUsOSBAQA0KICAgc3RydWN0IGdldF9tZXJnZWluZm9fd2Fs a19iYXRvbiB3YiA9IHsgMCB9OwogCiAgIHdiLmNoaWxkcmVuX3dpdGhfbWVyZ2VpbmZvID0gY2hp bGRyZW5fd2l0aF9tZXJnZWluZm87CisgIHdiLmNiX3Bvb2wgPSBzdm5fcG9vbF9jcmVhdGUoc2Ny YXRjaF9wb29sKTsKKyAgd2Iuc3VidHJlZV9kaXJlbnRzID0gYXByX2hhc2hfbWFrZSh3Yi5jYl9w b29sKTsKKyAgd2IubWlzc2luZ19zdWJ0cmVlcyA9IGFwcl9oYXNoX21ha2Uod2IuY2JfcG9vbCk7 CiAgIHdiLm1lcmdlX3NyY19jYW5vbl9wYXRoID0gbWVyZ2Vfc3JjX2Nhbm9uX3BhdGg7CiAgIHdi Lm1lcmdlX3RhcmdldF9hYnNwYXRoID0gbWVyZ2VfY21kX2JhdG9uLT50YXJnZXRfYWJzcGF0aDsK ICAgd2Iuc291cmNlX3Jvb3RfdXJsID0gc291cmNlX3Jvb3RfdXJsOwpAQCAtNTcwOCw2ICs1ODQx LDM3IEBADQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlX2NtZF9i YXRvbi0+Y3R4LT5jYW5jZWxfYmF0b24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgc2NyYXRjaF9wb29sKSk7CiAKKyAgaWYgKGFwcl9oYXNoX2NvdW50KHdiLm1pc3Npbmdf c3VidHJlZXMpKQorICAgIHsKKyAgICAgIGFwcl9oYXNoX2luZGV4X3QgKmhpOworICAgICAgYXBy X3Bvb2xfdCAqaXRlcnBvb2wgPSBzdm5fcG9vbF9jcmVhdGUoc2NyYXRjaF9wb29sKTsKKyAgICAg IGNvbnN0IGNoYXIgKm1pc3Npbmdfc3VidHJlZV9lcnJfc3RyID0gTlVMTDsKKyAgICAgIAorICAg ICAgZm9yIChoaSA9IGFwcl9oYXNoX2ZpcnN0KGl0ZXJwb29sLCB3Yi5taXNzaW5nX3N1YnRyZWVz KTsKKyAgICAgICAgICAgaGk7CisgICAgICAgICAgIGhpID0gYXByX2hhc2hfbmV4dChoaSkpCisg ICAgICAgIHsKKyAgICAgICAgICBjb25zdCBjaGFyICptaXNzaW5nX2Fic3BhdGggPSBzdm5fX2Fw cl9oYXNoX2luZGV4X2tleShoaSk7CisKKyAgICAgICAgICBtaXNzaW5nX3N1YnRyZWVfZXJyX3N0 ciA9IGFwcl9wc3ByaW50ZigKKyAgICAgICAgICAgIHNjcmF0Y2hfcG9vbCwgIiVzJXNcbiIsCisg ICAgICAgICAgICBtaXNzaW5nX3N1YnRyZWVfZXJyX3N0ciA/IG1pc3Npbmdfc3VidHJlZV9lcnJf c3RyIDogIiIsCisgICAgICAgICAgICBzdm5fZGlyZW50X2xvY2FsX3N0eWxlKG1pc3NpbmdfYWJz cGF0aCwgc2NyYXRjaF9wb29sKSk7CisgICAgICAgIH0KKworICAgICAgaWYgKG1pc3Npbmdfc3Vi dHJlZV9lcnJfc3RyKQorICAgICAgICByZXR1cm4gc3ZuX2Vycm9yX2NyZWF0ZWYoU1ZOX0VSUl9D TElFTlRfTk9UX1JFQURZX1RPX01FUkdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8oIk1lcmdlIHRyYWNr aW5nIG5vdCBhbGxvd2VkIHdpdGggbWlzc2luZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICJzdWJ0cmVlczsgdHJ5IHJlc3RvcmluZyB0aGVzZSBpdGVtcyAiCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaXJzdDpcbiVzIiksCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBtaXNzaW5nX3N1YnRyZWVfZXJyX3N0cik7CisgIH0KKworICAv KiBUaGlzIHBvb2wgaXMgb25seSBuZWVkZWQgYWNyb3NzIGFsbCB0aGUgY2FsbGJhY2tzIHRvIGRl dGVjdAorICAgICBtaXNzaW5nIHN1YnRyZWVzLiAqLworICBzdm5fcG9vbF9kZXN0cm95KHdiLmNi X3Bvb2wpOworCiAgIC8qIENISUxEUkVOX1dJVEhfTUVSR0VJTkZPIG11c3QgYmUgaW4gZGVwdGgg Zmlyc3Qgb3JkZXIsIGJ1dCB0aGUgbm9kZQogICAgICB3YWxrIGNvZGUgcmV0dXJucyBub2RlcyBp biBhIG5vbiBwYXJ0aWN1bGFyIG9yZGVyLiAgQWxzbywgd2UgbWF5IG5lZWQKICAgICAgdG8gYWRk IGVsZW1lbnRzIHRvIHRoZSBhcnJheSB0byBjb3ZlciBjYXNlIDMpIHRocm91Z2ggNSkgZnJvbSB0 aGUKSW5kZXg6IHN1YnZlcnNpb24vdGVzdHMvY21kbGluZS9tZXJnZV90ZXN0cy5weQ0KPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQ0KLS0tIHN1YnZlcnNpb24vdGVzdHMvY21kbGluZS9tZXJnZV90ZXN0cy5weQkocmV2aXNp b24gOTkxMzk2KQ0KKysrIHN1YnZlcnNpb24vdGVzdHMvY21kbGluZS9tZXJnZV90ZXN0cy5weQko d29ya2luZyBjb3B5KQ0KQEAgLTE1OTAzLDYgKzE1OTAzLDg3IEBADQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSwgVHJ1ZSwgbmV3X2Rpcl9wYXRoKQogICBzYm94 LnNpbXBsZV9jb21taXQoKQogCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0IGZvciBpc3N1ZSAjMjkx NSAnSGFuZGxlIG1lcmdlaW5mbyBmb3Igc3VidHJlZXMgbWlzc2luZyBkdWUgdG8gcmVtb3ZhbAor IyBieSBub24tc3ZuIGNvbW1hbmQnCitkZWYgbWVyZ2Vfd2l0aF9vc19kZWxldGVkX3N1YnRyZWVz KHNib3gpOgorICAibWVyZ2UgdHJhY2tpbmcgZmFpbHMgaWYgdGFyZ2V0IG1pc3Npbmcgc3VidHJl ZXMiCisKKyAgIyByMTogQ3JlYXRlIGEgZ3JlZWsgdHJlZS4KKyAgc2JveC5idWlsZCgpCisgIHdj X2RpciA9IHNib3gud2NfZGlyCisKKyAgIyByMiAtIHI2OiBDb3B5IEEgdG8gQV9DT1BZIGFuZCB0 aGVuIG1ha2Ugc29tZSB0ZXh0IGNoYW5nZXMgdW5kZXIgQS4KKyAgc2V0X3VwX2JyYW5jaChzYm94 KQorCisgICMgU29tZSBwYXRocyB3ZSdsbCBjYXJlIGFib3V0CisgIEFfQ09QWV9wYXRoICAgPSBv cy5wYXRoLmpvaW4od2NfZGlyLCAiQV9DT1BZIikKKyAgQ19DT1BZX3BhdGggICA9IG9zLnBhdGgu am9pbih3Y19kaXIsICJBX0NPUFkiLCAiQyIpCisgIHBzaV9DT1BZX3BhdGggPSBvcy5wYXRoLmpv aW4od2NfZGlyLCAiQV9DT1BZIiwgIkQiLCAiSCIsICJwc2kiKQorICBtdV9DT1BZX3BhdGggID0g b3MucGF0aC5qb2luKHdjX2RpciwgIkFfQ09QWSIsICJtdSIpCisgIEdfQ09QWV9wYXRoICAgPSBv cy5wYXRoLmpvaW4od2NfZGlyLCAiQV9DT1BZIiwgIkQiLCAiRyIpCisKKyAgIyBSZW1vdmUgc2V2 ZXJhbCBzdWJ0cmVlcyBmcm9tIGRpc2suCisgIHN2bnRlc3QubWFpbi5zYWZlX3JtdHJlZShDX0NP UFlfcGF0aCkKKyAgc3ZudGVzdC5tYWluLnNhZmVfcm10cmVlKEdfQ09QWV9wYXRoKQorICBvcy5y ZW1vdmUocHNpX0NPUFlfcGF0aCkKKyAgb3MucmVtb3ZlKG11X0NPUFlfcGF0aCkKKworICAjIEJl IHN1cmUgdGhlIHJlZ2V4IHBhdGhzIGFyZSBwcm9wZXJseSBlc2NhcGVkIG9uIFdpbmRvd3MsIHNl ZSB0aGUKKyAgIyBub3RlIGFib3V0ICJUaGUgQmFja3NsYXNoIFBsYWd1ZSIgaW4gZXhwZWN0ZWRf bWVyZ2Vfb3V0cHV0KCkuCisgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgIHJlX3Nl cCA9ICdcXFxcJworICBlbHNlOgorICAgIHJlX3NlcCA9IG9zLnBhdGhzZXAKKworICAjIENvbW1v biBwYXJ0IG9mIHRoZSBleHBlY3RlZCBlcnJvciBtZXNzYWdlIGZvciBhbGwgY2FzZXMgd2Ugd2ls bCB0ZXN0LgorICBlcnJfcmUgPSAic3ZuOiBNZXJnZSB0cmFja2luZyBub3QgYWxsb3dlZCB3aXRo IG1pc3Npbmcgc3VidHJlZXM7ICIgKyBcCisgICAgICAgICAgICJ0cnkgcmVzdG9yaW5nIHRoZXNl IGl0ZW1zIGZpcnN0OiIgICAgICAgICAgICAgICAgICAgICAgICArIFwKKyAgICAgICAgICAgInwo XG4pIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsg XAorICAgICAgICAgICAifCguKmFwcl9lcnIuKlxuKSIgIyBJbiBjYXNlIG9mIGRlYnVnIGJ1aWxk CisKKyAgIyBDYXNlIDE6IEluZmluaXRlIGRlcHRoIG1lcmdlIGludG8gaW5maW5pdGUgZGVwdGgg V0MgdGFyZ2V0LgorICAjIEV2ZXJ5IG1pc3Npbmcgc3VidHJlZSB1bmRlciB0aGUgdGFyZ2V0IHNo b3VsZCBiZSByZXBvcnRlZCBhcyBtaXNzaW5nLgorICBtaXNzaW5nID0gInwoLipBX0NPUFkiICsg cmVfc2VwICsgIm11XG4pIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBcCisgICAg ICAgICAgICAifCguKkFfQ09QWSIgKyByZV9zZXAgKyAiRCIgKyByZV9zZXAgKyAiR1xuKSIgICAg ICAgICAgICAgICAgICArIFwKKyAgICAgICAgICAgICJ8KC4qQV9DT1BZIiArIHJlX3NlcCArICJD XG4pIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgXAorICAgICAgICAgICAgInwo LipBX0NPUFkiICsgcmVfc2VwICsgIkQiICsgcmVfc2VwICsgIkgiICsgcmVfc2VwICsgInBzaVxu KSIKKyAgZXhpdF9jb2RlLCBvdXQsIGVyciA9IHN2bnRlc3QuYWN0aW9ucy5ydW5fYW5kX3Zlcmlm eV9zdm4oCisgICAgIk1pc3Npbmcgc3VidHJlZXMgc2hvdWxkIHJhaXNlIGVycm9yIiwgW10sIHN2 bnRlc3QudmVyaWZ5LkFueU91dHB1dCwKKyAgICAnbWVyZ2UnLCBzYm94LnJlcG9fdXJsICsgJy9B JywgQV9DT1BZX3BhdGgpCisgIHN2bnRlc3QudmVyaWZ5LnZlcmlmeV9vdXRwdXRzKCJNZXJnZSBm YWlsZWQgYnV0IG5vdCBpbiB0aGUgd2F5IGV4cGVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgZXJyLCBOb25lLCBlcnJfcmUgKyBtaXNzaW5nLCBOb25lLAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBUcnVlKSAjIE1hdGNoICphbGwqIGxpbmVzIG9mIHN0ZGVy cgorCisgICMgQ2FzZSAyOiBJbW1lZGlhdGVzIGRlcHRoIG1lcmdlIGludG8gaW5maW5pdGUgZGVw dGggV0MgdGFyZ2V0LgorICAjIE9ubHkgdGhlIHR3byBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgdGhl IG1lcmdlIHRhcmdldCBzaG91bGQgYmUgcmVwb3J0ZWQKKyAgIyBhcyBtaXNzaW5nLgorICBtaXNz aW5nID0gInwoLipBX0NPUFkiICsgcmVfc2VwICsgIm11XG4pIiArIFwKKyAgICAgICAgICAgICJ8 KC4qQV9DT1BZIiArIHJlX3NlcCArICJDXG4pIgorICBleGl0X2NvZGUsIG91dCwgZXJyID0gc3Zu dGVzdC5hY3Rpb25zLnJ1bl9hbmRfdmVyaWZ5X3N2bigKKyAgICAiTWlzc2luZyBzdWJ0cmVlcyBz aG91bGQgcmFpc2UgZXJyb3IiLCBbXSwgc3ZudGVzdC52ZXJpZnkuQW55T3V0cHV0LAorICAgICdt ZXJnZScsIHNib3gucmVwb191cmwgKyAnL0EnLCBBX0NPUFlfcGF0aCwgJy0tZGVwdGg9aW1tZWRp YXRlcycpCisgIHN2bnRlc3QudmVyaWZ5LnZlcmlmeV9vdXRwdXRzKCJNZXJnZSBmYWlsZWQgYnV0 IG5vdCBpbiB0aGUgd2F5IGV4cGVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgZXJyLCBOb25lLCBlcnJfcmUgKyBtaXNzaW5nLCBOb25lLCBUcnVlKQorCisgICMgQ2FzZSAz OiBGaWxlcyBkZXB0aCBtZXJnZSBpbnRvIGluZmluaXRlIGRlcHRoIFdDIHRhcmdldC4KKyAgIyBP bmx5IHRoZSBzaW5nbGUgZmlsZSBjaGlsZCBvZiB0aGUgbWVyZ2UgdGFyZ2V0IHNob3VsZCBiZSBy ZXBvcnRlZAorICAjIGFzIG1pc3NpbmcuCisgIG1pc3NpbmcgPSAifCguKkFfQ09QWSIgKyByZV9z ZXAgKyAibXVcbikiCisgIGV4aXRfY29kZSwgb3V0LCBlcnIgPSBzdm50ZXN0LmFjdGlvbnMucnVu X2FuZF92ZXJpZnlfc3ZuKAorICAgICJNaXNzaW5nIHN1YnRyZWVzIHNob3VsZCByYWlzZSBlcnJv ciIsIFtdLCBzdm50ZXN0LnZlcmlmeS5BbnlPdXRwdXQsCisgICAgJ21lcmdlJywgc2JveC5yZXBv X3VybCArICcvQScsIEFfQ09QWV9wYXRoLCAnLS1kZXB0aD1maWxlcycpCisgIHN2bnRlc3QudmVy aWZ5LnZlcmlmeV9vdXRwdXRzKCJNZXJnZSBmYWlsZWQgYnV0IG5vdCBpbiB0aGUgd2F5IGV4cGVj dGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBOb25lLCBlcnJfcmUg KyBtaXNzaW5nLCBOb25lLCBUcnVlKQorCisgICMgQ2FzZSA0OiBFbXB0eSBkZXB0aCBtZXJnZSBp bnRvIGluZmluaXRlIGRlcHRoIFdDIHRhcmdldC4KKyAgIyBPbmx5IHRoZS4uLm9oLCB3YWl0LCB0 aGUgdGFyZ2V0IGlzIHByZXNlbnQgYW5kIHRoYXQgaXMgYXMgZGVlcAorICAjIGFzIHRoZSBtZXJn ZSBnb2VzLCBzbyB0aGlzIG1lcmdlIHNob3VsZCBzdWNjZWVkIQorICBzdm50ZXN0LmFjdGlvbnMu cnVuX2FuZF92ZXJpZnlfc3ZuKAorICAgICJEZXB0aCBlbXB0eSBtZXJnZSBzaG91bGQgc3VjY2Vl ZCBhcyBsb25nIGF0IHRoZSB0YXJnZXQgaXMgcHJlc2VudCIsCisgICAgc3ZudGVzdC52ZXJpZnku QW55T3V0cHV0LCBbXSwgJ21lcmdlJywgc2JveC5yZXBvX3VybCArICcvQScsCisgICAgQV9DT1BZ X3BhdGgsICctLWRlcHRoPWVtcHR5JykKKyAgCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgUnVuIHRoZSB0 ZXN0cwogCkBAIC0xNjA5Myw2ICsxNjE3NCw3IEBADQogICAgICAgICAgICAgICBjb3B5X2NhdXNl c19waGFudG9tX2VvbF9jb25mbGljdCwKICAgICAgICAgICAgICAgbWVyZ2VfaW50b19sb2NhbGx5 X2FkZGVkX2ZpbGUsCiAgICAgICAgICAgICAgIG1lcmdlX2ludG9fbG9jYWxseV9hZGRlZF9kaXJl Y3RvcnksCisgICAgICAgICAgICAgIG1lcmdlX3dpdGhfb3NfZGVsZXRlZF9zdWJ0cmVlcywKICAg ICAgICAgICAgICBdCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Cg== --001636c5b312d5d832048f27c4e9--