From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11294 invoked by alias); 20 Jul 2009 14:01:49 -0000 Received: (qmail 10776 invoked by uid 22791); 20 Jul 2009 14:01:40 -0000 X-SWARE-Spam-Status: No, hits=-1.7 required=5.0 tests=AWL,BAYES_00,SARE_MSGID_LONG40,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mail-px0-f183.google.com (HELO mail-px0-f183.google.com) (209.85.216.183) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 20 Jul 2009 14:01:31 +0000 Received: by pxi13 with SMTP id 13so1839399pxi.12 for ; Mon, 20 Jul 2009 07:01:29 -0700 (PDT) MIME-Version: 1.0 Received: by 10.143.165.19 with SMTP id s19mr975063wfo.36.1248098489071; Mon, 20 Jul 2009 07:01:29 -0700 (PDT) In-Reply-To: <4A63C450.1080307@vmware.com> References: <4A5A8438.6030005@vmware.com> <4A6121FC.3030205@vmware.com> <4A63C450.1080307@vmware.com> From: Hui Zhu Date: Mon, 20 Jul 2009 14:13:00 -0000 Message-ID: Subject: Re: [RFA/RFC Prec] Add Linux AMD64 process record support second version, (AMD64 Linux system call support) 3/3 To: Michael Snyder Cc: Mark Kettenis , gdb-patches ml Content-Type: multipart/mixed; boundary=001636e9101115fa21046f2393f1 X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-07/txt/msg00478.txt.bz2 --001636e9101115fa21046f2393f1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-length: 4535 Hi Michael, I still got fail with solib-reverse.exp with this patch. The attachment is the log. Thanks, Hui On Mon, Jul 20, 2009 at 09:11, Michael Snyder wrote: > Hui, > > Here is an "epilogue unwinder" for the amd64. =A0Please try it out. > > If you update infrun.c now you will see most of your *-record.exp > testsuites broken by my recent change there. =A0This will fix them. > > > Thanks, > Michael > > > --- saveteawater3/amd64-tdep.c =A02009-07-19 18:08:56.000000000 -0700 > +++ ./amd64-tdep.c =A0 =A0 =A02009-07-19 18:10:18.000000000 -0700 > @@ -1887,6 +1887,89 @@ static const struct frame_base amd64_fra > =A0 amd64_frame_base_address > =A0}; > > +/* Normal frames, but in a function epilogue. =A0*/ > + > +/* The epilogue is defined here as the 'ret' instruction, which will > + =A0 follow any instruction such as 'leave' or 'pop %ebp' that destroys > + =A0 the function's stack frame. =A0*/ > + > +static int > +amd64_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc) > +{ > + =A0gdb_byte insn; > + > + =A0if (target_read_memory (pc, &insn, 1)) > + =A0 =A0return 0; =A0 /* Can't read memory at pc. =A0*/ > + > + =A0if (insn !=3D 0xc3) =A0 =A0 /* 'ret' instruction. =A0*/ > + =A0 =A0return 0; > + > + =A0return 1; > +} > + > +static int > +amd64_epilogue_frame_sniffer (const struct frame_unwind *self, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct frame_in= fo *this_frame, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 void **this_pro= logue_cache) > +{ > + =A0if (frame_relative_level (this_frame) =3D=3D 0) > + =A0 =A0return amd64_in_function_epilogue_p (get_frame_arch (this_frame), > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0get_frame_pc (this_frame)); > + =A0else > + =A0 =A0return 0; > +} > + > +static struct amd64_frame_cache * > +amd64_epilogue_frame_cache (struct frame_info *this_frame, void > **this_cache) > +{ > + =A0struct gdbarch *gdbarch =3D get_frame_arch (this_frame); > + =A0enum bfd_endian byte_order =3D gdbarch_byte_order (gdbarch); > + =A0struct amd64_frame_cache *cache; > + =A0gdb_byte buf[4]; > + > + =A0if (*this_cache) > + =A0 =A0return *this_cache; > + > + =A0cache =3D amd64_alloc_frame_cache (); > + =A0*this_cache =3D cache; > + > + =A0/* Cache base will be %esp plus cache->sp_offset (-8). =A0*/ > + =A0get_frame_register (this_frame, AMD64_RSP_REGNUM, buf); > + =A0cache->base =3D extract_unsigned_integer (buf, 8, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 byte_order) + cache->sp_offset; > + > + =A0/* Cache pc will be the frame func. =A0*/ > + =A0cache->pc =3D get_frame_pc (this_frame); > + > + =A0/* The saved %esp will be at cache->base plus 16. =A0*/ > + =A0cache->saved_sp =3D cache->base + 16; > + > + =A0/* The saved %eip will be at cache->base plus 8. =A0*/ > + =A0cache->saved_regs[AMD64_RIP_REGNUM] =3D cache->base + 8; > + > + =A0return cache; > +} > + > +static void > +amd64_epilogue_frame_this_id (struct frame_info *this_frame, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 void **this_cac= he, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct frame_id= *this_id) > +{ > + =A0struct amd64_frame_cache *cache =3D amd64_epilogue_frame_cache (this= _frame, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0this_cache); > + > + =A0(*this_id) =3D frame_id_build (cache->base + 8, cache->pc); > +} > + > +static const struct frame_unwind amd64_epilogue_frame_unwind =3D > +{ > + =A0NORMAL_FRAME, > + =A0amd64_epilogue_frame_this_id, > + =A0amd64_frame_prev_register, > + =A0NULL, > + =A0amd64_epilogue_frame_sniffer > +}; > + > =A0static struct frame_id > =A0amd64_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame) > =A0{ > @@ -2065,6 +2148,12 @@ amd64_init_abi (struct gdbarch_info info > > =A0 set_gdbarch_dummy_id (gdbarch, amd64_dummy_id); > > + =A0/* Hook the function epilogue frame unwinder. =A0This unwinder is > + =A0 =A0 appended to the list first, so that it supercedes the other > + =A0 =A0 unwinders in function epilogues. =A0*/ > + =A0frame_unwind_prepend_unwinder (gdbarch, &amd64_epilogue_frame_unwind= ); > + > + =A0/* Hook the prologue-based frame unwinders. =A0*/ > =A0 frame_unwind_append_unwinder (gdbarch, &amd64_sigtramp_frame_unwind); > =A0 frame_unwind_append_unwinder (gdbarch, &amd64_frame_unwind); > =A0 frame_base_set_default (gdbarch, &amd64_frame_base); > > --001636e9101115fa21046f2393f1 Content-Type: text/x-log; charset=US-ASCII; name="gdb.log" Content-Disposition: attachment; filename="gdb.log" Content-Transfer-Encoding: base64 X-Attachment-Id: f_fxd9kwq81 Content-length: 10586 VGVzdCBSdW4gQnkgdGVhd2F0ZXIgb24gTW9uIEp1bCAyMCAyMTo1Nzo1NyAy MDA5Ck5hdGl2ZSBjb25maWd1cmF0aW9uIGlzIHg4Nl82NC11bmtub3duLWxp bnV4LWdudQoKCQk9PT0gZ2RiIHRlc3RzID09PQoKU2NoZWR1bGUgb2YgdmFy aWF0aW9uczoKICAgIHByZWNvcmQKClJ1bm5pbmcgdGFyZ2V0IHByZWNvcmQK VXNpbmcgL3Vzci9zaGFyZS9kZWphZ251L2Jhc2Vib2FyZHMvcHJlY29yZC5l eHAgYXMgYm9hcmQgZGVzY3JpcHRpb24gZmlsZSBmb3IgdGFyZ2V0LgpVc2lu ZyAvdXNyL3NoYXJlL2RlamFnbnUvYmFzZWJvYXJkcy91bml4LmV4cCBhcyBi b2FyZCBkZXNjcmlwdGlvbiBmaWxlIGZvciB0YXJnZXQuClVzaW5nIC91c3Iv c2hhcmUvZGVqYWdudS9jb25maWcvdW5peC5leHAgYXMgZ2VuZXJpYyBpbnRl cmZhY2UgZmlsZSBmb3IgdGFyZ2V0LgpVc2luZyAuLi9zcmMvZ2RiL3Rlc3Rz dWl0ZS9jb25maWcvdW5peC5leHAgYXMgdG9vbC1hbmQtdGFyZ2V0LXNwZWNp ZmljIGludGVyZmFjZSBmaWxlLgpSdW5uaW5nIC4uL3NyYy9nZGIvdGVzdHN1 aXRlL2dkYi5yZXZlcnNlL3NvbGliLXJldmVyc2UuZXhwIC4uLgpnZXRfY29t cGlsZXJfaW5mbzogZ2NjLTQtMy0zCkV4ZWN1dGluZyBvbiBob3N0OiBnY2Mg IC1mcGljIC1jIC1nICAtbyAvaG9tZS90ZWF3YXRlci9nZGIvYnQvZ2RiLnJl dmVyc2Uvc2hyMi5jLm8gLi4vc3JjL2dkYi90ZXN0c3VpdGUvZ2RiLnJldmVy c2Uvc2hyMi5jICAgICh0aW1lb3V0ID0gMzAwKQpFeGVjdXRpbmcgb24gaG9z dDogZ2NjIC9ob21lL3RlYXdhdGVyL2dkYi9idC9nZGIucmV2ZXJzZS9zaHIy LmMubyAgLXNoYXJlZCAtZyAgLWxtICAgLW8gL2hvbWUvdGVhd2F0ZXIvZ2Ri L2J0L2dkYi5yZXZlcnNlL3NocjIuc2wgICAgKHRpbWVvdXQgPSAzMDApCkV4 ZWN1dGluZyBvbiBob3N0OiBnY2MgLi4vc3JjL2dkYi90ZXN0c3VpdGUvZ2Ri LnJldmVyc2Uvc29saWItcmV2ZXJzZS5jIC9ob21lL3RlYXdhdGVyL2dkYi9i dC9nZGIucmV2ZXJzZS9zaHIyLnNsICAtZyAgLWxtICAgLW8gL2hvbWUvdGVh d2F0ZXIvZ2RiL2J0L2dkYi5yZXZlcnNlL3NvbGliLXJldmVyc2UgICAgKHRp bWVvdXQgPSAzMDApCkdOVSBnZGIgKEdEQikgNi44LjUwLjIwMDkwNzIwLWN2 cw0KQ29weXJpZ2h0IChDKSAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlv biwgSW5jLg0KTGljZW5zZSBHUEx2Mys6IEdOVSBHUEwgdmVyc2lvbiAzIG9y IGxhdGVyIDxodHRwOi8vZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbD4NClRo aXMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGFyZSBmcmVlIHRvIGNoYW5nZSBh bmQgcmVkaXN0cmlidXRlIGl0Lg0KVGhlcmUgaXMgTk8gV0FSUkFOVFksIHRv IHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdy4gIFR5cGUgInNob3cgY29w eWluZyINCmFuZCAic2hvdyB3YXJyYW50eSIgZm9yIGRldGFpbHMuDQpUaGlz IEdEQiB3YXMgY29uZmlndXJlZCBhcyAieDg2XzY0LXVua25vd24tbGludXgt Z251Ii4NCkZvciBidWcgcmVwb3J0aW5nIGluc3RydWN0aW9ucywgcGxlYXNl IHNlZToNCjxodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ2RiL2J1Z3Mv Pi4NCihnZGIpIHNldCBoZWlnaHQgMA0KKGdkYikgc2V0IHdpZHRoIDANCihn ZGIpIGRpcg0KUmVpbml0aWFsaXplIHNvdXJjZSBwYXRoIHRvIGVtcHR5PyAo eSBvciBuKSB5DQpTb3VyY2UgZGlyZWN0b3JpZXMgc2VhcmNoZWQ6ICRjZGly OiRjd2QNCihnZGIpIGRpciAuLi9zcmMvZ2RiL3Rlc3RzdWl0ZS9nZGIucmV2 ZXJzZQ0KU291cmNlIGRpcmVjdG9yaWVzIHNlYXJjaGVkOiAvaG9tZS90ZWF3 YXRlci9nZGIvYnQvLi4vc3JjL2dkYi90ZXN0c3VpdGUvZ2RiLnJldmVyc2U6 JGNkaXI6JGN3ZA0KKGdkYikga2lsbA0KVGhlIHByb2dyYW0gaXMgbm90IGJl aW5nIHJ1bi4NCihnZGIpIGZpbGUgL2hvbWUvdGVhd2F0ZXIvZ2RiL2J0L2dk Yi5yZXZlcnNlL3NvbGliLXJldmVyc2UNClJlYWRpbmcgc3ltYm9scyBmcm9t IC9ob21lL3RlYXdhdGVyL2dkYi9idC9nZGIucmV2ZXJzZS9zb2xpYi1yZXZl cnNlLi4uZG9uZS4NCihnZGIpIGRlbGV0ZSBicmVha3BvaW50cw0KKGdkYikg aW5mbyBicmVha3BvaW50cw0KTm8gYnJlYWtwb2ludHMgb3Igd2F0Y2hwb2lu dHMuDQooZ2RiKSBicmVhayBtYWluDQpCcmVha3BvaW50IDEgYXQgMHg0MDA2 ZTQ6IGZpbGUgLi4vc3JjL2dkYi90ZXN0c3VpdGUvZ2RiLnJldmVyc2Uvc29s aWItcmV2ZXJzZS5jLCBsaW5lIDI3Lg0KKGdkYikgcnVuIA0KU3RhcnRpbmcg cHJvZ3JhbTogL2hvbWUvdGVhd2F0ZXIvZ2RiL2J0L2dkYi5yZXZlcnNlL3Nv bGliLXJldmVyc2UgDQoNCkJyZWFrcG9pbnQgMSwgbWFpbiAoKSBhdCAuLi9z cmMvZ2RiL3Rlc3RzdWl0ZS9nZGIucmV2ZXJzZS9zb2xpYi1yZXZlcnNlLmM6 MjcNCjI3CSAgY2hhciogY3B0ciA9ICJTdHJpbmcgMSI7DQooZ2RiKSByZWNv cmQNCihnZGIpIFBBU1M6IGdkYi5yZXZlcnNlL3NvbGliLXJldmVyc2UuZXhw OiBUdXJuIG9uIHByb2Nlc3MgcmVjb3JkCnVudGlsIDQxDQptZXNzYWdlIDEN Cm1lc3NhZ2UgMg0KbWVzc2FnZSAzDQptYWluICgpIGF0IC4uL3NyYy9nZGIv dGVzdHN1aXRlL2dkYi5yZXZlcnNlL3NvbGliLXJldmVyc2UuYzo0MQ0KNDEJ ICByZXR1cm4gMDsJCQkvKiBlbmQgcGFydCBvbmUgKi8NCihnZGIpIFBBU1M6 IGdkYi5yZXZlcnNlL3NvbGliLXJldmVyc2UuZXhwOiBydW4gdW50aWwgZW5k IHBhcnQgb25lCnJldmVyc2Utc3RlcA0KMzgJICBzbGVlcCAoMCk7CQkJLyog c2xlZXAgdHdvICovDQooZ2RiKSBGQUlMOiBnZGIucmV2ZXJzZS9zb2xpYi1y ZXZlcnNlLmV4cDogcmV2ZXJzZS1zdGVwIHRoaXJkIHNsZWVwCnJldmVyc2Ut c3RlcA0KMzcJICBzbGVlcCAoMCk7CQkJLyogc2xlZXAgb25lICovDQooZ2Ri KSBGQUlMOiBnZGIucmV2ZXJzZS9zb2xpYi1yZXZlcnNlLmV4cDogcmV2ZXJz ZS1zdGVwIHNlY29uZCBzbGVlcApyZXZlcnNlLXN0ZXANCjM1CSAgcHJpbnRm ICgibWVzc2FnZSAyXG4iKTsJLyogcHJpbnRmIHR3byAqLw0KKGdkYikgRkFJ TDogZ2RiLnJldmVyc2Uvc29saWItcmV2ZXJzZS5leHA6IHJldmVyc2Utc3Rl cCBmaXJzdCBzbGVlcCwgZHluc3ltIHJlc29sdmUKcmV2ZXJzZS1zdGVwDQoz NAkgIHByaW50ZiAoIm1lc3NhZ2UgMVxuIik7CS8qIHByaW50ZiBvbmUgKi8N CihnZGIpIEZBSUw6IGdkYi5yZXZlcnNlL3NvbGliLXJldmVyc2UuZXhwOiBy ZXZlcnNlLXN0ZXAgdGhpcmQgcHJpbnRmCnJldmVyc2Utc3RlcA0KMzMJICBi WzBdID0gNjsgICBiWzFdID0gOTsJCS8qIGdlbmVyaWMgc3RhdGVtZW50LCBl bmQgcGFydCB0d28gKi8NCihnZGIpIEZBSUw6IGdkYi5yZXZlcnNlL3NvbGli LXJldmVyc2UuZXhwOiByZXZlcnNlLXN0ZXAgc2Vjb25kIHByaW50ZgpyZXZl cnNlLXN0ZXANCnNocjIgKHg9MTcpIGF0IC4uL3NyYy9nZGIvdGVzdHN1aXRl L2dkYi5yZXZlcnNlL3NocjIuYzoyNQ0KMjUJfQ0KKGdkYikgRkFJTDogZ2Ri LnJldmVyc2Uvc29saWItcmV2ZXJzZS5leHA6IHJldmVyc2Utc3RlcCBmaXJz dCBwcmludGYsIGR5bnN5bSByZXNvbHZlCnJldmVyc2Utc3RlcA0KMjQJICBy ZXR1cm4gMip4Ow0KKGdkYikgRkFJTDogZ2RiLnJldmVyc2Uvc29saWItcmV2 ZXJzZS5leHA6IHJldmVyc2Utc3RlcCBnZW5lcmljCnVudGlsIDQxDQpObyBs aW5lIDQxIGluIGZpbGUgIi4uL3NyYy9nZGIvdGVzdHN1aXRlL2dkYi5yZXZl cnNlL3NocjIuYyIuDQooZ2RiKSBGQUlMOiBnZGIucmV2ZXJzZS9zb2xpYi1y ZXZlcnNlLmV4cDogZm9yd2FyZCB0byBlbmQgcGFydCBvbmUKcmV2ZXJzZS1u ZXh0DQptYWluICgpIGF0IC4uL3NyYy9nZGIvdGVzdHN1aXRlL2dkYi5yZXZl cnNlL3NvbGliLXJldmVyc2UuYzozMA0KMzAJICBiWzBdID0gc2hyMigxMik7 CQkvKiBiZWdpbiBwYXJ0IHR3byAqLw0KKGdkYikgRkFJTDogZ2RiLnJldmVy c2Uvc29saWItcmV2ZXJzZS5leHA6IHJldmVyc2UtbmV4dCB0aGlyZCBzbGVl cApyZXZlcnNlLW5leHQNCjI4CSAgaW50IGJbMl0gPSB7NSw4fTsNCihnZGIp IEZBSUw6IGdkYi5yZXZlcnNlL3NvbGliLXJldmVyc2UuZXhwOiByZXZlcnNl LW5leHQgc2Vjb25kIHNsZWVwCnJldmVyc2UtbmV4dA0KDQpObyBtb3JlIHJl dmVyc2UtZXhlY3V0aW9uIGhpc3RvcnkuDQptYWluICgpIGF0IC4uL3NyYy9n ZGIvdGVzdHN1aXRlL2dkYi5yZXZlcnNlL3NvbGliLXJldmVyc2UuYzoyNw0K MjcJICBjaGFyKiBjcHRyID0gIlN0cmluZyAxIjsNCihnZGIpIEZBSUw6IGdk Yi5yZXZlcnNlL3NvbGliLXJldmVyc2UuZXhwOiByZXZlcnNlLW5leHQgZmly c3Qgc2xlZXAsIGR5bnN5bSByZXNvbHZlCnJldmVyc2UtbmV4dA0KDQpObyBt b3JlIHJldmVyc2UtZXhlY3V0aW9uIGhpc3RvcnkuDQptYWluICgpIGF0IC4u L3NyYy9nZGIvdGVzdHN1aXRlL2dkYi5yZXZlcnNlL3NvbGliLXJldmVyc2Uu YzoyNw0KMjcJICBjaGFyKiBjcHRyID0gIlN0cmluZyAxIjsNCihnZGIpIEZB SUw6IGdkYi5yZXZlcnNlL3NvbGliLXJldmVyc2UuZXhwOiByZXZlcnNlLW5l eHQgdGhpcmQgcHJpbnRmCnJldmVyc2UtbmV4dA0KDQpObyBtb3JlIHJldmVy c2UtZXhlY3V0aW9uIGhpc3RvcnkuDQptYWluICgpIGF0IC4uL3NyYy9nZGIv dGVzdHN1aXRlL2dkYi5yZXZlcnNlL3NvbGliLXJldmVyc2UuYzoyNw0KMjcJ ICBjaGFyKiBjcHRyID0gIlN0cmluZyAxIjsNCihnZGIpIEZBSUw6IGdkYi5y ZXZlcnNlL3NvbGliLXJldmVyc2UuZXhwOiByZXZlcnNlLW5leHQgc2Vjb25k IHByaW50ZgpyZXZlcnNlLW5leHQNCg0KTm8gbW9yZSByZXZlcnNlLWV4ZWN1 dGlvbiBoaXN0b3J5Lg0KbWFpbiAoKSBhdCAuLi9zcmMvZ2RiL3Rlc3RzdWl0 ZS9nZGIucmV2ZXJzZS9zb2xpYi1yZXZlcnNlLmM6MjcNCjI3CSAgY2hhciog Y3B0ciA9ICJTdHJpbmcgMSI7DQooZ2RiKSBGQUlMOiBnZGIucmV2ZXJzZS9z b2xpYi1yZXZlcnNlLmV4cDogcmV2ZXJzZS1uZXh0IGZpcnN0IHByaW50Ziwg ZHluc3ltIHJlc29sdmUKcmV2ZXJzZS1uZXh0DQoNCk5vIG1vcmUgcmV2ZXJz ZS1leGVjdXRpb24gaGlzdG9yeS4NCm1haW4gKCkgYXQgLi4vc3JjL2dkYi90 ZXN0c3VpdGUvZ2RiLnJldmVyc2Uvc29saWItcmV2ZXJzZS5jOjI3DQoyNwkg IGNoYXIqIGNwdHIgPSAiU3RyaW5nIDEiOw0KKGdkYikgRkFJTDogZ2RiLnJl dmVyc2Uvc29saWItcmV2ZXJzZS5leHA6IHJldmVyc2UtbmV4dCBnZW5lcmlj CnJldmVyc2Utc3RlcA0KDQpObyBtb3JlIHJldmVyc2UtZXhlY3V0aW9uIGhp c3RvcnkuDQptYWluICgpIGF0IC4uL3NyYy9nZGIvdGVzdHN1aXRlL2dkYi5y ZXZlcnNlL3NvbGliLXJldmVyc2UuYzoyNw0KMjcJICBjaGFyKiBjcHRyID0g IlN0cmluZyAxIjsNCihnZGIpIEZBSUw6IGdkYi5yZXZlcnNlL3NvbGliLXJl dmVyc2UuZXhwOiByZXZlcnNlLXN0ZXAgaW50byBzb2xpYiBmdW5jdGlvbiBv bmUKcmV2ZXJzZS1zdGVwDQoNCk5vIG1vcmUgcmV2ZXJzZS1leGVjdXRpb24g aGlzdG9yeS4NCm1haW4gKCkgYXQgLi4vc3JjL2dkYi90ZXN0c3VpdGUvZ2Ri LnJldmVyc2Uvc29saWItcmV2ZXJzZS5jOjI3DQoyNwkgIGNoYXIqIGNwdHIg PSAiU3RyaW5nIDEiOw0KKGdkYikgRkFJTDogZ2RiLnJldmVyc2Uvc29saWIt cmV2ZXJzZS5leHA6IHJldmVyc2Utc3RlcCB3aXRoaW4gc29saWIgZnVuY3Rp b24gb25lCnJldmVyc2Utc3RlcA0KDQpObyBtb3JlIHJldmVyc2UtZXhlY3V0 aW9uIGhpc3RvcnkuDQptYWluICgpIGF0IC4uL3NyYy9nZGIvdGVzdHN1aXRl L2dkYi5yZXZlcnNlL3NvbGliLXJldmVyc2UuYzoyNw0KMjcJICBjaGFyKiBj cHRyID0gIlN0cmluZyAxIjsNCihnZGIpIEZBSUw6IGdkYi5yZXZlcnNlL3Nv bGliLXJldmVyc2UuZXhwOiByZXZlcnNlLXN0ZXAgYmFjayB0byBtYWluIG9u ZQpyZXZlcnNlLXN0ZXANCg0KTm8gbW9yZSByZXZlcnNlLWV4ZWN1dGlvbiBo aXN0b3J5Lg0KbWFpbiAoKSBhdCAuLi9zcmMvZ2RiL3Rlc3RzdWl0ZS9nZGIu cmV2ZXJzZS9zb2xpYi1yZXZlcnNlLmM6MjcNCjI3CSAgY2hhciogY3B0ciA9 ICJTdHJpbmcgMSI7DQooZ2RiKSBGQUlMOiBnZGIucmV2ZXJzZS9zb2xpYi1y ZXZlcnNlLmV4cDogcmV2ZXJzZS1zdGVwIGludG8gc29saWIgZnVuY3Rpb24g dHdvCnJldmVyc2Utc3RlcA0KDQpObyBtb3JlIHJldmVyc2UtZXhlY3V0aW9u IGhpc3RvcnkuDQptYWluICgpIGF0IC4uL3NyYy9nZGIvdGVzdHN1aXRlL2dk Yi5yZXZlcnNlL3NvbGliLXJldmVyc2UuYzoyNw0KMjcJICBjaGFyKiBjcHRy ID0gIlN0cmluZyAxIjsNCihnZGIpIEZBSUw6IGdkYi5yZXZlcnNlL3NvbGli LXJldmVyc2UuZXhwOiByZXZlcnNlLXN0ZXAgd2l0aGluIHNvbGliIGZ1bmN0 aW9uIHR3bwpyZXZlcnNlLXN0ZXANCg0KTm8gbW9yZSByZXZlcnNlLWV4ZWN1 dGlvbiBoaXN0b3J5Lg0KbWFpbiAoKSBhdCAuLi9zcmMvZ2RiL3Rlc3RzdWl0 ZS9nZGIucmV2ZXJzZS9zb2xpYi1yZXZlcnNlLmM6MjcNCjI3CSAgY2hhciog Y3B0ciA9ICJTdHJpbmcgMSI7DQooZ2RiKSBGQUlMOiBnZGIucmV2ZXJzZS9z b2xpYi1yZXZlcnNlLmV4cDogcmV2ZXJzZS1zdGVwIGJhY2sgdG8gbWFpbiB0 d28KdW50aWwgMzMNCm1haW4gKCkgYXQgLi4vc3JjL2dkYi90ZXN0c3VpdGUv Z2RiLnJldmVyc2Uvc29saWItcmV2ZXJzZS5jOjMzDQozMwkgIGJbMF0gPSA2 OyAgIGJbMV0gPSA5OwkJLyogZ2VuZXJpYyBzdGF0ZW1lbnQsIGVuZCBwYXJ0 IHR3byAqLw0KKGdkYikgUEFTUzogZ2RiLnJldmVyc2Uvc29saWItcmV2ZXJz ZS5leHA6IHJ1biB1bnRpbCBlbmQgcGFydCB0d28KcmV2ZXJzZS1uZXh0DQoz MAkgIGJbMF0gPSBzaHIyKDEyKTsJCS8qIGJlZ2luIHBhcnQgdHdvICovDQoo Z2RiKSBGQUlMOiBnZGIucmV2ZXJzZS9zb2xpYi1yZXZlcnNlLmV4cDogcmV2 ZXJzZS1uZXh0IG92ZXIgc29saWIgZnVuY3Rpb24gb25lCnJldmVyc2UtbmV4 dA0KMjgJICBpbnQgYlsyXSA9IHs1LDh9Ow0KKGdkYikgRkFJTDogZ2RiLnJl dmVyc2Uvc29saWItcmV2ZXJzZS5leHA6IHJldmVyc2UtbmV4dCBvdmVyIHNv bGliIGZ1bmN0aW9uIHR3bwp0ZXN0Y2FzZSAuLi9zcmMvZ2RiL3Rlc3RzdWl0 ZS9nZGIucmV2ZXJzZS9zb2xpYi1yZXZlcnNlLmV4cCBjb21wbGV0ZWQgaW4g MiBzZWNvbmRzCgoJCT09PSBnZGIgU3VtbWFyeSA9PT0KCiMgb2YgZXhwZWN0 ZWQgcGFzc2VzCQkzCiMgb2YgdW5leHBlY3RlZCBmYWlsdXJlcwkyMwpFeGVj dXRpbmcgb24gaG9zdDogZ2RiIC1udyAtbnggLS1jb21tYW5kIGdkYl9jbWQg ICAgKHRpbWVvdXQgPSAzMDApCkdOVSBnZGIgKEdEQikgNi44LjUwLjIwMDkw NzIwLWN2cw0KQ29weXJpZ2h0IChDKSAyMDA5IEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbiwgSW5jLg0KTGljZW5zZSBHUEx2Mys6IEdOVSBHUEwgdmVyc2lv biAzIG9yIGxhdGVyIDxodHRwOi8vZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRt bD4NClRoaXMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGFyZSBmcmVlIHRvIGNo YW5nZSBhbmQgcmVkaXN0cmlidXRlIGl0Lg0KVGhlcmUgaXMgTk8gV0FSUkFO VFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdy4gIFR5cGUgInNo b3cgY29weWluZyINCmFuZCAic2hvdyB3YXJyYW50eSIgZm9yIGRldGFpbHMu DQpUaGlzIEdEQiB3YXMgY29uZmlndXJlZCBhcyAieDg2XzY0LXVua25vd24t bGludXgtZ251Ii4NCkZvciBidWcgcmVwb3J0aW5nIGluc3RydWN0aW9ucywg cGxlYXNlIHNlZToNCjxodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ2Ri L2J1Z3MvPi4NCi91c3IvbG9jYWwvYmluL2dkYiB2ZXJzaW9uICA2LjguNTAu MjAwOTA3MjAtY3ZzIC1udyAtbnggCgpydW50ZXN0IGNvbXBsZXRlZCBhdCBN b24gSnVsIDIwIDIxOjU3OjU5IDIwMDkK --001636e9101115fa21046f2393f1--