From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Alex Riesen" Subject: Re: Perforce support. Date: Fri, 13 Jul 2007 08:45:37 +0200 Message-ID: <81b0412b0707122345s5558a179n566c1196eaba57bd@mail.gmail.com> References: <69b0c0350707121134t61905e87xaa2fc78c30891bb0@mail.gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_20408_143888.1184309137305" Cc: git@vger.kernel.org To: "Govind Salinas" X-From: git-owner@vger.kernel.org Fri Jul 13 08:45:49 2007 Return-path: Envelope-to: gcvg-git@gmane.org Received: from vger.kernel.org ([209.132.176.167]) by lo.gmane.org with esmtp (Exim 4.50) id 1I9EuS-0000Cz-2M for gcvg-git@gmane.org; Fri, 13 Jul 2007 08:45:49 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753418AbXGMGpl (ORCPT ); Fri, 13 Jul 2007 02:45:41 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754119AbXGMGpl (ORCPT ); Fri, 13 Jul 2007 02:45:41 -0400 Received: from ug-out-1314.google.com ([66.249.92.170]:22452 "EHLO ug-out-1314.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751611AbXGMGpj (ORCPT ); Fri, 13 Jul 2007 02:45:39 -0400 Received: by ug-out-1314.google.com with SMTP id j3so505490ugf for ; Thu, 12 Jul 2007 23:45:37 -0700 (PDT) DKIM-Signature: a=rsa-sha1; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:references; b=ZpGRW1Rv/xWR/hFLmV2VU53koNJE5DJNH8aqmDbyJKwIZ9Sg9Jc4aex/fjo5+hhz4cUDCMNHGWP6nXhw9LSEx1/g2TGGXN241tUw5CNBlsvDdf0J9yi3TQx/FoKsDX8xdmkgfXn+kt8tYB+bBSamklZ034u7ov0L7QlExXYKO5M= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:references; b=aO2S8Xyw4zduDqWwrE9OGlQB+NjNp4ipe+kA0KmOefXs1HUXo2/HEgfBzywoTMskReyRRlyeIZodFXaLXbQtFNWC21OSqAlMG7PujuZrMR/gf2IhcZq+NBQX69o3o1KVyeevk0wcODXkhTK7AcF1y8m0jgAUlh8lTBfaypgPucA= Received: by 10.78.168.1 with SMTP id q1mr399408hue.1184309137427; Thu, 12 Jul 2007 23:45:37 -0700 (PDT) Received: by 10.78.118.19 with HTTP; Thu, 12 Jul 2007 23:45:37 -0700 (PDT) In-Reply-To: <69b0c0350707121134t61905e87xaa2fc78c30891bb0@mail.gmail.com> Sender: git-owner@vger.kernel.org Precedence: bulk X-Mailing-List: git@vger.kernel.org Archived-At: ------=_Part_20408_143888.1184309137305 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline On 7/12/07, Govind Salinas wrote: > I am hoping to convince my co-workers to start using a Distributed > SCM, hopefully git, and I wanted to see what people had to say about > the Perforce-git interoperability. To make it more fun we are doing > this on Windows. There are two scripts. git-p4import.py, is in standard distribution, and is AFAIK not used very much Windows. The other, git-p4-import.bat is never tried on anywhere but Windows and is maintained outside of mainstream Git. I maintain the second one, git-p4-import.bat. I don't dare to submit it for distribution with Git: it is very centered on stu^H^H^H^H suboptimal practices I have at work. > I have been playing around with git for a month or so and have started > writing, what I hope will be, a nice GUI over git that works well on > Windows (Cygwin) and offers some feeling of familiarity to our > Perforce users. That however is only half the problem. I trust you already seen git gui... > We need to be able to go back and forth to our main Perforce depot, > and while I understand that git-svn support is very good, I have only > seen limited support of Perforce. Because Perforce is, in some respects, even worse: it is closed. It will never get the level of support SVN or even CVS have. > I was wondering if anyone has been > using git with p4 and how well did it work. We have very complex and > somewhat large "clients" that do a lot of mapping of directories > (which strikes me as particularly insane) and I was wondering if any > of the tools support that. I am in such situation. Perforce is so bad in managing it, that people here had to write a handful of wrappers around standard commands just to make it limping (and it is falling apart right now). I use the git-p4-import.bat to import and export the commits. It is PITA though. Try it (attached), but don't expect too much. It is a perl script, geared towards Windows and Activision Perl (hopefully not too much and it still can work with cygwin's perl). Some examples (I assume a useful shell, not cmd): Import a range of P4 changelists, convert p4 path to local path $ git-p4-import.bat --p4-path //Very/stupid/perforce \ --local-path "" --p4-range '@123,456' Result can be found in the reference named p4/IMPORT. Export some commits: $ git-p4-import.bat --merge my-branch -y --edit=vim This prepare a change lists, let you edit the changelist description in vim and submit it. I suggest you always rebase my-branch before this: p4 linearizes the history, so in case you loose your original git branch, the _useful_ parenthood information is lost with it. Better not even have any hopes associated with this. ------=_Part_20408_143888.1184309137305 Content-Type: text/plain; name=git-p4-import.bat.txt; charset=ANSI_X3.4-1968 Content-Transfer-Encoding: base64 X-Attachment-Id: f_f42b4nnu Content-Disposition: attachment; filename="git-p4-import.bat.txt" QHJlbSA9ICdOVDogQ01ELkVYRSB2aW06IHN5bnRheD1wZXJsIG5vZXQgc3c9NApAcGVybCAteCAt cyAlMCAtLSAlKgpAZ290byBfX2VuZF9vZl9maWxlX18KQHJlbSAnOwojIXBlcmwgLXcKI2xpbmUg NwoKbG9jYWwgJFZFUkJPU0UgPSAwOwpsb2NhbCAkRFJZUlVOID0gMDsKbG9jYWwgJFNIT1dfRElG RlMgPSAwOwpsb2NhbCAkQVVUT19DT01NSVQgPSAwOwpsb2NhbCAkSlVTVF9DT01NSVQgPSAwOwps b2NhbCAkR0lUX0RJUiA9IHVuZGVmOwpsb2NhbCAkUDRDTElFTlQgPSB1bmRlZjsKbG9jYWwgJEVE SVRfQ09NTUlUID0gMDsKbG9jYWwgJEZPUkNFID0gMDsKbG9jYWwgQEZVTExfSU1QT1JUID0gMDsK bG9jYWwgQERFU0MgPSAoKTsKbG9jYWwgJFNQRUMgPSB1bmRlZjsKbG9jYWwgJFA0SEFWRV9GSUxF ID0gdW5kZWY7CmxvY2FsICVQNFVTRVJTID0gKCk7CmxvY2FsICRGVUxMX0RFU0MgPSAxOwpsb2Nh bCAkSEVBRF9GUk9NX1A0ID0gMDsKbG9jYWwgJFA0X0VESVRfTUVSR0UgPSAwOwpsb2NhbCAkUDRf RURJVF9DSEFOR0VEID0gMDsKbG9jYWwgJFA0X0VESVRfSEVBRCA9IHVuZGVmOwpsb2NhbCAkZWRp dG9yID0gdW5kZWY7Cgpsb2NhbCAkUDRfUEFUSCA9IHVuZGVmOwpsb2NhbCAkUDRfUkFOR0UgPSB1 bmRlZjsKbG9jYWwgJFA0X0xPQ0FMX1BBVEggPSB1bmRlZjsKbG9jYWwgJFNUQVJUX1BPSU5UID0g dW5kZWY7CmxvY2FsICRVUERBVEVfQlJBTkNIID0gdW5kZWY7CmxvY2FsICRQNF9UQUcgPSB1bmRl ZjsKCmxvY2FsICRQNF9TWU5DX1RPID0gdW5kZWY7CiMgY2FjaGUgZm9yIHJlZnMvcDRpbXBvcnQg cmVmZXJlbmNlcwpsb2NhbCAlUDRJTVBPUlRfSEVBRFMgPSAoKTsKCnN1YiByZWFkX2FyZ3Mgewog ICAgbXkgJG5vX29wdCA9IDA7CiAgICBteSAkbm9fRURJVF9DT01NSVQgPSAwOwogICAgd2hpbGUg KG15ICRmID0gc2hpZnQpIHsKCWdvdG8gX2ZpbGVzIGlmICRub19vcHQ7Cgkkbm9fb3B0PTEsIG5l eHQgaWYgJGYgZXEgJy0tJzsKCgkkRFJZUlVOPTEsIG5leHQgaWYgJGYgZXEgJy1uJyBvciAkZiBl cSAnLS1kcnktcnVuJzsKCSRTSE9XX0RJRkZTPSREUllSVU49MSwgbmV4dCBpZiAkZiBlcSAnLS1k aWZmcyc7CgkkQVVUT19DT01NSVQ9MSwgbmV4dCBpZiAkZiBlcSAnLXknIG9yICRmIGVxICctLXll cyc7CgkkSlVTVF9DT01NSVQ9MSwgbmV4dCBpZiAkZiA9fiAvXi0tKGp1c3QtKT9jb21taXQkLzsK CSRFRElUX0NPTU1JVD0xLCBuZXh0IGlmICRmIGVxICctZScgb3IgJGYgZXEgJy0tZWRpdCc7Cgkk bm9fRURJVF9DT01NSVQ9MSwgbmV4dCBpZiAkZiBlcSAnLW5lJyBvciAkZiBlcSAnLS1uby1lZGl0 JzsKCSRGT1JDRT0xLCBuZXh0IGlmICRmIGVxICctLWZvcmNlJzsKCWlmICgkZiA9fiAvXi0oZXwt ZWRpdD0pKC4qKS8pIHsKCSAgICAkZWRpdG9yID0gJDI7CgkgICAgJEVESVRfQ09NTUlUPTE7Cgkg ICAgbmV4dDsKCX0KCSRGVUxMX0lNUE9SVD0xLCBuZXh0IGlmICRmIGVxICctLWZ1bGwnOwoJJEZV TExfREVTQysrLCBuZXh0IGlmICRmIGVxICctLXA0LWRlc2MnOwoKCSRWRVJCT1NFKyssIG5leHQg aWYgJGYgZXEgJy12JyBvciAkZiBlcSAnLS12ZXJib3NlJzsKCSRQNENMSUVOVCA9IHNoaWZ0LCBu ZXh0IGlmICRmIGVxICctLWNsaWVudCcgYW5kIEBfOwoJJFA0Q0xJRU5UID0gJDEsIG5leHQgaWYg JGYgPX4gL14tLWNsaWVudD0oLiopLzsKCXB1c2goQERFU0MsJ2MnLnNoaWZ0KSwgbmV4dCBpZiAk ZiBlcSAnLUMnIGFuZCBAXzsKCXB1c2goQERFU0MsImMkMSIpLCBuZXh0IGlmICRmID1+IC9eLS1j aGFuZ2VsaXN0PSguKikvOwoJcHVzaChAREVTQywnZicuc2hpZnQpLCBuZXh0IGlmICRmIGVxICct RicgYW5kIEBfOwoJcHVzaChAREVTQywiZiQxIiksIG5leHQgaWYgJGYgPX4gL14tLWZpbGU9KC4q KS87CglwdXNoKEBERVNDLCc0Jy5zaGlmdCksIG5leHQgaWYgKCRmIGVxICctLXB0cicgb3IgJGYg ZXEgJy0tcDQnKSBhbmQgQF87CglwdXNoKEBERVNDLCI0JDIiKSwgbmV4dCBpZiAkZiA9fiAvXi0t KHA0fHB0cik9KC4qKS87CgoJJFA0X0VESVRfQ0hBTkdFRD0xLCBuZXh0IGlmICRmIGVxICctLXA0 LWVkaXQtY2hhbmdlZCc7CglpZiAoJGYgPX4gL14tLXA0LWVkaXQtY2hhbmdlZD0oLiopLykgewoJ ICAgICRQNF9FRElUX0NIQU5HRUQ9MTsKCSAgICAkUDRfRURJVF9IRUFEPSQxOwoJICAgIG5leHQg Cgl9CglpZiAoJGYgPX4gL14tLW1lcmdlPSguKikvIG9yCgkgICAgKCRmIGVxICctLW1lcmdlJyBh bmQgQF8pKSB7CgkgICAgJFA0X0VESVRfTUVSR0U9MTsKCSAgICAkUDRfRURJVF9DSEFOR0VEPTE7 CgkgICAgJEVESVRfQ09NTUlUPTE7CgkgICAgJFA0X0VESVRfSEVBRD0gJGYgZXEgJy0tbWVyZ2Un ID8gc2hpZnQ6ICQxOwoJICAgIG5leHQgCgl9CgkkUDRfVEFHPSQxLCBuZXh0IGlmICRmID1+IC9e LS1wNC10YWc9KC4rKS87CgkkUDRfVEFHPXNoaWZ0LCBuZXh0IGlmICRmIGVxICctLXA0LXRhZycg YW5kIEBfOwoJIyAkUDRfRURJVF9NRVJHRSA9ICdzdWJtaXQnIGlmICRmIGVxICctLXN1Ym1pdCc7 CgoJJFA0X1BBVEg9JDEsIG5leHQgaWYgJGYgPX4gL14tLXA0LXBhdGg9KC4qKS87CgkkUDRfUEFU SD1zaGlmdCwgbmV4dCBpZiAkZiBlcSAnLS1wNC1wYXRoJyBhbmQgQF87CgkkUDRfUkFOR0U9JDEs IG5leHQgaWYgJGYgPX4gL14tLXA0LXJhbmdlPSguKikvOwoJJFA0X1JBTkdFPXNoaWZ0LCBuZXh0 IGlmICRmIGVxICctLXA0LXJhbmdlJyBhbmQgQF87CgkkUDRfTE9DQUxfUEFUSD0kMSwgbmV4dCBp ZiAkZiA9fiAvXi0tbG9jYWwtcGF0aD0oLiopLzsKCSRQNF9MT0NBTF9QQVRIPXNoaWZ0LCBuZXh0 IGlmICRmIGVxICctLWxvY2FsLXBhdGgnIGFuZCBAXzsKCSRTVEFSVF9QT0lOVD0kMSwgbmV4dCBp ZiAkZiA9fiAvXi0tc3RhcnQ9KC4qKS87CgkkU1RBUlRfUE9JTlQ9c2hpZnQsIG5leHQgaWYgJGYg ZXEgJy0tc3RhcnQnIGFuZCBAXzsKCSRVUERBVEVfQlJBTkNIPSQxLCBuZXh0IGlmICRmID1+IC9e LS1icmFuY2g9KC4qKS87CgkkVVBEQVRFX0JSQU5DSD1zaGlmdCwgbmV4dCBpZiAkZiBlcSAnLS1i cmFuY2gnIGFuZCBAXzsKCgkkUDRfU1lOQ19UTz0kMSwgbmV4dCBpZiAkZiA9fiAvLS1zeW5jPSgu KikvOwoJJFA0X1NZTkNfVE89c2hpZnQsIG5leHQgaWYgJGYgZXEgJy0tc3luYycgYW5kIEBfOwoK CWlmICgkZiBlcSAnLS1oZWxwJyBvciAkZiBlcSAnLWgnKSB7CgkgICAgcHJpbnQgPDxFT0Y7CiQw IFstbnwtLWRyeS1ydW5dIFsteXwtLXllc10gWy0tY2xpZW50IDxjbGllbnQtbmFtZT5dIFstLWRp ZmZzXSBcClstZXwtLWVkaXRdIFstLWp1c3QtY29tbWl0XSBbLS1mdWxsXSBbLXZ8LS12ZXJib3Nl XSBbLUMgPGNoYW5nZS1udW1iZXI+XSBcClstRiA8ZmlsZW5hbWU+XSBbLS1wdHJ8LS1wNCA8cDQt cGF0aC1hbmQvb3ItcmV2aXNpb24+XSBbLS1wNC1kZXNjXSBcClstLV0gWzxzcGVjaWZpY2F0aW9u Pl0KClBlcmZvcmNlIGNsaWVudCBzdGF0ZSBpbXBvcnRlci4gQ3JlYXRlcyBhIGdpdCBjb21taXQg b24gdGhlIGN1cnJlbnQKYnJhbmNoIGZyb20gYSBzdGF0ZSB0aGUgZ2l2ZW4gcDQgY2xpZW50IGFu ZCB3b3JraW5nIGRpcmVjdG9yeSBob2xkLgoKPHNwZWNpZmljYXRpb24+IG11c3QgYmUgZ2l2ZW4g YW5kIGlzIGV4cGVjdGVkIHRvIGJlIGEgZmlsZSB3aGljaCB3aWxsIGJlCnN0b3JlZCBvbiB0aGUg c2lkZSBicmFuY2ggdW5kZXIgdGhlIG5hbWUgInNwZWMiLgpSZW1vdGUtdG8tbG9jYWwgbWFwcGlu ZyBhbmQgdGhlIHJldmlzaW9ucyBvZiBmaWxlcyBhcmUgc3RvcmVkIGluICJoYXZlIiwKYW5kIHRo ZSBjbGllbnQgZGVmaW5pdGlvbiAtIGluICJjbGllbnQiLgoKLS1jbGllbnQgY2xpZW50IFNwZWNp ZnkgY2xpZW50IG5hbWUgKHNhdmVkIGluIC5naXQvcDQvY2xpZW50IGZvciB0aGUgbmV4dCB0aW1l KQotLWZ1bGwgICAgICAgICAgUGVyZm9ybSBmdWxsIGltcG9ydCwgZG9uJ3QgZXZlbiB0cnkgdG8g ZmlndXJlIG91dCB3aGF0IGNoYW5nZWQKLXl8LS15ZXMgICAgICAgIENvbW1pdCBhdXRvbWF0aWNh bGx5IChieSBkZWZhdWx0IG9ubHkgaW5kZXggdXBkYXRlZCkKLS1qdXN0LWNvbW1pdCAgIFRvIGJl IHVzZWQgYWZ0ZXIgeW91IGZvcmdvdCB0byBydW4gd2l0aCAtLXllcyBmaXJzdCB0aW1lCi1ufC0t ZHJ5LXJ1biAgICBEbyBub3QgdXBkYXRlIHRoZSBpbmRleCBhbmQgZG8gbm90IGNvbW1pdAotZXwt LWVkaXQgICAgICAgRWRpdCBjb21taXQgZGVzY3JpcHRpb24gYmVmb3JlIGNvbW1pdHRpbmcKLXZ8 LS12ZXJib3NlICAgIEJlIG1vcmUgdmVyYm9zZS4gQ2FuIGJlIGdpdmVuIG1hbnkgdGltZXMsIGlu Y3JlYXNlcyB2ZXJib3NpdHkKCi0tZmlsZT1maWxlCi1GIGZpbGUgICAgICAgICBUYWtlIGRlc2Ny aXB0aW9uIGZvciB0aGUgY29tbWl0IGZyb20gYSBmaWxlIGluIHRoZQogICAgICAgICAgICAgICAg bmV4dCBwYXJhbWV0ZXIKCi0tY2hhbmdlbGlzdD1jaGFuZ2UKLUMgY2hhbmdlICAgICAgIFRha2Ug ZGVzY3JpcHRpb24gZm9yIHRoZSBjb21taXQgZnJvbSB0aGlzIHA0IGNoYW5nZQoKLS1wNHwtLXB0 cj1wNC1wYXRoLWFuZC9vci1yZXZpc2lvbgogICAgICAgICAgICAgICAgVGFrZSBkZXNjcmlwdGlv biBmb3IgdGhlIGNvbW1pdCBmcm9tIHRoZSBwNCBjaGFuZ2UgZGVzY3JpYmVkCiAgICAgICAgICAg ICAgICBieSB0aGlzIHA0IHBhdGgsIHBvc3NpYmx5IGluY2x1ZGluZyByZXZpc2lvbiBzcGVjaWZp Y2F0aW9uCgotLXA0LXBhdGg9cDQtcGF0aAogICAgICAgICAgICAgICAgSW1wb3J0IGNoYW5nZXMg ZGlyZWN0bHkgZnJvbSBQZXJmb3JjZSBjb25jZXJuaW5nIHRoZSBnaXZlbgogICAgICAgICAgICAg ICAgcDQtcGF0aC4gVGhlIGZpcnN0IGNoYW5nZSBsaXN0IGRlZmluZXMgdGhlIHN0YXJ0aW5nIHN0 YXRlCiAgICAgICAgICAgICAgICBvZiBpbXBvcnRlZCBwYXRoCi0tcDQtcmFuZ2U9cmV2cmFuZ2UK ICAgICAgICAgICAgICAgIFJlc3RyaWN0IHRoZSBjaGFuZ2VzIHRvIHRoZSByZXZyYW5nZSBjaGFu Z2UgbGlzdHMuCiAgICAgICAgICAgICAgICBUaGUgZmlyc3QgY2hhbmdlIGxpc3QgaXMgYWx3YXlz IGltcG9ydGVkIGZ1bGx5LAogICAgICAgICAgICAgICAgYWxsIHRoZSBzdWJzZXF1ZW50IC0gaW5j cmVtZW50YWxseS4gSWYgbm90IGdpdmVuIC0KICAgICAgICAgICAgICAgIGFsbCBjaGFuZ2VzIG9u IHRoZSBwYXRjaCB3aWxsIGJlIGltcG9ydGVkCi0tbG9jYWwtcGF0aD1sb2NhbC1wYXRoCiAgICAg ICAgICAgICAgICBSZXBsYWNlIHRoZSBwNC1wYXRoIGdpdmVuIHRvIC0tcDQtcGF0aCB3aXRoIGxv Y2FsLXBhdGgKICAgICAgICAgICAgICAgIGluIHRoZSBpbXBvcnRlZCBwYXRobmFtZXMKLS1zdGFy dD1naXQtcmVmCiAgICAgICAgICAgICAgICBTdGFydCBjb21taXRpbmcgYXQgdGhlIGdpdmVuIHJl ZmVyZW5jZS4gSWYgbm90IGdpdmVuLAogICAgICAgICAgICAgICAgdGhlIHZhbHVlIG9mIHJlZmVy ZW5jZSBnaXZlbiB0byAtLWJyYW5jaCBpcyB1c2VkLAogICAgICAgICAgICAgICAgb3RoZXJ3aXNl IHRoZSBjdXJyZW50IEhFQUQgaXMgYXNzdW1lZAotLWJyYW5jaD1naXQtYnJhbmNoCiAgICAgICAg ICAgICAgICBBZnRlciBldmVyeXRoaW5nIGlzIGltcG9ydGVkIGFuZCBjb21taXR0ZWQsIHVwZGF0 ZSB0aGUKICAgICAgICAgICAgICAgIHJlZmVyZW5jZSBnaXQtYnJhbmNoIHdpdGggc2hhMSBvZiB0 aGUgbGFzdCBjb21taXQuCiAgICAgICAgICAgICAgICBJZiBub3QgZ2l2ZW4gLSB0aGUgbGFzdCBj b21taXQgb2YgdGhlIGltcG9ydCBpcyBzdG9yZWQKICAgICAgICAgICAgICAgIGluIHRoZSByZWZl cmVuY2UgL3A0L0lNUE9SVAoKLS1wNC1kZXNjICAgICAgIEluY3JlYXNlIGFtb3VudCBvZiBqdW5r IGZyb20gcDQgY2hhbmdlIGRlc2NyaXB0aW9uCgotLWRpZmZzICAgICAgICAgU2hvdyBmaWxlcyB3 aGljaCBhcmUgZGlmZmVyZW50IGJldHdlZW4gbG9jYWwgZmlsZXN5c3RlbSwgaW5kZXgsCiAgICAg ICAgICAgICAgICBhbmQgdGhlIGN1cnJlbnQgSEVBRC4gRG9lcyBub3QgZG8gYW55dGhpbmcgZWxz ZQoKLS1tZXJnZT1icmFuY2gKICAgICAgICAgICAgICAgIE1lcmdlIHdpdGggdGhlIGdpdmVuIHNo YTEgYW5kIHByZXBhcmUgYSBwNCBzdWJtaXNzaW9uLgogICAgICAgICAgICAgICAgQ3VycmVudCBI RUFEIHdpbGwgYmUgZ2l0LW1lcmdlZCB3aXRoIGJyYW5jaC4KICAgICAgICAgICAgICAgIFRoZSB3 b3JraW5nIGRpcmVjdG9yeSBtdXN0IGhhdmUgbm8gbG9jYWwgY2hhbmdlcwoKLS1wNC1lZGl0LWNo YW5nZWQKLS1wNC1lZGl0LWNoYW5nZWQ9YnJhbmNoCiAgICAgICAgICAgICAgICBSZWFkIHRoZSBn aXZlbiBicmFuY2ggaW4gdGhlIGluZGV4IGFuZCBwcmVwYXJlIGEgcDQgc3VibWlzc2lvbi4KICAg ICAgICAgICAgICAgIEN1cnJlbnQgSEVBRCBtdXN0IGZhc3QtZm9yd2FyZCB0byBzaGExLiBJZiBi cmFuY2ggaXMgb21pdGVkLAogICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgSEVBRCBpcyBhc3N1 bWVkICh1c2VmdWwgYWZ0ZXIgcHVzaCBvbiBIRUFEKS4KICAgICAgICAgICAgICAgIFRoZSB3b3Jr aW5nIGRpcmVjdG9yeSBtdXN0IGhhdmUgbm8gbG9jYWwgY2hhbmdlcwoKLS1zeW5jPXJlZgogICAg ICAgICAgICAgICAgU3luYyB0aGUgY3VycmVudCBjbGllbnQgdG8gdGhlIHN0YXRlIGdpdmVuIGJ5 IHJlZjpoZWFkCiAgICAgICAgICAgICAgICBmaWxlLiBUaGUgZmlsZSBtdXN0IGhhdmUgYmVlbiBz dG9yZWQgYnkgcHJldmlvdXMgaW1wb3J0LgogICAgICAgICAgICAgICAgVGhlIG9wdGlvbiBjb25z aWRlcnMgYWxsIHJlZmVyZW5jZXMgdW5kZXIgcDRpbXBvcnQgd2hlbgogICAgICAgICAgICAgICAg bG9va2luZyBmb3IgdGhlICJoYXZlIi1maWxlCgoKVGhlIGRlc2NyaXB0aW9ucyB0YWtlbiBmcm9t IHA0IGNoYW5nZXMgZ2l2ZW4gYnkgLUMgYW5kIC0tcDQgd2lsbApiZSBjb25jYXRlbmF0ZWQgaWYg dGhlIG9wdGlvbnMgZ2l2ZW4gbXVsdGlwbGUgdGltZXMuCiItLSIgY2FuIGJlIHVzZWQgdG8gc2Vw YXJhdGUgb3B0aW9ucyBmcm9tIGRlc2NyaXB0aW9uIGZpbGVzLgoKRU9GCgkgICAgZXhpdCgwKTsK CX0KCWRpZSAiJDA6IHVua25vd24gb3B0aW9uICRmXG4iIGlmICRmID1+IC9eLS87CiAgICBfZmls ZXM6Cgl3YXJuICIkMDogc3BlYyB3YXMgYWxyZWFkeSBzZXQsICRTUEVDIGlnbm9yZWRcbiIgaWYg ZGVmaW5lZCgkU1BFQyk7CgkkU1BFQyA9ICRmOwogICAgfQogICAgJEVESVRfQ09NTUlUID0gMCBp ZiAkbm9fRURJVF9DT01NSVQ7Cn0KcmVhZF9hcmdzKEBBUkdWKTsKCiRlZGl0b3IgPSAkRU5We1ZJ U1VBTH0gdW5sZXNzIGRlZmluZWQoJGVkaXRvcik7CiRlZGl0b3IgPSAkRU5We0VESVRPUn0gdW5s ZXNzIGRlZmluZWQoJGVkaXRvcik7CiRlZGl0b3IgPSAndmltJyB1bmxlc3MgZGVmaW5lZCgkZWRp dG9yKTsKZGllICIkMDogbm8gZWRpdG9yIGRlZmluZWRcbiIgaWYgJEVESVRfQ09NTUlUIGFuZCAh ZGVmaW5lZCgkZWRpdG9yKTsKCmlmICghZGVmaW5lZCgkR0lUX0RJUikpIHsKICAgICRHSVRfRElS ID0gZ2l0X3Jldl9wYXJzZSgnLS1naXQtZGlyJyk7CiAgICBkaWUgIiQwOiBHSVRfRElSIG5vdCBm b3VuZFxuIiBpZiAhZGVmaW5lZCgkR0lUX0RJUikgb3IgIS1kICRHSVRfRElSOwp9CgpleGl0KGdp dF9zaG93X2RpZmZzKCkgPyAxOiAwKSBpZiAkU0hPV19ESUZGUzsKCiMgdGhlIG1vc3QgY29tbWFu ZHMgYmVsb3cgbmVlZCBHSVRfRElSL3A0LCB0cnkgdG8gY3JlYXRlIGl0Cm1rZGlyICIkR0lUX0RJ Ui9wNCIsIDA3NzU7CgppZiAoZGVmaW5lZCgkUDRfUEFUSCkpIHsKICAgICRTVEFSVF9QT0lOVCA9 ICRVUERBVEVfQlJBTkNICglpZiAhZGVmaW5lZCgkU1RBUlRfUE9JTlQpIGFuZCBkZWZpbmVkKCRV UERBVEVfQlJBTkNIKTsKICAgIG15ICRwYXJlbnQgPSB1bmRlZjsKICAgICRwYXJlbnQgPSBnaXRf cmV2X3BhcnNlKCRTVEFSVF9QT0lOVCkgaWYgZGVmaW5lZCgkU1RBUlRfUE9JTlQpOwogICAgJHBh cmVudCA9ICcnIGlmICFkZWZpbmVkKCRwYXJlbnQpOwoKICAgICRQNF9SQU5HRSA9ICcjaGVhZCcg aWYgIWRlZmluZWQoJFA0X1JBTkdFKTsgIyBpbXBvcnQgYWxsIGNoYW5nZXMKICAgICRQNF9MT0NB TF9QQVRIID0gJFA0X1BBVEggaWYgIWRlZmluZWQoJFA0X0xPQ0FMX1BBVEgpOwogICAgJFA0X0xP Q0FMX1BBVEggPX4gcyFeLyshIW87CiAgICBzIS8rXC5cLlwuJCEhbyBmb3IgKCRQNF9QQVRILCRQ NF9MT0NBTF9QQVRIKTsKICAgIHMhLyskISFvIGZvciAoJFA0X1BBVEgsJFA0X0xPQ0FMX1BBVEgp OwogICAgcHJpbnQgIlBhdGggY29udmVyc2lvbjpcbickUDRfUEFUSCcgLT5cbickUDRfTE9DQUxf UEFUSCdcbiIgaWYgJFZFUkJPU0UgPiAxOwogICAgaW1wb3J0X3A0X2RpcigkUDRfUEFUSCwkUDRf TE9DQUxfUEFUSCwkUDRfUkFOR0UsJHBhcmVudCwkVVBEQVRFX0JSQU5DSCk7CiAgICBleGl0IDA7 Cn0KCmlmIChkZWZpbmVkKCRQNF9UQUcpKSB7CiAgICBteSAkcmMgPSBnaXRfcDRfdGFnX0hFQUQo JFA0X1RBRyk7CiAgICBleGl0IDEyNyBpZiAkcmMgJiAweGZmOwogICAgZXhpdCAxIGlmICRyYzsK ICAgIGV4aXQgMDsKfQoKIyBQNCBjbGllbnQgd2FzIGdpdmVuIGluIGNvbW1hbmQtbGluZS4gU3Rv cmUgaXQKaWYgKCBkZWZpbmVkKCRQNENMSUVOVCkgKSB7CiAgICBta2RpciAiJEdJVF9ESVIvcDQi LCAwNzc3OwogICAgaWYgKCBvcGVuKEYsICc+JywgIiRHSVRfRElSL3A0L2NsaWVudCIpICkgewoJ cHJpbnQgRiAiJFA0Q0xJRU5UXG4iOwoJY2xvc2UoRik7CiAgICB9IGVsc2UgewoJZGllICIkMDog Y2Fubm90IHN0b3JlIGNsaWVudCBuYW1lOiAkIVxuIgogICAgfQp9IGVsc2UgewogICAgaWYgKCBv cGVuKEYsICc8JywgIiRHSVRfRElSL3A0L2NsaWVudCIpICkgewoJKCRQNENMSUVOVCkgPSA8Rj47 CgljbG9zZShGKTsKCSRQNENMSUVOVCA9fiBzL15ccyovLywkUDRDTElFTlQgPX4gcy9ccyokLy8g aWYgZGVmaW5lZCgkUDRDTElFTlQpOwogICAgfQp9CmRpZSAiUDQgY2xpZW50IG5vdCBkZWZpbmVk XG4iIGlmICFkZWZpbmVkKCRQNENMSUVOVCkgb3IgIWxlbmd0aCgkUDRDTElFTlQpOwpwcmludCAi cmVhZGluZyBjbGllbnQgJFA0Q0xJRU5UXG4iIGlmICRWRVJCT1NFOwpsb2NhbCAoJFA0Uk9PVCwg JHA0Y2xudCwgJFA0SE9TVCk7Cm9wZW4obXkgJGZkbywgJz4nLCAiJEdJVF9ESVIvcDQvY2xpZW50 LmRlZiIpIG9yIGRpZSAicDQvY2xpZW50LmRlZjogJCFcbiI7CmJpbm1vZGUoJGZkbyk7Cm9wZW4o bXkgJGZkaSwgJy18JywgInA0IGNsaWVudCAtbyAkUDRDTElFTlQiKSBvciBkaWUgInA0IGNsaWVu dDogJCFcbiI7CmJpbm1vZGUoJGZkaSk7Cm15ICRsYXN0X2xpbmVfbGVuID0gMDsKd2hpbGUgKDwk ZmRpPikgewogICAgbmV4dCBpZiAvXiMvbzsKICAgIGlmICggbS9eXHMqUm9vdDpccyooXFMrKVtc XFwvXSpccyokL3NvICkgeyAkUDRST09UID0gJDEgfQogICAgZWxzaWYgKCBtL15ccypDbGllbnQ6 XHMqKFxTKykvbyApIHsgJHA0Y2xudCA9ICQxIH0KICAgIGVsc2lmICggbS9eXHMqSG9zdDpccyoo XFMrKS9vICkgeyAkUDRIT1NUID0gJDEgfQogICAgKCRWRVJCT1NFIGFuZCBwcmludCksIG5leHQg aWYgL14oQWNjZXNzfFVwZGF0ZSk6LzsKICAgIHMvXHI/XG4kLy9zbzsKICAgIG15ICRsZW4gPSBs ZW5ndGgoJF8pOwogICAgcHJpbnQgJGZkbyAiJF9cbiIgaWYgJGxlbiBvciAkbGVuICE9ICRsYXN0 X2xpbmVfbGVuOwogICAgJGxhc3RfbGluZV9sZW4gPSAkbGVuOwp9CmNsb3NlKCRmZGkpOwpjbG9z ZSgkZmRvKTsKCmRpZSAiQ2xpZW50IHJvb3Qgbm90IGRlZmluZWRcbiIgdW5sZXNzIGRlZmluZWQo JFA0Uk9PVCk7CmlmICggJFZFUkJPU0UgKSB7CiAgICB1c2UgQ3dkOwogICAgcHJpbnQgIkdJVF9E SVI6ICRHSVRfRElSXG4iOwogICAgcHJpbnQgIlJvb3Q6ICRQNFJPT1QgKGN3ZDogIi5jd2QoKS4i XG4iOwogICAgcHJpbnQgIkhvc3Q6ICRQNEhPU1RcbiI7CiAgICBwcmludCAiQ2xpZW50OiAkcDRj bG50XG4iIGlmICRwNGNsbnQgbmUgJFA0Q0xJRU5UOwp9CgpkaWUgaWYgZGVmaW5lZCAkUDRfU1lO Q19UTzsKI2V4aXQoZ2l0X3N5bmNfdG8oJFA0X1NZTkNfVE8pKSBpZiBkZWZpbmVkICRQNF9TWU5D X1RPOwoKaWYgKCRQNF9FRElUX0NIQU5HRUQpIHsKICAgIGV4aXQoZ2l0X3A0X21lcmdlKCRQNF9F RElUX0hFQUQsICRQNF9FRElUX01FUkdFLCAkQVVUT19DT01NSVQpKTsKfQoKbXkgKCRnaXRfaGVh ZCwkZ2l0X3A0X2hlYWQsJGdpdF9wNF9oYXZlKSA9IGdpdF9wNF9pbml0KCk7CgppZiAoJEpVU1Rf Q09NTUlUKSB7CiAgICBnaXRfcDRfY29tbWl0KCRnaXRfaGVhZCwgJGdpdF9wNF9oZWFkKTsKICAg IGV4aXQgMDsKfQoKbG9jYWwgJWdpdGlnbm9yZV9kaXJzID0gKCk7CiRnaXRpZ25vcmVfZGlyc3sn Lyd9ID0gcmVhZF9maWx0ZXJfZmlsZSgiJEdJVF9ESVIvaW5mby9leGNsdWRlIik7CnB1c2goQHsk Z2l0aWdub3JlX2RpcnN7Jy8nfX0sIEB7cmVhZF9maWx0ZXJfZmlsZSgnLmdpdGlnbm9yZScpfSk7 CgpteSAlZ2l0X2luZGV4ID0gKCk7CiQvID0gIlwwIjsKbXkgQGdpdF9YID0gKCk7CnByaW50ICJS ZWFkaW5nIGdpdCBmaWxlIGxpc3QoZ2l0IGxzLWZpbGVzIEBnaXRfWCAtLWNhY2hlZCAteikuLi5c biIgaWYgJFZFUkJPU0U7CmZvcmVhY2ggKCBxeHtnaXQgbHMtZmlsZXMgQGdpdF9YIC0tY2FjaGVk IC16fSApIHsKICAgIGNob3A7ICMgY2hvcCBcMAogICAgbmV4dCBpZiBtL15cLmdpdGlnbm9yZSQv bzsKICAgIG5leHQgaWYgbS9cL1wuZ2l0aWdub3JlJC9vOwogICAgbmV4dCBpZiBmaWx0ZXJlZCgk Xyk7CiAgICAkZ2l0X2luZGV4eyRffSA9IDE7Cn0KCm15IEBnaXRfYWRkID0gKCk7Cm15IEBnaXRf YWRkeCA9ICgpOwpteSBAZ2l0X2RlbCA9ICgpOwpteSBAZ2l0X3VwZCA9ICgpOwoKcHJpbnQgIlJl YWRpbmcgUDQgZmlsZSBsaXN0Li4uXG4iIGlmICRWRVJCT1NFOwpsb2NhbCAoJENvbmZsaWN0cywk SWdub3JlZCwkQWRkZWQsJERlbGV0ZWQsJFVwZGF0ZWQpID0gKDAsMCwwLDAsMCk7CiQvID0gIlxu IjsKbXkgJGluX25hbWUgPSAwOwpteSBAcm9vdCA9IHNwbGl0KC9bXC9cXF0rLywgJFA0Uk9PVCk7 Cm15ICVwNF9pbmRleCA9ICgpOwpteSAlcDRfYV9sYyA9ICgpOwpteSAlbG5hbWVzID0gKCk7Cm15 ICVsY29uZmxpY3RzID0gKCk7CmlmIChvcGVuZGlyKERJUiwgJy4nKSkgewogICAgJGxuYW1lc3sn Lid9ID0gW2dyZXAgeyRfIG5lICcuJyBhbmQgJF8gbmUgJy4uJ30gcmVhZGRpcihESVIpXTsKICAg IGNsb3NlZGlyKERJUik7Cn0Kb3BlbihteSAkaGF2ZSwgInA0IC1HIC1jICRQNENMSUVOVCAtSCAk UDRIT1NUIC1kICRQNFJPT1QgaGF2ZSB8Iikgb3IKICAgIGRpZSAiJDA6IGZhaWxlZCB0byBzdGFy dCBwNDogJCFcbiI7CmJpbm1vZGUoJGhhdmUpOwokUDRIQVZFX0ZJTEUgPSAiJEdJVF9ESVIvcDQv aGF2ZSI7Cm9wZW4obXkgJHN0b3JlZGhhdmUsICc+JywgJFA0SEFWRV9GSUxFKSBvciBkaWUgIiRQ NEhBVkVfRklMRTogJCFcbiI7CmJpbm1vZGUoJHN0b3JlZGhhdmUpOwpteSAoJGNudCwkZXJyLCRl bnQpID0gKDAsMCx1bmRlZik7CndoaWxlIChkZWZpbmVkKCRlbnQ9cmVhZF9weWRpY3RfZW50cnko JGhhdmUpKSkgewogICAgaWYgKGRlZmluZWQoJGVudC0+e2NvZGV9KSBhbmQgZGVmaW5lZCgkZW50 LT57ZGF0YX0pKSB7CgkrKyRlcnIgaWYgJGVudC0+e2NvZGV9IGVxICdlcnJvcic7CglwcmludCBT VERFUlIgJ3A0OiAnLiRlbnQtPntjb2RlfS4nOiAnLiRlbnQtPntkYXRhfS4iXG4iOwoJbmV4dDsK ICAgIH0KICAgIG5leHQgaWYgIWRlZmluZWQoJGVudC0+e2RlcG90RmlsZX0pIG9yICFkZWZpbmVk KCRlbnQtPntjbGllbnRGaWxlfSk7CiAgICArKyRjbnQ7CiAgICBteSAkYSA9ICRlbnQtPntkZXBv dEZpbGV9OwogICAgJGVudC0+e2NsaWVudEZpbGV9ID1+IG0hXi8vW14vXSsvKC4qKSFvOwogICAg bXkgJGIgPSAkMTsKICAgIG15IEBiYiA9IHNwbGl0KC9cLysvLCAkYik7CiAgICBwcmludCAkc3Rv cmVkaGF2ZSAiJGFcMCRlbnQtPntjbGllbnRGaWxlfVwwJGVudC0+e2hhdmVSZXZ9XDBcbiI7Cgog ICAgaWYgKCAkXk8gZXEgJ01TV2luMzInICkgewoJIyBzdHVwaWQgd2luZG93cywgZGFmdCBhY3Rp dmVzdGF0ZSwgZHVtYiBQNAoJIyBUaGlzIHBpZWNlIGJlbG93IGlzIGNoZWNraW5nIGZvciBmaWxl IG5hbWUgY29uZmxpY3RzCgkjIHdoaWNoIGhhcHBlbiBvbiB3aW5kb3dzIGJlY2F1c2Ugb2YgaXQg bWFuZ2xpbmcgdGhlIG5hbWVzLgoJbXkgJGJsYyA9IGxjICRiOwoJaWYgKCAkI2JiID4gMCApIHsK CSAgICBteSAkcGF0aCA9ICcuJzsKCSAgICBmb3JlYWNoIG15ICRuIChAYmJbMCAuLiAkI2JiIC0x XSkgewoJCW15IEBjb25mbGljdHMgPQoJCSAgICBncmVwIHtsYyAkXyBlcSBsYyAkbiBhbmQgJF8g bmUgJG59IEB7JGxuYW1lc3skcGF0aH19OwoJCWlmIChAY29uZmxpY3RzIGFuZCAhZXhpc3RzKCRs Y29uZmxpY3RzeyIkcGF0aC8kbiJ9KSkgewoJCSAgICB3YXJuICJ3YXJuaW5nOiAkYSAtPiAkYlxu Ii4KCQkJICJ3YXJuaW5nOiBjb25mbGljdCBiZXR3ZWVuIHBhdGggXCIkcGF0aC8kblwiIGFuZCAi LgoJCQkgImxvY2FsIGZpbGVzeXN0ZW0gaW4gXCJAY29uZmxpY3RzXCJcbiI7CgkJICAgICRDb25m bGljdHMrKzsKCQkgICAgJGxjb25mbGljdHN7IiRwYXRoLyRuIn0gPSAxOwoJCX0KCQkkcGF0aCAu PSAiLyRuIjsKCQlpZiAoIWV4aXN0cygkbG5hbWVzeyRwYXRofSkpIHsKCQkgICAgaWYgKG9wZW5k aXIoRElSLCAkcGF0aCkpIHsKCQkJJGxuYW1lc3skcGF0aH0gPQoJCQkgICAgW2dyZXAgeyRfIG5l ICcuJyBhbmQgJF8gbmUgJy4uJ30gcmVhZGRpcihESVIpXTsKCQkJY2xvc2VkaXIoRElSKTsKCQkJ I3ByaW50ICJyZWFkICRwYXRoICgiLHNjYWxhcihAeyRsbmFtZXN7JHBhdGh9fSksIilcbiI7CgkJ ICAgIH0KCQl9CgkgICAgfQoJfQoJaWYgKCFleGlzdHMoJHA0X2FfbGN7JGJsY30pKSB7CgkgICAg JHA0X2FfbGN7JGJsY30gPSBbJGEsICRiXTsKCX0gZWxzZSB7CgkgICAgd2Fybigid2FybmluZzog JGEgLT4gJGJcbiIuCgkJICJ3YXJuaW5nOiBjb25mbGljdHMgd2l0aCAiLgoJCSAkcDRfYV9sY3sk YmxjfS0+WzBdLiIgLT4gIi4KCQkgJHA0X2FfbGN7JGJsY30tPlsxXS4iXG4iKTsKCSAgICAkQ29u ZmxpY3RzKys7CgkgICAgbmV4dDsKCX0KICAgIH0KCiAgICBteSAkaTsKICAgIGZvciAoJGkgPSAw OyAkaSA8ICQjYmI7ICsrJGkpIHsKCW15ICRiZGlyID0gam9pbignLycsQGJiWzAgLi4gJGldKSAu ICcvJzsKCWlmICggIWV4aXN0cygkZ2l0aWdub3JlX2RpcnN7JGJkaXJ9KSApIHsKCSAgICAkZ2l0 aWdub3JlX2RpcnN7JGJkaXJ9ID0gcmVhZF9maWx0ZXJfZmlsZSgiJGJkaXIuZ2l0aWdub3JlIik7 Cgl9CiAgICB9CiAgICBpZiAoZmlsdGVyZWQoJGIpKSB7CglwcmludCAiIGkgJGJcbiIgaWYgJFZF UkJPU0UgPiAzOwoJJElnbm9yZWQrKzsKCW5leHQKICAgIH0KICAgICRwNF9pbmRleHskYn0gPSAk YTsKICAgIGlmICggZXhpc3RzKCRnaXRfaW5kZXh7JGJ9KSApIHsKCW15ICRuZWVkdXAgPSAxOwoJ aWYgKGRlZmluZWQoJGdpdF9wNF9oYXZlKSkgewoJICAgICRwcmV2ID0gJGdpdF9wNF9oYXZlLT57 JGF9OwoJICAgIGlmIChkZWZpbmVkKCRwcmV2KSkgewoJCSRwcmV2LT5bMF0gPX4gbSFeLy9bXi9d Ky8oLiopIW87CgkJJG5lZWR1cCA9IDAgaWYgKCRiIGVxICQxKSBhbmQgKCRwcmV2LT5bMV0gZXEg JGVudC0+e2hhdmVSZXZ9KTsKCQlpZiAoJG5lZWR1cCBhbmQgJFZFUkJPU0UgPiAxKSB7CgkJICAg IG15ICRyZWFzb247CgkJICAgICRyZWFzb24gPSAnbG9jYWwgZmlsZScgaWYgJGIgbmUgJDE7CgkJ ICAgICRyZWFzb24gPSAncmV2aXNpb24nIGlmICRwcmV2LT5bMV0gbmUgJGVudC0+e2hhdmVSZXZ9 OwoJCSAgICBwcmludCAiJGEgKCRyZWFzb24gY2hhbmdlZClcbiI7CgkJfQoJICAgIH0KCX0KCWlm ICgkbmVlZHVwKSB7CgkgICAgJFVwZGF0ZWQrKzsKCSAgICBwdXNoKEBnaXRfdXBkLCAkYik7Cgl9 CiAgICB9IGVsc2UgewoJJEFkZGVkKys7CglpZiAoICRiID1+IG0vXC4oYmF0fGNtZHxwbHxzaHxl eGV8ZGxsKSQvaW8gKQoJeyBwdXNoKEBnaXRfYWRkeCwgJGIpIH0gZWxzZSB7IHB1c2goQGdpdF9h ZGQsICRiKSB9CiAgICB9Cn0KY2xvc2UoJHN0b3JlZGhhdmUpOwpjbG9zZSgkaGF2ZSk7CmV4aXQg MSBpZiAkZXJyOyAjIHRoZSBlcnJvciBhbHJlYWR5IHJlcG9ydGVkCmRpZSAiTm90aGluZyBpbiB0 aGUgY2xpZW50ICRQNENMSUVOVFxuIiBpZiAhJGNudDsKCnVuZGVmICVwNF9hX2xjOwoKQGdpdF9k ZWwgPSBncmVwIHsgIWV4aXN0cygkcDRfaW5kZXh7JF99KSB9IGtleXMgJWdpdF9pbmRleDsKJERl bGV0ZWQgPSAkI2dpdF9kZWwgKyAxOwoKI2ZvcmVhY2ggKGtleXMgJWdpdF9pbmRleCkKI3sgcHVz aChAZ2l0X2RlbCwgJF8pIGlmICFleGlzdHMoJHA0X2luZGV4eyRffSkgfQoKaWYgKCAkRFJZUlVO ICkgewogICAgcHJpbnQoJCNnaXRfYWRkKyQjZ2l0X2FkZHgrIDIsIiBmaWxlcyB0byBhZGRcbiIp IGlmICRWRVJCT1NFOwogICAgcHJpbnQgbWFwIHsiIGEgJF9cbiJ9IEBnaXRfYWRkIGlmICRWRVJC T1NFID4gMjsKICAgIHByaW50IG1hcCB7IiBhICRfXG4ifSBAZ2l0X2FkZHggaWYgJFZFUkJPU0Ug PiAyOwogICAgcHJpbnQoJCNnaXRfZGVsKzEsIiBmaWxlcyB0byB1bnJlZ1xuIikgaWYgJFZFUkJP U0U7CiAgICBwcmludCBtYXAgeyIgZCAkX1xuIn0gQGdpdF9kZWwgaWYgJFZFUkJPU0UgPiAyOwog ICAgcHJpbnQoJCNnaXRfdXBkKzEsIiBmaWxlcyB0byB1cGRhdGVcbiIpIGlmICRWRVJCT1NFOwog ICAgcHJpbnQgbWFwIHsiIHUgJF9cbiJ9IEBnaXRfdXBkIGlmICRWRVJCT1NFID4gMjsKICAgIHBy aW50ICJhZGRlZDogJEFkZGVkLCB1bnJlZ2Q6ICREZWxldGVkLCB1cGRhdGVkOiAkVXBkYXRlZCwg aWdub3JlZDogJElnbm9yZWQiOwogICAgcHJpbnQgIiwgY29uZmxpY3RzOiAkQ29uZmxpY3RzIiBp ZiAkQ29uZmxpY3RzOwogICAgcHJpbnQgIlxuIjsKfSBlbHNlIHsKICAgIGlmIChAZ2l0X2FkZCB8 fCBAZ2l0X2FkZHgpIHsKCXByaW50KCQjZ2l0X2FkZCskI2dpdF9hZGR4KyAyLAoJICAgICAgIiBm aWxlcyB8IGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgLXogLS1zdGRpblxuIikKCSAgICBpZiAkVkVS Qk9TRTsKCWlmIChAZ2l0X2FkZCkgewoJICAgIG9wZW4oR0lULCAnfCBnaXQgdXBkYXRlLWluZGV4 IC0tYWRkIC0tY2htb2Q9LXggLXogLS1zdGRpbicpIG9yCgkJZGllICIkMCBnaXQtdXBkYXRlLWlu ZGV4KGFkZCk6ICQhXG4iOwoJICAgIHByaW50IEdJVCBtYXAge3ByaW50ICIgYSAkX1xuIiBpZiAk VkVSQk9TRSA+IDE7ICIkX1wwIn0gQGdpdF9hZGQ7CgkgICAgY2xvc2UoR0lUKTsKCX0KCWlmIChA Z2l0X2FkZHgpIHsKCSAgICBvcGVuKEdJVCwgJ3wgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLWNo bW9kPSt4IC16IC0tc3RkaW4nKSBvcgoJCWRpZSAiJDAgZ2l0LXVwZGF0ZS1pbmRleChhZGQpOiAk IVxuIjsKCSAgICBwcmludCBHSVQgbWFwIHtwcmludCAiIGEgJF9cbiIgaWYgJFZFUkJPU0UgPiAx OyAiJF9cMCJ9IEBnaXRfYWRkeDsKCSAgICBjbG9zZShHSVQpOwoJfQogICAgfQoKICAgIGlmIChA Z2l0X2RlbCkgewoJcHJpbnQoJCNnaXRfZGVsKzEsIiBmaWxlcyB8IGdpdCB1cGRhdGUtaW5kZXgg LS1yZW1vdmUgLXogLS1zdGRpblxuIikKCSAgICBpZiAkVkVSQk9TRTsKCW9wZW4oR0lULCAnfCBn aXQgdXBkYXRlLWluZGV4IC0tZm9yY2UtcmVtb3ZlIC16IC0tc3RkaW4nKSBvcgoJICAgIGRpZSAi JDAgZ2l0LXVwZGF0ZS1pbmRleChkZWwpOiAkIVxuIjsKCXByaW50IEdJVCBtYXAge3ByaW50ICIg ZCAkX1xuIiBpZiAkVkVSQk9TRSA+IDE7ICIkX1wwIn0gQGdpdF9kZWw7CgljbG9zZShHSVQpOwog ICAgfQoKICAgIGlmIChAZ2l0X3VwZCkgewoJcHJpbnQoJCNnaXRfdXBkKzEsIiBmaWxlcyB8IGdp dCB1cGRhdGUtaW5kZXggLXogLS1zdGRpblxuIikKCSAgICBpZiAkVkVSQk9TRTsKCW9wZW4oR0lU LCAnfCBnaXQgdXBkYXRlLWluZGV4IC16IC0tc3RkaW4nKSBvcgoJICAgIGRpZSAiJDAgZ2l0LXVw ZGF0ZS1pbmRleCh1cGQpOiAkIVxuIjsKCXByaW50IEdJVCBtYXAge3ByaW50ICIgdSAkX1xuIiBp ZiAkVkVSQk9TRSA+IDE7ICIkX1wwIn0gQGdpdF91cGQ7CgljbG9zZShHSVQpOwogICAgfQoKICAg IHByaW50ICJhZGRlZDogJEFkZGVkLCB1bnJlZ2Q6ICREZWxldGVkLCB1cGRhdGVkOiAkVXBkYXRl ZCwgaWdub3JlZDogJElnbm9yZWQiOwogICAgcHJpbnQgIiwgY29uZmxpY3RzOiAkQ29uZmxpY3Rz IiBpZiAkQ29uZmxpY3RzOwogICAgcHJpbnQgIlxuIjsKICAgIGdpdF9wNF9jb21taXQoJGdpdF9o ZWFkLCAkZ2l0X3A0X2hlYWQpIGlmICRBVVRPX0NPTU1JVDsKfQoKZXhpdCAwOwoKc3ViIHJ1bl9v cl9leGl0IHsKICAgIG15ICRyYyA9IHN5c3RlbShAXyk7CiAgICBleGl0KDEyNykgaWYgJHJjICYg MHhmZjsKICAgIGV4aXQoMSkgaWYgJHJjOwogICAgcmV0dXJuIDA7Cn0KCnN1YiBmaWx0ZXJlZCB7 CiAgICBteSAkbmFtZSA9IHNoaWZ0OwogICAgc3R1ZHkoJG5hbWUpOwogICAgbXkgQHBhdGggPSBz cGxpdCgvXC8rL28sICRuYW1lKTsKICAgIG15ICRkaXIgPSAnJzsKICAgICRuYW1lID0gJyc7Cgog ICAgZm9yZWFjaCBteSAkZCAoQHBhdGgpIHsKCSRuYW1lIC49ICRkOwojCXByaW50IFNUREVSUiAi JGRpcjogJG5hbWUgJGRcbiIgaWYgJHY7Cglmb3JlYWNoIG15ICRyZSAoQHskZ2l0aWdub3JlX2Rp cnN7Jy8nfX0pIHsKCSAgICByZXR1cm4gMSBpZiAkbmFtZSA9fiBtLyRyZS87CgkgICAgcmV0dXJu IDEgaWYgJGQgPX4gbS8kcmUvOwoJfQoJaWYgKCBsZW5ndGgoJGRpcikgYW5kIGV4aXN0cygkZ2l0 aWdub3JlX2RpcnN7JGRpcn0pICkgewoJICAgIGZvcmVhY2ggbXkgJHJlIChAeyRnaXRpZ25vcmVf ZGlyc3skZGlyfX0pIHsKCQlyZXR1cm4gMSBpZiAkbmFtZSA9fiBtLyRyZS87CgkJcmV0dXJuIDEg aWYgJGQgPX4gbS8kcmUvOwoJICAgIH0KCX0KCSRuYW1lIC49ICcvJzsKCSRkaXIgPSAkbmFtZTsK ICAgIH0KIyAgICBwcmludCBTVERFUlIgIiRuYW1lIG5vdCBmaWx0ZXJlZFxuIiBpZiAkdjsKICAg IHJldHVybiAwOwp9CgpzdWIgcmVhZF9maWx0ZXJfZmlsZSB7CiAgICBteSBAZmlsdHMgPSAoKTsK ICAgIG15ICRmaWxlID0gc2hpZnQ7CiAgICBpZiAoIG9wZW4obXkgJGlmLCAnPCcsICRmaWxlKSAp IHsKCXByaW50ICJhZGRlZCBpZ25vcmUgZmlsZSAkZmlsZVxuIiBpZiAkVkVSQk9TRTsKCSQvID0g IlxuIjsKCXdoaWxlIChteSAkbCA9IDwkaWY+KSB7CgkgICAgbmV4dCBpZiAkbCA9fiAvXlxzKiMv bzsKCSAgICBuZXh0IGlmICRsID1+IC9eXHMqJC9vOwoJICAgICRsID1+IHMvW1xyXG5dKyQvL3Nv OwoJICAgICRsID1+IHMvXC4vXFwuL2dvOwoJICAgICRsID1+IHMvXCovLiovZ287CgkgICAgaWYg KCAkbCA9fiBtL1wvLyApIHsKCQkkbCA9ICJeJGwoJHwvKSI7CgkgICAgfSBlbHNlIHsKCQkkbCA9 ICIoXnwvKSRsXCQiOwoJICAgIH0KCSAgICBwcmludCAiIGZpbHRlciAkbFxuIiBpZiAkVkVSQk9T RSA+IDE7CgkgICAgcHVzaChAZmlsdHMsIHFyLyRsLyk7Cgl9CgljbG9zZSgkaWYpOwogICAgfQog ICAgcmV0dXJuIFxAZmlsdHM7Cn0KCnN1YiByX3B5c3RyCnsKICAgIG15ICRmZCA9IHNoaWZ0Owog ICAgbXkgKCRsZW4sJHN0cik9KCcnLCcnKTsKICAgIG15ICgkYywkcmQsJGIpID0gKDQsMCwnJyk7 CiAgICB3aGlsZSAoJGMgPiAwKSB7CgkkcmQgPSBzeXNyZWFkKCRmZCwkYiwkYyk7Cgl3YXJuKCJm YWlsZWQgdG8gcmVhZCBsZW46ICQhIiksIHJldHVybiB1bmRlZiBpZiAhZGVmaW5lZCgkcmQpOwoJ d2Fybigibm90IGVub3VnaCBkYXRhIGZvciBsZW4iKSwgcmV0dXJuIHVuZGVmIGlmICEkcmQ7Cgkk bGVuIC49ICRiOwoJJGMgLT0gJHJkOwogICAgfQogICAgJGxlbiA9IHVucGFjaygnVicsJGxlbik7 CiAgICB3aGlsZSAoJGxlbiA+IDApIHsKCSRyZCA9IHN5c3JlYWQoJGZkLCRiLCRsZW4pOwoJd2Fy bigiZmFpbGVkIHRvIHJlYWQgZGF0YTogJCEiKSwgcmV0dXJuIHVuZGVmIGlmICFkZWZpbmVkKCRy ZCk7Cgl3YXJuKCJub3QgZW5vdWdoIGRhdGEiKSwgcmV0dXJuIHVuZGVmIGlmICEkcmQ7Cgkkc3Ry IC49ICRiOwoJJGxlbiAtPSAkcmQ7CiAgICB9CiAgICByZXR1cm4gJHN0cjsKfQoKc3ViIHJlYWRf cHlkaWN0X2VudHJ5CnsKICAgIG15ICRmID0gc2hpZnQ7CiAgICBteSAoJGJ1ZiwkcmQpOwogICAg RklMOiB3aGlsZSAoMSkgewoJIyBvYmplY3QgdHlwZSBpZGVudGlmaWVyCgkkcmQgPSBzeXNyZWFk KCRmLCAkYnVmLCAxKTsKCWxhc3QgRklMIGlmICRyZCA9PSAwOwoJd2FybigicDQ6IG9iamVjdCB0 eXBlOiAkIVxuIiksbGFzdCBpZiAkcmQgIT0gMTsKCSMgJ3snIGlzIGEgcHl0aG9uIG1hcnNoYWxs ZWQgZGljdAoJd2FybigicDQ6IG9iamVjdCB0eXBlOiBub3Qge1xuIiksbGFzdCBpZiAkYnVmIG5l ICd7JzsKCW15ICRlbnQgPSB7fTsKCVBBSVI6IHdoaWxlICgxKSB7CgkgICAgbXkgKCRiLCRrZXkp OwoJICAgICMga2V5IHR5cGUgaWRlbnRpZmllcgoJICAgICRyZCA9IHN5c3JlYWQoJGYsICRiLCAx KTsKCSAgICB3YXJuKCJwNDoga2V5IHR5cGU6ICQhXG4iKSxsYXN0IEZJTCBpZiAkcmQgIT0gMTsK CSAgICBpZiAoJGIgZXEgJ3MnKSB7ICMgbGVuZ3RoLXByZWZpeGVkIHN0cmluZwoJCSRrZXkgPSBy X3B5c3RyKCRmKTsKCQl3YXJuKCJwNDoga2V5OiAkIVxuIiksbGFzdCBGSUwgaWYgIWRlZmluZWQo JGIpOwoJICAgIH0gZWxzaWYgKCRiIGVxICcwJykgeyAjIE5VTEwtZWxlbWVudCwgZW5kIG9mIGVu dHJ5CgkJbGFzdCBQQUlSOwoJICAgIH0gZWxzZSB7CgkJZGllKCJwNDoga2V5IHR5cGU6IG5vdCBz IChzdHJpbmcpXG4iKTsKCQlsYXN0IEZJTDsKCSAgICB9CgkgICAgIyB2YWx1ZSB0eXBlIGlkZW50 aWZpZXIKCSAgICAkcmQgPSBzeXNyZWFkKCRmLCAkYiwgMSk7CgkgICAgd2FybigicDQ6ICRrZXkg dmFsdWUgdHlwZTogJCFcbiIpLGxhc3QgRklMIGlmICRyZCAhPSAxOwoJICAgIGlmICgkYiBlcSAn cycpIHsgIyBsZW5ndGgtcHJlZml4ZWQgc3RyaW5nCgkJJGIgPSByX3B5c3RyKCRmKTsKCQl3YXJu KCJwNDogJGtleSB2YWx1ZTogJCFcbiIpLGxhc3QgRklMIGlmICFkZWZpbmVkKCRiKTsKCQkkZW50 LT57JGtleX0gPSAkYjsKCSAgICB9IGVsc2lmICgkYiBlcSAnaScpIHsgIyA0LWJ5dGUgaW50ZWdl cgoJCSRyZCA9IHN5c3JlYWQoJGYsICRiLCA0KTsKCQl3YXJuKCJwNDogJGtleSB2YWx1ZSBkYXRh OiAkIVxuIiksbGFzdCBGSUwgaWYgJHJkICE9IDQ7CgkJJGVudC0+eyRrZXl9ID0gdW5wYWNrKCdW JywkYik7CgkgICAgfSBlbHNlIHsKCQl3YXJuKCJwNDogJGtleSB2YWx1ZSB0eXBlOiBub3QgcyAo JGIpXG4iKTsKCQlsYXN0IEZJTDsKCSAgICB9Cgl9CglyZXR1cm4gJGVudDsKICAgIH0KICAgIHJl dHVybiB1bmRlZjsKfQoKc3ViIHA0dXNlcl90b19lbnYgewogICAgbXkgJHUgPSBzaGlmdDsKICAg ICRFTlZ7R0lUX0FVVEhPUl9OQU1FfSAgPSAnJzsKICAgICRFTlZ7R0lUX0FVVEhPUl9FTUFJTH0g PSAnJzsKICAgIHJldHVybiBpZiAhZGVmaW5lZCgkdSk7CiAgICBpZiAoIWV4aXN0cygkUDRVU0VS U3skdX0pKSB7CglteSAoJG1haWwsJG5hbWUpID0gZ3JlcCB7L14oRW1haWx8RnVsbE5hbWUpOi99 IHF4e3A0IHVzZXIgLW8gJHV9OwoJaWYgKCQ/ID09IDAgYW5kIGRlZmluZWQoJG1haWwpIGFuZCBk ZWZpbmVkKCRuYW1lKSkgewoJICAgIHMvXlxTKzoJKFteXHJcbl0qKVxyP1xuJC8kMS9zbyBmb3Ig KCRtYWlsLCRuYW1lKTsKCSAgICBpZiAobGVuZ3RoKCRuYW1lKSBhbmQgbGVuZ3RoKCRtYWlsKSkg ewoJCSRQNFVTRVJTeyR1fSA9IHtuYW1lPT4kbmFtZSwgZW1haWw9PiRtYWlsfTsKCSAgICB9Cgl9 CiAgICB9CiAgICBpZiAoJFA0VVNFUlN7JHV9KSB7CgkkcDR1ID0gJFA0VVNFUlN7JHV9OwoJJEVO VntHSVRfQVVUSE9SX05BTUV9ICA9ICRwNHUtPntuYW1lfTsKCSRFTlZ7R0lUX0FVVEhPUl9FTUFJ TH0gPSAkcDR1LT57ZW1haWx9OwogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBwNF9nZXRfY2hh bmdlIHsKICAgIG15ICgkZmQsJHA0KTsKICAgIG15ICRjbCA9IHNoaWZ0OwogICAgaWYgKCFvcGVu KCRmZCwgJz4nLCAiJEdJVF9ESVIvcDQvZmlsZXMiKSkgewoJd2FybiAicDQvZmlsZXM6ICQhXG4i OwoJcmV0dXJuOwogICAgfQogICAgcHJpbnQgJGZkICItb1xuJGNsXG4iOwogICAgY2xvc2UoJGZk KTsKICAgIGlmICghb3BlbigkcDQsICJwNCAteCAkR0lUX0RJUi9wNC9maWxlcyBjaGFuZ2V8Iikp IHsKCXdhcm4gInA0OiBmYWlsZWQgdG8gcmVhZCBwNCBjaGFuZ2UgJGNsOiAkIVxuIjsKCXJldHVy bjsKICAgIH0KICAgIG15IEBjaGFuZ2UgPSA8JHA0PjsKICAgIGNsb3NlKCRwNCk7CiAgICByZXR1 cm4gQGNoYW5nZTsKfQoKc3ViIGNsMm1zZyB7CiAgICBteSAkY2wgPSBzaGlmdDsKICAgIG15KCRv MSwkbzIsJGkpOwogICAgaWYoIW9wZW4oJG8xLCAnPj4nLCAiJEdJVF9ESVIvcDQvbXNnIikpIHsK CXdhcm4gInA0L21zZzogJCFcbiI7CglyZXR1cm47CiAgICB9CiAgICBiaW5tb2RlKCRvMSk7CiAg ICBpZighb3BlbigkbzIsICc+PicsICIkR0lUX0RJUi9wNC9wNG1zZyIpKSB7Cgl3YXJuICJwNC9w NG1zZzogJCFcbiI7CgljbG9zZSgkbzEpOwoJcmV0dXJuCiAgICB9CiAgICBiaW5tb2RlKCRvMik7 CiAgICBpZighb3BlbigkaSwgJy18JywgInA0IGRlc2NyaWJlIC1zICRjbCIpKXsKCXdhcm4gInA0 IGRlc2NyaWJlOiAkIVxuIjsKCWNsb3NlKCRvMSk7CgljbG9zZSgkbzIpOwoJcmV0dXJuCiAgICB9 CiAgICBiaW5tb2RlKCRpKTsKICAgIHByaW50ICRvMSAiJGNsOiAiIGlmICRGVUxMX0RFU0M7CiAg ICBwcmludCAkbzIgIiRjbDogIjsKICAgIG15IEBhOwogICAgbXkgJHUgPSB1bmRlZjsKICAgIHdo aWxlIChteSAkbCA9IDwkaT4pIHsKCWlmICgkbCA9fiAvXkNoYW5nZSBcZCsgYnkgKFxTKylAW14g XSogb24gKFteXHJcbl0qKS9zbykgewoJICAgICR1ID0gJDE7CgkgICAgJEVOVntHSVRfQVVUSE9S X0RBVEV9ID0gJDIgaWYgbGVuZ3RoKCQyKTsKCX0KCWxhc3QgaWYgJEZVTExfREVTQyA8IDIgYW5k ICRsID1+IC9eXHMqQWZmZWN0ZWQgZmlsZXMgXC57M31ccyokL3NvOwoJJGwgPX4gcy9ccj9cbiQv L3NvOwoJcHVzaCBAYSwgJGw7CiAgICB9CiAgICBjbG9zZSgkaSk7CiAgICBwcmludCAkbzIgc3Vi c3RyKCRhWzJdLDEpLCJcbiI7ICMgcDQgc2lkZS1icmFuY2ggY29tbWl0IGRlc2NyaXB0aW9uCiAg ICBjbG9zZSgkbzIpOwogICAgIyBpbXBvcnQgYnJhbmNoIGNvbW1pdCBkZXNjcmlwdGlvbgogICAg aWYgKCRGVUxMX0RFU0MgPiAxKSB7CgkjIGRlc2MgbGV2ZWwgMis6IGtlZXAgdGhlIENoYW5nZSBs aW5lCglwcmludCAkbzEgbWFwIHsiJF9cbiJ9IChzdWJzdHIoJGFbMl0sMSksIlxuIixAYSk7CiAg ICB9IGVsc2UgewoJIyBsZXZlbHMgMCBhbmQgMTogcmVtb3ZlIHRoZSBDaGFuZ2UgbGluZQoJcHJp bnQgJG8xIG1hcCB7IChsZW5ndGgoJF8pID8gc3Vic3RyKCRfLDEpOicnKS4iXG4iIH0gQGFbMi4u JCNhXTsKICAgIH0KICAgIGNsb3NlKCRvMSk7CiAgICBwNHVzZXJfdG9fZW52KCR1KTsKfQoKIyBs b29rcyBmb3IgcDRpbXBvcnQvIGNvbW1pdCB3aGljaCBwb2ludHMgdG8gdGhlIGdpdmVuIHJlZmVy ZW5jZQojIHJldHVybnMgdW5kZWYgaWYgbm90IGZvdW5kCnN1YiBnaXRfZmluZF9wNGluZm8gewog ICAgbXkgJGJyYW5jaCA9IHNoaWZ0OwogICAgaWYgKCElUDRJTVBPUlRfSEVBRFMpIHsKCWZvcmVh Y2ggbXkgJGwgKHF4e2dpdCBzaG93LXJlZn0pIHsKCSAgICAkUDRJTVBPUlRfSEVBRFN7JDJ9ID0g JDEKCQlpZiAkbCA9fiBtIV4oWzAtOWEtZl17NDB9KSByZWZzLyhwNGltcG9ydC9bXlxyXG5dKylc cj9cbiFzbzsKCX0KICAgIH0KICAgIG15ICgkY29tbWl0LCRwYXJlbnQsJHA0Y29tbWl0LCRwNHBh cmVudCk7CiAgICBteSAkciA9IGdpdF9yZXZfcGFyc2UoJGJyYW5jaCk7CiAgICByZXR1cm4gdW5k ZWYgaWYgIWRlZmluZWQoJHIpOwogICAgd2hpbGUgKG15ICgkaywkcDRoZWFkKSA9IGVhY2ggJVA0 SU1QT1JUX0hFQURTKSB7CglteSAkY29tbWl0OwoJZG8gewoJICAgIHByaW50ICJ0cnlpbmcgJGs6 JHA0aGVhZFxuIiBpZiAkVkVSQk9TRSA+MzsKCSAgICAoJGNvbW1pdCwkcDRoZWFkKSA9CgkJZ3Jl cCB7IHMvXnBhcmVudCAoWzAtOWEtZl17NDB9KS4qLyQxL3MgfQoJCXF4e2dpdCBjYXQtZmlsZSBj b21taXQgJHA0aGVhZH07CgkgICAgJGNvbW1pdCA9ICRwNGhlYWQgPSAnJyBpZiAkPzsKCSAgICBy ZXR1cm4gJHA0aGVhZCBpZiAkY29tbWl0IGVxICRyOwoJfSB3aGlsZSAoZGVmaW5lZCgkcDRoZWFk KSAmJiBsZW5ndGgoJHA0aGVhZCkpOwogICAgfQogICAgd2FybiAiJGJyYW5jaCBpcyBub3QgaW1w b3J0ZWQgZnJvbSBQZXJmb3JjZVxuIjsKICAgIHJldHVybiB1bmRlZjsKfQoKc3ViIGdpdF9nZXRf cDRoYXZlIHsKICAgIG15ICRwNGhlYWQgPSBzaGlmdDsKICAgIG15ICRwNGhhdmUgPSB1bmRlZjsK ICAgIGlmIChkZWZpbmVkKCRwNGhlYWQpIGFuZCBsZW5ndGgoJHA0aGVhZCkgYW5kCglvcGVuKG15 ICRmLCAnLXwnLCAiZ2l0IGNhdC1maWxlIGJsb2IgJHA0aGVhZDpoYXZlIikpIHsKCW15ICRvbGQg PSAkLzsKCSQvID0gIlwwIjsKCW15ICRjbnQgPSAwOwoJd2hpbGUoMSkgewoJICAgIG15ICRwNG5h bWUgPSA8JGY+OwoJICAgIGxhc3QgaWYgIWRlZmluZWQoJHA0bmFtZSk7CgkgICAgJHA0bmFtZSA9 fiBzL14uLy9zbyBpZiAkY250OyAjIHJlbW92ZSBcbgoJICAgIG15ICRuYW1lID0gPCRmPjsKCSAg ICBteSAkcmV2ID0gPCRmPjsKCSAgICBsYXN0IGlmICFkZWZpbmVkKCRuYW1lKSBvciAhZGVmaW5l ZCgkcmV2KTsKCSAgICBjaG9wKCRwNG5hbWUsJG5hbWUsJHJldik7CgkgICAgKyskY250OwoJICAg IGlmIChkZWZpbmVkKCRwNGhhdmUpKSB7CgkJJHA0aGF2ZS0+eyRwNG5hbWV9ID0gWyRuYW1lLCRy ZXZdOwoJICAgIH0gZWxzZSB7CgkJJHA0aGF2ZSA9IHskcDRuYW1lPT5bJG5hbWUsJHJldl19OwoJ ICAgIH0KCX0KCSQvID0gJG9sZDsKCWNsb3NlKCRmKTsKCXByaW50ICJsb2FkZWQgJGNudCByZXZp c2lvbnMgZnJvbSAkcDRoZWFkXG4iIGlmICRWRVJCT1NFOwogICAgfQogICAgcmV0dXJuICRwNGhh dmU7Cn0KCnN1YiBwNF9nZXRfaGF2ZSB7CiAgICBwcmludCAicmVhZGluZyBzdGF0ZSBvZiAkUDRD TElFTlRcbiIgaWYgJFZFUkJPU0U7CiAgICBteSAoJHA0aGF2ZSwgJGZkaSk7CiAgICBvcGVuKCRm ZGksICJwNCAtRyAtYyAkUDRDTElFTlQgLUggJFA0SE9TVCAtZCAkUDRST09UIGhhdmV8Iikgb3IK CWRpZSAicDQgaGF2ZTogJCFcbiI7CiAgICBiaW5tb2RlKCRmZGkpOwogICAgbXkgKCRlcnIsJGVu dCkgPSAoMCx1bmRlZik7CiAgICB3aGlsZSAoZGVmaW5lZCgkZW50PXJlYWRfcHlkaWN0X2VudHJ5 KCRmZGkpKSkgewoJaWYgKGRlZmluZWQoJGVudC0+e2NvZGV9KSBhbmQgZGVmaW5lZCgkZW50LT57 ZGF0YX0pKSB7CgkgICAgKyskZXJyIGlmICRlbnQtPntjb2RlfSBlcSAnZXJyb3InOwoJICAgIHBy aW50IFNUREVSUiAicDQ6ICRlbnQtPntjb2RlfTogJGVudC0+e2RhdGF9XG4iOwoJICAgIG5leHQ7 Cgl9CgluZXh0IGlmICFkZWZpbmVkKCRlbnQtPntkZXBvdEZpbGV9KTsKCW5leHQgaWYgIWRlZmlu ZWQoJGVudC0+e2NsaWVudEZpbGV9KTsKCWlmIChkZWZpbmVkKCRwNGhhdmUpKSB7CgkgICAgJHA0 aGF2ZS0+eyRlbnQtPntkZXBvdEZpbGV9fT1bJGVudC0+e2NsaWVudEZpbGV9LCRlbnQtPntoYXZl UmV2fV07Cgl9IGVsc2UgewoJICAgICRwNGhhdmU9eyQkZW50LT57ZGVwb3RGaWxlfT0+WyRlbnQt PntjbGllbnRGaWxlfSwkZW50LT57aGF2ZVJldn1dfTsKCX0KICAgIH0KICAgIGNsb3NlKCRmZGkp OwogICAgcmV0dXJuICRwNGhhdmU7Cn0KCnN1YiBnaXRfcDRfaW5pdCB7CiAgICBteSAoJGNvbW1p dCwkcGFyZW50LCRwNGNvbW1pdCwkcDRwYXJlbnQpOwogICAgbXkgJEhFQUQgPSBnaXRfcmV2X3Bh cnNlKCdIRUFEJyk7CiAgICAkSEVBRCA9ICcnIGlmICFkZWZpbmVkKCRIRUFEKTsKICAgIG15ICRw NGhlYWQgPSBnaXRfcmV2X3BhcnNlKCJyZWZzL3A0aW1wb3J0LyRQNENMSUVOVCIpOwogICAgJHA0 aGVhZCA9ICcnIGlmICFkZWZpbmVkKCRwNGhlYWQpOwogICAgZGllICJObyBIRUFEIGNvbW1pdCEg UmVmdXNpbmcgdG8gaW1wb3J0LlxuIiBpZiAhbGVuZ3RoKCRIRUFEKTsKICAgIGlmIChsZW5ndGgo JHA0aGVhZCkpIHsKCSgkY29tbWl0LCRwNHBhcmVudCkgPQoJICAgIGdyZXAgeyBzL15wYXJlbnQg KC57NDB9KS4qLyQxL3MgfQoJICAgIHF4e2dpdCBjYXQtZmlsZSBjb21taXQgJHA0aGVhZH07Cgkk Y29tbWl0ID0gJHA0cGFyZW50ID0gJycgaWYgJD87CgkkcDRwYXJlbnQgPSAnJyBpZiAhZGVmaW5l ZCgkcDRwYXJlbnQpOwogICAgfSBlbHNlIHsKCSRjb21taXQgPSAkcDRwYXJlbnQgPSAnJzsKICAg IH0KICAgIHdoaWxlICgoJGNvbW1pdCBuZSAkSEVBRCkgYW5kIGxlbmd0aCgkcDRwYXJlbnQpKSB7 CgkkcDRoZWFkID0gJHA0cGFyZW50OwoJKCRjb21taXQsJHA0cGFyZW50KSA9CgkgICAgZ3JlcCB7 IHMvXnBhcmVudCAoLns0MH0pLiovJDEvc28gfQoJICAgIHF4e2dpdCBjYXQtZmlsZSBjb21taXQg JHA0aGVhZH07CgkkY29tbWl0ID0gJHA0cGFyZW50ID0gJycgaWYgJD87CgkkcDRwYXJlbnQgPSAn JyBpZiAhZGVmaW5lZCgkcDRwYXJlbnQpOwoJaWYgKCRWRVJCT1NFIGFuZCAoJEhFQUQgZXEgJGNv bW1pdCkpIHsKCSAgICBwcmludCAiZm91bmQgcDQgaW1wb3J0IGNvbW1pdCAiOwoJICAgIHN5c3Rl bSgnZ2l0JywnbmFtZS1yZXYnLCRwNGhlYWQpOwoJfQogICAgfQogICAgaWYgKCRIRUFEIG5lICRj b21taXQpIHsKCSRIRUFEX0ZST01fUDQgPSAwOwoJd2FybiAiQ3VycmVudCBIRUFEIGlzIG5vdCBm cm9tICRQNENMSUVOVCwgZG9pbmcgZnVsbCBpbXBvcnRcbiI7CiAgICB9IGVsc2UgewoJJEhFQURf RlJPTV9QNCA9IDE7CiAgICB9CiAgICBteSAkcDRoYXZlID0gdW5kZWY7CiAgICBpZiAoISRGVUxM X0lNUE9SVCBhbmQgKCRIRUFEIGVxICRjb21taXQpIGFuZCBsZW5ndGgoJHA0aGVhZCkpIHsKCWlm IChvcGVuKG15ICRmLCAnLXwnLCAiZ2l0IGNhdC1maWxlIGJsb2IgJHA0aGVhZDpoYXZlIikpIHsK CSAgICBteSAkb2xkID0gJC87CgkgICAgJC8gPSAiXDAiOwoJICAgIG15ICRjbnQgPSAwOwoJICAg IHdoaWxlKDEpIHsKCQlteSAkcDRuYW1lID0gPCRmPjsKCQlsYXN0IGlmICFkZWZpbmVkKCRwNG5h bWUpOwoJCSRwNG5hbWUgPX4gcy9eLi8vc28gaWYgJGNudDsgIyByZW1vdmUgXG4KCQlteSAkbmFt ZSA9IDwkZj47CgkJbXkgJHJldiA9IDwkZj47CgkJbGFzdCBpZiAhZGVmaW5lZCgkbmFtZSkgb3Ig IWRlZmluZWQoJHJldik7CgkJY2hvcCgkcDRuYW1lLCRuYW1lLCRyZXYpOwoJCSsrJGNudDsKCQlp ZiAoZGVmaW5lZCgkcDRoYXZlKSkgewoJCSAgICAkcDRoYXZlLT57JHA0bmFtZX0gPSBbJG5hbWUs JHJldl07CgkJfSBlbHNlIHsKCQkgICAgJHA0aGF2ZSA9IHskcDRuYW1lPT5bJG5hbWUsJHJldl19 OwoJCX0KCSAgICB9CgkgICAgJC8gPSAkb2xkOwoJICAgIGNsb3NlKCRmKTsKCSAgICBwcmludCAi bG9hZGVkICRjbnQgcmV2aXNpb25zIGZyb20gJHA0aGVhZFxuIiBpZiAkVkVSQk9TRTsKCX0KICAg IH0KICAgIHJldHVybiAoJEhFQUQsICRwNGhlYWQsICRwNGhhdmUpOwp9CgpzdWIgZ2V0X29uZV9s aW5lIHsKICAgIG15ICgkbGluZSkgPSBxeHtAX307CiAgICByZXR1cm4gdW5kZWYgaWYgJD87CiAg ICAkbGluZSA9ICcnIGlmICFkZWZpbmVkKCRsaW5lKTsKICAgICRsaW5lID1+IHMvXHI/XG4vL2dz OwogICAgcmV0dXJuICRsaW5lOwp9CgpzdWIgZ2l0X3Jldl9wYXJzZSB7CiAgICByZXR1cm4gZ2V0 X29uZV9saW5lKCdnaXQnLCAncmV2LXBhcnNlJywgc2hpZnQpOwp9CgpzdWIgZ2l0X3dyaXRlX3Ry ZWUgewogICAgbXkgJHNoYTEgPSBnZXRfb25lX2xpbmUoJ2dpdCcsJ3dyaXRlLXRyZWUnKTsKICAg IHJldHVybiB1bmRlZiBpZiAhZGVmaW5lZCgkc2hhMSkgb3IgIWxlbmd0aCgkc2hhMSk7CiAgICBy ZXR1cm4gJHNoYTE7Cn0KCnN1YiBnaXRfY29tbWl0X3RyZWUgewogICAgbXkgJHNoYTEgPSBnZXRf b25lX2xpbmUoJ2dpdCcsJ2NvbW1pdC10cmVlJyxAXyk7CiAgICByZXR1cm4gdW5kZWYgaWYgIWRl ZmluZWQoJHNoYTEpIG9yICFsZW5ndGgoJHNoYTEpOwogICAgcmV0dXJuICRzaGExOwp9CgpzdWIg Z2l0X2hhc2hfc3RkaW4gewogICAgbXkgJHNoYTEgPSBnZXRfb25lX2xpbmUoJ2dpdCcsJ2hhc2gt b2JqZWN0JywnLXQnLCdibG9iJywnLXcnLCctLXN0ZGluJyk7CiAgICByZXR1cm4gdW5kZWYgaWYg IWRlZmluZWQoJHNoYTEpIG9yICFsZW5ndGgoJHNoYTEpOwogICAgcmV0dXJuICRzaGExOwp9Cgpz dWIgZ2l0X2hhc2hfZmlsZSB7CiAgICBvcGVuKFNURElOLCAnPCcsICRfWzBdKSBvciBkaWUgIiQw OiBnaXRfaGFzaF9maWxlICRfWzBdOiAkIVxuIjsKICAgIHJldHVybiBnaXRfaGFzaF9zdGRpbigp Owp9CgpzdWIgZ2l0X3VwZGF0ZV9yZWZfZGlyZWN0bHkgewogICAgcmV0dXJuIHN5c3RlbSgnZ2l0 JywndXBkYXRlLXJlZicsQF8pOwp9CnN1YiBnaXRfdXBkYXRlX3JlZiB7CiAgICBteSAoJG1zZywk cmVmbmFtZSwkcmVmdmFsKSA9IEBfOwogICAgaWYgKCRyZWZuYW1lID1+IG0hXihPUklHX3xGRVRD SF98TUVSR0VfKT9IRUFEJCFvKSB7fQogICAgZWxzaWYgKCRyZWZuYW1lID1+IHMhXi8rISFvKSB7 fQogICAgZWxzaWYgKCRyZWZuYW1lID1+IG0hXnJlZnMvIW8pIHt9CiAgICBlbHNpZiAoJHJlZm5h bWUgPX4gbSFeKGhlYWRzfHJlbW90ZXN8dGFnc3xwNGltcG9ydCkvIW8pIHsKCSRyZWZuYW1lID0g InJlZnMvJHJlZm5hbWUiCiAgICB9IGVsc2UgeyAkcmVmbmFtZSA9ICJyZWZzL2hlYWRzLyRyZWZu YW1lIiB9CiAgICBwcmludCBTVERFUlIgIlVwZGF0aW5nICRyZWZuYW1lIHdpdGggJHJlZnZhbFxu IiBpZiAkVkVSQk9TRSA+IDE7CiAgICByZXR1cm4gZ2l0X3VwZGF0ZV9yZWZfZGlyZWN0bHkoJy1t JywkbXNnLCRyZWZuYW1lLCRyZWZ2YWwpOwp9CgpzdWIgZ2l0X3A0X2NvbW1pdCB7CiAgICBteSAo JEhFQUQsICRwNGhlYWQpID0gQF87CiAgICBteSAoJGNvbW1pdCwkcGFyZW50LCRwNGNvbW1pdCwk cDRwYXJlbnQpOwoKICAgIG15ICgkZmRvLCRmZGksJHJjKTsKICAgICRyYyA9IHN5c3RlbSgnZ2l0 JywnZGlmZi1pbmRleCcsJy0tZXhpdC1jb2RlJywnLS1xdWlldCcsJy0tY2FjaGVkJywnSEVBRCcp OwogICAgaWYgKCRyYyA9PSAwKSB7Cgl3YXJuKCJObyBjaGFuZ2VzXG4iKTsKCXJldHVybjsKICAg IH0KCiAgICByZXR1cm4gaWYgJERSWVJVTjsKCiAgICBpZiAoIUBERVNDICYmICEkRURJVF9DT01N SVQpIHsKCXdhcm4gIiQwOiBubyBjb21taXQgZGVzY3JpcHRpb24gZ2l2ZW5cbiI7CglyZXR1cm47 CiAgICB9CgogICAgbXkgJHA0eCA9ICIkR0lUX0RJUi9wNC9pZHgudG1wIjsKICAgIHVubGluaygk cDR4KTsKCiAgICAkRU5We1BBR0VSfSA9ICdjYXQnOwoKICAgIGlmICghZGVmaW5lZCgkU1BFQykg b3IgIW9wZW4oU1RESU4sICc8JywgJFNQRUMpKSB7CglpZiAoICReTyBlcSAnTVNXaW4zMicgKSB7 CgkgICAgb3BlbihTVERJTiwgJzwnLCAnTlVMJykgb3IgZGllICIkU1BFQzogJCFcbiI7Cgl9IGVs c2UgewoJICAgIG9wZW4oU1RESU4sICc8JywgJy9kZXYvbnVsbCcpIG9yIGRpZSAiJFNQRUM6ICQh XG4iOwoJfQogICAgfQogICAgbXkgJHA0c3BlYyA9IGdpdF9oYXNoX3N0ZGluKCk7CiAgICBkaWUg IkZhaWxlZCB0byBzdG9yZSAkU1BFQyBpbiBnaXQgcmVwb1xuIiBpZiAhZGVmaW5lZCgkcDRzcGVj KTsKCiAgICBteSAkcDRjbG50ID0gZ2l0X2hhc2hfZmlsZSgiJEdJVF9ESVIvcDQvY2xpZW50LmRl ZiIpOwogICAgZGllICJGYWlsZWQgdG8gc2F2ZSBtYXBwaW5ncyBvZiAkUDRDTElFTlQgaW4gZ2l0 IHJlcG8iIGlmICFkZWZpbmVkKCRwNGNsbnQpOwoKICAgIGlmICghZGVmaW5lZCgkUDRIQVZFX0ZJ TEUpKSB7CglwcmludCAicmVhZGluZyBzdGF0ZSBvZiAkUDRDTElFTlRcbiIgaWYgJFZFUkJPU0U7 CgkkUDRIQVZFX0ZJTEUgPSAiJEdJVF9ESVIvcDQvaGF2ZSI7CglvcGVuKCRmZG8sICc+JywgJFA0 SEFWRV9GSUxFKSBvciBkaWUgInA0L2hhdmU6ICQhXG4iOwoJYmlubW9kZSgkZmRvKTsKCW9wZW4o JGZkaSwgInA0IC1HIC1jICRQNENMSUVOVCAtSCAkUDRIT1NUIC1kICRQNFJPT1QgaGF2ZXwiKSBv cgoJICAgIGRpZSAicDQgaGF2ZTogJCFcbiI7CgliaW5tb2RlKCRmZGkpOwoJbXkgKCRjbnQsJGVy ciwkZW50KSA9ICgwLDAsdW5kZWYpOwoJd2hpbGUgKGRlZmluZWQoJGVudD1yZWFkX3B5ZGljdF9l bnRyeSgkZmRpKSkpIHsKCSAgICBpZiAoZGVmaW5lZCgkZW50LT57Y29kZX0pIGFuZCBkZWZpbmVk KCRlbnQtPntkYXRhfSkpIHsKCQkrKyRlcnIgaWYgJGVudC0+e2NvZGV9IGVxICdlcnJvcic7CgkJ cHJpbnQgU1RERVJSICdwNDogJy4kZW50LT57Y29kZX0uJzogJy4kZW50LT57ZGF0YX0uIlxuIjsK CQluZXh0OwoJICAgIH0KCSAgICBuZXh0IGlmICFkZWZpbmVkKCRlbnQtPntkZXBvdEZpbGV9KTsK CSAgICBuZXh0IGlmICFkZWZpbmVkKCRlbnQtPntjbGllbnRGaWxlfSk7CgkgICAgKyskY250OwoJ ICAgIHByaW50ICRmZG8gIiRlbnQtPntkZXBvdEZpbGV9XDAiLAoJCSAgICAgICAiJGVudC0+e2Ns aWVudEZpbGV9XDAiLAoJCSAgICAgICAiJGVudC0+e2hhdmVSZXZ9XDBcbiI7Cgl9CgljbG9zZSgk ZmRpKTsKCWNsb3NlKCRmZG8pOwoJZXhpdCAxIGlmICRlcnI7ICMgdGhlIGVycm9yIGFscmVhZHkg cmVwb3J0ZWQKCWRpZSAiVGhlIGNsaWVudCAkUDRDTElFTlQgaGFzIG5vdGhpbmdcbiIgaWYgISRj bnQ7CiAgICB9CgogICAgbXkgJHA0aGF2ZSA9IGdpdF9oYXNoX2ZpbGUoJFA0SEFWRV9GSUxFKTsK ICAgIGRpZSAiRmFpbGVkIHRvIHNhdmUgc3RhdGUgb2YgJFA0Q0xJRU5UIGluIGdpdCByZXBvIiBp ZiAhZGVmaW5lZCgkcDRoYXZlKTsKCiAgICAjCiAgICAjIFByZXBhcmUgY29tbWl0IG1lc3NhZ2Vz CiAgICAjCiAgICB1bmxpbmsoIiRHSVRfRElSL3A0L21zZyIsICIkR0lUX0RJUi9wNC9wNG1zZyIp OwogICAgb3BlbigkZmRvLCAnPicsICIkR0lUX0RJUi9wNC9tc2ciKTsgY2xvc2UoJGZkbyk7CiAg ICBvcGVuKCRmZG8sICc+JywgIiRHSVRfRElSL3A0L3A0bXNnIik7IGNsb3NlKCRmZG8pOwoKICAg IGZvcmVhY2ggbXkgJGkgKEBERVNDKSB7CgkkaSA9fiBzL14oLikvL287CglpZiAoJ2MnIGVxICQx KSB7CgkgICAgcHJpbnQgInJlYWRpbmcgY2hhbmdlcyBmb3IgJGlcbiIgaWYgJFZFUkJPU0U7Cgkg ICAgY2wybXNnKCRpKTsKCX0gZWxzaWYgKCdmJyBlcSAkMSkgewoJICAgIG15KCRvMSwkbzIsJGkp OwoJICAgIGlmIChvcGVuKCRvMSwgJz4+JywgIiRHSVRfRElSL3A0L21zZyIpKSB7CgkJaWYgKG9w ZW4oJG8yLCAnPj4nLCAiJEdJVF9ESVIvcDQvcDRtc2ciKSkgewoJCSAgICBpZiAob3BlbigkaSwg JzwnLCAkaSkpIHsKCQkJbXkgJG4gPSAwOwoJCQl3aGlsZSg8JGk+KSB7CgkJCSAgICAkbisrOwoJ CQkgICAgcHJpbnQgJG8xICRfOwoJCQkgICAgcHJpbnQgJG8yICRfIGlmICRuID09IDE7CgkJCX0K CQkJY2xvc2UoJGkpOwoJCSAgICB9CgkJICAgIGNsb3NlKCRvMik7CgkJfQoJCWNsb3NlKCRvMSk7 CgkgICAgfQoJfSBlbHNpZiAoJzQnIGVxICQxKSB7CgkgICAgcHJpbnQgInJlYWRpbmcgY2hhbmdl cyBmb3IgJGlcbiIgaWYgJFZFUkJPU0U7CgkgICAgbXkgJGNoYW5nZSA9IGdldF9vbmVfbGluZSgn cDQnLCAnY2hhbmdlcycsICctbTEnLCAkaSk7CgkgICAgaWYgKCFkZWZpbmVkKCRjaGFuZ2UpIG9y ICRjaGFuZ2UgIX4gbS9ccysoXGQrKVxzLykgewoJCWRpZSAiJGkgZG9lcyBub3QgcmVzb2x2ZSBp bnRvIGEgY2hhbmdlIG51bWJlclxuIjsKCSAgICB9CgkgICAgY2wybXNnKCQxKTsKCX0KICAgIH0K ICAgIHN5c3RlbSgiJGVkaXRvciAkR0lUX0RJUi9wNC9tc2ciKSBpZiAkRURJVF9DT01NSVQ7Cgog ICAgIyBjb3B5IG1pcnJvci1icmFuY2ggY29tbWl0IG1lc3NhZ2UgaW50byBzaWRlLWJyYW5jaAog ICAgIyBjb21taXQgbWVzc2FnZSBpZiBubyBvdGhlciBkZXNjcmlwdGlvbiB3ZXJlIGdpdmVuLgog ICAgaWYgKCEtcyAiJEdJVF9ESVIvcDQvcDRtc2ciKSB7CglvcGVuKCRmZGksICc8JywgIiRHSVRf RElSL3A0L21zZyIpIG9yIGRpZSAiJEdJVF9ESVIvcDQvbXNnOiAkIVxuIjsKCXN5c3JlYWQoJGZk aSwkYnVmLC1zICIkR0lUX0RJUi9wNC9tc2ciKTsKCWNsb3NlKCRmZGkpOwoJb3BlbigkZmRvLCAn Pj4nLCAiJEdJVF9ESVIvcDQvcDRtc2ciKSBvciBkaWUgIiRHSVRfRElSL3A0L3A0bXNnOiAkIVxu IjsKCXN5c3dyaXRlKCRmZG8sJGJ1Zik7CgljbG9zZSgkZmRvKTsKICAgIH0KCiAgICAjCiAgICAj IFN0b3JlIHRoZSBpbXBvcnRlZCBmaWxlIGRhdGEKICAgICMKCiAgICBpZiAoJFZFUkJPU0UgPCAy KSB7CglpZiAoICReTyBlcSAnTVNXaW4zMicgKSB7IG9wZW4oU1RERVJSLCAiTlVMIikgfQoJZWxz ZSB7IG9wZW4oU1RERVJSLCAiL2Rldi9udWxsIikgfQogICAgfQoKICAgIG15ICRyZW1vdmVfbWVy Z2VfaGVhZHMgPSAwOwogICAgbXkgJHRyZWUgPSBnaXRfd3JpdGVfdHJlZSgpOwogICAgZGllICJm YWlsZWQgdG8gd3JpdGUgY3VycmVudCB0cmVlXG4iIGlmICFkZWZpbmVkKCR0cmVlKTsKICAgIG9w ZW4oU1RESU4sICc8JywgIiRHSVRfRElSL3A0L21zZyIpIG9yIGRpZSAicDQvbXNnOiAkIVxuIjsK ICAgIGlmIChsZW5ndGgoJEhFQUQpKSB7CglteSBAbWVyZ2VwYXJlbnRzOwoJaWYgKG9wZW4oJGZk LCAnPCcsICIkR0lUX0RJUi9NRVJHRV9IRUFEIikpIHsKCSAgICB3aGlsZSg8JGZkPikgewoJCXMv XHI/XG4kLy9nczsKCQlwdXNoKEBtZXJnZXBhcmVudHMsICctcCcsICRfKSBpZiAvXlswLTlhLWZd ezQwfSQvOwoJICAgIH0KCSAgICBjbG9zZSgkZmQpOwoJfQoJJGNvbW1pdCA9IGdpdF9jb21taXRf dHJlZSgkdHJlZSwgJy1wJywgJEhFQUQsIEBtZXJnZXBhcmVudHMpOwoJZGllICJmYWlsZWQgdG8g Y29tbWl0IHRoZSBtZXJnZWQgdHJlZVxuIiBpZiAhZGVmaW5lZCgkY29tbWl0KTsKCSRyZW1vdmVf bWVyZ2VfaGVhZHMgPSAxIGlmIEBtZXJnZXBhcmVudHM7CiAgICB9IGVsc2UgewoJJGNvbW1pdCA9 IGdpdF9jb21taXRfdHJlZSgkdHJlZSk7CglkaWUgImZhaWxlZCB0byBjb21taXQgY3VycmVudCB0 cmVlXG4iIGlmICFkZWZpbmVkKCRjb21taXQpOwogICAgfQogICAgcHJpbnQgImN1cnJlbnQgdHJl ZSBzdG9yZWQgaW4gY29tbWl0ICRjb21taXRcbiIgaWYgJFZFUkJPU0U7CgogICAgIwogICAgIyBT dG9yaW5nIGltcG9ydCBjb250cm9sIGRhdGEKICAgICMKICAgICRFTlZ7R0lUX0lOREVYX0ZJTEV9 ID0gJHA0eDsKICAgIG9wZW4oJGZkbywgJ3wtJywgJ2dpdCB1cGRhdGUtaW5kZXggLS1hZGQgLS1p bmRleC1pbmZvJykgb3IKCWRpZSAiY291bGQgbm90IHN0YXJ0IGdpdCB1cGRhdGUtaW5kZXhcbiI7 CiAgICBiaW5tb2RlKCRmZG8pOwogICAgcHJpbnQgJGZkbyAiMTAwNjQ0ICRwNHNwZWNcdHNwZWNc biI7CiAgICBwcmludCAkZmRvICIxMDA2NDQgJHA0Y2xudFx0Y2xpZW50XG4iOwogICAgcHJpbnQg JGZkbyAiMTAwNjQ0ICRwNGhhdmVcdGhhdmVcbiI7CiAgICBjbG9zZSgkZmRvKTsKICAgIGlmKCQ/ KSB7CglkaWUgIkZhaWxlZCB0byBzdG9yZSAkU1BFQyBpbiBwNGltcG9ydCBpbmRleCBhbmQgZ2l0 IHJlcG9cbiIuCgkgICAgIkZhaWxlZCB0byBzYXZlIG1hcHBpbmdzIG9mICRQNENMSUVOVCBpbiBw NGltcG9ydCBpbmRleCBhbmQgZ2l0IHJlcG9cbiIuCgkgICAgIkZhaWxlZCB0byBzYXZlIHN0YXRl IG9mICRQNENMSUVOVCBpbiBwNGltcG9ydCBpbmRleCBhbmQgZ2l0IHJlcG9cbiIKICAgIH0KICAg IG15ICRwNHRyZWUgPSBnaXRfd3JpdGVfdHJlZSgpOwogICAgZGllICJGYWlsZWQgdG8gc3RvcmUg JFNQRUMgKHRyZWUpIGluIGdpdCByZXBvXG4iIGlmICQ/OwoKICAgICMgQmluZCBpbXBvcnQgY29u dHJvbCBkYXRhIHRvIHRoZSBmaWxlIGRhdGEKICAgIG9wZW4oU1RESU4sICc8JywgIiRHSVRfRElS L3A0L3A0bXNnIikgb3IgZGllICJwNC9wNG1zZzogJCFcbiI7CiAgICAkcDRjb21taXQgPSBsZW5n dGgoJHA0aGVhZCkgPwoJZ2l0X2NvbW1pdF90cmVlKCRwNHRyZWUsICctcCcsICRjb21taXQsICct cCcsICRwNGhlYWQpOgoJZ2l0X2NvbW1pdF90cmVlKCRwNHRyZWUsICctcCcsICRjb21taXQpOwog ICAgZGllICJGYWlsZWQgdG8gc3RvcmUgJFNQRUMgKGNvbW1pdCkgaW4gZ2l0IHJlcG9cbiIgaWYg JD87CgogICAgIyBGaW5pc2hpbmcgdG91Y2hlczogdXBkYXRlIHJlZmVyZW5jZXMKICAgIGlmICgh JERSWVJVTikgewoJZ2l0X3VwZGF0ZV9yZWYoJ2JhY2t1cCByZWYgb2YgY3VycmVudCBicmFuY2gn LCcvcDQvYmFja3VwLUhFQUQnLCdIRUFEJyk7CglnaXRfdXBkYXRlX3JlZignYmFja3VwIHJlZiBv ZiBwNGltcG9ydCcsCgkJICAgICAgICcvcDQvYmFja3VwLXA0aW1wb3J0JywicmVmcy9wNGltcG9y dC8kUDRDTElFTlQiKTsKCSRyYyA9IGdpdF91cGRhdGVfcmVmKCdkYXRhIG9mIHA0aW1wb3J0Jywn SEVBRCcsJGNvbW1pdCk7CglkaWUgIkZhaWxlZCB0byB1cGRhdGUgSEVBRFxuIiBpZiAkcmM7Cgl1 bmxpbmsoIiRHSVRfRElSL01FUkdFX0hFQUQiKSBpZiAkcmVtb3ZlX21lcmdlX2hlYWRzOwoJJHJj ID0gZ2l0X3VwZGF0ZV9yZWYoJ3A0aW1wb3J0JywicDRpbXBvcnQvJFA0Q0xJRU5UIiwkcDRjb21t aXQpOwoJZGllICJGYWlsZWQgdG8gc3RvcmUgJFNQRUMgKHJlZmVyZW5jZSkgaW4gZ2l0IHJlcG9c biIgaWYgJHJjOwogICAgfQoKICAgICRFTlZ7R0lUX1BBR0VSfSA9ICdjYXQnOwogICAgaWYgKCRW RVJCT1NFKSB7CglwcmludCBTVERPVVQgKGdyZXAge3MvXHI/XG4vL2dzO3MvLio/XHMvL30gcXh7 Z2l0IG5hbWUtcmV2IHJlZnMvcDRpbXBvcnQvJFA0Q0xJRU5UfSksICI6XG4iOwoJc3lzdGVtKCdn aXQnLCdsb2cnLCctLW1heC1jb3VudD0xJywnLS1wcmV0dHk9Zm9ybWF0OiVoICVzJW4nLCRwNGNv bW1pdCk7CiAgICB9CiAgICBwcmludCBTVERPVVQgKGdyZXAge3MvXHI/XG4vL2dzO3MvLio/XHMv L30gcXh7Z2l0IG5hbWUtcmV2IEhFQUR9KSwiOlxuIjsKICAgIHN5c3RlbSgnZ2l0JywnbG9nJywn LS1tYXgtY291bnQ9MScsJy0tcHJldHR5PWZvcm1hdDolaCAlcyVuJywkY29tbWl0KTsKfQoKc3Vi IGltcG9ydF9wNF9kaXIgewogICAgbXkgKCRwNHBhdGgsICRsb2NhbF9wYXRoLCAkcmV2cmFuZ2Us ICRwYXJlbnQsICRicmFuY2gpID0gQF87CiAgICBteSAoJGZkLCAkZW50LCAkZXJyb3IsICRyYykg PSAodW5kZWYsdW5kZWYsMCwwKTsKCiAgICBwcmludCAiUnVubmluZyBjaGFuZ2VzXG4iIGlmICRW RVJCT1NFOwoKICAgIGlmIChvcGVuKCRmZCwgJz4nLCAiJEdJVF9ESVIvcDQvZmlsZXMiKSkgewoJ cHJpbnQgImxvb2tpbmcgZm9yIGNoYW5nZXMgJHA0cGF0aC8uLi4kcmV2cmFuZ2VcbiIgaWYgJFZF UkJPU0UgPiAxOwoJcHJpbnQgJGZkICIkcDRwYXRoLy4uLiRyZXZyYW5nZVxuIjsKCWNsb3NlKCRm ZCk7CiAgICB9IGVsc2UgewoJZGllICIkMDogcDQvZmlsZXM6ICQhXG4iCiAgICB9CiAgICBvcGVu KFNURElOLCAnPCcsICIkR0lUX0RJUi9wNC9maWxlcyIpIG9yIGRpZSAiJDA6IHA0L2ZpbGVzOiAk IVxuIjsKICAgIGRpZSAiJDA6IGNoYW5nZXMgJHA0cGF0aDogJCFcbiIgaWYgIW9wZW4oJGZkLCAn LXwnLCAncDQgLUcgLXggLSBjaGFuZ2VzJyk7CiAgICBteSAlQ0hBTkdFUyA9ICgpOwogICAgd2hp bGUgKGRlZmluZWQoJGVudCA9IHJlYWRfcHlkaWN0X2VudHJ5KCRmZCkpKSB7CgluZXh0IGlmICRl cnJvcjsKCWlmICgkZW50LT57Y29kZX0gZXEgJ2Vycm9yJykgewoJICAgIHdhcm4gIiQwOiBwNDog JGVudC0+e2RhdGF9XG4iOwoJICAgICRlcnJvciA9IDE7CgkgICAgbmV4dDsKCX0KCXByaW50ICJj aGFuZ2UgJGVudC0+e2NoYW5nZX1cbiIgaWYgJFZFUkJPU0UgPiAxOwoJJENIQU5HRVN7JGVudC0+ e2NoYW5nZX19ID0gewoJICAgIGNoYW5nZSA9PiRlbnQtPntjaGFuZ2V9LAoJICAgIGRlc2MgICA9 PicnLCAjIGhhdmUgdG8gcmVhZCB0aGUgZGVzYyBhbnl3YXkgd2l0aCBkZXNjcmliZQoJICAgIG10 aW1lICA9PiRlbnQtPnsndGltZSd9LAoJICAgIHVzZXIgICA9PiRlbnQtPnt1c2VyfSwKCSAgICBm aWxlcyAgPT5bXSwKCX07CiAgICB9CiAgICBjbG9zZSgkZmQpOwogICAgd2FybigiJDA6IG5vdGhp bmcgZm91bmRcbiIpLCBleGl0KDApIGlmICElQ0hBTkdFUzsKICAgIGV4aXQgMSBpZiAkZXJyb3I7 CgogICAgcHJpbnQgIlJ1bm5pbmcgZGVzY3JpYmUgZm9yICIuc2NhbGFyKGtleXMgJUNIQU5HRVMp LiIgY2hhbmdlIGxpc3RzXG4iCglpZiAkVkVSQk9TRTsKCiAgICBpZiAob3BlbigkZmQsICc+Jywg IiRHSVRfRElSL3A0L2ZpbGVzIikpIHsKCXByaW50ICRmZCBtYXAgeyAiJF9cbiJ9IHNvcnQgeyRh IDw9PiAkYn0ga2V5cyAlQ0hBTkdFUzsKCWNsb3NlKCRmZCk7CiAgICB9IGVsc2UgewoJZGllICIk MDogcDQvZmlsZXM6ICQhXG4iCiAgICB9CiAgICBvcGVuKFNURElOLCAnPCcsICIkR0lUX0RJUi9w NC9maWxlcyIpIG9yIGRpZSAiJDA6IHA0L2ZpbGVzOiAkIVxuIjsKICAgIGRpZSAiJDA6IGRlc2Ny aWJlOiAkIVxuIiBpZiAhb3BlbigkZmQsICctfCcsICdwNCAtRyAteCAtIGRlc2NyaWJlJyk7CiAg ICB3aGlsZSAoZGVmaW5lZCgkZW50ID0gcmVhZF9weWRpY3RfZW50cnkoJGZkKSkpIHsKCW5leHQg aWYgJGVycm9yOwoJaWYgKCRlbnQtPntjb2RlfSBlcSAnZXJyb3InKSB7CgkgICAgd2FybiAiJDA6 IHA0OiAkZW50LT57ZGF0YX1cbiI7CgkgICAgJGVycm9yID0gMTsKCSAgICBuZXh0OwoJfQoJJENI QU5HRVN7JGVudC0+e2NoYW5nZX19LT57ZGVzY30gPSAkZW50LT57ZGVzY307CgkkQ0hBTkdFU3sk ZW50LT57Y2hhbmdlfX0tPntmaWxlc30gPSB7fTsKCWZvciAobXkgJGk9MDs7ICsrJGkpIHsKCSAg ICBteSAkZm4gPSAkZW50LT57ImRlcG90RmlsZSRpIn07CgkgICAgbGFzdCBpZiAhZGVmaW5lZCgk Zm4pOwoJICAgIG5leHQgaWYgJGZuICF+IG0hXiRwNHBhdGgoL3wkKSE7CgkgICAgJENIQU5HRVN7 JGVudC0+e2NoYW5nZX19LT57ZmlsZXN9LT57JGZufSA9IHsKCQlhY3Rpb24gPT4gJGVudC0+eyJh Y3Rpb24kaSJ9LAoJICAgIH07CgkgICAgIyAkZW50LT57InR5cGUkaSJ9IDogdGV4dCwgYmluYXJ5 Cgl9CiAgICB9CiAgICBjbG9zZSgkZmQpOwogICAgZXhpdCAxIGlmICRlcnJvcjsKCiAgICBwcmlu dCAiUmVhZGluZyBmaWxlIGRhdGEgYW5kIGNyZWF0aW5nIGdpdCBoaXN0b3J5XG4iIGlmICRWRVJC T1NFOwoKICAgICMgUHJlcGFyZSBjbGVhbiBpbmRleCB1bmRlciB0aGUgbG9jYWwgcGF0aAogICAg JEVOVntHSVRfSU5ERVhfRklMRX0gPSAiJEdJVF9ESVIvcDQvaWR4LnRtcCI7CiAgICB1bmxpbmso JEVOVntHSVRfSU5ERVhfRklMRX0pOwogICAgaWYgKGxlbmd0aCgkcGFyZW50KSkgewoJJHJjID0g c3lzdGVtKCdnaXQnLCAncmVhZC10cmVlJywgJy1pJywgJy0tcmVzZXQnLCAkcGFyZW50KTsKCWRp ZSAiZ2l0IHJlYWQtdHJlZSAkcGFyZW50XG4iIGlmICRyYzsKCSRyYyA9IHN5c3RlbSgnZ2l0Jywn dXBkYXRlLWluZGV4JywnLS1mb3JjZS1yZW1vdmUnLCctLScsJGxvY2FsX3BhdGgpOwoJZGllICJn aXQgdXBkYXRlLWluZGV4ICRsb2NhbF9wYXRoXG4iIGlmICRyYzsKICAgIH0KICAgICMgUmVhZCBm aWxlIGRhdGEgZm9yIGVhY2ggY2hhbmdlIGxpc3QKICAgIG15ICRmaXJzdCA9IHVuZGVmOwogICAg bXkgJGNoOwogICAgZm9yZWFjaCBteSAkayAoc29ydCB7JGEgPD0+ICRifSBrZXlzICVDSEFOR0VT KSB7CgkkY2ggPSAkQ0hBTkdFU3ska307CglwcmludCAiJGtcbiIgaWYgJFZFUkJPU0UgPiAxOwoJ IyBSZWFkIHRoZSBmdWxsIHRyZWUgZm9yIHRoZSBmaXJzdCBjaGFuZ2UgbnVtYmVyCglpZiAob3Bl bigkZmQsICc+JywgIiRHSVRfRElSL3A0L2ZpbGVzIikpIHsKCSAgICBpZiAoIWRlZmluZWQoJGZp cnN0KSkgewoJCXByaW50ICRmZCAiJHA0cGF0aC8uLi5cQCRrXG4iOwoJCSRmaXJzdCA9ICRrOwoJ ICAgIH0gZWxzZSB7CgkJZm9yZWFjaCBteSAkZiAoa2V5cygleyRjaC0+e2ZpbGVzfX0pKSB7CgkJ ICAgIHByaW50ICRmZCAiJGZcQCRrXG4iOwoJCX0KCSAgICB9CgkgICAgY2xvc2UoJGZkKTsKCX0g ZWxzZSB7CgkgICAgZGllICIkMDogcDQvZmlsZXM6ICQhXG4iCgl9CglvcGVuKFNURElOLCAnPCcs ICIkR0lUX0RJUi9wNC9maWxlcyIpIG9yIGRpZSAiJDA6IHA0L2ZpbGVzOiAkIVxuIjsKCglwcmlu dCAiUmVhZGluZyBmaWxlIGRhdGEgZm9yICRrXG4iIGlmICRWRVJCT1NFID4gMTsKCglkaWUgIiQw OiBwcmludDogJCFcbiIgaWYgIW9wZW4oJGZkLCAnLXwnLCAncDQgLUcgLXggLSBwcmludCcpOwoJ bXkgJHRtcGZpbGUgPSAiJEdJVF9ESVIvcDQvY3AudG1wIjsKCXdoaWxlIChkZWZpbmVkKCRlbnQg PSByZWFkX3B5ZGljdF9lbnRyeSgkZmQpKSkgewoJICAgIG5leHQgaWYgJGVycm9yOwoJICAgIGlm ICgkZW50LT57Y29kZX0gZXEgJ2Vycm9yJykgewoJCXdhcm4gIiQwOiBwNDogJGVudC0+e2RhdGF9 XG4iOwoJCSRlcnJvciA9IDE7CgkJbmV4dDsKCSAgICB9CgkgICAgaWYgKCRlbnQtPntjb2RlfSBl cSAnYmluYXJ5JykgewoJCWlmICghZGVmaW5lZCgkZikpIHsKCQkgICAgd2FybiAiJDA6IGZpbGUg ZGF0YSB3aXRob3V0IHN0YXQgaW5mb1xuIjsKCQkgICAgJGVycm9yID0gMTsKCQkgICAgbmV4dDsK CQl9CgkJJGYtPntzaXplfSArPSBsZW5ndGgoJGVudC0+e2RhdGF9KTsKCQlpZiAobGVuZ3RoKCRl bnQtPntkYXRhfSkpIHsKCQkgICAgaWYgKCFkZWZpbmVkKHN5c3dyaXRlKCRmLT57dG1wZmR9LCAk ZW50LT57ZGF0YX0pKSkgewoJCQl3YXJuICIkZi0+e2RlcG90RmlsZX06ICR0bXBmaWxlOiAkIVxu IjsKCQkJY2xvc2UoJGYtPnt0bXBmZH0pOwoJCQkkZiA9IHVuZGVmOwoJCQkkZXJyb3IgPSAxOwoJ CQluZXh0OwoJCSAgICB9CgkJfSBlbHNlIHsKCQkgICAgIyBGSUxFIEZJTklTSEVEIElGIEFOIEVN UFRZIEJJTkFSWSBQQUNLRVQgUkVDRUlWRUQKCQkgICAgY2xvc2UoJGYtPnt0bXBmZH0pOwoJCSAg ICBteSAkZm4gPSAkZi0+e2RlcG90RmlsZX07CgkJICAgICMgcHV0IGZpbGUgZGF0YSBpbnRvIGdp dCByZXBvCgkJICAgIG15ICR0bXBzaGExID0gZ2l0X2hhc2hfZmlsZSgkdG1wZmlsZSk7CgkJICAg IGRpZSAiRmFpbGVkIHRvIHNhdmUgJGZuIGluIGdpdCByZXBvXG4iIGlmICFkZWZpbmVkKCR0bXBz aGExKTsKCQkgICAgdW5saW5rKCR0bXBmaWxlKTsKCQkgICAgJGYtPntzaGExfSA9ICR0bXBzaGEx OwoKCQkgICAgcHJpbnQgIiRrXHQkdG1wc2hhMVx0JGYtPntzaXplfVx0JGZuXG4iIGlmICRWRVJC T1NFID4gMjsKCQkgICAgJGNoLT57ZmlsZXN9LT57JGZufSA9ICRmOwoKCQkgICAgZGVsZXRlICRm LT57ZGVwb3RGaWxlfTsgIyBjbGVhbnVwCgkJICAgIGRlbGV0ZSAkZi0+e3RtcGZkfTsgIyBjbGVh bnVwCgkJICAgICRmID0gdW5kZWY7CgkJfQoJCW5leHQ7CgkgICAgfQoJICAgIGlmICgkZW50LT57 Y29kZX0gZXEgJ3N0YXQnKSB7CgkJZGllICIkMDogZmlsZSAkZi0+e2RlcG90RmlsZX0gdHJ1bmNh dGVkXG4iIGlmIGRlZmluZWQoJGYpOwoJCWRpZSAiJGVudC0+e2RlcG90RmlsZX06IHRoZSBsZWFk aW5nIHBhdGggbm90IGV4cGVjdGVkXG4iCgkJICAgIGlmIHN1YnN0cigkZW50LT57ZGVwb3RGaWxl fSwwLGxlbmd0aCgkcDRwYXRoKSkgbmUgJHA0cGF0aDsKCQlkaWUgIiRlbnQtPntkZXBvdEZpbGV9 XEAkZW50LT57Y2hhbmdlfTogdGhlIGNoYW5nZSBub3QgZXhwZWN0ZWRcbiIKCQkgICAgaWYgJGVu dC0+e2NoYW5nZX0gPiAkazsKCgkJbXkgJHByZXYgPSAkY2gtPntmaWxlc30tPnskZW50LT57ZGVw b3RGaWxlfX07CgkJJGYgPSB7CgkJICAgIGFjdGlvbiA9PiBkZWZpbmVkKCRwcmV2LT57YWN0aW9u fSkgPyAkcHJldi0+e2FjdGlvbn06J2FkZCcsCgkJICAgIGNoYW5nZSA9PiAkZW50LT57Y2hhbmdl fSwKCQkgICAgZGVwb3RGaWxlID0+ICRlbnQtPntkZXBvdEZpbGV9LAoJCSAgICBtdGltZSA9PiAk ZW50LT57J3RpbWUnfSwKCQkgICAgc2l6ZSA9PiAwLAoJCX07CgkJbXkgJGZ0OwoJCW9wZW4oJGZ0 LCc+JywkdG1wZmlsZSkgb3IgZGllICIkdG1wZmlsZTogJCFcbiI7CgkJJGYtPnt0bXBmZH0gPSAk ZnQ7CgkgICAgfQoJfQoJY2xvc2UoJGZkKTsKCWV4aXQgMSBpZiAkZXJyb3I7CglteSAkbW9kY250 ID0gMDsKCW15IEBkZWxmaWxlcyA9ICgpOwoJbXkgJGZkbyA9IHVuZGVmOwoJb3BlbigkZmRvLCAn fC0nLCAnZ2l0IHVwZGF0ZS1pbmRleCAteiAtLXJlcGxhY2UgLS1hZGQgLS1pbmRleC1pbmZvJykg b3IKCSAgICBkaWUgImNvdWxkIG5vdCBzdGFydCBnaXQgdXBkYXRlLWluZGV4XG4iOwoJYmlubW9k ZSgkZmRvKTsKCXdoaWxlIChteSAoJGZuLCRmKSA9IGVhY2ggJXskY2gtPntmaWxlc319KSB7Cgkg ICAgaWYgKHN1YnN0cigkZm4sMCxsZW5ndGgoJHA0cGF0aCkpIG5lICRwNHBhdGgpIHsKCQlkaWUg IiRmbjogdGhlIGxlYWRpbmcgcGF0aCBub3QgZXhwZWN0ZWRcbiI7CgkgICAgfQoJICAgIG15ICRs b2NmaWxlID0gJGZuOwoJICAgIHN1YnN0cigkbG9jZmlsZSwwLGxlbmd0aCgkcDRwYXRoKSkgPSAk bG9jYWxfcGF0aDsKCSAgICAkbG9jZmlsZSA9fiBzIV4vKyEhbzsKCSAgICBwdXNoKEBkZWxmaWxl cywgJGxvY2ZpbGUpLCBuZXh0IGlmICRmLT57YWN0aW9ufSBlcSAnZGVsZXRlJzsKCSAgICBwcmlu dCAiXHQkZi0+e3NoYTF9XHQkbG9jZmlsZVxuIiBpZiAkVkVSQk9TRSA+IDE7CgkgICAgbXkgJG1v ZGUgPSAnMTAwNjQ0JzsKCSAgICAkbW9kZSA9ICcxMDA3NTUnIGlmICRsb2NmaWxlID1+IC9cLihl eGV8YmF0fGNtZHxwbHxkbGx8c28pJC9pbzsKCSAgICBwcmludCAkZmRvICIkbW9kZSAkZi0+e3No YTF9XHQkbG9jZmlsZVwwIjsKCSAgICArKyRtb2RjbnQ7Cgl9CgljbG9zZSgkZmRvKTsKCWRpZSAi ZmFpbGVkIHRvIGJ1aWxkIHRoZSB0cmVlcyBpbiAkbG9jYWxfcGF0aCBmb3IgJGtcbiIgaWYgJD87 CglpZiAoQGRlbGZpbGVzKSB7CgkgICAgb3BlbigkZmRvLCAnfC0nLCAnZ2l0IHVwZGF0ZS1pbmRl eCAteiAtLWZvcmNlLXJlbW92ZSAtLXN0ZGluJykgb3IKCQlkaWUgImNvdWxkIG5vdCBzdGFydCBn aXQgdXBkYXRlLWluZGV4IHRvIHJlbW92ZSBmaWxlc1xuIjsKCSAgICBiaW5tb2RlKCRmZG8pOwoJ ICAgIHByaW50ICRmZG8gbWFwIHsgIiRfXDAiIH0gQGRlbGZpbGVzOwoJICAgIGNsb3NlKCRmZG8p OwoJICAgIHByaW50IG1hcCB7ICJcdGRlbGV0ZSAkX1xuIiB9IEBkZWxmaWxlcyBpZiAkVkVSQk9T RSA+IDE7CgkgICAgZGllICJmYWlsZWQgdG8gY2xlYW4gdGhlIHRyZWVzIGluICRsb2NhbF9wYXRo IGZvciAka1xuIiBpZiAkPzsKCSAgICAkbW9kY250ICs9IHNjYWxhciBAZGVsZmlsZXM7Cgl9Cglt eSAkdHJlZSA9IGdpdF93cml0ZV90cmVlKCk7CglkaWUgIkZhaWxlZCB0byBzdG9yZSB0cmVlIG9m ICRrIGluIGdpdCByZXBvXG4iIGlmICFkZWZpbmVkKCR0cmVlKTsKCXByaW50ICJcdHRyZWUgb2Yg JGsgd3JpdHRlbiBhcyAkdHJlZVxuIiBpZiAkVkVSQk9TRSA+IDE7CgkjIHByZXBhcmUgY29tbWl0 CglvcGVuKCRmZG8sJz4nLCIkR0lUX0RJUi9wNC9tc2ciKSBvciBkaWUgInA0L21zZzogJCFcbiI7 CglwcmludCAkZmRvICIkazogJGNoLT57ZGVzY30iOwoJY2xvc2UoJGZkbyk7CglwNHVzZXJfdG9f ZW52KCRjaC0+e3VzZXJ9KTsKCSRFTlZ7R0lUX0FVVEhPUl9EQVRFfSA9ICRjaC0+e210aW1lfTsK CW9wZW4oU1RESU4sICc8JywgIiRHSVRfRElSL3A0L21zZyIpIG9yIGRpZSAicDQvbXNnIChjb21t aXQpOiAkIVxuIjsKCW15ICRjb21taXQgPSBsZW5ndGgoJHBhcmVudCkgPwoJICAgIGdpdF9jb21t aXRfdHJlZSgkdHJlZSwgJy1wJywgJHBhcmVudCk6IGdpdF9jb21taXRfdHJlZSgkdHJlZSk7Cglk aWUgIkZhaWxlZCB0byBjb21taXQgJGsgaW4gZ2l0IHJlcG9cbiIgaWYgIWRlZmluZWQoJGNvbW1p dCk7CglwcmludCAiJGsgY29tbWl0dGVkIGFzICRjb21taXQiOwoJcHJpbnQgIiAoJG1vZGNudCBt b2RpZmljYXRpb24iLigkbW9kY250PT0xPycnOidzJykuJyknIGlmICRWRVJCT1NFOwoJcHJpbnQg IlxuIjsKCSRwYXJlbnQgPSAkY29tbWl0OwogICAgfQogICAgaWYgKCEkRFJZUlVOIGFuZCBsZW5n dGgoJHBhcmVudCkpIHsKCWdpdF91cGRhdGVfcmVmKCJiYWNrdXAgcmVmIG9mICRicmFuY2giLCAi L3A0L2JhY2t1cC0kYnJhbmNoIiwkYnJhbmNoKQoJICAgIGlmIGRlZmluZWQoJGJyYW5jaCk7Cgkk YnJhbmNoID0gJy9wNC9JTVBPUlQnIGlmICFkZWZpbmVkKCRicmFuY2gpOwoJbXkgJHJjID0gZ2l0 X3VwZGF0ZV9yZWYoInA0IGltcG9ydCAkYnJhbmNoIiwgJGJyYW5jaCwgJHBhcmVudCk7CglkaWUg ImZhaWxlZCB0byB1cGRhdGUgJGJyYW5jaCB3aXRoICRwYXJlbnRcbiIgaWYgJHJjOwoJJGJyYW5j aCA9fiBzIV4vKyEhOwoJcHJpbnQgIkJyYW5jaCAnJGJyYW5jaCcgdXBkYXRlZCB3aXRoIHN0YXRl IGZyb20gJGNoLT57Y2hhbmdlfVxuIjsKCSRFTlZ7R0lUX1BBR0VSfSA9ICdjYXQnOwoJc3lzdGVt KCdnaXQnLCdsb2cnLCctLW1heC1jb3VudD0xJywnLS1wcmV0dHk9Zm9ybWF0OiVoICVzJW4nLCRi cmFuY2gpOwogICAgfQp9CgpzdWIgZ2l0X3Nob3dfZGlmZnMgewogICAgbXkgJHNlcCA9ICQvOwog ICAgJC89IlwwIjsKICAgIG15ICgkc2hvdywgJGNudCkgPSAoMCwgMCk7CiAgICBpZiAob3BlbihG LCAnLXwnLCAnZ2l0IGRpZmYtZmlsZXMgLXIgLS1uYW1lLW9ubHkgLXonKSkgewoJd2hpbGUgKDxG PikgewoJICAgIG15ICRjID0gY2hvcDsKCSAgICAkXyAuPSAkYyBpZiAkYyBuZSAiXDAiOwoJICAg IHByaW50ICJDaGFuZ2VkIGZpbGVzOlxuIiBpZiAhJHNob3c7CgkgICAgcHJpbnQgIiAkX1xuIjsK CSAgICAkc2hvdyA9IDE7CgkgICAgJGNudCsrOwoJfQoJY2xvc2UoRik7CiAgICB9CiAgICBpZiAo b3BlbihGLCAnLXwnLCAnZ2l0IGRpZmYtaW5kZXggLS1jYWNoZWQgLXIgLXogSEVBRCcpKSB7Cgkk c2hvdyA9IDA7CglteSAoJGRpZmYsICRpbmZvKSA9ICgwLCAxKTsKCXdoaWxlICg8Rj4pIHsKCSAg ICBteSAkYyA9IGNob3A7CgkgICAgJF8gLj0gJGMgaWYgJGMgbmUgIlwwIjsKCSAgICBpZiAoJGlu Zm8pIHsKCQluZXh0IGlmICEvXjooXGR7Nn0pIChcZHs2fSkgKFswLTlhLWZdezQwfSkgKFswLTlh LWZdezQwfSkgLi9vOwoJCSMgc2hvdyBvbmx5IGNvbnRlbnQgY2hhbmdlcywgcDQgZG9lcyBub3Qg c3VwcG9ydCBleGVjLWJpdCBhbnl3YXkKCQkkZGlmZiA9ICQzIG5lICQ0OwoJICAgIH0gZWxzaWYg KCRkaWZmKSB7CgkJcHJpbnQgIkNoYW5nZXMgYmV0d2VlbiBpbmRleCBhbmQgSEVBRDpcbiIgaWYg ISRzaG93OwoJCXByaW50ICIgJF9cbiI7CgkJJHNob3cgPSAxOwoJCSRjbnQrKzsKCSAgICB9Cgkg ICAgJGluZm8gPSAhJGluZm87Cgl9CgljbG9zZShGKTsKICAgIH0KICAgICQvID0gJHNlcDsKICAg IHJldHVybiAkY250Owp9CgpzdWIgZ2l0X3N5bmNfdG8gewogICAgbXkgJHJjOwogICAgbXkgJGJy YW5jaCA9IHNoaWZ0OwogICAgaWYgKCEkRk9SQ0UpIHsKCSRyYyA9IHN5c3RlbSgnZ2l0JywgJ2Rp ZmYnLCAnLS1xdWlldCcpOwoJd2FybigiVGhlcmUgYXJlIGNoYW5nZXMgaW4gdGhlIHdvcmtpbmcg ZGlyZWN0b3J5LiBSZWZ1c2luZyB0byBzeW5jXG4iKQoJICAgIGlmICRyYzsKCSRyYyA9IHN5c3Rl bSgnZ2l0JywgJ2RpZmYnLCAnLS1xdWlldCcsICctLWNhY2hlZCcpOwoJd2FybigiVGhlcmUgYXJl IGNoYW5nZXMgaW4gdGhlIGluZGV4LiBSZWZ1c2luZyB0byBzeW5jXG4iKSBpZiAkcmM7CiAgICB9 CiAgICBteSAkcDRoZWFkID0gZ2l0X2ZpbmRfcDRpbmZvKCRicmFuY2gpOwogICAgcHJpbnQgImZv dW5kIHA0IGltcG9ydCBjb21taXQgJHA0aGVhZCBmb3IgJGJyYW5jaFxuIgoJaWYgKCRWRVJCT1NF ID4gMSBvciAkRFJZUlVOKSBhbmQgZGVmaW5lZCAkcDRoZWFkOwogICAgcmV0dXJuIDAgaWYgJERS WVJVTiBhbmQgZGVmaW5lZCAkcDRoZWFkOwogICAgbXkgJHA0aGF2ZSA9IGdpdF9nZXRfcDRoYXZl KCRwNGhlYWQpOwogICAgZGllICIkcDRoZWFkIGhhcyBubyBwNCBkYXRhXG4iIGlmICFkZWZpbmVk KCRwNGhhdmUpOwogICAgbXkgKCRmZCwkZmRvKTsKICAgIGRpZSAicmVhZGluZyBjbGllbnQgJFA0 Q0xJRU5UOiAkIVxuIgoJaWYgIW9wZW4oJGZkLCAnLXwnLCAicDQgLUcgY2xpZW50IC1vICRQNENM SUVOVCIpOwogICAgYmlubW9kZSgkZmQpOwoKICAgIG15ICVjZGF0YSA9IChDbGllbnQ9PicnLCBE ZXNjcmlwdGlvbj0+JycsIExpbmVFbmQ9PicnLCBPcHRpb25zPT4nJyk7CgogICAgd2hpbGUgKGRl ZmluZWQoJGVudCA9IHJlYWRfcHlkaWN0X2VudHJ5KCRmZCkpKSB7CgluZXh0IGlmICRlcnJvcjsK CWlmICgkZW50LT57Y29kZX0gZXEgJ2Vycm9yJykgewoJICAgIHdhcm4gInA0IGNsaWVudCAkUDRD TElFTlQ6ICRlbnQtPntkYXRhfVxuIjsKCSAgICAkZXJyb3IgPSAxOwoJICAgIG5leHQ7Cgl9Cglm b3JlYWNoIG15ICRrIChrZXlzICVjZGF0YSkgewoJICAgICRjZGF0YXska30gPSAkZW50LT57JGt9 IGlmIGRlZmluZWQgJGVudC0+eyRrfTsKCX0KICAgIH0KICAgIGNsb3NlKCRmZCk7CiAgICBkaWUg ImNsaWVudC5kZWY6ICQhXG4iIGlmICFvcGVuKCRmZG8sICc+JywgIiRHSVRfRElSL3A0L2NsaWVu dC5kZWYiKTsKICAgIGJpbm1vZGUoJGZkbyk7CiAgICBwcmludCAkZmRvICJDbGllbnQ6ICRQNENM SUVOVFxuXG4iOwogICAgcHJpbnQgJGZkbyAiRGVzY3JpcHRpb246XG4iOwogICAgJGNkYXRhe0Rl c2NyaXB0aW9ufSA9fiBzL1xuL1xuXHQvZ3M7CiAgICAkY2RhdGF7RGVzY3JpcHRpb259ID1+IHMv XHQkLy9zOwogICAgcHJpbnQgJGZkbyAiXHQkY2RhdGF7RGVzY3JpcHRpb259XG4iOwogICAgbXkg JHdkID0gY3dkKCk7CiAgICAkd2QgPX4gcy9cXC9cLy9nbzsKICAgIHByaW50ICRmZG8gIlJvb3Q6 XHQkd2RcblxuIjsKICAgIHByaW50ICRmZG8gIkxpbmVFbmQ6XHQkY2RhdGF7TGluZUVuZH1cblxu IjsKICAgIHByaW50ICRmZG8gIk9wdGlvbnM6XHQkY2RhdGF7T3B0aW9uc31cblxuIjsKICAgIHBy aW50ICRmZG8gIlZpZXc6XG4iOwogICAgcHJpbnQgJGZkbwoJbWFwIHsKCSAgICBteSAkZm4gPSAk cDRoYXZlLT57JF99LT5bMF07CgkgICAgJGZuID1+IHMhXi8vW14vXSovIS8vJFA0Q0xJRU5ULyFv OwoJICAgIHMvKFsgXHQiJ0AqIyVdKS9zcHJpbnRmKCIlJSUwMngiLG9yZCgkMSkpL2dlbyBmb3Ig KCRfLCRmbik7CgkgICAgIlx0JF8gJGZuXG4iCgl9IHNvcnQgeyAkYSBjbXAgJGIgfQoJa2V5cyAl eyRwNGhhdmV9OwogICAgY2xvc2UoJGZkbyk7CiAgICBwcmludCAibG9hZGluZyBjbGllbnQgJFA0 Q0xJRU5UXG4iOwogICAgb3BlbihTVERJTiwgJzwnLCAiJEdJVF9ESVIvcDQvY2xpZW50LmRlZiIp IG9yIGRpZSAiY2xpZW50LmRlZjogJCFcbiI7CiAgICBydW5fb3JfZXhpdCgncDQnLCAnY2xpZW50 JywgJy1pJyk7CiAgICBkaWUgImZpbGVzOiAkIVxuIiBpZiAhb3BlbigkZmRvLCAnPicsICIkR0lU X0RJUi9wNC9maWxlcyIpOwogICAgcHJpbnQgJGZkbwoJbWFwIHsKCSAgICBteSAkZm4gPSAkXzsK CSAgICBzLyhbIFx0IidAKiMlXSkvc3ByaW50ZigiJSUlMDJ4IixvcmQoJDEpKS9nZW87CgkgICAg IiRfIyRwNGhhdmUtPnskZm59LT5bMV1cbiIKCX0gc29ydCB7ICRhIGNtcCAkYiB9CglrZXlzICV7 JHA0aGF2ZX07CiAgICBjbG9zZSgkZmRvKTsKICAgIHByaW50ICJzeW5jaW5nIGNsaWVudCAkUDRD TElFTlRcbiI7CiAgICBvcGVuKFNURElOLCAnPCcsICIkR0lUX0RJUi9wNC9maWxlcyIpIG9yIGRp ZSAicDQvZmlsZXM6ICQhXG4iOwogICAgcnVuX29yX2V4aXQoJ3A0JywgJy1jJywgJFA0Q0xJRU5U LCAnLUgnLCAkUDRIT1NULCAnLWQnLCAkUDRST09ULCcteCcsICctJywgJ3N5bmMnKTsKCiAgICBy ZXR1cm4gZGVmaW5lZCgkcDRoZWFkKSA/IDA6IDE7Cn0KCnN1YiBnaXRfcDRfdGFnX0hFQUQgewog ICAgbXkgJGNsID0gc2hpZnQ7CiAgICBteSBAY2hhbmdlID0gcDRfZ2V0X2NoYW5nZSgkY2wpOwog ICAgcmV0dXJuIDB4MTAwIGlmICFAY2hhbmdlOwogICAgbXkgJGQ9MDsKICAgIG15ICgkZmlyc3Rf bGluZSkgPSBncmVwIHsKCWlmICgkZD09MSkgewoJICAgIGlmICghL15ccypbXHJcbl0qJC9zbykg eyAkZD0wOyAxIH0KCSAgICBlbHNlIHsgMCB9Cgl9IGVsc2UgewoJICAgICRkPTEgaWYgL15EZXNj cmlwdGlvbjovbzsgMAoJfQogICAgfSBAY2hhbmdlOwogICAgbXkgJGZkOwogICAgaWYgKCFvcGVu KCRmZCwgJz4nLCAiJEdJVF9ESVIvcDQvZGVzYyIpKSB7Cgl3YXJuICJwNC9kZXNjOiAkIVxuIjsK CXJldHVybiAweDEwMDsKICAgIH0KICAgIHVuc2hpZnQoQGNoYW5nZSwgJycpOwogICAgJGZpcnN0 X2xpbmUgPX4gcy9eXHMrLy87CiAgICB1bnNoaWZ0KEBjaGFuZ2UsICRmaXJzdF9saW5lKTsKICAg IHByaW50ICRmZCBtYXAge3MvXHI/XG4kLy9zbzsiJF9cbiJ9IEBjaGFuZ2U7CiAgICBjbG9zZSgk ZmQpOwogICAgbXkgJHJjID0gc3lzdGVtKCdnaXQnLCAndGFnJywgJy1mJywgJy1GJywgIiRHSVRf RElSL3A0L2Rlc2MiLCAicDQvJGNsIik7CiAgICBwcmludCAiSEVBRCB0YWdnZWQgcDQvJGNsXG4i IGlmICEkcmM7CiAgICByZXR1cm4gJHJjOwp9CgpzdWIgZ2l0X3A0X21lcmdlIHsKICAgIG15ICgk c291cmNlX2hlYWQsJGRvX21lcmdlLCRhdXRvX3N1Ym1pdCkgPSBAXzsKICAgIG15ICRyYyA9IHN5 c3RlbSgnZ2l0JywgJ2RpZmYtZmlsZXMnLCAnLS1xdWlldCcpOwogICAgZXhpdCgxMjcpIGlmICRy YyAmIDB4ZmY7ICMgZXJyb3Igc3RhcnRpbmcgdGhlIHByb2dyYW0KICAgIGRpZSAiVGhlcmUgYXJl IGNoYW5nZXMgaW4gJFA0Uk9PVC4gQ2xlYW4gdGhlbSB1cCBmaXJzdC5cbiIgaWYgJHJjOwogICAg JHNvdXJjZV9oZWFkID0gJ0hFQUQnIGlmICFkZWZpbmVkKCRzb3VyY2VfaGVhZCk7CiAgICBteSAk bWVyZ2VoZWFkID0gZ2l0X3Jldl9wYXJzZSgkc291cmNlX2hlYWQpOwogICAgZXhpdCgxKSBpZiAh ZGVmaW5lZCgkbWVyZ2VoZWFkKSBvciAhbGVuZ3RoKCRtZXJnZWhlYWQpOwogICAgbXkgJGZhc3Rf Zm9yd2FyZCA9IDE7CiAgICAjIENoZWNrIGlmIHRoZSBnaXZlbiByZWZlcmVuY2UgaXMgYSBkaXJl Y3QgZGVzY2VuZGFudCBvZiBjdXJyZW50IGJyYW5jaAogICAgaWYgKCRzb3VyY2VfaGVhZCBuZSAn SEVBRCcpIHsKCW15ICRzaGExID0gZ2V0X29uZV9saW5lKCdnaXQnLCAncmV2LWxpc3QnLCAnLS1t YXgtY291bnQ9MScsICIkbWVyZ2VoZWFkLi5IRUFEIik7CglleGl0IDEgaWYgIWRlZmluZWQoJHNo YTEpOwoJaWYgKGxlbmd0aCgkc2hhMSkgYW5kIGRlZmluZWQoJHNoYTEpIGFuZCAkc2hhMSA9fiAv XlswLTlhLWZdezQwfVxiLykgewoJICAgIG15ICRtc2cgPSAiSEVBRCBkb2VzIG5vdCBmYXN0LWZv cndhcmQgdG8gJHNvdXJjZV9oZWFkXG4iOwoJICAgICRkb19tZXJnZSA/IHdhcm4oIldhcm5pbmc6 ICRtc2ciKTogZGllKCJGYXRhbDogJG1zZyIpOwoJICAgICRmYXN0X2ZvcndhcmQgPSAwOwoJfQog ICAgfQogICAgcHJpbnQgIkNoZWNraW5nIG91dCAkc291cmNlX2hlYWQgKCRtZXJnZWhlYWQpIGZv ciBwNCBlZGl0XG4iIGlmICRWRVJCT1NFOwogICAgbXkgJGNudDsKICAgIG15IEBmaWxlcyA9ICgp OwogICAgbXkgJHNlcCA9ICQvOwogICAgJC89IlwwIjsKICAgIGlmIChvcGVuKEYsICctfCcsICJn aXQgZGlmZi1pbmRleCAtUiAtLWNhY2hlZCAtciAteiAkbWVyZ2VoZWFkIikpIHsKCW15ICgkZGlm ZiwgJGluZm8sICRNKSA9ICgwLCAxLCAnJyk7Cgl3aGlsZSAoPEY+KSB7CgkgICAgbXkgJGMgPSBj aG9wOwoJICAgICRfIC49ICRjIGlmICRjIG5lICJcMCI7CgkgICAgaWYgKCRpbmZvKSB7CgkJbmV4 dCBpZiAhL146XGR7Nn0gXGR7Nn0gKFswLTlhLWZdezQwfSkgKFswLTlhLWZdezQwfSkgKFx3Kykv bzsKCQkjIHVzZSBvbmx5IGNvbnRlbnQgY2hhbmdlcywgcDQgZG9lcyBub3Qgc3VwcG9ydCBleGVj LWJpdAoJCSRkaWZmID0gJDEgbmUgJDI7CgkJJE0gPSAkMzsgIyBjaGFuZ2UgdHlwZSBtYXJrZXIK CSAgICB9IGVsc2lmICgkZGlmZikgewoJCXByaW50ICIkTSAkX1xuIiBpZiAkVkVSQk9TRTsKCQlk aWUgIkZpbGUgY29udGFpbnMgY2hhcmFjdGVycyB3aGljaCBwNCBjYW5ub3Qgc3VwcG9ydFxuIgoJ CSAgICBpZiAvW1xuQCMlKl0vczsKCQlwdXNoIEBmaWxlcywgIiRNJF8iOwoJCSRjbnQrKzsKCSAg ICB9CgkgICAgJGluZm8gPSAhJGluZm87Cgl9CgljbG9zZShGKTsKICAgIH0KICAgICQvID0gJHNl cDsKICAgIGlmICghJGNudCkgewoJd2FybiAiJDA6IE5vIGNvbnRlbnQgY2hhbmdlcyBmb3VuZCBi ZXR3ZWVuIEhFQUQgYW5kICRzb3VyY2VfaGVhZCI7CglyZXR1cm4gMDsKICAgIH0KICAgICMgQ3Jl YXRlIGEgbmV3IGNoYW5nZWxpc3QKICAgIG15ICRwNDsKICAgIG9wZW4oJHA0LCAicDQgLWMgJFA0 Q0xJRU5UIC1IICRQNEhPU1QgLWQgJFA0Uk9PVCBjaGFuZ2UgLW98Iikgb3IKCWRpZSAiJDA6IGZh aWxlZCB0byBjcmVhdGUgY2hhbmdlbGlzdFxuIjsKICAgIG15IEBkZXNjID0gbWFwIHtzL1xyP1xu JC8vc287ICRffSA8JHA0PjsKICAgIGNsb3NlKCRwNCk7CgogICAgbXkgJGRlc2NfcG9zID0gMDsK ICAgIGZvcmVhY2ggKEBkZXNjKSB7CgkrKyRkZXNjX3BvczsKCWxhc3QgaWYgL15EZXNjcmlwdGlv bjovbzsKICAgIH0KICAgIG15ICRlZGl0ZmQ7CiAgICBkaWUgIiRHSVRfRElSL3A0L2Rlc2MudHh0 OiAkIVxuIgoJaWYgIW9wZW4oJGVkaXRmZCwgJz4nLCAiJEdJVF9ESVIvcDQvZGVzYy50eHQiKTsK ICAgIG15ICRyYW5nZSA9ICIuLiRtZXJnZWhlYWQiOwogICAgIyBiZWNhdXNlIEkgaGF2ZSBubyBp bmZvcm1hdGlvbiBhYm91dCB3aGF0IEkgYW0gbWVyZ2luZyB3aXRoOgogICAgIyB0aGlzIGlzIHRo ZSBjYXNlIHdoZW4gYSBwdXNoIG1vZGlmaWVkIEhFQUQuCiAgICAkcmFuZ2UgPSAiJHttZXJnZWhl YWR9Xi4uJG1lcmdlaGVhZCIgaWYgJHNvdXJjZV9oZWFkIGVxICdIRUFEJzsKICAgIGlmIChvcGVu KG15ICRmZCwgJy18JywgImdpdCBsb2cgJHJhbmdlIikpIHsKCXdoaWxlKDwkZmQ+KSB7CgkgICAg IyBJIGJlbGlldmUgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHNhdmUgdGhpcyBpbmZvcm1hdGlvbgoJ ICAgICMgaW4gUGVyZm9yY2UuIFRoZXkgYXJlIHByaW1pdGl2ZQoJICAgIG5leHQgaWYgL14oY29t bWl0IHxBdXRob3I6fERhdGU6KS87CgkgICAgcy9ccj9cbiQvL3NvOwoJICAgIG5leHQgaWYgIWxl bmd0aCgkXyk7ICMgaGVhZGVyL21lc3NhZ2Ugc2VwYXJhdG9yIGxpbmUKCSAgICBzL15cc3s0fS8v bzsKCSAgICBwcmludCAkZWRpdGZkICIkX1xuIiBpZiBkZWZpbmVkKCRlZGl0ZmQpOwoJfQoJY2xv c2UoJGZkKTsKICAgIH0KICAgIHByaW50ICRlZGl0ZmQgbWFwIHsgL15ccz8oLiopL287IiQxXG4i IH0gQGRlc2NbJGRlc2NfcG9zLi4kI2Rlc2NdOyAKICAgIGNsb3NlKCRlZGl0ZmQpOwoKICAgIHN5 c3RlbSgiJGVkaXRvciAkR0lUX0RJUi9wNC9kZXNjLnR4dCIpIGlmICRFRElUX0NPTU1JVDsKICAg IGRpZSAiJEdJVF9ESVIvcDQvZGVzYy50eHQ6ICQhXG4iCglpZiAhb3BlbigkZWRpdGZkLCAnPCcs ICIkR0lUX0RJUi9wNC9kZXNjLnR4dCIpOwogICAgbXkgQHRtcGRlc2MgPSA8JGVkaXRmZD47CiAg ICBkaWUgIk5vIGNoYW5nZSBkZXNjcmlwdGlvbiwgbm90IG1lcmdpbmcuXG4iCglpZiAhZ3JlcCB7 IW0vXihcc3xbXHJcbl0pKiQvc299IEB0bXBkZXNjOwogICAgc3BsaWNlKEBkZXNjLCAkZGVzY19w b3MsICQjZGVzYyArIDEgLSAkZGVzY19wb3MsCgkgICBtYXAge3MvXHI/XG4kLy9zbzsiICRfIn0g QHRtcGRlc2MpOwogICAgY2xvc2UoJGVkaXRmZCk7CgogICAgb3BlbigkcDQsICc+JywgIiRHSVRf RElSL3A0L2NoYW5nZWxpc3QiKSBvcgoJZGllICIkR0lUX0RJUi9wNC9jaGFuZ2VsaXN0OiAkIVxu IjsKICAgIHByaW50ICRwNCBtYXAgeyIkX1xuIn0gQGRlc2M7CiAgICBjbG9zZSgkcDQpOwoKICAg IHJldHVybiAwIGlmICREUllSVU47CgogICAgb3BlbihTVERJTiwgJzwnLCAiJEdJVF9ESVIvcDQv Y2hhbmdlbGlzdCIpIG9yCglkaWUgIiRHSVRfRElSL3A0L2NoYW5nZWxpc3Q6ICQhXG4iOwogICAg b3BlbigkcDQsICJwNCAtYyAkUDRDTElFTlQgLUggJFA0SE9TVCAtZCAkUDRST09UIGNoYW5nZSAt aXwiKSBvcgoJZGllICIkMDogZmFpbGVkIHRvIGNyZWF0ZSBjaGFuZ2VsaXN0XG4iOwogICAgbXkg KCRuZXdjaGFuZ2UpID0gZ3JlcCB7cy9eQ2hhbmdlIChcZCspIGNyZWF0ZWRcYi4qLyQxL3NvfSA8 JHA0PjsKICAgIGNsb3NlKCRwNCk7CiAgICBwcmludCAiQ2hlY2tpbmcgb3V0IFA0IGZpbGVzIGlu IGNoYW5nZWxpc3QgJG5ld2NoYW5nZVxuIiBpZiAkVkVSQk9TRTsKICAgIHN1YiBydW5wNCB7Cgly dW5fb3JfZXhpdCgncDQnLCctYycsJFA0Q0xJRU5ULCctSCcsJFA0SE9TVCwnLWQnLCRQNFJPT1Qs QF8pOwogICAgfQogICAgIyBvcGVuIGZpbGVzIGZvciBlZGl0CiAgICAkY250ID0gMDsKICAgIG9w ZW4oJHA0LCAnPicsICIkR0lUX0RJUi9wNC9maWxlcyIpIG9yIGRpZSAiJEdJVF9ESVIvcDQvZmls ZXM6ICQhXG4iOwogICAgcHJpbnQgJHA0ICItY1xuJG5ld2NoYW5nZVxuIjsKICAgIHByaW50ICRw NCAobWFwIHsrKyRjbnQ7IHN1YnN0cigkXywxKS4iXG4ifSBncmVwIHsvXk0vfSBAZmlsZXMpOwog ICAgY2xvc2UoJHA0KTsKICAgIHJ1bnA0KCcteCcsIiRHSVRfRElSL3A0L2ZpbGVzIiwgJ2VkaXQn KSBpZiAkY250OwogICAgZXhpdCgxKSBpZiAkPzsKCiAgICAkY250ID0gMDsKICAgIG9wZW4oJHA0 LCAnPicsICIkR0lUX0RJUi9wNC9maWxlcyIpIG9yIGRpZSAiJEdJVF9ESVIvcDQvZmlsZXM6ICQh XG4iOwogICAgcHJpbnQgJHA0ICItY1xuJG5ld2NoYW5nZVxuIjsKICAgIHByaW50ICRwNCAobWFw IHsrKyRjbnQ7IHN1YnN0cigkXywxKS4iXG4ifSBncmVwIHsvXkEvfSBAZmlsZXMpOwogICAgY2xv c2UoJHA0KTsKICAgIHJ1bnA0KCcteCcsIiRHSVRfRElSL3A0L2ZpbGVzIiwgJ2FkZCcpIGlmICRj bnQ7CiAgICBleGl0KDEpIGlmICQ/OwoKICAgICRjbnQgPSAwOwogICAgb3BlbigkcDQsICc+Jywg IiRHSVRfRElSL3A0L2ZpbGVzIikgb3IgZGllICIkR0lUX0RJUi9wNC9maWxlczogJCFcbiI7CiAg ICBwcmludCAkcDQgIi1jXG4kbmV3Y2hhbmdlXG4iOwogICAgcHJpbnQgJHA0IChtYXAgeysrJGNu dDsgc3Vic3RyKCRfLDEpLiJcbiJ9IGdyZXAgey9eRC99IEBmaWxlcyk7CiAgICBjbG9zZSgkcDQp OwogICAgcnVucDQoJy14JywiJEdJVF9ESVIvcDQvZmlsZXMiLCAnZGVsZXRlJykgaWYgJGNudDsK ICAgIGV4aXQoMSkgaWYgJD87CgogICAgIyBwNCBtb2RpZmllcyB3b3JraW5nIGRpcmVjdG9yeSBv biBjaGVja291dCwgc3R1cGlkIHRoaW5nCiAgICBzeXN0ZW0oJ2dpdCcsICd1cGRhdGUtaW5kZXgn LCAnLS1yZWZyZXNoJyk7CiAgICBpZiAoJGRvX21lcmdlKSB7CglydW5fb3JfZXhpdCgnZ2l0Jywg J21lcmdlJywgJy0tbm8tY29tbWl0JywgJG1lcmdlaGVhZCk7CiAgICB9IGVsc2UgewoJcnVuX29y X2V4aXQoJ2dpdCcsICdyZWFkLXRyZWUnLCAnLW0nLCAnLXUnLCAkbWVyZ2VoZWFkKTsKCXByaW50 ICJUaGUgc3RhdGUgb2YgJHNvdXJjZV9oZWFkKCRtZXJnZWhlYWQpIGlzIGNoZWNrZWQgb3V0Llxu IjsKICAgIH0KICAgIGlmICghJGF1dG9fc3VibWl0KSB7CglwcmludCAiQSBwNCBjaGFuZ2VsaXN0 ICRuZXdjaGFuZ2UgaXMgcHJlcGFyZWQuXG4iOwoJcHJpbnQgIlRvIHN1Ym1pdDpcblx0cDQgc3Vi bWl0IC1jICRuZXdjaGFuZ2VcbiI7CglwcmludCAiVG8gY29tbWl0OlxuXHRnaXQtcDQtaW1wb3J0 LmJhdCAteSAtQyBTVUJNSVRURURfQ0hBTkdFXG4iCgkgICAgaWYgISRmYXN0X2ZvcndhcmQ7CiAg ICB9IGVsc2UgewoJZGllICJwNC9maWxlczogJCFcbiIgaWYgIW9wZW4oJHA0LCAnPicsICIkR0lU X0RJUi9wNC9maWxlcyIpOwoJcHJpbnQgJHA0ICItY1xuJG5ld2NoYW5nZVxuIjsKCWNsb3NlKCRw NCk7CglteSBAcmVzOwoJbXkgJHN1YmNoYW5nZSA9IHVuZGVmOwoJQHJlcyA9IHF4e3A0IC1jICRQ NENMSUVOVCAtSCAkUDRIT1NUIC1kICRQNFJPT1QgLXggJEdJVF9ESVIvcDQvZmlsZXMgc3VibWl0 fTsKCWRpZSAicDQ6IGZhaWxlZCB0byBydW4gcDQgc3VibWl0IC1jICRuZXdjaGFuZ2VcbiIgaWYg JD87Cglmb3JlYWNoKEByZXMpIHsKCSAgICBwcmludDsKCSAgICBpZiAoL15ccypDaGFuZ2UgKFxk Kykgc3VibWl0dGVkXC4uKi9zKSB7CgkJJHN1YmNoYW5nZSA9ICQxOwoJICAgIH0KCSAgICBlbHNp ZiAoL15ccypDaGFuZ2UgKFxkKykgcmVuYW1lZCBjaGFuZ2UgKFxkKykgYW5kIHN1Ym1pdHRlZC4q L3MpIHsKCQkkc3ViY2hhbmdlID0gJDIgaWYgJDEgZXEgJG5ld2NoYW5nZTsKCSAgICB9Cgl9Cglk aWUgInA0IHN1Ym1pdCBiZWhhdmVkIHVuZXhwZWN0ZWRseVxuIi4KCSAgICAiVG8gdGFnIHRoZSBj dXJyZW50IEhFQUQgdXNlIFxuIi4KCSAgICAiXHRnaXQtcDQtaW1wb3J0IC0tcDQtdGFnIDx0aGUg bmV3IGNoYW5nZT5cbiIKCSAgICBpZiAhZGVmaW5lZCgkc3ViY2hhbmdlKTsKCSRzdWJjaGFuZ2Ug PX4gcy9ccj9cbiQvL3NvOwoJcHJpbnQgIlN1Ym1pdHRlZCBhcyAkc3ViY2hhbmdlXG4iOwoJaWYg KCRmYXN0X2ZvcndhcmQpIHsKCSAgICAkcmMgPSBnaXRfcDRfdGFnX0hFQUQoJHN1YmNoYW5nZSk7 CgkgICAgZXhpdCgxMjcpIGlmICRyYyAmIDB4ZmY7CgkgICAgZXhpdCgxKSBpZiAkcmM7CgkgICAg cHJpbnQgIlRhZ2dlZCBhcyBwNC8kc3ViY2hhbmdlXG4iOwoJfSBlbHNlIHsKCSAgICBwcmludCAi VGhlIG1lcmdlZCB0cmVlIGlzIGxlZnQgaW4gJFA0Uk9PVC5cbiI7CgkgICAgcHJpbnQgIlRvIGNv bW1pdDpcblx0Z2l0LXA0LWltcG9ydC5iYXQgLXkgLUMgJHN1YmNoYW5nZVxuIjsKCX0KICAgIH0K ICAgIHJldHVybiAwOwp9CgpfX0VORF9fCjpfX2VuZF9vZl9maWxlX18KCg== ------=_Part_20408_143888.1184309137305--