From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Jean-Philippe Gravel Newsgroups: gmane.emacs.bugs Subject: bug#10580: 24.0.92; gdb initialization takes more than one minute at 100 Date: Mon, 17 Dec 2012 23:45:49 -0500 Message-ID: References: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=20cf307f34120b857404d1192c1b X-Trace: ger.gmane.org 1355806018 20105 80.91.229.3 (18 Dec 2012 04:46:58 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Tue, 18 Dec 2012 04:46:58 +0000 (UTC) To: 10580@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Tue Dec 18 05:47:13 2012 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1Tkp5C-00078H-PK for geb-bug-gnu-emacs@m.gmane.org; Tue, 18 Dec 2012 05:47:11 +0100 Original-Received: from localhost ([::1]:58168 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tkp4z-0001J9-F2 for geb-bug-gnu-emacs@m.gmane.org; Mon, 17 Dec 2012 23:46:57 -0500 Original-Received: from eggs.gnu.org ([208.118.235.92]:45053) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tkp4q-0001IG-VI for bug-gnu-emacs@gnu.org; Mon, 17 Dec 2012 23:46:54 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Tkp4m-0007p0-VM for bug-gnu-emacs@gnu.org; Mon, 17 Dec 2012 23:46:48 -0500 Original-Received: from debbugs.gnu.org ([140.186.70.43]:37728) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tkp4m-0007ow-Qu for bug-gnu-emacs@gnu.org; Mon, 17 Dec 2012 23:46:44 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.72) (envelope-from ) id 1Tkp62-0008CI-C7 for bug-gnu-emacs@gnu.org; Mon, 17 Dec 2012 23:48:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Jean-Philippe Gravel Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 18 Dec 2012 04:48:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 10580 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 10580-submit@debbugs.gnu.org id=B10580.135580603231438 (code B ref 10580); Tue, 18 Dec 2012 04:48:02 +0000 Original-Received: (at 10580) by debbugs.gnu.org; 18 Dec 2012 04:47:12 +0000 Original-Received: from localhost ([127.0.0.1]:47979 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1Tkp5D-0008B0-8t for submit@debbugs.gnu.org; Mon, 17 Dec 2012 23:47:11 -0500 Original-Received: from mail-vb0-f48.google.com ([209.85.212.48]:47812) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1Tkp5B-0008As-1c for 10580@debbugs.gnu.org; Mon, 17 Dec 2012 23:47:10 -0500 Original-Received: by mail-vb0-f48.google.com with SMTP id fc21so278238vbb.7 for <10580@debbugs.gnu.org>; Mon, 17 Dec 2012 20:45:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; bh=p9ZqQ3WxzszqINNBszq04cgnLryWlR/wzI+4f1Xzzow=; b=t1CxxyGVOqNT0ekiCgcjvoPBW2OaFOHngcwzKoDOEPD2eQvmtiCJYgYlqPI0caXA8M klHbBPwpXhZZgXbIkY1zAr+R7Vy/W2D77D0tV0/pKV0NpfKSqEFbDl/TK+l5C+fw1H/j X67qJXVwD96qV4/urPu76K2MfmZraOoPUTL2V/1UIb+nZ2/ub2rGP5kazPe5H59Q6Chd Hfb5eO/Qj7eod04bLQq1RwAfFklQoUqYOHhBzEEK+wBu0cRrQLF/iQ0m9aJ+RVzZR+gw yAC2e97j8tMRARV3JEJ7iTCIAzrhk/TeYi/0WYNFQpbNb439kjHWcnTJVdFrAUEOU+c/ IIrw== Original-Received: by 10.52.72.66 with SMTP id b2mr943303vdv.31.1355805950182; Mon, 17 Dec 2012 20:45:50 -0800 (PST) Original-Received: by 10.58.65.104 with HTTP; Mon, 17 Dec 2012 20:45:49 -0800 (PST) In-Reply-To: X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:68693 Archived-At: --20cf307f34120b857404d1192c1b Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable Here is my patch. As stated previously, I only re-wrote gud-gdbmi-marker-filter. This function now parses the GDB/MI records in the order of arrival. Only the signature of each record is read by the new parser. The actual content of the record (i.e. result strings) is still parsed by the original code (which I will refer to as the record handlers below). The new parser is based on the GDB/MI output BNF grammar available at: ftp://ftp.gnu.org/pub/old-gnu/Manuals/gdb/html_node/gdb_214.html#SEC221 Records that are too large to be received in one data chunk can be parsed progressively by the record handlers, if they support it. The global configuration alist =93gdbmi-bnf-result-state-configs=94 defines the mapping between record types and record handlers. This structure flags all the handlers as either progressive or atomic. Progressive handlers are invokes as soon as a partial data chunks are received. Atomic handlers on the other hand will not be invoked until the whole record is received. This design allowed me to progressively attack the optimization problem: the ^done / ^error messages being the biggest bottleneck (the reply to -file-list-exec-source-files), I started by only converting those to progressive parsing. If we find that other messages cause performance issue, we can always convert them to progressive parsing as well. That being said, while the handler for ^done and ^error (gdb-done-or-error) do receive the data progressively, it doesn=92t parse it on the fly. Instead, it accumulates the data chunks in a temporary buffer and parses its content only when the record is complete. This is sub-optimal, but my tests showed that optimizing this part would have only a minimal effect compared to fixing gud-gdbmi-marker-filter. I decided to keep this as a separate optimization task, to be done later. For performance reason, I tried to keep processing and data copy to a minimum. I therefore work in-place, directly in the gud-marker-acc string, instead of copying the string to a temporary buffer. The parser walks in the string using an offset stored in gdbmi-bnf-offset. By looking at the character at this offset, I can quickly detect the type of record we received, BEFORE trying to parse it with string-match. Note: I am a little confused about when the parser states should be (re)initialized. I would have expected the states to be initialized before the GDB process is started (before gud-common-init) because once the process starts, the marker-filter can be invoked at any time. Instead, I find that the gdb-mi variables are all initialized in gdb-init-1, which runs after the process is started. I added a new function gdbmi-bnf-init that is invoked from within gdb-init-1, but that doesn=92t seem right. Does anyone have an opinion on this? I certainly do think there is currently a problem because if the GDB/MI initialization is interrupted expectedly (for instance because of an error), it seems to restart in a very bad state the next time (I think that's true even before my fix)=85 Jean-Philippe --20cf307f34120b857404d1192c1b Content-Type: application/octet-stream; name="gdb-mi-optimization-1.patch" Content-Disposition: attachment; filename="gdb-mi-optimization-1.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_haujrsn81 PT09IG1vZGlmaWVkIGZpbGUgJ2xpc3AvcHJvZ21vZGVzL2dkYi1taS5lbCcKKioqIGxpc3AvcHJv Z21vZGVzL2dkYi1taS5lbAkyMDEyLTEwLTE4IDE5OjQ2OjE4ICswMDAwCi0tLSBsaXNwL3Byb2dt b2Rlcy9nZGItbWkuZWwJMjAxMi0xMi0xOCAwNDozMjoyNiArMDAwMAoqKioqKioqKioqKioqKiog QWxzbyBkaXNwbGF5IHRoZSBtYWluIHJvdXRpbmUgaW4gdGhlIGRpcwoqKiogNTA3LDUxMiAqKioq Ci0tLSA1MDcsNTE5IC0tLS0KICAgIDpncm91cCAnZ2RiCiAgICA6dmVyc2lvbiAiMjIuMSIpCiAg CisgKGRlZmN1c3RvbSBnZGJtaS1kZWJ1Zy1tb2RlIG5pbAorICAgIldoZW4gbm9uLW5pbCwgYWxs IHRoZSBtZXNzYWdlcyBzZW50IG9yIHJlY2VpdmVkIGZyb20gR0RCL01JIGFyZSBwcmludGVkIGlu CisgdGhlICpNZXNzYWdlcyogYnVmZmVyLiIKKyAgIDp0eXBlICdib29sZWFuCisgICA6Z3JvdXAg J2d1ZAorICAgOnZlcnNpb24gIjI0LjMiKQorIAogIChkZWZ1biBnZGItZm9yY2UtbW9kZS1saW5l LXVwZGF0ZSAoc3RhdHVzKQogICAgKGxldCAoKGJ1ZmZlciBndWQtY29taW50LWJ1ZmZlcikpCiAg ICAgIChpZiAoYW5kIGJ1ZmZlciAoYnVmZmVyLW5hbWUgYnVmZmVyKSkKKioqKioqKioqKioqKioq IGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoaXMgbW9kZS4KKioqIDg0Niw4NTEgKioqKgotLS0g ODUzLDg2MCAtLS0tCiAgICAgICAgICBnZGItcmVnaXN0ZXItbmFtZXMgJygpCiAgICAgICAgICBn ZGItbm9uLXN0b3AgZ2RiLW5vbi1zdG9wLXNldHRpbmcpCiAgICA7OworICAgKGdkYm1pLWJuZi1p bml0KQorICAgOzsKICAgIChzZXRxIGdkYi1idWZmZXItdHlwZSAnZ2RibWkpCiAgICA7OwogICAg KGdkYi1mb3JjZS1tb2RlLWxpbmUtdXBkYXRlCioqKioqKioqKioqKioqKiBjb21wbGV0ZS4iCioq KiAxNzM5LDE3NDQgKioqKgotLS0gMTc0OCwxNzU0IC0tLS0KICAgIChzZXRxIGdkYi10b2tlbi1u dW1iZXIgKDErIGdkYi10b2tlbi1udW1iZXIpKQogICAgKHNldHEgY29tbWFuZCAoY29uY2F0IChu dW1iZXItdG8tc3RyaW5nIGdkYi10b2tlbi1udW1iZXIpIGNvbW1hbmQpKQogICAgKHB1c2ggKGNv bnMgZ2RiLXRva2VuLW51bWJlciBoYW5kbGVyLWZ1bmN0aW9uKSBnZGItaGFuZGxlci1hbGlzdCkK KyAgIChpZiBnZGJtaS1kZWJ1Zy1tb2RlIChtZXNzYWdlICJnZGItaW5wdXQ6ICVzIiBjb21tYW5k KSkKICAgIChwcm9jZXNzLXNlbmQtc3RyaW5nIChnZXQtYnVmZmVyLXByb2Nlc3MgZ3VkLWNvbWlu dC1idWZmZXIpCiAgCQkgICAgICAgKGNvbmNhdCBjb21tYW5kICJcbiIpKSkKICAKKioqKioqKioq KioqKioqIGlzIHJ1bm5pbmcuIgoqKiogMTg3NCwxODk2ICoqKioKICAgICAgICAoc2V0LXdpbmRv dy1idWZmZXIgc291cmNlLXdpbmRvdyBidWZmZXIpKQogICAgICBzb3VyY2Utd2luZG93KSkKICAK LSAoZGVmdW4gZ2RiLWNhcjwgKGEgYikKLSAgICg8IChjYXIgYSkgKGNhciBiKSkpCiAgCiEgKGRl ZnZhciBnZGJtaS1yZWNvcmQtbGlzdAohICAgJygoZ2RiLWdkYiAuICIoZ2RiKSBcbiIpCiEgICAg IChnZGItZG9uZSAuICJcXChbMC05XSpcXClcXF5kb25lLD9cXCguKj9cXClcbiIpCiEgICAgIChn ZGItc3RhcnRpbmcgLiAiXFwoWzAtOV0qXFwpXFxecnVubmluZ1xuIikKISAgICAgKGdkYi1lcnJv ciAuICJcXChbMC05XSpcXClcXF5lcnJvcixcXCguKj9cXClcbiIpCiEgICAgIChnZGItY29uc29s ZSAuICJ+XFwoXCIuKj9cIlxcKVxuIikKISAgICAgKGdkYi1pbnRlcm5hbHMgLiAiJlxcKFwiLio/ XCJcXClcbiIpCiEgICAgIChnZGItc3RvcHBlZCAuICJcXCpzdG9wcGVkLD9cXCguKj9cXClcbiIp CiEgICAgIChnZGItcnVubmluZyAuICJcXCpydW5uaW5nLFxcKC4qP1xuXFwpIikKISAgICAgKGdk Yi10aHJlYWQtY3JlYXRlZCAuICI9dGhyZWFkLWNyZWF0ZWQsXFwoLio/XG5cXCkiKQohICAgICAo Z2RiLXRocmVhZC1zZWxlY3RlZCAuICI9dGhyZWFkLXNlbGVjdGVkLFxcKC4qP1xcKVxuIikKISAg ICAgKGdkYi10aHJlYWQtZXhpdGVkIC4gIj10aHJlYWQtZXhpdGVkLFxcKC4qP1xuXFwpIikKISAg ICAgKGdkYi1pZ25vcmVkLW5vdGlmaWNhdGlvbiAuICI9Wy1bOmFscGhhOl1dKyw/XFwoLio/XFwp XG4iKQohICAgICAoZ2RiLXNoZWxsIC4gIlxcKFxcKD86Xi4rXG5cXCkrXFwpIikpKQogIAogIChk ZWZ1biBndWQtZ2RibWktbWFya2VyLWZpbHRlciAoc3RyaW5nKQogICAgIkZpbHRlciBHREIvTUkg b3V0cHV0LiIKLS0tIDE4ODQsMjIwNSAtLS0tCiAgICAgICAgKHNldC13aW5kb3ctYnVmZmVyIHNv dXJjZS13aW5kb3cgYnVmZmVyKSkKICAgICAgc291cmNlLXdpbmRvdykpCiAgCiAgCiEgKGRlZnVu IGdkYm1pLXN0YXJ0LXdpdGggKHN0ciBvZmZzZXQgbWF0Y2gpCiEgICAiUmV0dXJucyBub24tbmls IGlmIHN0cmluZyBTVFIgc3RhcnRzIHdpdGggTUFUQ0gsIGVsc2UgcmV0dXJucyBuaWwuCiEgT0ZG U0VUIGlzIHRoZSBwb3NpdGlvbiBpbiBTVFIgYXQgd2hpY2ggdGhlIGNvbXBhcmlzb24gdGFrZXMg cGxhY2UuIgohICAgKGxldCAoKG1hdGNoLWxlbmd0aCAobGVuZ3RoIG1hdGNoKSkKISAJKHN0ci1s ZW5ndGggKC0gKGxlbmd0aCBzdHIpIG9mZnNldCkpKQohICAgICAod2hlbiAoPj0gc3RyLWxlbmd0 aCBtYXRjaC1sZW5ndGgpCiEgICAgICAgKHN0cmluZy1lcXVhbCBtYXRjaCAoc3Vic3RyaW5nIHN0 ciBvZmZzZXQgKCsgb2Zmc2V0IG1hdGNoLWxlbmd0aCkpKSkpKQohIAohIChkZWZ1biBnZGJtaS1z YW1lLXN0YXJ0IChzdHIgb2Zmc2V0IG1hdGNoKQohICAgIlJldHVybnMgbm9uLW5pbCBpZiBTVFIg YW5kIE1BVENIIGFyZSBlcXVhbCB1cCB0byB0aGUgZW5kIG9mIGVpdGhlciBzdHJpbmdzLCBlbHNl IHJldHVybnMgbmlsLgohIE9GRlNFVCBpcyB0aGUgcG9zaXRpb24gaW4gU1RSIGF0IHdoaWNoIHRo ZSBjb21wYXJpc29uIHRha2VzIHBsYWNlLiIKISAgIChsZXQqICgoc3RyLWxlbmd0aCAoLSAobGVu Z3RoIHN0cikgb2Zmc2V0KSkKISAJIChtYXRjaC1sZW5ndGggKGxlbmd0aCBtYXRjaCkpCiEgCSAo Y29tcGFyZS1sZW5ndGggKG1pbiBzdHItbGVuZ3RoIG1hdGNoLWxlbmd0aCkpKQohICAgICAod2hl biAoPiBjb21wYXJlLWxlbmd0aCAwKQohICAgICAgIChzdHJpbmctZXF1YWwgKHN1YnN0cmluZyBz dHIgb2Zmc2V0ICgrIG9mZnNldCBjb21wYXJlLWxlbmd0aCkpCiEgCQkgICAgKHN1YnN0cmluZyBt YXRjaCAwIGNvbXBhcmUtbGVuZ3RoKSkpKSkKISAKISAoZGVmdW4gZ2RibWktaXMtbnVtYmVyIChj aGFyYWN0ZXIpCiEgIlJldHVybnMgbm9uLW5pbCBpZiBDSEFSQUNURVIgaXMgYSBudW1lcmljYWwg Y2hhcmFjdGVyIGJldHdlZW4gMCBhbmQgOSwKISBlbHNlIHJldHVybnMgbmlsLiIKISAgIChhbmQg KD49IGNoYXJhY3RlciA/MCkKISAgICAgICAgKDw9IGNoYXJhY3RlciA/OSkpKQohIAohIAohIChk ZWZ2YXIgZ2RibWktYm5mLXN0YXRlICdnZGJtaS1ibmYtb3V0cHV0CiEgICAiQ3VycmVudCBHREIv TUkgb3V0cHV0IHBhcnNlciBzdGF0ZS4gIFRoZSBwYXJzZXIgaXMgcGxhY2VkIGluIGEKISBkaWZm ZXJlbnQgc3RhdGUgd2hlbiBhbiBpbmNvbXBsZXRlIGRhdGEgc3RlYW0gaXMgcmVjZWl2ZWQgZnJv bSBHREIuCiEgVGhpcyB2YXJpYWJsZSB3aWxsIHByZXNlcnZlIHRoZSBzdGF0ZSByZXF1aXJlZCB0 byByZXN1bWUgdGhlIHBhcnNpbmcKISB3aGVuIG1vcmUgZGF0YSBhcnJpdmVzLiIpCiEgKG1ha2Ut dmFyaWFibGUtYnVmZmVyLWxvY2FsICdnZGJtaS1ibmYtc3RhdGUpCiEgCiEgKGRlZnZhciBnZGJt aS1ibmYtb2Zmc2V0IDAKISAgICJPZmZzZXQgaW4gZ3VkLW1hcmtlci1hY2MgYXQgd2hpY2ggdGhl IHBhcnNlciBpcyByZWFkaW5nLgohIFRoaXMgb2Zmc2V0IGlzIHVzZWQgdG8gYmUgYWJsZSB0byBw YXJzZSB0aGUgR0RCL01JIG1lc3NhZ2UKISBpbi1wbGFjZSwgd2l0aG91dCB0aGUgbmVlZCBvZiBj b3B5aW5nIHRoZSBzdHJpbmcgaW4gYSB0ZW1wb3JhcnkgYnVmZmVyCiEgb3IgZGlzY2FyZGluZyBw YXJzZWQgdG9rZW5zIGJ5IHN1YnN0cmluZ2luZyB0aGUgbWVzc2FnZS4iKQohIChtYWtlLXZhcmlh YmxlLWJ1ZmZlci1sb2NhbCAnZ2RibWktYm5mLW9mZnNldCkKISAKISAoZGVmdW4gZ2RibWktYm5m LWluaXQgKCkKISAgICJJbml0aWFsaXplcyB0aGUgR0RCL01JIG1lc3NhZ2UgcGFyc2VyIgohICAg KHNldHEgZ2RibWktYm5mLXN0YXRlICdnZGJtaS1ibmYtb3V0cHV0KQohICAgKHNldHEgZ2RibWkt Ym5mLW9mZnNldCAwKQohICAgKHNldHEgZ3VkLW1hcmtlci1hY2MgIiIpKQohIAohIAohIChkZWZ1 biBnZGJtaS1ibmYtb3V0cHV0ICgpCiEgICAiSW1wbGVtZW50YXRpb24gb2YgdGhlIGZvbGxvd2lu ZyBHREIvTUkgb3V0cHV0IGdyYW1tYXIgcnVsZToKISAKISAgIG91dHB1dCA9PT4KISAgICAgICAg KCBvdXQtb2YtYmFuZC1yZWNvcmQgKSogWyByZXN1bHQtcmVjb3JkIF0gZ2RiLXByb21wdCIKISAK ISAgICAgKGdkYm1pLWJuZi1za2lwLXVucmVjb2duaXplZCkKISAgICAgKHdoaWxlIChnZGJtaS1i bmYtb3V0LW9mLWJhbmQtcmVjb3JkKSkKISAgICAgKGdkYm1pLWJuZi1yZXN1bHQtcmVjb3JkKQoh ICAgICAoZ2RibWktYm5mLWdkYi1wcm9tcHQpKQohIAohIAohIChkZWZ1biBnZGJtaS1ibmYtc2tp cC11bnJlY29nbml6ZWQgKCkKISAiVXNlZCBhcyBhIHByb3RlY3Rpb24gbWVjaGFuaXNtIGluIGNh c2Ugc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2hlbiBwYXJzaW5nCiEgYSBHREIvTUkgcmVwbHkgbWVz c2FnZS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBza2lwIGNoYXJhY3RlcnMgdW50aWwgaXMgZW5jb3Vu dGVycwohIHRoZSBiZWdpbm5pbmcgb2YgYSB2YWxpZCByZWNvcmQuIgohICAgKGxldCAoKGFjYy1s ZW5ndGggKGxlbmd0aCBndWQtbWFya2VyLWFjYykpCiEgCShwcmVmaXgtb2Zmc2V0IGdkYm1pLWJu Zi1vZmZzZXQpCiEgCShwcm9tcHQgIihnZGIpIFxuIikpCiEgCiEgICAgICh3aGlsZSAoYW5kICg8 IHByZWZpeC1vZmZzZXQgYWNjLWxlbmd0aCkKISAgICAgICAgICAgICAgICAgKGdkYm1pLWlzLW51 bWJlciAoYXJlZiBndWQtbWFya2VyLWFjYyBwcmVmaXgtb2Zmc2V0KSkpCiEgICAgICAgKHNldHEg cHJlZml4LW9mZnNldCAoMSsgcHJlZml4LW9mZnNldCkpKQohIAohICAgICAoaWYgKGFuZCAoPCBw cmVmaXgtb2Zmc2V0IGFjYy1sZW5ndGgpCiEgICAgICAgICAgICAgIChub3QgKG1lbWJlciAoYXJl ZiBndWQtbWFya2VyLWFjYyBwcmVmaXgtb2Zmc2V0KSAnKD9eID8qID8rID89ID9+ID9AID8mKSkp CiEgICAgICAgICAgICAgIChub3QgKGdkYm1pLXNhbWUtc3RhcnQgZ3VkLW1hcmtlci1hY2MgZ2Ri bWktYm5mLW9mZnNldCBwcm9tcHQpKQohICAgICAgICAgICAgICAoc3RyaW5nLW1hdGNoICJcXChb Xl4qKz1+QCZdK1xcKSIgZ3VkLW1hcmtlci1hY2MgZ2RibWktYm5mLW9mZnNldCkpCiEgICAgICAg ICAobGV0ICgodW5yZWNvZ25pemVkLXN0ciAobWF0Y2gtc3RyaW5nIDAgZ3VkLW1hcmtlci1hY2Mp KSkKISAgICAgICAgICAgKHNldHEgZ2RibWktYm5mLW9mZnNldCAobWF0Y2gtZW5kIDApKQohIAkg IChpZiBnZGJtaS1kZWJ1Zy1tb2RlIChtZXNzYWdlICJnZGJtaS1ibmYtc2tpcC11bnJlY29nbml6 ZWQ6ICVzIiB1bnJlY29nbml6ZWQtc3RyKSkKISAgICAgICAgICAgKGdkYi1zaGVsbCB1bnJlY29n bml6ZWQtc3RyKQohIAkgIHQpKSkpCiEgCiEgCiEgKGRlZnVuIGdkYm1pLWJuZi1nZGItcHJvbXB0 ICgpCiEgICAiSW1wbGVtZW50YXRpb24gb2YgdGhlIGZvbGxvd2luZyBHREIvTUkgb3V0cHV0IGdy YW1tYXIgcnVsZToKISAgIGdkYi1wcm9tcHQgPT0+CiEgICAgICAgICcoZ2RiKScgbmwKISAKISAg IG5sID09PgohICAgICAgICBDUiB8IENSLUxGIgohIAohICAgKGxldCAoKHByb21wdCAiKGdkYikg XG4iKSkKISAgICAgKHdoZW4gKGdkYm1pLXN0YXJ0LXdpdGggZ3VkLW1hcmtlci1hY2MgZ2RibWkt Ym5mLW9mZnNldCBwcm9tcHQpCiEgICAgICAgKGlmIGdkYm1pLWRlYnVnLW1vZGUgKG1lc3NhZ2Ug ImdkYm1pLWJuZi1nZGItcHJvbXB0OiAlcyIgcHJvbXB0KSkKISAgICAgICAoZ2RiLWdkYiBwcm9t cHQpCiEgICAgICAgKHNldHEgZ2RibWktYm5mLW9mZnNldCAoKyBnZGJtaS1ibmYtb2Zmc2V0IChs ZW5ndGggcHJvbXB0KSkpCiEgCiEgICAgICAgOzsgUmV0dXJucyBub24tbmlsIHRvIHRlbGwgZ3Vk LWdkYm1pLW1hcmtlci1maWx0ZXIgd2UndmUgcmVhY2hlZAohICAgICAgIDs7IHRoZSBlbmQgb2Yg YSBHREIgcmVwbHkgbWVzc2FnZS4KISAgICAgICB0KSkpCiEgCiEgCiEgKGRlZnVuIGdkYm1pLWJu Zi1yZXN1bHQtcmVjb3JkICgpCiEgICAiSW1wbGVtZW50YXRpb24gb2YgdGhlIGZvbGxvd2luZyBH REIvTUkgb3V0cHV0IGdyYW1tYXIgcnVsZToKISAKISAgIHJlc3VsdC1yZWNvcmQgPT0+CiEgICAg ICAgIFsgdG9rZW4gXSAnXicgcmVzdWx0LWNsYXNzICggJywnIHJlc3VsdCApKiBubAohIAohICAg dG9rZW4gPT0+CiEgICAgICAgIGFueSBzZXF1ZW5jZSBvZiBkaWdpdHMuIgohIAohICAgKGdkYm1p LWJuZi1yZXN1bHQtYW5kLWFzeW5jLXJlY29yZC1pbXBsKSkKISAKISAKISAoZGVmdW4gZ2RibWkt Ym5mLW91dC1vZi1iYW5kLXJlY29yZCAoKQohICAgIkltcGxlbWVudGF0aW9uIG9mIHRoZSBmb2xs b3dpbmcgR0RCL01JIG91dHB1dCBncmFtbWFyIHJ1bGU6CiEgCiEgICBvdXQtb2YtYmFuZC1yZWNv cmQgPT0+CiEgICAgICAgIGFzeW5jLXJlY29yZCB8IHN0cmVhbS1yZWNvcmQiCiEgCiEgICAob3Ig KGdkYm1pLWJuZi1hc3luYy1yZWNvcmQpCiEgICAgICAgKGdkYm1pLWJuZi1zdHJlYW0tcmVjb3Jk KSkpCiEgCiEgCiEgKGRlZnVuIGdkYm1pLWJuZi1hc3luYy1yZWNvcmQgKCkKISAgICJJbXBsZW1l bnRhdGlvbiBvZiB0aGUgZm9sbG93aW5nIEdEQi9NSSBvdXRwdXQgZ3JhbW1hciBydWxlczoKISAK ISAgIGFzeW5jLXJlY29yZCA9PT4KISAgICAgICAgZXhlYy1hc3luYy1vdXRwdXQgfCBzdGF0dXMt YXN5bmMtb3V0cHV0IHwgbm90aWZ5LWFzeW5jLW91dHB1dAohIAohICAgZXhlYy1hc3luYy1vdXRw dXQgPT0+CiEgICAgICAgIFsgdG9rZW4gXSAnKicgYXN5bmMtb3V0cHV0CiEgCiEgICBzdGF0dXMt YXN5bmMtb3V0cHV0ID09PgohICAgICAgICBbIHRva2VuIF0gJysnIGFzeW5jLW91dHB1dAohIAoh ICAgbm90aWZ5LWFzeW5jLW91dHB1dCA9PT4KISAgICAgICAgWyB0b2tlbiBdICc9JyBhc3luYy1v dXRwdXQKISAKISAgIGFzeW5jLW91dHB1dCA9PT4KISAgICAgICAgYXN5bmMtY2xhc3MgKCAnLCcg cmVzdWx0ICkqIG5sIgohIAohICAgKGdkYm1pLWJuZi1yZXN1bHQtYW5kLWFzeW5jLXJlY29yZC1p bXBsKSkKISAKISAKISAoZGVmdW4gZ2RibWktYm5mLXN0cmVhbS1yZWNvcmQgKCkKISAgICJJbXBs ZW1lbnQgdGhlIGZvbGxvd2luZyBHREIvTUkgb3V0cHV0IGdyYW1tYXIgcnVsZToKISAgIHN0cmVh bS1yZWNvcmQgPT0+CiEgICAgICAgIGNvbnNvbGUtc3RyZWFtLW91dHB1dCB8IHRhcmdldC1zdHJl YW0tb3V0cHV0IHwgbG9nLXN0cmVhbS1vdXRwdXQKISAKISAgIGNvbnNvbGUtc3RyZWFtLW91dHB1 dCA9PT4KISAgICAgICAgJ34nIGMtc3RyaW5nCiEgCiEgICB0YXJnZXQtc3RyZWFtLW91dHB1dCA9 PT4KISAgICAgICAgJ0AnIGMtc3RyaW5nCiEgCiEgICBsb2ctc3RyZWFtLW91dHB1dCA9PT4KISAg ICAgICAgJyYnIGMtc3RyaW5nIgohICAgKHdoZW4gKDwgZ2RibWktYm5mLW9mZnNldCAobGVuZ3Ro IGd1ZC1tYXJrZXItYWNjKSkKISAgICAgKGlmIChhbmQgKG1lbWJlciAoYXJlZiBndWQtbWFya2Vy LWFjYyBnZGJtaS1ibmYtb2Zmc2V0KSAnKD9+ID9AID8mKSkKISAgICAgICAgICAgICAgKHN0cmlu Zy1tYXRjaCAiXFwoW35AJl1cXClcXChcIi4qP1wiXFwpXG4iIGd1ZC1tYXJrZXItYWNjIGdkYm1p LWJuZi1vZmZzZXQpKQohICAgICAgICAgKGxldCAoKHByZWZpeCAobWF0Y2gtc3RyaW5nIDEgZ3Vk LW1hcmtlci1hY2MpKQohICAgICAgICAgICAgICAgKGMtc3RyaW5nIChtYXRjaC1zdHJpbmcgMiBn dWQtbWFya2VyLWFjYykpKQohIAohICAgICAgICAgICAoc2V0cSBnZGJtaS1ibmYtb2Zmc2V0ICht YXRjaC1lbmQgMCkpCiEgICAgICAgICAgIChpZiBnZGJtaS1kZWJ1Zy1tb2RlIChtZXNzYWdlICJn ZGJtaS1ibmYtc3RyZWFtLXJlY29yZDogJXMiIChtYXRjaC1zdHJpbmcgMCBndWQtbWFya2VyLWFj YykpKQohIAohICAgICAgICAgICAoY29uZCAoKHN0cmluZy1lcXVhbCBwcmVmaXggIn4iKQohICAg ICAgICAgICAgICAgICAgKGdkYm1pLWJuZi1jb25zb2xlLXN0cmVhbS1vdXRwdXQgYy1zdHJpbmcp KQohICAgICAgICAgICAgICAgICAoKHN0cmluZy1lcXVhbCBwcmVmaXggIkAiKQohICAgICAgICAg ICAgICAgICAgKGdkYm1pLWJuZi10YXJnZXQtc3RyZWFtLW91dHB1dCBjLXN0cmluZykpCiEgICAg ICAgICAgICAgICAgICgoc3RyaW5nLWVxdWFsIHByZWZpeCAiJiIpCiEgICAgICAgICAgICAgICAg ICAoZ2RibWktYm5mLWxvZy1zdHJlYW0tb3V0cHV0IGMtc3RyaW5nKSkpCiEgCSAgdCkpKSkKISAK ISAoZGVmdW4gZ2RibWktYm5mLWNvbnNvbGUtc3RyZWFtLW91dHB1dCAoYy1zdHJpbmcpCiEgICAi SGFuZGxlciBmb3IgdGhlIGNvbnNvbGUtc3RyZWFtLW91dHB1dCBHREIvTUkgb3V0cHV0IGdyYW1t YXIgcnVsZSIKISAgIChnZGItY29uc29sZSBjLXN0cmluZykpCiEgCiEgKGRlZnVuIGdkYm1pLWJu Zi10YXJnZXQtc3RyZWFtLW91dHB1dCAoYy1zdHJpbmcpCiEgICAiSGFuZGxlciBmb3IgdGhlIHRh cmdldC1zdHJlYW0tb3V0cHV0IEdEQi9NSSBvdXRwdXQgZ3JhbW1hciBydWxlIgohICAgOzsgTm90 IGN1cnJlbnRseSB1c2VkLgohICAgKQohIAohIChkZWZ1biBnZGJtaS1ibmYtbG9nLXN0cmVhbS1v dXRwdXQgKGMtc3RyaW5nKQohICAgIkhhbmRsZXIgZm9yIHRoZSBsb2ctc3RyZWFtLW91dHB1dCBH REIvTUkgb3V0cHV0IGdyYW1tYXIgcnVsZSIKISAgIDs7IFN1cHByZXNzICJObyByZWdpc3RlcnMu IiAgR0RCIDYuOCBhbmQgZWFybGllcgohICAgOzsgZHVwbGljYXRlcyBNSSBlcnJvciBtZXNzYWdl IG9uIGludGVybmFsIHN0cmVhbS4KISAgIDs7IERvbid0IHByaW50IHRvIEdVRCBidWZmZXIuCiEg ICAoaWYgKG5vdCAoc3RyaW5nLWVxdWFsIChyZWFkIGMtc3RyaW5nKSAiTm8gcmVnaXN0ZXJzLlxu IikpCiEgICAgICAgKGdkYi1pbnRlcm5hbHMgYy1zdHJpbmcpKSkKISAKISAKISAoZGVmY29uc3Qg Z2RibWktYm5mLXJlc3VsdC1zdGF0ZS1jb25maWdzCiEgICAnKCgiXiIgLiAoKCJkb25lIiAuIChn ZGItZG9uZSAuIHByb2dyZXNzaXZlKSkKISAgICAgICAgICAgICAoImVycm9yIiAuIChnZGItZXJy b3IgLiBwcm9ncmVzc2l2ZSkpCiEgICAgICAgICAgICAgKCJydW5uaW5nIiAuIChnZGItc3RhcnRp bmcgLiBhdG9taWMpKSkpCiEgICAgICgiKiIgLiAoKCJzdG9wcGVkIiAuIChnZGItc3RvcHBlZCAu IGF0b21pYykpCiEgICAgICAgICAgICAgKCJydW5uaW5nIiAuIChnZGItcnVubmluZyAuIGF0b21p YykpKSkKISAgICAgKCIrIiAuICgpKQohICAgICAoIj0iIC4gKCgidGhyZWFkLWNyZWF0ZWQiIC4g KGdkYi10aHJlYWQtY3JlYXRlZCAuIGF0b21pYykpCiEgICAgICAgICAgICAgKCJ0aHJlYWQtc2Vs ZWN0ZWQiIC4gKGdkYi10aHJlYWQtc2VsZWN0ZWQgLiBhdG9taWMpKQohICAgICAgICAgICAgICgi dGhyZWFkLWV4aXN0ZWQiIC4gKGdkYi1pZ25vcmVkLW5vdGlmaWNhdGlvbiAuIGF0b21pYykpCiEg ICAgICAgICAgICAgKCdkZWZhdWx0IC4gKGdkYi1pZ25vcmVkLW5vdGlmaWNhdGlvbiAuIGF0b21p YykpKSkpCiEgICAiVHdvIGRpbWVuc2lvbmFsIGFsaXN0LCBtYXBwaW5nIHRoZSB0eXBlIGFuZCBj bGFzcyBvZiBtZXNzYWdlIHRvIGEgaGFuZGxlciBmdW5jdGlvbi4KISBIYW5kbGVyIGZ1bmN0aW9u cyBhcmUgYWxsIGZsYWdnZWQgYXMgZWl0aGVyICdwcm9ncmVzc2l2ZScgb3IgJ2F0b21pYycuICAn cHJvZ3Jlc3NpdmUnCiEgaGFuZGxlcnMgYXJlIGNhcGFibGUgb2YgcGFyc2luZyBpbmNvbXBsZXRl IG1lc3NhZ2VzLiAgVGhleSBjYW4gYmUgY2FsbGVkIHNldmVyYWwgdGltZQohIHdpdGggbmV3IGRh dGEgY2h1bmsgYXMgdGhleSBhcnJpdmUgZnJvbSBHREIuICAncHJvZ3Jlc3NpdmUnIGhhbmRsZXIg bXVzdCBoYXZlIGFuIGV4dHJhCiEgYXJndW1lbnQgdGhhdCBpcyBzZXQgdG8gYSBub24tbmlsIHZh bHVlIHdoZW4gdGhlIG1lc3NhZ2UgaXMgY29tcGxldGUuCiEgCiEgSW1wbGVtZW50IHRoZSBmb2xs b3dpbmcgR0RCL01JIG91dHB1dCBncmFtbWFyIHJ1bGU6CiEgICByZXN1bHQtY2xhc3MgPT0+CiEg ICAgICAgICdkb25lJyB8ICdydW5uaW5nJyB8ICdjb25uZWN0ZWQnIHwgJ2Vycm9yJyB8ICdleGl0 JwohIAohICAgYXN5bmMtY2xhc3MgPT0+CiEgICAgICAgICdzdG9wcGVkJyB8IG90aGVycyAod2hl cmUgb3RoZXJzIHdpbGwgYmUgYWRkZWQgZGVwZW5kaW5nIG9uIHRoZSBuZWVkcy0tdGhpcyBpcyBz dGlsbCBpbiBkZXZlbG9wbWVudCkuIikKISAKISAoZGVmdW4gZ2RibWktYm5mLXJlc3VsdC1hbmQt YXN5bmMtcmVjb3JkLWltcGwgKCkKISAgICJDb21tb24gaW1wbGVtZW50YXRpb24gb2YgdGhlIHJl c3VsdC1yZWNvcmQgYW5kIGFzeW5jLXJlY29yZCBydWxlLiAgQm90aCBydWxlIHNoYXJlCiEgdGhl IHNhbWUgc3ludGF4LiAgVGhvc2UgcmVjb3JkcyBtYXkgYmUgdmVyeSBsYXJnZSBpbiBzaXplLiAg Rm9yIHRoYXQgcmVhc29uLCB0aGUgJ3Jlc3VsdCcKISBwYXJ0IG9mIHRoZSAgcmVjb3JkIGlzIHBh cnNlZCBieSBnZGJtaS1ibmYtaW5jb21wbGV0ZS1yZWNvcmQtcmVzdWx0LCB3aGljaCB3aWxsIGtl ZXAKISByZWNlaXZpbmcgY2hhcmFjdGVycyBhcyB0aGV5IGFycml2ZSBmcm9tIEdEQiB1bnRpbCB0 aGUgcmVjb3JkIGlzIGNvbXBsZXRlLiIKISAgIChsZXQgKChhY2MtbGVuZ3RoIChsZW5ndGggZ3Vk LW1hcmtlci1hY2MpKQohIAkocHJlZml4LW9mZnNldCBnZGJtaS1ibmYtb2Zmc2V0KSkKISAKISAg ICAgKHdoaWxlIChhbmQgKDwgcHJlZml4LW9mZnNldCBhY2MtbGVuZ3RoKQohICAgICAgICAgICAg ICAgICAoZ2RibWktaXMtbnVtYmVyIChhcmVmIGd1ZC1tYXJrZXItYWNjIHByZWZpeC1vZmZzZXQp KSkKISAgICAgICAoc2V0cSBwcmVmaXgtb2Zmc2V0ICgxKyBwcmVmaXgtb2Zmc2V0KSkpCiEgCiEg ICAgIChpZiAoYW5kICg8IHByZWZpeC1vZmZzZXQgYWNjLWxlbmd0aCkKISAgICAgICAgICAgICAg KG1lbWJlciAoYXJlZiBndWQtbWFya2VyLWFjYyBwcmVmaXgtb2Zmc2V0KSAnKD8qID8rID89ID9e KSkKISAgICAgICAgICAgICAgKHN0cmluZy1tYXRjaCAiXFwoWzAtOV0qXFwpXFwoWyorPV5dXFwp XFwoLis/XFwpXFwoWyxcbl1cXCkiIGd1ZC1tYXJrZXItYWNjIGdkYm1pLWJuZi1vZmZzZXQpKQoh IAohICAgICAgICAgKGxldCAoKHRva2VuIChtYXRjaC1zdHJpbmcgMSBndWQtbWFya2VyLWFjYykp CiEgCSAgICAgIChwcmVmaXggKG1hdGNoLXN0cmluZyAyIGd1ZC1tYXJrZXItYWNjKSkKISAJICAg ICAgKGNsYXNzIChtYXRjaC1zdHJpbmcgMyBndWQtbWFya2VyLWFjYykpCiEgCSAgICAgIChjb21w bGV0ZSAoc3RyaW5nLWVxdWFsIChtYXRjaC1zdHJpbmcgNCBndWQtbWFya2VyLWFjYykgIlxuIikp CiEgCSAgICAgIGNsYXNzLWFsaXN0CiEgCSAgICAgIGNsYXNzLWNvbW1hbmQpCiEgCiEgICAgICAg ICAgIChzZXRxIGdkYm1pLWJuZi1vZmZzZXQgKG1hdGNoLWVuZCAwKSkKISAJICAoaWYgZ2RibWkt ZGVidWctbW9kZSAobWVzc2FnZSAiZ2RibWktYm5mLXJlc3VsdC1yZWNvcmQ6ICVzIiAobWF0Y2gt c3RyaW5nIDAgZ3VkLW1hcmtlci1hY2MpKSkKISAKISAgICAgICAgICAgKHNldHEgY2xhc3MtYWxp c3QgKGNkciAoYXNzb2MgcHJlZml4IGdkYm1pLWJuZi1yZXN1bHQtc3RhdGUtY29uZmlncykpKQoh ICAgICAgICAgICAoc2V0cSBjbGFzcy1jb21tYW5kIChjZHIgKGFzc29jIGNsYXNzIGNsYXNzLWFs aXN0KSkpCiEgICAgICAgICAgIChpZiAobnVsbCBjbGFzcy1jb21tYW5kKQohICAgICAgICAgICAg ICAgKHNldHEgY2xhc3MtY29tbWFuZCAoY2RyIChhc3NvYyAnZGVmYXVsdCBjbGFzcy1hbGlzdCkp KSkKISAKISAgICAgICAgICAgKGlmIGNvbXBsZXRlCiEgICAgICAgICAgICAgICAoaWYgY2xhc3Mt Y29tbWFuZAohICAgICAgICAgICAgICAgICAgIChpZiAoZXF1YWwgKGNkciBjbGFzcy1jb21tYW5k KSAncHJvZ3Jlc3NpdmUpCiEgICAgICAgICAgICAgICAgICAgICAgIChmdW5jYWxsIChjYXIgY2xh c3MtY29tbWFuZCkgdG9rZW4gIiIgY29tcGxldGUpCiEgICAgICAgICAgICAgICAgICAgICAoZnVu Y2FsbCAoY2FyIGNsYXNzLWNvbW1hbmQpIHRva2VuICIiKSkpCiEgICAgICAgICAgICAgKHNldHEg Z2RibWktYm5mLXN0YXRlIGAobGFtYmRhICgpIChnZGJtaS1ibmYtaW5jb21wbGV0ZS1yZWNvcmQt cmVzdWx0ICx0b2tlbiAnLGNsYXNzLWNvbW1hbmQpKSkKISAgICAgICAgICAgICAoZnVuY2FsbCBn ZGJtaS1ibmYtc3RhdGUpKQohIAkgIHQpKSkpCiEgCiEgKGRlZnVuIGdkYm1pLWJuZi1pbmNvbXBs ZXRlLXJlY29yZC1yZXN1bHQgKHRva2VuIGNsYXNzLWNvbW1hbmQpCiEgICAiU3RhdGUgb2YgdGhl IHBhcnNlciB1c2VkIHRvIHByb2dyZXNzaXZlbHkgcGFyc2UgYSByZXN1bHQtcmVjb3JkIG9yIGFz eW5jLXJlY29yZAohIHJ1bGUgZnJvbSBhbiBpbmNvbXBsZXRlIGRhdGEgc3RyZWFtLiAgVGhlIHBh cnNlciB3aWxsIHN0YXkgaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgZW5kCiEgb2YgdGhlIGN1cnJl bnQgcmVzdWx0IG9yIGFzeW5jIHJlY29yZCBpcyByZWFjaGVkLiIKISAgICh3aGVuICg8IGdkYm1p LWJuZi1vZmZzZXQgKGxlbmd0aCBndWQtbWFya2VyLWFjYykpCiEgICAgIDs7IFNlYXJjaCB0aGUg ZGF0YSBzdHJlYW0gZm9yIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcmVjb3JkOgohICAgICAoaWYg KHN0cmluZy1tYXRjaCAiXFwoW15cbl0qXFwpXFwoXG4/XFwpIiBndWQtbWFya2VyLWFjYyBnZGJt aS1ibmYtb2Zmc2V0KQohIAohICAgICAgICAgKGxldCAoKHJlc3VsdCAobWF0Y2gtc3RyaW5nIDEg Z3VkLW1hcmtlci1hY2MpKQohICAgICAgICAgICAgICAgKGlzLWNvbXBsZXRlIChzdHJpbmctZXF1 YWwgKG1hdGNoLXN0cmluZyAyIGd1ZC1tYXJrZXItYWNjKSAiXG4iKSkKISAgICAgICAgICAgICAg IChpcy1wcm9ncmVzc2l2ZSAoZXF1YWwgKGNkciBjbGFzcy1jb21tYW5kKSAncHJvZ3Jlc3NpdmUp KSkKISAKISAgICAgICAgICAgOzsgVXBkYXRlIHRoZSBnZGJtaS1ibmYtb2Zmc2V0IG9ubHkgaWYg dGhlIGN1cnJlbnQgY2h1bmsgb2YgZGF0YSBjYW4KISAgICAgICAgICAgOzsgYmUgcHJvY2Vzc2Vk IGJ5IHRoZSBjbGFzcy1jb21tYW5kIGhhbmRsZXI6CiEgICAgICAgICAgIChpZiAob3IgaXMtY29t cGxldGUgaXMtcHJvZ3Jlc3NpdmUpCiEgICAgICAgICAgICAgICAoc2V0cSBnZGJtaS1ibmYtb2Zm c2V0IChtYXRjaC1lbmQgMCkpKQohIAohIAkgIChpZiBnZGJtaS1kZWJ1Zy1tb2RlIChtZXNzYWdl ICJnZGJtaS1ibmYtaW5jb21wbGV0ZS1yZWNvcmQtcmVzdWx0OiAlcyIgKG1hdGNoLXN0cmluZyAw IGd1ZC1tYXJrZXItYWNjKSkpCiEgCiEgICAgICAgICAgIDs7IFVwZGF0ZSB0aGUgcGFyc2luZyBz dGF0ZSBiZWZvcmUgaW52b2tpbmcgdGhlIGhhbmRsZXIgaW4gY2xhc3MtY29tbWFuZAohICAgICAg ICAgICA7OyB0byBtYWtlIHN1cmUgaXQncyBub3QgbGVmdCBpbiBhbiBpbnZhbGlkIHN0YXRlIGlm IHRoZSBoYW5kbGVyIHdhcwohICAgICAgICAgICA7OyB0byBnZW5lcmF0ZSBhbiBlcnJvci4KISAg ICAgICAgICAgKGlmIGlzLWNvbXBsZXRlCiEgICAgICAgICAgICAgICAoc2V0cSBnZGJtaS1ibmYt c3RhdGUgJ2dkYm1pLWJuZi1vdXRwdXQpKQohIAohICAgICAgICAgICAoaWYgY2xhc3MtY29tbWFu ZAohICAgICAgICAgICAgICAgKGlmIGlzLXByb2dyZXNzaXZlCiEgICAgICAgICAgICAgICAgICAg KGZ1bmNhbGwgKGNhciBjbGFzcy1jb21tYW5kKSB0b2tlbiByZXN1bHQgaXMtY29tcGxldGUpCiEg ICAgICAgICAgICAgICAgIChpZiBpcy1jb21wbGV0ZQohICAgICAgICAgICAgICAgICAgICAgKGZ1 bmNhbGwgKGNhciBjbGFzcy1jb21tYW5kKSB0b2tlbiByZXN1bHQpKSkpCiEgCiEgICAgICAgICAg ICh1bmxlc3MgaXMtY29tcGxldGUgOzsgSW5jb21wbGV0ZSBnZGIgcmVzcG9uc2U6IGFib3J0IHRo ZSBwYXJzaW5nIHVudGlsIHdlIHJlY2VpdmUgbW9yZSBkYXRhLgohIAkgICAgKGlmIGdkYm1pLWRl YnVnLW1vZGUgKG1lc3NhZ2UgImdkYm1pLWJuZi1pbmNvbXBsZXRlLXJlY29yZC1yZXN1bHQsIGFi b3J0aW5nOiBpbmNvbXBsZXRlIHN0cmVhbSIpKQohICAgICAgICAgICAgICh0aHJvdyAnZ2RibWkt aW5jb21wbGV0ZS1zdHJlYW0gbmlsKSkKISAKISAgICAgICAgICAgaXMtY29tcGxldGUpKSkpCiEg CiEgCiEgOyBUaGUgZm9sbG93aW5nIGdyYW1tYXIgcnVsZXMgYXJlIG5vdCB5ZXQgaW1wbGVtZW50 ZWQgYnkgdGhpcyBHREJNSS1CTkYgcGFyc2VyLgohIDsgVGhlIGhhbmRsaW5nIG9mIHRob3NlIHJ1 bGVzIGlzIGN1cnJlbnRseSBkb25lIGJ5IHRoZSBoYW5kbGVycyByZWdpc3RlcmVkCiEgOyBpbiBn ZGJtaS1ibmYtcmVzdWx0LXN0YXRlLWNvbmZpZ3MKISA7CiEgOyByZXN1bHQgPT0+CiEgOyAgICAg IHZhcmlhYmxlICI9IiB2YWx1ZQohIDsKISA7IHZhcmlhYmxlID09PgohIDsgICAgICBzdHJpbmcK ISA7CiEgOyB2YWx1ZSA9PT4KISA7ICAgICAgY29uc3QgfCB0dXBsZSB8IGxpc3QKISA7CiEgOyBj b25zdCA9PT4KISA7ICAgICAgYy1zdHJpbmcKISA7CiEgOyB0dXBsZSA9PT4KISA7ICAgICAgInt9 IiB8ICJ7IiByZXN1bHQgKCAiLCIgcmVzdWx0ICkqICJ9IgohIDsKISA7IGxpc3QgPT0+CiEgOyAg ICAgICJbXSIgfCAiWyIgdmFsdWUgKCAiLCIgdmFsdWUgKSogIl0iIHwgIlsiIHJlc3VsdCAoICIs IiByZXN1bHQgKSogIl0iCiEgCiAgCiAgKGRlZnVuIGd1ZC1nZGJtaS1tYXJrZXItZmlsdGVyIChz dHJpbmcpCiAgICAiRmlsdGVyIEdEQi9NSSBvdXRwdXQuIgoqKioqKioqKioqKioqKiogaXMgcnVu bmluZy4iCioqKiAxOTA3LDE5NTIgKioqKgogIAogICAgOzsgU3RhcnQgYWNjdW11bGF0aW5nIG91 dHB1dCBmb3IgdGhlIEdVRCBidWZmZXIuCiAgICAoc2V0cSBnZGItZmlsdGVyLW91dHB1dCAiIikK LSAgIChsZXQgKG91dHB1dC1yZWNvcmQtbGlzdCkKICAKISAgICAgOzsgUHJvY2VzcyBhbGwgdGhl IGNvbXBsZXRlIG1hcmtlcnMgaW4gdGhpcyBjaHVuay4KISAgICAgKGRvbGlzdCAoZ2RibWktcmVj b3JkIGdkYm1pLXJlY29yZC1saXN0KQohICAgICAgICh3aGlsZSAoc3RyaW5nLW1hdGNoIChjZHIg Z2RibWktcmVjb3JkKSBndWQtbWFya2VyLWFjYykKISAJKHB1c2ggKGxpc3QgKG1hdGNoLWJlZ2lu bmluZyAwKQohIAkJICAgIChjYXIgZ2RibWktcmVjb3JkKQohIAkJICAgIChtYXRjaC1zdHJpbmcg MSBndWQtbWFya2VyLWFjYykKISAJCSAgICAobWF0Y2gtc3RyaW5nIDIgZ3VkLW1hcmtlci1hY2Mp CiEgCQkgICAgKG1hdGNoLWVuZCAwKSkKISAJICAgICAgb3V0cHV0LXJlY29yZC1saXN0KQohIAko c2V0cSBndWQtbWFya2VyLWFjYwohIAkgICAgICAoY29uY2F0IChzdWJzdHJpbmcgZ3VkLW1hcmtl ci1hY2MgMCAobWF0Y2gtYmVnaW5uaW5nIDApKQohIAkJICAgICAgOzsgUGFkIHdpdGggc3BhY2Vz IHRvIHByZXNlcnZlIHBvc2l0aW9uLgohIAkJICAgICAgKG1ha2Utc3RyaW5nIChsZW5ndGggKG1h dGNoLXN0cmluZyAwIGd1ZC1tYXJrZXItYWNjKSkgMzIpCiEgCQkgICAgICAoc3Vic3RyaW5nIGd1 ZC1tYXJrZXItYWNjIChtYXRjaC1lbmQgMCkpKSkpKQohIAohICAgICAoc2V0cSBvdXRwdXQtcmVj b3JkLWxpc3QgKHNvcnQgb3V0cHV0LXJlY29yZC1saXN0ICdnZGItY2FyPCkpCiEgCiEgICAgIChk b2xpc3QgKG91dHB1dC1yZWNvcmQgb3V0cHV0LXJlY29yZC1saXN0KQohICAgICAgIChsZXQgKChy ZWNvcmQtdHlwZSAoY2FkciBvdXRwdXQtcmVjb3JkKSkKISAJICAgIChhcmcxIChudGggMiBvdXRw dXQtcmVjb3JkKSkKISAJICAgIChhcmcyIChudGggMyBvdXRwdXQtcmVjb3JkKSkpCiEgCShjb25k ICgoZXEgcmVjb3JkLXR5cGUgJ2dkYi1lcnJvcikKISAJICAgICAgIChnZGItZG9uZS1vci1lcnJv ciBhcmcyIGFyZzEgJ2Vycm9yKSkKISAJICAgICAgKChlcSByZWNvcmQtdHlwZSAnZ2RiLWRvbmUp CiEgCSAgICAgICAoZ2RiLWRvbmUtb3ItZXJyb3IgYXJnMiBhcmcxICdkb25lKSkKISAJICAgICAg OzsgU3VwcHJlc3MgIk5vIHJlZ2lzdGVycy4iICBHREIgNi44IGFuZCBlYXJsaWVyCiEgCSAgICAg IDs7IGR1cGxpY2F0ZXMgTUkgZXJyb3IgbWVzc2FnZSBvbiBpbnRlcm5hbCBzdHJlYW0uCiEgCSAg ICAgIDs7IERvbid0IHByaW50IHRvIEdVRCBidWZmZXIuCiEgCSAgICAgICgobm90IChhbmQgKGVx IHJlY29yZC10eXBlICdnZGItaW50ZXJuYWxzKQohIAkJCSAoc3RyaW5nLWVxdWFsIChyZWFkIGFy ZzEpICJObyByZWdpc3RlcnMuXG4iKSkpCiEgCSAgICAgICAoZnVuY2FsbCByZWNvcmQtdHlwZSBh cmcxKSkpKSkKICAKISAgICAgKHNldHEgZ2RiLW91dHB1dC1zaW5rICd1c2VyKQohICAgICA7OyBS ZW1vdmUgcGFkZGluZy4KISAgICAgKHN0cmluZy1tYXRjaCAiXiAqIiBndWQtbWFya2VyLWFjYykK ISAgICAgKHNldHEgZ3VkLW1hcmtlci1hY2MgKHN1YnN0cmluZyBndWQtbWFya2VyLWFjYyAobWF0 Y2gtZW5kIDApKSkKICAKISAgICAgZ2RiLWZpbHRlci1vdXRwdXQpKQogIAogIChkZWZ1biBnZGIt Z2RiIChfb3V0cHV0LWZpZWxkKSkKICAKLS0tIDIyMTYsMjIzNCAtLS0tCiAgCiAgICA7OyBTdGFy dCBhY2N1bXVsYXRpbmcgb3V0cHV0IGZvciB0aGUgR1VEIGJ1ZmZlci4KICAgIChzZXRxIGdkYi1m aWx0ZXItb3V0cHV0ICIiKQogIAohICAgKGxldCAoKGFjYy1sZW5ndGggKGxlbmd0aCBndWQtbWFy a2VyLWFjYykpKQohICAgICAoY2F0Y2ggJ2dkYm1pLWluY29tcGxldGUtc3RyZWFtCiEgICAgICAg KHdoaWxlIChhbmQgKDwgZ2RibWktYm5mLW9mZnNldCBhY2MtbGVuZ3RoKQohIAkJICAoZnVuY2Fs bCBnZGJtaS1ibmYtc3RhdGUpKSkpKQogIAohICAgKHNldHEgZ3VkLW1hcmtlci1hY2MgKHN1YnN0 cmluZyBndWQtbWFya2VyLWFjYyBnZGJtaS1ibmYtb2Zmc2V0KSkKISAgIChzZXRxIGdkYm1pLWJu Zi1vZmZzZXQgMCkKISAKISAgICh3aGVuIChhbmQgZ2RibWktZGVidWctbW9kZSAoPiAobGVuZ3Ro IGd1ZC1tYXJrZXItYWNjKSAwKSkKISAgICAgKG1lc3NhZ2UgImd1ZC1nZGJtaS1tYXJrZXItZmls dGVyLCB1bnBhcnNlZCBzdHJpbmc6ICVzIiBndWQtbWFya2VyLWFjYykpCiAgCiEgICBnZGItZmls dGVyLW91dHB1dCkKICAKICAoZGVmdW4gZ2RiLWdkYiAoX291dHB1dC1maWVsZCkpCiAgCioqKioq KioqKioqKioqKiBpcyBydW5uaW5nLiIKKioqIDE5NTQsMTk2NCAqKioqCiAgICAoc2V0cSBnZGIt ZmlsdGVyLW91dHB1dAogICAgICAgICAgKGNvbmNhdCBvdXRwdXQtZmllbGQgZ2RiLWZpbHRlci1v dXRwdXQpKSkKICAKISAoZGVmdW4gZ2RiLWlnbm9yZWQtbm90aWZpY2F0aW9uIChfb3V0cHV0LWZp ZWxkKSkKICAKICA7OyBnZGItaW52YWxpZGF0ZS10aHJlYWRzIGlzIGRlZmluZWQgdG8gYWNjZXB0 ICd1cGRhdGUtdGhyZWFkcyBzaWduYWwKISAoZGVmdW4gZ2RiLXRocmVhZC1jcmVhdGVkIChfb3V0 cHV0LWZpZWxkKSkKISAoZGVmdW4gZ2RiLXRocmVhZC1leGl0ZWQgKG91dHB1dC1maWVsZCkKICAg ICJIYW5kbGUgPXRocmVhZC1leGl0ZWQgYXN5bmMgcmVjb3JkOiB1bnNldCBgZ2RiLXRocmVhZC1u dW1iZXInCiAgIGlmIGN1cnJlbnQgdGhyZWFkIGV4aXRlZCBhbmQgdXBkYXRlIHRocmVhZHMgbGlz dC4iCiAgICAobGV0KiAoKHRocmVhZC1pZCAoYmluZGF0LWdldC1maWVsZCAoZ2RiLWpzb24tc3Ry aW5nIG91dHB1dC1maWVsZCkgJ2lkKSkpCi0tLSAyMjM2LDIyNDYgLS0tLQogICAgKHNldHEgZ2Ri LWZpbHRlci1vdXRwdXQKICAgICAgICAgIChjb25jYXQgb3V0cHV0LWZpZWxkIGdkYi1maWx0ZXIt b3V0cHV0KSkpCiAgCiEgKGRlZnVuIGdkYi1pZ25vcmVkLW5vdGlmaWNhdGlvbiAoX3Rva2VuIF9v dXRwdXQtZmllbGQpKQogIAogIDs7IGdkYi1pbnZhbGlkYXRlLXRocmVhZHMgaXMgZGVmaW5lZCB0 byBhY2NlcHQgJ3VwZGF0ZS10aHJlYWRzIHNpZ25hbAohIChkZWZ1biBnZGItdGhyZWFkLWNyZWF0 ZWQgKF90b2tlbiBfb3V0cHV0LWZpZWxkKSkKISAoZGVmdW4gZ2RiLXRocmVhZC1leGl0ZWQgKF90 b2tlbiBvdXRwdXQtZmllbGQpCiAgICAiSGFuZGxlID10aHJlYWQtZXhpdGVkIGFzeW5jIHJlY29y ZDogdW5zZXQgYGdkYi10aHJlYWQtbnVtYmVyJwogICBpZiBjdXJyZW50IHRocmVhZCBleGl0ZWQg YW5kIHVwZGF0ZSB0aHJlYWRzIGxpc3QuIgogICAgKGxldCogKCh0aHJlYWQtaWQgKGJpbmRhdC1n ZXQtZmllbGQgKGdkYi1qc29uLXN0cmluZyBvdXRwdXQtZmllbGQpICdpZCkpKQoqKioqKioqKioq KioqKiogaXMgcnVubmluZy4iCioqKiAxOTcxLDE5NzcgKioqKgogICAgICAoZ2RiLXdhaXQtZm9y LXBlbmRpbmcKICAgICAgIChnZGItZW1pdC1zaWduYWwgZ2RiLWJ1Zi1wdWJsaXNoZXIgJ3VwZGF0 ZS10aHJlYWRzKSkpKQogIAohIChkZWZ1biBnZGItdGhyZWFkLXNlbGVjdGVkIChvdXRwdXQtZmll bGQpCiAgICAiSGFuZGxlciBmb3IgPXRocmVhZC1zZWxlY3RlZCBNSSBvdXRwdXQgcmVjb3JkLgog IAogIFNldHMgYGdkYi10aHJlYWQtbnVtYmVyJyB0byBuZXcgaWQuIgotLS0gMjI1MywyMjU5IC0t LS0KICAgICAgKGdkYi13YWl0LWZvci1wZW5kaW5nCiAgICAgICAoZ2RiLWVtaXQtc2lnbmFsIGdk Yi1idWYtcHVibGlzaGVyICd1cGRhdGUtdGhyZWFkcykpKSkKICAKISAoZGVmdW4gZ2RiLXRocmVh ZC1zZWxlY3RlZCAoX3Rva2VuIG91dHB1dC1maWVsZCkKICAgICJIYW5kbGVyIGZvciA9dGhyZWFk LXNlbGVjdGVkIE1JIG91dHB1dCByZWNvcmQuCiAgCiAgU2V0cyBgZ2RiLXRocmVhZC1udW1iZXIn IHRvIG5ldyBpZC4iCioqKioqKioqKioqKioqKiBTZXRzIGBnZGItdGhyZWFkLW51bWJlcicgdG8g bmV3IGlkLiIKKioqIDE5ODgsMTk5NCAqKioqCiAgICAgIChnZGItd2FpdC1mb3ItcGVuZGluZwog ICAgICAgKGdkYi11cGRhdGUpKSkpCiAgCiEgKGRlZnVuIGdkYi1ydW5uaW5nIChvdXRwdXQtZmll bGQpCiAgICAobGV0KiAoKHRocmVhZC1pZAogICAgICAgICAgICAoYmluZGF0LWdldC1maWVsZCAo Z2RiLWpzb24tc3RyaW5nIG91dHB1dC1maWVsZCkgJ3RocmVhZC1pZCkpKQogICAgICA7OyBXZSBy ZXNldCBnZGItZnJhbWUtbnVtYmVyIHRvIG5pbCBpZiBjdXJyZW50IHRocmVhZCBoYXMgZ29uZQot LS0gMjI3MCwyMjc2IC0tLS0KICAgICAgKGdkYi13YWl0LWZvci1wZW5kaW5nCiAgICAgICAoZ2Ri LXVwZGF0ZSkpKSkKICAKISAoZGVmdW4gZ2RiLXJ1bm5pbmcgKF90b2tlbiBvdXRwdXQtZmllbGQp CiAgICAobGV0KiAoKHRocmVhZC1pZAogICAgICAgICAgICAoYmluZGF0LWdldC1maWVsZCAoZ2Ri LWpzb24tc3RyaW5nIG91dHB1dC1maWVsZCkgJ3RocmVhZC1pZCkpKQogICAgICA7OyBXZSByZXNl dCBnZGItZnJhbWUtbnVtYmVyIHRvIG5pbCBpZiBjdXJyZW50IHRocmVhZCBoYXMgZ29uZQoqKioq KioqKioqKioqKiogU2V0cyBgZ2RiLXRocmVhZC1udW1iZXInIHRvIG5ldyBpZC4iCioqKiAyMDA2 LDIwMTIgKioqKgogICAgKHNldHEgZ2RiLWFjdGl2ZS1wcm9jZXNzIHQpCiAgICAoZ2RiLWVtaXQt c2lnbmFsIGdkYi1idWYtcHVibGlzaGVyICd1cGRhdGUtdGhyZWFkcykpCiAgCiEgKGRlZnVuIGdk Yi1zdGFydGluZyAoX291dHB1dC1maWVsZCkKICAgIDs7IENMSSBjb21tYW5kcyBkb24ndCBlbWl0 IF5ydW5uaW5nIGF0IHRoZSBtb21lbnQgc28gdXNlIGdkYi1ydW5uaW5nIHRvby4KICAgIChzZXRx IGdkYi1pbmZlcmlvci1zdGF0dXMgInJ1bm5pbmciKQogICAgKGdkYi1mb3JjZS1tb2RlLWxpbmUt dXBkYXRlCi0tLSAyMjg4LDIyOTQgLS0tLQogICAgKHNldHEgZ2RiLWFjdGl2ZS1wcm9jZXNzIHQp CiAgICAoZ2RiLWVtaXQtc2lnbmFsIGdkYi1idWYtcHVibGlzaGVyICd1cGRhdGUtdGhyZWFkcykp CiAgCiEgKGRlZnVuIGdkYi1zdGFydGluZyAoX291dHB1dC1maWVsZCByZXN1bHQpCiAgICA7OyBD TEkgY29tbWFuZHMgZG9uJ3QgZW1pdCBecnVubmluZyBhdCB0aGUgbW9tZW50IHNvIHVzZSBnZGIt cnVubmluZyB0b28uCiAgICAoc2V0cSBnZGItaW5mZXJpb3Itc3RhdHVzICJydW5uaW5nIikKICAg IChnZGItZm9yY2UtbW9kZS1saW5lLXVwZGF0ZQoqKioqKioqKioqKioqKiogU2V0cyBgZ2RiLXRo cmVhZC1udW1iZXInIHRvIG5ldyBpZC4iCioqKiAyMDIwLDIwMjYgKioqKgogIAogIDs7IC1icmVh ay1pbnNlcnQgLXQgZGlkbid0IGdpdmUgYSByZWFzb24gYmVmb3JlIGdkYiA2LjkKICAKISAoZGVm dW4gZ2RiLXN0b3BwZWQgKG91dHB1dC1maWVsZCkKICAgICJHaXZlbiB0aGUgY29udGVudHMgb2Yg KnN0b3BwZWQgTUkgYXN5bmMgcmVjb3JkLCBzZWxlY3QgbmV3CiAgY3VycmVudCB0aHJlYWQgYW5k IHVwZGF0ZSBHREIgYnVmZmVycy4iCiAgICA7OyBSZWFzb24gaXMgYXZhaWxhYmxlIHdpdGggdGFy Z2V0LWFzeW5jIG9ubHkKLS0tIDIzMDIsMjMwOCAtLS0tCiAgCiAgOzsgLWJyZWFrLWluc2VydCAt dCBkaWRuJ3QgZ2l2ZSBhIHJlYXNvbiBiZWZvcmUgZ2RiIDYuOQogIAohIChkZWZ1biBnZGItc3Rv cHBlZCAoX3Rva2VuIG91dHB1dC1maWVsZCkKICAgICJHaXZlbiB0aGUgY29udGVudHMgb2YgKnN0 b3BwZWQgTUkgYXN5bmMgcmVjb3JkLCBzZWxlY3QgbmV3CiAgY3VycmVudCB0aHJlYWQgYW5kIHVw ZGF0ZSBHREIgYnVmZmVycy4iCiAgICA7OyBSZWFzb24gaXMgYXZhaWxhYmxlIHdpdGggdGFyZ2V0 LWFzeW5jIG9ubHkKKioqKioqKioqKioqKioqIGN1cnJlbnQgdGhyZWFkIGFuZCB1cGRhdGUgR0RC IGJ1ZmZlcnMuIgoqKiogMjEwNiwyMTEyICoqKioKICAgIChzZXRxIGdkYi1maWx0ZXItb3V0cHV0 CiAgCShnZGItY29uY2F0LW91dHB1dCBnZGItZmlsdGVyLW91dHB1dCAocmVhZCBvdXRwdXQtZmll bGQpKSkpCiAgCiEgKGRlZnVuIGdkYi1kb25lLW9yLWVycm9yIChvdXRwdXQtZmllbGQgdG9rZW4t bnVtYmVyIHR5cGUpCiAgICAoaWYgKHN0cmluZy1lcXVhbCB0b2tlbi1udW1iZXIgIiIpCiAgICAg ICAgOzsgT3V0cHV0IGZyb20gY29tbWFuZCBlbnRlcmVkIGJ5IHVzZXIKICAgICAgICAocHJvZ24K LS0tIDIzODgsMjQwMCAtLS0tCiAgICAoc2V0cSBnZGItZmlsdGVyLW91dHB1dAogIAkoZ2RiLWNv bmNhdC1vdXRwdXQgZ2RiLWZpbHRlci1vdXRwdXQgKHJlYWQgb3V0cHV0LWZpZWxkKSkpKQogIAoh IChkZWZ1biBnZGItZG9uZSAodG9rZW4tbnVtYmVyIG91dHB1dC1maWVsZCBpcy1jb21wbGV0ZSkK ISAgIChnZGItZG9uZS1vci1lcnJvciB0b2tlbi1udW1iZXIgJ2RvbmUgb3V0cHV0LWZpZWxkIGlz LWNvbXBsZXRlKSkKISAKISAoZGVmdW4gZ2RiLWVycm9yICh0b2tlbi1udW1iZXIgb3V0cHV0LWZp ZWxkIGlzLWNvbXBsZXRlKQohICAgKGdkYi1kb25lLW9yLWVycm9yIHRva2VuLW51bWJlciAnZXJy b3Igb3V0cHV0LWZpZWxkIGlzLWNvbXBsZXRlKSkKISAKISAoZGVmdW4gZ2RiLWRvbmUtb3ItZXJy b3IgKHRva2VuLW51bWJlciB0eXBlIG91dHB1dC1maWVsZCBpcy1jb21wbGV0ZSkKICAgIChpZiAo c3RyaW5nLWVxdWFsIHRva2VuLW51bWJlciAiIikKICAgICAgICA7OyBPdXRwdXQgZnJvbSBjb21t YW5kIGVudGVyZWQgYnkgdXNlcgogICAgICAgIChwcm9nbgoqKioqKioqKioqKioqKiogY3VycmVu dCB0aHJlYWQgYW5kIHVwZGF0ZSBHREIgYnVmZmVycy4iCioqKiAyMTIyLDIxMzUgKioqKgogICAg ICA7OyBPdXRwdXQgZnJvbSBjb21tYW5kIGZyb20gZnJvbnRlbmQuCiAgICAgIChzZXRxIGdkYi1v dXRwdXQtc2luayAnZW1hY3MpKQogIAotICAgKGdkYi1jbGVhci1wYXJ0aWFsLW91dHB1dCkKLSAK ICAgIDs7IFRoZSBwcm9jZXNzIG1heSBhbHJlYWR5IGJlIGRlYWQgKGUuZy4gQy1kIGF0IHRoZSBn ZGIgcHJvbXB0KS4KICAgIChsZXQqICgocHJvYyAoZ2V0LWJ1ZmZlci1wcm9jZXNzIGd1ZC1jb21p bnQtYnVmZmVyKSkKICAJIChuby1wcm9jIChvciAobnVsbCBwcm9jKQogIAkJICAgICAgKG1lbXEg KHByb2Nlc3Mtc3RhdHVzIHByb2MpICcoZXhpdCBzaWduYWwpKSkpKQogIAohICAgICAod2hlbiBn ZGItZmlyc3QtZG9uZS1vci1lcnJvcgogICAgICAgICh1bmxlc3MgKG9yIHRva2VuLW51bWJlciBn dWQtcnVubmluZyBuby1wcm9jKQogIAkoc2V0cSBnZGItZmlsdGVyLW91dHB1dCAoY29uY2F0IGdk Yi1maWx0ZXItb3V0cHV0IGdkYi1wcm9tcHQtbmFtZSkpKQogICAgICAgIChnZGItdXBkYXRlIG5v LXByb2MpCi0tLSAyNDEwLDI0MjEgLS0tLQogICAgICA7OyBPdXRwdXQgZnJvbSBjb21tYW5kIGZy b20gZnJvbnRlbmQuCiAgICAgIChzZXRxIGdkYi1vdXRwdXQtc2luayAnZW1hY3MpKQogIAogICAg OzsgVGhlIHByb2Nlc3MgbWF5IGFscmVhZHkgYmUgZGVhZCAoZS5nLiBDLWQgYXQgdGhlIGdkYiBw cm9tcHQpLgogICAgKGxldCogKChwcm9jIChnZXQtYnVmZmVyLXByb2Nlc3MgZ3VkLWNvbWludC1i dWZmZXIpKQogIAkgKG5vLXByb2MgKG9yIChudWxsIHByb2MpCiAgCQkgICAgICAobWVtcSAocHJv Y2Vzcy1zdGF0dXMgcHJvYykgJyhleGl0IHNpZ25hbCkpKSkpCiAgCiEgICAgICh3aGVuIChhbmQg aXMtY29tcGxldGUgZ2RiLWZpcnN0LWRvbmUtb3ItZXJyb3IpCiAgICAgICAgKHVubGVzcyAob3Ig dG9rZW4tbnVtYmVyIGd1ZC1ydW5uaW5nIG5vLXByb2MpCiAgCShzZXRxIGdkYi1maWx0ZXItb3V0 cHV0IChjb25jYXQgZ2RiLWZpbHRlci1vdXRwdXQgZ2RiLXByb21wdC1uYW1lKSkpCiAgICAgICAg KGdkYi11cGRhdGUgbm8tcHJvYykKKioqKioqKioqKioqKioqIGN1cnJlbnQgdGhyZWFkIGFuZCB1 cGRhdGUgR0RCIGJ1ZmZlcnMuIgoqKiogMjEzOCwyMTUwICoqKioKICAgICAgKHNldHEgZ2RiLWZp bHRlci1vdXRwdXQKICAJICAoZ2RiLWNvbmNhdC1vdXRwdXQgZ2RiLWZpbHRlci1vdXRwdXQgb3V0 cHV0LWZpZWxkKSkKICAKISAgICAgKHdoZW4gdG9rZW4tbnVtYmVyCiAgICAgICAgKHdpdGgtY3Vy cmVudC1idWZmZXIKICAJICAoZ2RiLWdldC1idWZmZXItY3JlYXRlICdnZGItcGFydGlhbC1vdXRw dXQtYnVmZmVyKQogIAkoZnVuY2FsbAogIAkgKGNkciAoYXNzb2MgKHN0cmluZy10by1udW1iZXIg dG9rZW4tbnVtYmVyKSBnZGItaGFuZGxlci1hbGlzdCkpKSkKICAgICAgICAoc2V0cSBnZGItaGFu ZGxlci1hbGlzdAohIAkgICAgKGFzc3EtZGVsZXRlLWFsbCB0b2tlbi1udW1iZXIgZ2RiLWhhbmRs ZXItYWxpc3QpKSkpKQogIAogIChkZWZ1biBnZGItY29uY2F0LW91dHB1dCAoc28tZmFyIG5ldykK ICAgIChjb25kCi0tLSAyNDI0LDI0NDIgLS0tLQogICAgICAoc2V0cSBnZGItZmlsdGVyLW91dHB1 dAogIAkgIChnZGItY29uY2F0LW91dHB1dCBnZGItZmlsdGVyLW91dHB1dCBvdXRwdXQtZmllbGQp KQogIAohICAgICA7OyBXZSBhcmUgZG9uZSBjb25jYXRlbmF0aW5nIHRvIHRoZSBvdXRwdXQgc2lu ay4gIFJlc3RvcmUgaXQgdG8gdXNlciBzaW5rOgohICAgICAoc2V0cSBnZGItb3V0cHV0LXNpbmsg J3VzZXIpCiEgCiEgICAgICh3aGVuIChhbmQgdG9rZW4tbnVtYmVyIGlzLWNvbXBsZXRlKQogICAg ICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyCiAgCSAgKGdkYi1nZXQtYnVmZmVyLWNyZWF0ZSAnZ2Ri LXBhcnRpYWwtb3V0cHV0LWJ1ZmZlcikKICAJKGZ1bmNhbGwKICAJIChjZHIgKGFzc29jIChzdHJp bmctdG8tbnVtYmVyIHRva2VuLW51bWJlcikgZ2RiLWhhbmRsZXItYWxpc3QpKSkpCiAgICAgICAg KHNldHEgZ2RiLWhhbmRsZXItYWxpc3QKISAgICAgICAgICAgICAoYXNzcS1kZWxldGUtYWxsIHRv a2VuLW51bWJlciBnZGItaGFuZGxlci1hbGlzdCkpKQohIAohICAgKHdoZW4gaXMtY29tcGxldGUK ISAgICAgKGdkYi1jbGVhci1wYXJ0aWFsLW91dHB1dCkpKSkKICAKICAoZGVmdW4gZ2RiLWNvbmNh dC1vdXRwdXQgKHNvLWZhciBuZXcpCiAgICAoY29uZAoK --20cf307f34120b857404d1192c1b--