From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: martin rudalics Newsgroups: gmane.emacs.devel Subject: Re: Add function to rotate/transpose all windows Date: Thu, 24 Oct 2024 20:39:17 +0200 Message-ID: References: <87setpdv21.fsf@gmail.com> <87r09224pe.fsf@gmail.com> <87ikudk62k.fsf@gmail.com> <0d879e95-c37e-416d-b439-daa6384c4f30@gmx.at> <878qv8kws2.fsf@gmail.com> <87ed4xvf60.fsf@gmail.com> <861q0qfnhr.fsf@mail.linkov.net> <878quxdant.fsf@gmail.com> <86zfndi6wh.fsf@mail.linkov.net> <87zfncuqhu.fsf@gmail.com> <86v7y00w68.fsf@mail.linkov.net> <87y12smubh.fsf@gmail.com> <96ea5140-9043-4c1b-97f3-4c534296355e@gmx.at> <87frotqx90.fsf@gmail.com> <87y12iyidd.fsf@gmail.com> <87iktld1bd.fsf@gmail.com> <87r085r2gl.fsf@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------biFbARreP0KoNqd7qiOD0jvB" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="12453"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Mozilla Thunderbird Cc: Juri Linkov , Eli Zaretskii , emacs-devel@gnu.org To: Pranshu Sharma Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Thu Oct 24 20:40:24 2024 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1t42ky-00031R-Fd for ged-emacs-devel@m.gmane-mx.org; Thu, 24 Oct 2024 20:40:24 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1t42kB-0003tW-CR; Thu, 24 Oct 2024 14:39:35 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t42k5-0003sy-Qe for emacs-devel@gnu.org; Thu, 24 Oct 2024 14:39:29 -0400 Original-Received: from mout.gmx.net ([212.227.15.15]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t42k3-0007yt-7p; Thu, 24 Oct 2024 14:39:29 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.at; s=s31663417; t=1729795159; x=1730399959; i=rudalics@gmx.at; bh=pdqE5QWzKlbqjjEjyL3jiryG1mzqf68L7W326EFJuGE=; h=X-UI-Sender-Class:Content-Type:Message-ID:Date:MIME-Version: Subject:To:Cc:References:From:In-Reply-To:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=CYmk7IaM+VZDQzeJWNmkgNkHboj7vcSld7etPwDfhpXDOuFAQGnK0j4cImbWtLzl ljqvyoJnoX2jiGd4D86+1HG3ga7m3nzY2LnYi/Ncqnajzg6uuCLN68z9nKcaDBDKu SwVRq3zLb53u0P095jW2cO1+Hz6H2wr/2vfus2nAzt3K59C7gn1LLwjf4BRJzZpRO XnsvC3LbCfcS9Tqt6ZWPhzc2aAOv1WO2i0XfYqnZX5UM9rfpSsKGUJJ6Wv5mhdH7g pRAsM1wl0wm/b3ddk60hKhNBCKuq02bzfjrsFl16RpLjYDJMtyUovcvhDZbHKrYPS OfSylAD/yzn4riGk6w== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Original-Received: from [192.168.31.113] ([212.95.5.185]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1N4QwW-1u49YG4ABq-016kTg; Thu, 24 Oct 2024 20:39:19 +0200 Content-Language: en-US In-Reply-To: <87r085r2gl.fsf@gmail.com> X-Provags-ID: V03:K1:S/rra7Eo47ca5zMNl/BbjfmgFS6esZgIlUyj3IyFHIVzSTAjz+a ZRAqeAhqee/pnJ0k98b3tm6q9t9C0pJoBr1bqf5XBFrCHPoKZQIGuO5Eg+ydJ8ld1JU/VSg MxFzEIZgmO5caNwEKRgk++clJZN/Qe1aZqRhZfYjg5AhwTJ+KrLD3wnyFd/4fvlt9jowhMj DAKUEKHpW2wSEhQjO7N5Q== UI-OutboundReport: notjunk:1;M01:P0:OwF0rJkOVec=;B708DRu2ZLuV6T0/6yJlbMjZMTV LOFvXNUBI50DrwgdGc+vDKac723u7TkidEH/h1o6BgHD++KLM7LafeRu9qrigLFlJbxbW+MH+ 81VtfA0S6nFUs13TvPsifvNctaIlpbQx3TqN8rBMNT3KZppSBstLW62ggzI2zKKRrOaZyYY5U b1naJ6x4iQAynPveFq0YGdP08JgC3QX4O18va8FI1vOyEg3KC8J4U515dJ9NV6kVTmddctcFs 0EtKAM319jj+goUIzsFDzCVDuP5CTLL2P6s6SdQukYbvvO1sVQiTuTA2XpmOmPyL6DOiG427L 2MVMoC1m8uNIjrx09sT6jDtZBsXjnkQBrLhVJ3+LurcV5EHdYwUq7VrTkuoapLzwD5W9zg9u+ TblG566eULcmKekv3ixvwBbkAGvwq/SAHINRTFfSPuiQYNoYVvplXGBFr6eSCROEUiqq3kaeV IxIGB625oOFzALw3z5AwaaOJxC5FrbfxX928BOnD8BxaCcBEUp9UrYZmmlhryKdlb5mLbBFST d5m7WKocybBuPbR20WhUHO83N9/7wVJAjFzNJWba1bHfQG6H4pKC/7Jy9q+eVoDPtwEsbfUjI BQJnJbml/GDgo5CzVRMpRjwhA9mpjI9TGQ7fF+cWCrpsniys7CuqP7KoDXOuuYWcOAVTAfJcS IQPr8MOtwpc4TQmqUPypEMbuFQ/fSXh7zJdnNqFkBLcQZYRyxZrme1InJR/ucbfgJ1fWkTUzi WxO1Mp8rO1F6c8bCzIvZkHkRdwmgdpdrVPdA3JzF5o+97OFAq7txj+e+b0uGx6UtN9Lbp3Px Received-SPF: pass client-ip=212.227.15.15; envelope-from=rudalics@gmx.at; helo=mout.gmx.net X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-1.697, RCVD_IN_SBL_CSS=3.335, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.devel:324827 Archived-At: This is a multi-part message in MIME format. --------------biFbARreP0KoNqd7qiOD0jvB Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit > However, not on the one achived by: > C-x 3 > C-x o > C-x 2 > C-x 3 Yes, this one is a bit nasty. > I did make some progress on this, but the problem was there was no way I know > to achive this, which makes it a bit harder: > > |-------------| |-------------| > | A | | A | > |-------------| |-------------| > | B | -> | B | | > |-------------| |------| D | > | C | | C | | > |-------------| |-------------| > > I'm sure there is way to make it work without this, I'll probably come > up with way in shower. Maybe you should have done |-------------| |-------------| | A | | A | |-------------| |-------------| | | | -> | B | | | B | D | |------| D | | | | | C | | |-------------| |-------------| since you don't want to split parent windows. I attach a file called window-rotate.el which handles the above scenario. In contrast with a window tree it simply operates on the old window structure of the frame directly which I store as an association list. Note two aspects: (1) It always tries to find a leftmost live window to start operating on. I think you do the same but I've never been able to understand how. (2) It binds 'window-combination-limit' to make a parent window within something like the first combination you sketched above so this becomes |-------------| | A | |-------------| | ----------- | || B || ||-----------|| || C || | ----------- | |-------------| Half of the code is debugging code that is not commented. Note that the code handles rotations only, rotates only the entire frame, does not set sizes and probably misses other things. But it seems to work so please test it and maybe try to use as much of it as possible. martin --------------biFbARreP0KoNqd7qiOD0jvB Content-Type: text/x-emacs-lisp; charset=UTF-8; name="window-rotate.el" Content-Disposition: attachment; filename="window-rotate.el" Content-Transfer-Encoding: base64 Ozs7IC0qLSBsZXhpY2FsLWJpbmRpbmc6dCAtKi0KCjs7IERlYnVnZ2luZyBjb2RlLgooZGVm dmFyIHdpbmRvdy1udW1iZXIgMCkKKGRlZnZhciBvbGQtd2luZG93LWFsaXN0IG5pbCkKKGRl ZnZhciBvbGQtd2luZG93LWxpc3QgbmlsKQooZGVmdmFyIG5ldy13aW5kb3ctYWxpc3Qgbmls KQoKKGRlZnVuIG9sZC13aW5kb3ctYWxpc3QgKCkKICAoc2V0cSBvbGQtd2luZG93LWxpc3Qg KHdpbmRvdy1saXN0KSkKICAoc2V0cSBvbGQtd2luZG93LWFsaXN0IG5pbCkKICAoZG9saXN0 ICh3aW5kb3cgb2xkLXdpbmRvdy1saXN0KQogICAgKHNldHEgb2xkLXdpbmRvdy1hbGlzdAoJ ICAoY29ucwoJICAgKGNvbnMgd2luZG93ICh3aW5kb3ctcGFyZW50IHdpbmRvdykpCgkgICBv bGQtd2luZG93LWFsaXN0KSkpCgogIChzZXRxIG9sZC13aW5kb3ctYWxpc3QgKG5yZXZlcnNl IG9sZC13aW5kb3ctYWxpc3QpKSkKCihkZWZ1biBuZXctd2luZG93LWFsaXN0ICgpCiAgKHNl dHEgbmV3LXdpbmRvdy1hbGlzdCBuaWwpCiAgKGRvbGlzdCAod2luZG93IG9sZC13aW5kb3ct bGlzdCkKICAgIChzZXRxIG5ldy13aW5kb3ctYWxpc3QKCSAgKGNvbnMKCSAgIChjb25zIHdp bmRvdyAod2luZG93LXBhcmVudCB3aW5kb3cpKQoJICAgbmV3LXdpbmRvdy1hbGlzdCkpKQoK ICAoc2V0cSBuZXctd2luZG93LWFsaXN0IChucmV2ZXJzZSBuZXctd2luZG93LWFsaXN0KSkp Cgo7OyBUd28gdmFyaWFibGVzIHRoZSBjb2RlIGJlbG93IGJpbmRzIGxleGljYWxseS4KKGRl ZnZhciB3aW5kb3ctYWxpc3QgbmlsKQooZGVmdmFyIHdpbmRvdy1jbG9ja3dpc2UpCgooZGVm dW4gd2luZG93LWZpcnN0LXdpbmRvdyAod2luZG93KQogICJSZXR1cm4gdG9wbW9zdCBsZWZ0 bW9zdCBsaXZlIGRlc2NlbmRhbnQgb2YgV0lORE9XLiIKICAobGV0ICgoY2hpbGQgKG9yICh3 aW5kb3ctdG9wLWNoaWxkIHdpbmRvdykKCQkgICAod2luZG93LWxlZnQtY2hpbGQgd2luZG93 KSkpKQogICAgKGlmIGNoaWxkCgkod2luZG93LWZpcnN0LXdpbmRvdyBjaGlsZCkKICAgICAg d2luZG93KSkpCgooZGVmdW4gd2luZG93LWFsaXN0ICgpCiAgIlJldHVybiBhbGlzdCBvZiBh bGwgd2luZG93cyBvbiBzZWxlY3RlZCBmcmFtZS4iCiAgKGxldCAoYWxpc3QpCiAgICAod2Fs ay13aW5kb3ctdHJlZQogICAgIChsYW1iZGEgKHdpbmRvdykKICAgICAgIChzZXRxIGFsaXN0 CgkgICAgIChjb25zCgkgICAgICAoaWYgKHdpbmRvdy1idWZmZXIgd2luZG93KQoJCSAgKGxp c3Qgd2luZG93CgkJCShjb25zICdidWZmZXIgKHdpbmRvdy1idWZmZXIgd2luZG93KSkKCQkJ KGNvbnMgJ3BhcmVudCAod2luZG93LXBhcmVudCB3aW5kb3cpKQoJCQkoY29ucyAnbmV4dCAo d2luZG93LW5leHQtc2libGluZyB3aW5kb3cpKQoJCQkoY29ucyAncHJldiAod2luZG93LXBy ZXYtc2libGluZyB3aW5kb3cpKQoJCQkoY29ucyAnd2lkdGggKHdpbmRvdy1waXhlbC13aWR0 aCB3aW5kb3cpKQoJCQkoY29ucyAnaGVpZ2h0ICh3aW5kb3ctcGl4ZWwtaGVpZ2h0IHdpbmRv dykpKQoJCShsaXN0IHdpbmRvdwoJCSAgICAgIChjb25zICdsZWZ0ICh3aW5kb3ctbGVmdC1j aGlsZCB3aW5kb3cpKQoJCSAgICAgIChjb25zICd0b3AgKHdpbmRvdy10b3AtY2hpbGQgd2lu ZG93KSkKCQkgICAgICAoY29ucyAncGFyZW50ICh3aW5kb3ctcGFyZW50IHdpbmRvdykpCgkJ ICAgICAgKGNvbnMgJ25leHQgKHdpbmRvdy1uZXh0LXNpYmxpbmcgd2luZG93KSkKCQkgICAg ICAoY29ucyAncHJldiAod2luZG93LXByZXYtc2libGluZyB3aW5kb3cpKQoJCSAgICAgIChj b25zICdmaXJzdCAod2luZG93LWZpcnN0LXdpbmRvdyB3aW5kb3cpKQoJCSAgICAgIChjb25z ICd3aWR0aCAod2luZG93LXBpeGVsLXdpZHRoIHdpbmRvdykpCgkJICAgICAgKGNvbnMgJ2hl aWdodCAod2luZG93LXBpeGVsLWhlaWdodCB3aW5kb3cpKSkpCgkgICAgICBhbGlzdCkpKQog ICAgIG5pbCB0KQoKICAgIGFsaXN0KSkKCjs7IEFjY2Vzc29yIGZ1bmN0aW9ucy4KKGRlZnVu IHdpbmRvdy1hbGlzdC1wYXJlbnQgKHdpbmRvdykKICAoY2RyIChhc3NxICdwYXJlbnQgKGNk ciAoYXNzcSB3aW5kb3cgd2luZG93LWFsaXN0KSkpKSkKCihkZWZ1biB3aW5kb3ctYWxpc3Qt YnVmZmVyICh3aW5kb3cpCiAgKGNkciAoYXNzcSAnYnVmZmVyIChjZHIgKGFzc3Egd2luZG93 IHdpbmRvdy1hbGlzdCkpKSkpCgooZGVmdW4gd2luZG93LWFsaXN0LW5leHQgKHdpbmRvdykK ICAoY2RyIChhc3NxICduZXh0IChjZHIgKGFzc3Egd2luZG93IHdpbmRvdy1hbGlzdCkpKSkp CgooZGVmdW4gd2luZG93LWFsaXN0LXByZXYgKHdpbmRvdykKICAoY2RyIChhc3NxICdwcmV2 IChjZHIgKGFzc3Egd2luZG93IHdpbmRvdy1hbGlzdCkpKSkpCgooZGVmdW4gd2luZG93LWFs aXN0LWxlZnQgKHdpbmRvdykKICAoY2RyIChhc3NxICdsZWZ0IChjZHIgKGFzc3Egd2luZG93 IHdpbmRvdy1hbGlzdCkpKSkpCgooZGVmdW4gd2luZG93LWFsaXN0LXRvcCAod2luZG93KQog IChjZHIgKGFzc3EgJ3RvcCAoY2RyIChhc3NxIHdpbmRvdyB3aW5kb3ctYWxpc3QpKSkpKQoK KGRlZnVuIHdpbmRvdy1hbGlzdC1maXJzdCAod2luZG93KQogIChjZHIgKGFzc3EgJ2ZpcnN0 IChjZHIgKGFzc3Egd2luZG93IHdpbmRvdy1hbGlzdCkpKSkpCgooZGVmdW4gd2luZG93LXJv dGF0ZS1jbG9ja3dpc2UgKCkKICAiUm90YXRlIHJvb3Qgd2luZG93IG9mIHNlbGVjdGVkIGZy YW1lIGNsb2Nrd2lzZS4iCiAgKGludGVyYWN0aXZlKQogIChsZXQgKCh3aW5kb3ctY2xvY2t3 aXNlIHQpCgk7OyBDb25zdHJ1Y3QgJ3dpbmRvdy1hbGlzdCcgd2hpY2ggYWxzbyBtYWtlcyBz dXJlIHRoYXQgbm8gd2luZG93Cgk7OyBnZXRzIHJlY3ljbGVkIGJ5IEdDLgoJKHdpbmRvdy1h bGlzdCAod2luZG93LWFsaXN0KSkKCSh3aW5kb3cgKGZyYW1lLWZpcnN0LXdpbmRvdykpKQog ICAgKHNldHEgd2luZG93LW51bWJlciAwKQogICAgKG9sZC13aW5kb3ctYWxpc3QpCiAgICA7 OyBEZWxldGUgYWxsIHdpbmRvd3MgYnV0IHRoZSBmcmFtZSdzIGZpcnN0IHdpbmRvdy4KICAg IChkZWxldGUtb3RoZXItd2luZG93cy1pbnRlcm5hbCB3aW5kb3cpCiAgICAod2l0aC1jdXJy ZW50LWJ1ZmZlciAoZ2V0LWJ1ZmZlci1jcmVhdGUgIipmb28qIikKICAgICAgKGVyYXNlLWJ1 ZmZlcikKICAgICAgKHBwIHdpbmRvdy1hbGlzdCAoY3VycmVudC1idWZmZXIpKQogICAgICAo aW5zZXJ0ICJcbiIpKQogICAgOzsgTm93IHJvdGF0ZSBzdGFydGluZyB3aXRoIHRoZSBmcmFt ZSdzIGZpcnN0IHdpbmRvdy4KICAgICh3aW5kb3ctcm90YXRlIHdpbmRvdyBuaWwpCiAgICAo bmV3LXdpbmRvdy1hbGlzdCkKICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIChnZXQtYnVmZmVy LWNyZWF0ZSAiKmZvbyoiKQogICAgICAocHAgb2xkLXdpbmRvdy1hbGlzdCAoY3VycmVudC1i dWZmZXIpKQogICAgICAoaW5zZXJ0ICJcbiIpCiAgICAgIChwcCBuZXctd2luZG93LWFsaXN0 IChjdXJyZW50LWJ1ZmZlcikpKSkpCgooZGVmdW4gd2luZG93LXJvdGF0ZS1hbnRpLWNsb2Nr d2lzZSAoKQogICJSb3RhdGUgcm9vdCB3aW5kb3cgb2Ygc2VsZWN0ZWQgZnJhbWUgYW50aS1j bG9ja3dpc2UuIgogIChpbnRlcmFjdGl2ZSkKICAobGV0ICh3aW5kb3ctY2xvY2t3aXNlCgk7 OyBDb25zdHJ1Y3QgJ3dpbmRvdy1hbGlzdCcgd2hpY2ggYWxzbyBtYWtlcyBzdXJlIHRoYXQg bm8gd2luZG93Cgk7OyBnZXRzIHJlY3ljbGVkIGJ5IEdDLgoJKHdpbmRvdy1hbGlzdCAod2lu ZG93LWFsaXN0KSkKCSh3aW5kb3cgKGZyYW1lLWZpcnN0LXdpbmRvdykpKQogICAgKHNldHEg d2luZG93LW51bWJlciAwKQogICAgKG9sZC13aW5kb3ctYWxpc3QpCiAgICA7OyBEZWxldGUg YWxsIHdpbmRvd3MgYnV0IHRoZSBmcmFtZSdzIGZpcnN0IHdpbmRvdy4KICAgIChkZWxldGUt b3RoZXItd2luZG93cy1pbnRlcm5hbCB3aW5kb3cpCiAgICAod2l0aC1jdXJyZW50LWJ1ZmZl ciAoZ2V0LWJ1ZmZlci1jcmVhdGUgIipmb28qIikKICAgICAgKGVyYXNlLWJ1ZmZlcikKICAg ICAgKHBwIHdpbmRvdy1hbGlzdCAoY3VycmVudC1idWZmZXIpKQogICAgICAoaW5zZXJ0ICJc biIpKQogICAgOzsgTm93IHJvdGF0ZSBzdGFydGluZyB3aXRoIHRoZSBmcmFtZSdzIGZpcnN0 IHdpbmRvdy4KICAgICh3aW5kb3ctcm90YXRlIHdpbmRvdyBuaWwpCiAgICAobmV3LXdpbmRv dy1hbGlzdCkKICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIChnZXQtYnVmZmVyLWNyZWF0ZSAi KmZvbyoiKQogICAgICAocHAgb2xkLXdpbmRvdy1hbGlzdCAoY3VycmVudC1idWZmZXIpKQog ICAgICAoaW5zZXJ0ICJcbiIpCiAgICAgIChwcCBuZXctd2luZG93LWFsaXN0IChjdXJyZW50 LWJ1ZmZlcikpKSkpCgooZGVmdW4gd2luZG93LXJvdGF0ZSAod2luZG93IHJvb3QpCiAgIlJv dGF0ZSB3aW5kb3cgc3Vicm91dGluZS4KV0lORE9XIG11c3QgYmUgYSBsZWZ0bW9zdCBib3R0 b21tb3N0IGNoaWxkIHdpbmRvdyBzdWNoIGFzIHByb2R1Y2VkIGJ5CmBmcmFtZS1maXJzdC13 aW5kb3cnIG9yIGB3aW5kb3ctZmlyc3Qtd2luZG93Jy4gIE1vcmUgcHJlY2lzZWx5LCBXSU5E T1cKbXVzdCBzaG93IGEgYnVmZmVyIGFuZCBpdHMgcHJldmlvdXMgc2libGluZyBtdXN0IGJl IG5pbC4KClJPT1QgaXMgZWl0aGVyIHRoZSByb290IHdpbmRvdyB0byByb3RhdGUgb3IgYSBw YXJlbnQgd2luZG93IHN1Y2ggdGhhdApXSU5ET1cgaXMgaXRzIGBmcmFtZS1maXJzdC13aW5k b3cnLgoKVHJhdmVyc2UgdGhlIHdpbmRvdyBzdHJ1Y3R1cmUgc2F2ZWQgaW4gYHdpbmRvdy1h bGlzdCcgc3RhcnRpbmcgd2l0aApXSU5ET1csIGNvbnRpbnVpbmcgd2l0aCBpdHMgbmV4dCBz aWJsaW5ncy4gIElmIGEgc2libGluZyBpcyBhIHBhcmVudAp3aW5kb3csIHJlY3Vyc2Ugd2l0 aCBXSU5ET1cgc2V0IHRvIHRoZSB3aW5kb3cgcmV0dXJuZWQgYnkKYHdpbmRvdy1maXJzdC13 aW5kb3cnIGZvciB0aGF0IHNpYmxpbmcgYW5kIFJPT1Qgc2V0IHRvIHNpYmxpbmcncyBwYXJl bnQuCkFmdGVyIGhhdmluZyB0cmFjZWQgYWxsIHNpYmxpbmdzIGNvbnRpbnVlIHdpdGggV0lO RE9XJ3MgcGFyZW50IHVubGVzcwp0aGF0IHBhcmVudCBlcXVhbHMgUk9PVC4iCiAgKGxldCAo KHBhcmVudCAod2luZG93LWFsaXN0LXBhcmVudCB3aW5kb3cpKQoJbmV4dCBmaXJzdCBzaWRl KQogICAgKHdoZW4gcGFyZW50CiAgICAgIDs7IFRyYXZlcnNlIFdJTkRPVyAod2hpY2ggaXMg YWx3YXlzIHRoZSBmaXJzdCBzaWJsaW5nKSBhbmQgaXRzCiAgICAgIDs7IG5leHQgc2libGlu Z3MuCiAgICAgICh3aGlsZSAoc2V0cSBuZXh0ICh3aW5kb3ctYWxpc3QtbmV4dCB3aW5kb3cp KQoJOzsgQ2FsY3VsYXRlIFNJREUgYXJndW1lbnQgZm9yICdzcGxpdC13aW5kb3cnIHRha2lu ZyBpbnRvCgk7OyBhY2NvdW50ICd3aW5kb3ctY2xvY2t3aXNlJyBhbmQgd2hldGhlciBXSU5E T1cgaXMgaW4gYQoJOzsgaG9yaXpvbnRhbCBvZiB2ZXJ0aWNhbCBjb21iaW5hdGlvbi4KCShz ZXRxIHNpZGUgKGlmIHdpbmRvdy1jbG9ja3dpc2UKCQkgICAgICAgKGlmICh3aW5kb3ctYWxp c3QtbGVmdCBwYXJlbnQpICdiZWxvdyAnbGVmdCkKCQkgICAgIChpZiAod2luZG93LWFsaXN0 LWxlZnQgcGFyZW50KSAnYWJvdmUgJ3JpZ2h0KSkpCgk7OyBTYXZlIGN1cnJlbnQgd2luZG93 IGNvbmZpZ3VyYXRpb24gaW4gY2FzZSBvZiBhbiBlcnJvci4KCShsZXQgKChjb25maWcgKGN1 cnJlbnQtd2luZG93LWNvbmZpZ3VyYXRpb24pKSkKCSAgKGlmICh3aW5kb3ctYWxpc3QtYnVm ZmVyIG5leHQpCgkgICAgICA7OyBJZiB0aGUgbmV4dCBzaWJsaW5nIHNob3dzIGEgYnVmZmVy LCBzcGxpdCBpdCB3aXRoCgkgICAgICA7OyBXSU5ET1cncyBvbGQgcGFyZW50IGFzIG5ldyBw YXJlbnQuCgkgICAgICAoY29uZGl0aW9uLWNhc2UgdmFyCgkJICAobGV0KiAoKHByZXYgKHdp bmRvdy1hbGlzdC1wcmV2IHdpbmRvdykpCgkJCSA7OyBTZXQgJ3dpbmRvdy1jb21iaW5hdGlv bi1saW1pdCcgdG8gbWFrZSBzdXJlCgkJCSA7OyB0aGF0IGEgbmV3IHBhcmVudCBpcyBjcmVh dGVkIHdoZW4gV0lORE9XJ3MKCQkJIDs7IHByZXZpb3VzIHNpYmxpbmcgYW5kIFdJTkRPVyBk byBub3QgaGF2ZSB0aGUKCQkJIDs7IHNhbWUgcGFyZW50LgoJCQkgKHdpbmRvdy1jb21iaW5h dGlvbi1saW1pdAoJCQkgIChvciAobm90IHByZXYpCgkJCSAgICAgIChhbmQgKG5vdCAoZXEg KHdpbmRvdy1hbGlzdC1wYXJlbnQgcHJldikKCQkJCQkgICAgKHdpbmRvdy1hbGlzdC1wYXJl bnQgd2luZG93KSkpCgkJCQkgICB0KSkpKQoJCSAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciAo Z2V0LWJ1ZmZlci1jcmVhdGUgIipmb28qIikKCQkgICAgICAoaW5zZXJ0IChmb3JtYXQgIjEg Li4gdyAlcyAuLiBuICVzIC4uIHAgJXNcbiIgd2luZG93IG5leHQgcGFyZW50KSkpCgkJICAg IDs7IFNwbGl0IFdJTkRPVyB3aXRoIFJFRkVSIHNldCB0byBhIGNvbnMgb2YgV0lORE9XJ3MK CQkgICAgOzsgc2F2ZWQgbmV4dCBzaWJsaW5nIGFuZCBXSU5ET1cncyBzYXZlZCBwYXJlbnQu CgkJICAgIChzcGxpdC13aW5kb3cgd2luZG93IG5pbCBzaWRlIG5pbCAoY29ucyBuZXh0IHBh cmVudCkpKQoJCShlcnJvcgoJCSAod2l0aC1jdXJyZW50LWJ1ZmZlciAoZ2V0LWJ1ZmZlci1j cmVhdGUgIipmb28qIikKCQkgICAocHAgd2luZG93LWFsaXN0IChjdXJyZW50LWJ1ZmZlcikp CgkJICAgKGluc2VydCAiXG4iKQoJCSAgIChpbnNlcnQgKGZvcm1hdCAiMSAuLiB3ICVzIC4u IHMgJXMgLi4gciAlc1xuIiB3aW5kb3cgc2lkZSAoY29ucyBuZXh0IHBhcmVudCkpKQoJCSAg IChpbnNlcnQgKGZvcm1hdCAiJXNcbiIgdmFyKSkpCgkJIChzZXQtd2luZG93LWNvbmZpZ3Vy YXRpb24gY29uZmlnKSkpCgkgICAgOzsgSWYgdGhlIG5leHQgc2libGluZyBpcyBhIHBhcmVu dCB3aW5kb3cgc2V0IEZJUlNUIHRvIGl0cwoJICAgIDs7IHRvcG1vc3QgbGVmdG1vc3QgbGl2 ZSBkZXNjZW5kYW50LgoJICAgIChzZXRxIGZpcnN0ICh3aW5kb3ctYWxpc3QtZmlyc3QgbmV4 dCkpCgkgICAgKGNvbmRpdGlvbi1jYXNlIHZhcgoJCShsZXQqICgocHJldiAod2luZG93LWFs aXN0LXByZXYgd2luZG93KSkKCQkgICAgICAgOzsgU2V0ICd3aW5kb3ctY29tYmluYXRpb24t bGltaXQnIHRvIG1ha2Ugc3VyZQoJCSAgICAgICA7OyB0aGF0IGEgbmV3IHBhcmVudCBpcyBj cmVhdGVkIHdoZW4gV0lORE9XJ3MKCQkgICAgICAgOzsgcHJldmlvdXMgc2libGluZyBhbmQg V0lORE9XIGRvIG5vdCBoYXZlIHRoZQoJCSAgICAgICA7OyBzYW1lIHBhcmVudC4KCQkgICAg ICAgKHdpbmRvdy1jb21iaW5hdGlvbi1saW1pdAoJCQkob3IgKG5vdCBwcmV2KQoJCQkgICAg KGFuZCAobm90IChlcSAod2luZG93LWFsaXN0LXBhcmVudCBwcmV2KQoJCQkJCSAgKHdpbmRv dy1hbGlzdC1wYXJlbnQgd2luZG93KSkpCgkJCQkgdCkpKSkKCQkgICh3aXRoLWN1cnJlbnQt YnVmZmVyIChnZXQtYnVmZmVyLWNyZWF0ZSAiKmZvbyoiKQoJCSAgICAoaW5zZXJ0IChmb3Jt YXQgIjIgLi4gdyAlcyAuLiBmICVzIC4uIHAgJXNcbiIgd2luZG93IGZpcnN0IHBhcmVudCkp KQoJCSAgOzsgU3BsaXQgV0lORE9XIHdpdGggUkVGRVIgc2V0IHRvIGEgY29ucyBvZiBXSU5E T1cncwoJCSAgOzsgZmlyc3QgbGl2ZSBkZXNjZW5kYW50IGFuZCBXSU5ET1cncyBzYXZlZCBw YXJlbnQuCgkJICAoc3BsaXQtd2luZG93IHdpbmRvdyBuaWwgc2lkZSBuaWwgKGNvbnMgZmly c3QgcGFyZW50KSkpCgkgICAgICAoZXJyb3IKCSAgICAgICAod2l0aC1jdXJyZW50LWJ1ZmZl ciAoZ2V0LWJ1ZmZlci1jcmVhdGUgIipmb28qIikKCQkgKHBwIHdpbmRvdy1hbGlzdCAoY3Vy cmVudC1idWZmZXIpKQoJCSAoaW5zZXJ0ICJcbiIpCgkJIChpbnNlcnQgKGZvcm1hdCAiMiAu LiB3ICVzIC4uIHMgJXMgLi4gciAlc1xuIiB3aW5kb3cgc2lkZSAoY29ucyBuZXh0IHBhcmVu dCkpKQoJCSAoaW5zZXJ0IChmb3JtYXQgIiVzXG4iIHZhcikpKQoJICAgICAgIChzZXQtd2lu ZG93LWNvbmZpZ3VyYXRpb24gY29uZmlnKSkpCgkgICAgOzsgUmVjdXJzZSBzdGFydGluZyB3 aXRoIFdJTkRPVydzIGZpcnN0IGxpdmUgZGVzY2VuZGFudC4KCSAgICA7OyBUaGUgc2Vjb25k IGFyZ3VtZW50IFBBUkVOVCBzaG91bGQgdGVybWluYXRlIHRoZSByZWN1cnNpb24KCSAgICA7 OyB3aGVuIGdvaW5nIHVwIGFnYWluLgoJICAgICh3aW5kb3ctcm90YXRlIGZpcnN0IHBhcmVu dCkpKQoJOzsgQ29udGludWUgd2l0aCBXSU5ET1cncyBuZXh0IHNpYmxpbmcuCgkoc2V0cSB3 aW5kb3cgbmV4dCkpCiAgICAgIDs7IENvbnRpbnVlIHdpdGggV0lORE9XJ3MgcGFyZW50IHVu bGVzcyB3ZSBhcmUgYXQgdGhlIFJPT1Qgb2YgdGhlCiAgICAgIDs7IGN1cnJlbnQgcmVjdXJz aW9uLgogICAgICAodW5sZXNzIChlcSAod2luZG93LWFsaXN0LXBhcmVudCB3aW5kb3cpIHJv b3QpCgkod2luZG93LXJvdGF0ZSAod2luZG93LWFsaXN0LXBhcmVudCB3aW5kb3cpIHJvb3Qp KSkpKQoKKGdsb2JhbC1zZXQta2V5IFsoc3VwZXIgcCldICd3aW5kb3ctcm90YXRlLWNsb2Nr d2lzZSkKKGdsb2JhbC1zZXQta2V5IFsoc3VwZXIgcSldICd3aW5kb3ctcm90YXRlLWFudGkt Y2xvY2t3aXNlKQo= --------------biFbARreP0KoNqd7qiOD0jvB--