From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20136 invoked by alias); 10 Apr 2012 07:45:02 -0000 Received: (qmail 20029 invoked by uid 22791); 10 Apr 2012 07:44:58 -0000 X-SWARE-Spam-Status: No, hits=-4.9 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,KHOP_RCVD_TRUST,KHOP_THREADED,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE,TW_BJ,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail-qc0-f169.google.com (HELO mail-qc0-f169.google.com) (209.85.216.169) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 10 Apr 2012 07:44:29 +0000 Received: by qcsd16 with SMTP id d16so3326268qcs.0 for ; Tue, 10 Apr 2012 00:44:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:x-system-of-record:x-gm-message-state; bh=vjDH8HSTDr+r52vrJU7RiQmS0HS25xPBHHvdtdXhPDE=; b=RuojhexzCOiVEgO7ryFCTPFcbqPy0VnNSDxbvS0OM/F2AHrJxPD7IjOQ2201WFfGQw t0m7mhOpL6Am4LZyo3CDCTA/C3WM8IjVw/CAZeqwyd1wbK20xpCBMp29Fgcjtuq7TJ8k qFvqwRA/Cl8soUCv6lrQ6FK5dyl8qePJKN5tMjCx20Mq+ZEr5fcW+bnkj7EBYL6AVfVn mzhsHkOrJ95f4HytssLYQTKPJ+IJyxea1o4EPd4Oj/lxZrw6jq8tSpMDfNz+8WPfXOPs XwsdEsfBb2JAVhqWmAoS65ph043IdXx2244O7W8GNuNgRwHkq0LVVAW8iLRwoIEi9dzF igtA== Received: by 10.224.53.6 with SMTP id k6mr13064880qag.25.1334043868449; Tue, 10 Apr 2012 00:44:28 -0700 (PDT) MIME-Version: 1.0 Received: by 10.224.53.6 with SMTP id k6mr13064869qag.25.1334043868312; Tue, 10 Apr 2012 00:44:28 -0700 (PDT) Received: by 10.224.67.74 with HTTP; Tue, 10 Apr 2012 00:44:28 -0700 (PDT) In-Reply-To: <87mx6k4b9t.fsf@fleche.redhat.com> References: <87mx6k4b9t.fsf@fleche.redhat.com> Date: Tue, 10 Apr 2012 07:45:00 -0000 Message-ID: Subject: Re: [RFC - Python Scripting] New method gdb.Symtab.blocks_iterator - docs included From: Siva Chandra To: Tom Tromey , Eli Zaretskii Cc: gdb-patches@sourceware.org Content-Type: multipart/mixed; boundary=20cf3074d9a8e2b6f704bd4e4a40 X-System-Of-Record: true X-Gm-Message-State: ALoCoQlJnafNFzcfVZQuJUMa/DR7uNF+NZ9+DqMkqxzvlk7hxtRplMNb+C/xtErB8JFtElrtuJY9ZXk69e8qCHTho8oeCODcQB8R6di6wQ/GKM8wug38gwYP9wI3Heh/a0Cv95cfD+EHXfoK7R5cw8vUJ0U64fn5ig== 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: 2012-04/txt/msg00173.txt.bz2 --20cf3074d9a8e2b6f704bd4e4a40 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-length: 3318 Thanks Eli and Tom for taking a look. Tom, I have addressed all your comments. For some of them, I have my own comments below. The updated patch is attached. Code - 2012-04-10 Siva Chandra Reddy Add a new method gdb.Symtab.blocks to iterate over the scope blocks of a symbol table. * NEWS (Python scripting): Add entry about the new method. * python/py-symtab.c (symtab_blocks_iterator_object): New iterator type to iterate over the scope blocks of a symtab. (stpy_blocks): New function which implements the new method. (symtab_blocks_iterator_dealloc): New function which serves as the tp_dealloc function for symtab_blocks_iterator_object. (symtab_blocks_iterator_iter): New function which serves as the tp_iter function for symtab_blocks_iterator_object. (symtab_blocks_iterator_iternext): New function which serves as the tp_iternext function for symtab_blocks_iterator_object. (gdbpy_initialize_symtabs): Add initializations for the new iterator type. Docs - 2012-04-10 Siva Chandra Reddy * gdb.texinfo (Symbol Tables In Python): Add description about the new method gdb.Symtab.blocks. Tests - 2012-04-10 Siva Chandra Reddy * gdb.python/py-symtab.exp: Add tests to test the new method gdb.Symtab.blocks. Tom > It seems to me that the Symtab itself could provide the iterator so y= ou Tom > could just write: Tom > Tom > =A0 =A0for block in symtab: Tom > =A0 =A0 =A0... Tom > Tom > The precedent here is that gdb.Block is also an iterator over symbols. Tom > Tom > Alternatively, 'Symtab.blocks'. Tom > I find 'blocks_iterator' a bit too wordy somehow. Tom > Tom > What do you think of those? I have picked Symtab.blocks. I personally don't like making Symtab iterable as blocks are just one of them. Siva> + =A0 block_object =3D block_to_block_object (block, symtab->objfile); Siva> + =A0 if (! block_object) Siva> + =A0 =A0 { Siva> + =A0 =A0 =A0 PyErr_SetString (PyExc_RuntimeError, Siva> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0_("Unable to get the= next gdb.Block object.")); Tom> If block_to_block_object fails, then the error will already be set. Tom> I think it is generally better to propagate the original exception in Tom> cases like this. =A0Otherwise, the new exception may obscure some more Tom> fundamental error. block_to_block_object just returns NULL on failure. Am I missing something? Siva> + =A0 (iter->iter_index)++; Tom> Also I'm curious if an error should invalidate the iterator in some wa= y. Since the iterator exists only in Python environment, my opinion is that if the iterator gets invalidated, the execution should never reach this place. Do you see something else? Tom> We were recently discussing that it is preferable to give each Tom> executable its own name, so that if the test fails it is simpler to Tom> reproduce the problem from outside dejagnu. Tom> Tom> So, please choose a new name for the executable here. The source file py-symbol.c is used by py-symtab.exp as well as by py-symbol.exp. Hence, I have changed in py-symtab.exp to use executables py-symbol-symtab and py-symbol-symtab-cc. Thanks, Siva Chandra --20cf3074d9a8e2b6f704bd4e4a40 Content-Type: text/plain; charset=US-ASCII; name="blocks_iterator_patch_v2.txt" Content-Disposition: attachment; filename="blocks_iterator_patch_v2.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_h0un9mom0 Content-length: 19366 SW5kZXg6IE5FV1MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTog L2N2cy9zcmMvc3JjL2dkYi9ORVdTLHYKcmV0cmlldmluZyByZXZpc2lvbiAx LjUwNgpkaWZmIC1jIC1wIC1yMS41MDYgTkVXUwoqKiogTkVXUwkyIEFwciAy MDEyIDA3OjMyOjMxIC0wMDAwCTEuNTA2Ci0tLSBORVdTCTEwIEFwciAyMDEy IDA3OjM1OjEzIC0wMDAwCioqKioqKioqKioqKioqKgoqKiogMzIsMzcgKioq KgotLS0gMzIsNDEgLS0tLQogICAgKiogQSBuZXcgbWV0aG9kICdyZWZlcmVu Y2VkX3ZhbHVlJyBvbiBnZGIuVmFsdWUgb2JqZWN0cyB3aGljaCBjYW4KICAg ICAgIGRlcmVmZXJlbmNlIHBvaW50ZXIgYXMgd2VsbCBhcyBDKysgcmVmZXJl bmNlIHZhbHVlcy4KICAKKyAgICoqIEEgbmV3IG1ldGhvZCAnYmxvY2tzJyBv biBnZGIuU3ltdGFiIG9iamVjdHMgd2hpY2ggcmV0dXJucyBhbgorICAgICAg aXRlcmF0b3IgdG8gaXRlcmF0ZSBvdmVyIHRoZSBzY29wZSBibG9ja3MgKGdk Yi5CbG9jayBvYmplY3RzKSBvZgorICAgICAgdGhlIHN5bWJvbCB0YWJsZSAo Z2RiLlN5bXRhYiBvYmplY3QpLgorIAogICogR0RCc2VydmVyIG5vdyBzdXBw b3J0cyBzdGRpbyBjb25uZWN0aW9ucy4KICAgIEUuZy4gKGdkYikgdGFyZ2V0 IHJlbW90ZSB8IHNzaCBteWhvc3QgZ2Ric2VydmVyIC0gaGVsbG8KICAKSW5k ZXg6IGRvYy9nZGIudGV4aW5mbwo9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJD UyBmaWxlOiAvY3ZzL3NyYy9zcmMvZ2RiL2RvYy9nZGIudGV4aW5mbyx2CnJl dHJpZXZpbmcgcmV2aXNpb24gMS45MzkKZGlmZiAtYyAtcCAtcjEuOTM5IGdk Yi50ZXhpbmZvCioqKiBkb2MvZ2RiLnRleGluZm8JMjggTWFyIDIwMTIgMjE6 MzE6NDYgLTAwMDAJMS45MzkKLS0tIGRvYy9nZGIudGV4aW5mbwkxMCBBcHIg MjAxMiAwNzozNToyMSAtMDAwMAoqKioqKioqKioqKioqKiogaWYgaXQgaXMg aW52YWxpZCBhdCB0aGUgdGltZSB0aGUgbWV0aG9kIAoqKiogMjQzOTIsMjQz OTcgKioqKgotLS0gMjQzOTIsMjQ0MDMgLS0tLQogIEBkZWZ1biBTeW10YWIu ZnVsbG5hbWUgKCkKICBSZXR1cm4gdGhlIHN5bWJvbCB0YWJsZSdzIHNvdXJj ZSBhYnNvbHV0ZSBmaWxlIG5hbWUuCiAgQGVuZCBkZWZ1bgorIAorIEBkZWZ1 biBTeW10YWIuYmxvY2tzICgpCisgUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGgg d2hpY2ggdGhlIHVzZXIgY2FuIGl0ZXJhdGUgb3ZlciB0aGUgc3ltYm9sCisg c2NvcGUgYmxvY2tzIChAY29kZXtnZGIuQmxvY2t9IG9iamVjdHMpIG9mIHRo ZSBzeW1ib2wgdGFibGUKKyAoQGNvZGV7Z2RiLlN5bXRhYn0gb2JqZWN0KS4g IEB4cmVme0Jsb2NrcyBJbiBQeXRob259LgorIEBlbmQgZGVmdW4KICBAZW5k IHRhYmxlCiAgCiAgQG5vZGUgQnJlYWtwb2ludHMgSW4gUHl0aG9uCkluZGV4 OiBweXRob24vcHktc3ltdGFiLmMKPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpS Q1MgZmlsZTogL2N2cy9zcmMvc3JjL2dkYi9weXRob24vcHktc3ltdGFiLmMs dgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuOApkaWZmIC1jIC1wIC1yMS44IHB5 LXN5bXRhYi5jCioqKiBweXRob24vcHktc3ltdGFiLmMJNCBKYW4gMjAxMiAw ODoxNzoyNSAtMDAwMAkxLjgKLS0tIHB5dGhvbi9weS1zeW10YWIuYwkxMCBB cHIgMjAxMiAwNzozNToyMSAtMDAwMAoqKioqKioqKioqKioqKioKKioqIDIw LDI1ICoqKioKLS0tIDIwLDI2IC0tLS0KICAjaW5jbHVkZSAiZGVmcy5oIgog ICNpbmNsdWRlICJjaGFyc2V0LmgiCiAgI2luY2x1ZGUgInN5bXRhYi5oIgor ICNpbmNsdWRlICJibG9jay5oIgogICNpbmNsdWRlICJzb3VyY2UuaCIKICAj aW5jbHVkZSAicHl0aG9uLWludGVybmFsLmgiCiAgI2luY2x1ZGUgIm9iamZp bGVzLmgiCioqKioqKioqKioqKioqKiB0eXBlZGVmIHN0cnVjdCBzdHB5X3N5 bXRhYl9vYmplY3QgewoqKiogMzYsNDIgKioqKgotLS0gMzcsNjMgLS0tLQog ICAgc3RydWN0IHN0cHlfc3ltdGFiX29iamVjdCAqbmV4dDsKICB9IHN5bXRh Yl9vYmplY3Q7CiAgCisgLyogSXRlcmF0b3Igb2JqZWN0IHR5cGUgd2hvc2Ug aW5zdGFuY2Ugc2VydmVzIGFzIGFuIGl0ZXJhdG9yIG92ZXIgdGhlCisgICAg c2NvcGUgYmxvY2tzIGluIHRoZSB1bmRlcmx5aW5nIHN5bXRhYiBvZiBhIHN5 bXRhYl9vYmplY3QuICAqLworIAorIHR5cGVkZWYgc3RydWN0IHN0cHlfYmxv Y2tzX2l0ZXJhdG9yX29iamVjdAorIHsKKyAgIFB5T2JqZWN0X0hFQUQKKyAK KyAgIC8qIEEgcmVmZXJlbmNlIHRvIHRoZSBzeW10YWJfb2JqZWN0IGZyb20g d2hpY2ggdGhpcyBpdGVyYXRvciB3YXMKKyAgICAgIGNyZWF0ZWQuICAqLwor IAorICAgUHlPYmplY3QgKnN5bXRhYl9vYmo7CisgCisgICAvKiBJbmRleCBv ZiB0aGUgYmxvY2sgb2JqZWN0IGN1cnJlbnRseSBwb2ludGVkIHRvIGJ5IHRo ZQorICAgICAgaXRlcmF0b3IuICAqLworIAorICAgaW50IGl0ZXJfaW5kZXg7 CisgfSBzeW10YWJfYmxvY2tzX2l0ZXJhdG9yX29iamVjdDsKKyAKICBzdGF0 aWMgUHlUeXBlT2JqZWN0IHN5bXRhYl9vYmplY3RfdHlwZTsKKyBzdGF0aWMg UHlUeXBlT2JqZWN0IHN5bXRhYl9ibG9ja3NfaXRlcmF0b3Jfb2JqZWN0X3R5 cGU7CisgCiAgc3RhdGljIGNvbnN0IHN0cnVjdCBvYmpmaWxlX2RhdGEgKnN0 cHlfb2JqZmlsZV9kYXRhX2tleTsKICAKICAvKiBSZXF1aXJlIGEgdmFsaWQg c3ltYm9sIHRhYmxlLiAgQWxsIGFjY2VzcyB0byBzeW10YWJfb2JqZWN0LT5z eW10YWIKKioqKioqKioqKioqKioqIHN0cHlfaXNfdmFsaWQgKFB5T2JqZWN0 ICpzZWxmLCBQeU9iamVjdCAKKioqIDE1MywxNTggKioqKgotLS0gMTc0LDIw NSAtLS0tCiAgICBQeV9SRVRVUk5fVFJVRTsKICB9CiAgCisgLyogSW1wbGVt ZW50YXRpb24gb2YgZ2RiLlN5bXRhYi5ibG9ja3MgKHNlbGYpIC0+IGl0ZXJh dG9yLgorICAgIFJldHVybnMgYW4gaXRlcmF0b3Igd2l0aCB3aGljaCBhIHVz ZXIgY2FuIGl0ZXJhdG9yIG92ZXIgdGhlIHNjb3BlCisgICAgYmxvY2tzIChn ZGIuQmxvY2sgb2JqZWN0cykgb2YgdGhlIHVuZGVybHlpbmcgc3ltdGFiLiAg Ki8KKyAKKyBzdGF0aWMgUHlPYmplY3QgKgorIHN0cHlfYmxvY2tzIChQeU9i amVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCisgeworICAgc3RydWN0IHN5 bXRhYiAqc3ltdGFiID0gTlVMTDsKKyAgIHN5bXRhYl9ibG9ja3NfaXRlcmF0 b3Jfb2JqZWN0ICppdGVyID0gTlVMTDsKKyAgIHN5bXRhYl9vYmplY3QgKnN5 bXRhYl9vYmogPSAoc3ltdGFiX29iamVjdCAqKSBzZWxmOworIAorICAgU1RQ WV9SRVFVSVJFX1ZBTElEIChzZWxmLCBzeW10YWIpOworIAorICAgaXRlciA9 IFB5T2JqZWN0X05ldyAoc3ltdGFiX2Jsb2Nrc19pdGVyYXRvcl9vYmplY3Qs CisgICAgICAgICAgICAgICAgICAgICAgICAmc3ltdGFiX2Jsb2Nrc19pdGVy YXRvcl9vYmplY3RfdHlwZSk7CisgICBpZiAoaXRlcikKKyAgICAgeworICAg ICAgIGl0ZXItPnN5bXRhYl9vYmogPSAoUHlPYmplY3QgKikgc3ltdGFiX29i ajsKKyAgICAgICBpdGVyLT5pdGVyX2luZGV4ID0gMDsKKyAgICAgICAvKiBU aGUgaXRlcmF0b3IgaG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIHN5bXRhYl9v YmplY3QuICAqLworICAgICAgIFB5X0lOQ1JFRiAoc2VsZik7CisgICAgIH0K KyAKKyAgIHJldHVybiAoUHlPYmplY3QgKikgaXRlcjsKKyB9CisgCiAgc3Rh dGljIFB5T2JqZWN0ICoKICBzYWxweV9zdHIgKFB5T2JqZWN0ICpzZWxmKQog IHsKKioqKioqKioqKioqKioqIHN0cHlfZGVhbGxvYyAoUHlPYmplY3QgKm9i aikKKioqIDE5MywxOTkgKioqKgogICAgc3ltdGFiLT5zeW10YWIgPSBOVUxM OwogIH0KICAKLSAKICBzdGF0aWMgUHlPYmplY3QgKgogIHNhbHB5X2dldF9w YyAoUHlPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiAgewotLS0gMjQw LDI0NSAtLS0tCioqKioqKioqKioqKioqKiBkZWxfb2JqZmlsZV9zYWwgKHN0 cnVjdCBvYmpmaWxlICpvYmpmaWxlCioqKiA0MzEsNDM2ICoqKioKLS0tIDQ3 Nyw1MzUgLS0tLQogICAgICB9CiAgfQogIAorIC8qIFRoZSB0cF9kZWFsbG9j IGZ1bmN0aW9uIG9mIHN5bXRhYl9ibG9ja3NfaXRlcmF0b3Jfb2JqZWN0X3R5 cGUuICAqLworIAorIHN0YXRpYyB2b2lkCisgc3ltdGFiX2Jsb2Nrc19pdGVy YXRvcl9kZWFsbG9jIChQeU9iamVjdCAqc2VsZikKKyB7CisgICBzeW10YWJf YmxvY2tzX2l0ZXJhdG9yX29iamVjdCAqaXRlcjsKKyAKKyAgIGl0ZXIgPSAo c3ltdGFiX2Jsb2Nrc19pdGVyYXRvcl9vYmplY3QgKikgc2VsZjsKKyAgIC8q IERlY3JlbWVudCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBzeW10YWJfb2JqZWN0 LiAgKi8KKyAgIFB5X0RFQ1JFRiAoaXRlci0+c3ltdGFiX29iaik7CisgfQor IAorIC8qIFRoZSB0cF9pdGVyIGZ1bmN0aW9uIG9mIHN5bXRhYl9ibG9ja3Nf aXRlcmF0b3Jfb2JqZWN0X3R5cGUuICAqLworIAorIHN0YXRpYyBQeU9iamVj dCAqCisgc3ltdGFiX2Jsb2Nrc19pdGVyYXRvcl9pdGVyIChQeU9iamVjdCAq c2VsZikKKyB7CisgICBQeV9JTkNSRUYgKHNlbGYpOworICAgcmV0dXJuIHNl bGY7CisgfQorIAorIC8qIFRoZSB0cF9pdGVybmV4dCBmdW5jdGlvbiBvZiBz eW10YWJfYmxvY2tzX2l0ZXJhdG9yX29iamVjdF90eXBlLiAgKi8KKyAKKyBz dGF0aWMgUHlPYmplY3QgKgorIHN5bXRhYl9ibG9ja3NfaXRlcmF0b3JfaXRl cm5leHQgKFB5T2JqZWN0ICpzZWxmKQorIHsKKyAgIFB5T2JqZWN0ICpibG9j a19vYmplY3Q7CisgICBzeW10YWJfYmxvY2tzX2l0ZXJhdG9yX29iamVjdCAq aXRlcjsKKyAgIHN5bXRhYl9vYmplY3QgKnN5bXRhYl9vYmo7CisgICBzdHJ1 Y3Qgc3ltdGFiICpzeW10YWI7CisgICBzdHJ1Y3QgYmxvY2sgKmJsb2NrOwor IAorICAgaXRlciA9IChzeW10YWJfYmxvY2tzX2l0ZXJhdG9yX29iamVjdCAq KSBzZWxmOworIAorICAgU1RQWV9SRVFVSVJFX1ZBTElEIChpdGVyLT5zeW10 YWJfb2JqLCBzeW10YWIpOyAKKyAgIHN5bXRhYl9vYmogPSAoc3ltdGFiX29i amVjdCAqKSBpdGVyLT5zeW10YWJfb2JqOworIAorICAgaWYgKGl0ZXItPml0 ZXJfaW5kZXggPj0gc3ltdGFiLT5ibG9ja3ZlY3Rvci0+bmJsb2NrcykKKyAg ICAgcmV0dXJuIE5VTEw7CisgCisgICBibG9jayA9IHN5bXRhYi0+YmxvY2t2 ZWN0b3ItPmJsb2NrW2l0ZXItPml0ZXJfaW5kZXhdOworICAgYmxvY2tfb2Jq ZWN0ID0gYmxvY2tfdG9fYmxvY2tfb2JqZWN0IChibG9jaywgc3ltdGFiLT5v YmpmaWxlKTsKKyAgIGlmICghIGJsb2NrX29iamVjdCkKKyAgICAgeworICAg ICAgIFB5RXJyX1NldFN0cmluZyAoUHlFeGNfUnVudGltZUVycm9yLAorICAg ICAgICAgICAgICAgICAgICAgICAgXygiVW5hYmxlIHRvIGdldCB0aGUgbmV4 dCBnZGIuQmxvY2sgb2JqZWN0LiIpKTsKKyAgICAgICByZXR1cm4gTlVMTDsK KyAgICAgfQorIAorICAgKGl0ZXItPml0ZXJfaW5kZXgpKys7CisgICByZXR1 cm4gYmxvY2tfb2JqZWN0OworIH0KKyAKICB2b2lkCiAgZ2RicHlfaW5pdGlh bGl6ZV9zeW10YWJzICh2b2lkKQogIHsKKioqKioqKioqKioqKioqIGdkYnB5 X2luaXRpYWxpemVfc3ltdGFicyAodm9pZCkKKioqIDQ0Miw0NDcgKioqKgot LS0gNTQxLDU1MCAtLS0tCiAgICBpZiAoUHlUeXBlX1JlYWR5ICgmc2FsX29i amVjdF90eXBlKSA8IDApCiAgICAgIHJldHVybjsKICAKKyAgIHN5bXRhYl9i bG9ja3NfaXRlcmF0b3Jfb2JqZWN0X3R5cGUudHBfbmV3ID0gUHlUeXBlX0dl bmVyaWNOZXc7CisgICBpZiAoUHlUeXBlX1JlYWR5ICgmc3ltdGFiX2Jsb2Nr c19pdGVyYXRvcl9vYmplY3RfdHlwZSkgPCAwKQorICAgICByZXR1cm47Cisg CiAgICAvKiBSZWdpc3RlciBhbiBvYmpmaWxlICJmcmVlIiBjYWxsYmFjayBz byB3ZSBjYW4gcHJvcGVybHkKICAgICAgIGludmFsaWRhdGUgc3ltYm9sIHRh YmxlcywgYW5kIHN5bWJvbCB0YWJsZSBhbmQgbGluZSBkYXRhCiAgICAgICBz dHJ1Y3R1cmVzIHdoZW4gYW4gb2JqZWN0IGZpbGUgdGhhdCBpcyBhYm91dCB0 byBiZQoqKioqKioqKioqKioqKiogZ2RicHlfaW5pdGlhbGl6ZV9zeW10YWJz ICh2b2lkKQoqKiogNDU4LDQ2MyAqKioqCi0tLSA1NjEsNTcwIC0tLS0KICAg IFB5X0lOQ1JFRiAoJnNhbF9vYmplY3RfdHlwZSk7CiAgICBQeU1vZHVsZV9B ZGRPYmplY3QgKGdkYl9tb2R1bGUsICJTeW10YWJfYW5kX2xpbmUiLAogIAkJ ICAgICAgKFB5T2JqZWN0ICopICZzYWxfb2JqZWN0X3R5cGUpOworIAorICAg UHlfSU5DUkVGICgmc3ltdGFiX2Jsb2Nrc19pdGVyYXRvcl9vYmplY3RfdHlw ZSk7CisgICBQeU1vZHVsZV9BZGRPYmplY3QgKGdkYl9tb2R1bGUsICJCbG9j a0l0ZXJhdG9yIiwKKyAJCSAgICAgIChQeU9iamVjdCAqKSAmc3ltdGFiX2Js b2Nrc19pdGVyYXRvcl9vYmplY3RfdHlwZSk7CiAgfQogIAogIAwKKioqKioq KioqKioqKioqIFJldHVybiB0cnVlIGlmIHRoaXMgc3ltYm9sIHRhYmxlIGlz IHZhbGkKKioqIDQ3Nyw0ODIgKioqKgotLS0gNTg0LDU5MyAtLS0tCiAgICB7 ICJmdWxsbmFtZSIsIHN0cHlfZnVsbG5hbWUsIE1FVEhfTk9BUkdTLAogICAg ICAiZnVsbG5hbWUgKCkgLT4gU3RyaW5nLlxuXAogIFJldHVybiB0aGUgc3lt dGFiJ3MgZnVsbCBzb3VyY2UgZmlsZW5hbWUuIiB9LAorICAgeyAiYmxvY2tz Iiwgc3RweV9ibG9ja3MsIE1FVEhfTk9BUkdTLAorICAgICAiYmxvY2tzICgp IC0+IGl0ZXJhdG9yLlxuXAorIFJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRo ZSBzY29wZSBibG9ja3MgKGdkYi5CbG9jayBvYmplY3RzKSBvZiB0aGVcblwK KyB1bmRlcmx5aW5nIFN5bXRhYi4iIH0sCiAgICB7TlVMTH0gIC8qIFNlbnRp bmVsICovCiAgfTsKICAKKioqKioqKioqKioqKioqIHN0YXRpYyBQeVR5cGVP YmplY3Qgc2FsX29iamVjdF90eXBlID0gewoqKiogNTYyLDU2NCAqKioqCi0t LSA2NzMsNzA2IC0tLS0KICAgIDAsCQkJCSAgLyp0cF9tZW1iZXJzICovCiAg ICBzYWxfb2JqZWN0X2dldHNldAkJICAvKnRwX2dldHNldCAqLwogIH07Cisg Cisgc3RhdGljIFB5VHlwZU9iamVjdCBzeW10YWJfYmxvY2tzX2l0ZXJhdG9y X29iamVjdF90eXBlID0geworICAgUHlPYmplY3RfSEVBRF9JTklUIChOVUxM KQorICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3Np emUqLworICAgImdkYi5CbG9ja0l0ZXJhdG9yIiwgICAgICAgICAgICAvKnRw X25hbWUqLworICAgc2l6ZW9mIChzeW10YWJfYmxvY2tzX2l0ZXJhdG9yX29i amVjdCksICAvKnRwX2Jhc2ljc2l6ZSovCisgICAwLCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgc3ltdGFiX2Js b2Nrc19pdGVyYXRvcl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgMCwg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAg IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRy Ki8KKyAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9z ZXRhdHRyKi8KKyAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Lyp0cF9jb21wYXJlKi8KKyAgIDAsICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgLyp0cF9yZXByKi8KKyAgIDAsICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgMCwgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgIDAsICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8K KyAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNo ICovCisgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBf Y2FsbCovCisgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q dHBfc3RyKi8KKyAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Lyp0cF9nZXRhdHRybyovCisgICAwLCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgMCwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICBQeV9UUEZMQUdT X0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfSVRFUiwgIC8qdHBfZmxhZ3Mq LworICAgIkl0ZXJhdG9yIG92ZXIgR0RCIGJsb2NrcyIsICAgICAvKnRwX2Rv YyAqLworICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRw X3RyYXZlcnNlICovCisgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIC8qdHBfY2xlYXIgKi8KKyAgIDAsICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSAqLworICAgMCwgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0ICovCisg ICBzeW10YWJfYmxvY2tzX2l0ZXJhdG9yX2l0ZXIsICAgIC8qdHBfaXRlciAq LworICAgc3ltdGFiX2Jsb2Nrc19pdGVyYXRvcl9pdGVybmV4dCwgIC8qdHBf aXRlcm5leHQgKi8KKyB9OwpJbmRleDogdGVzdHN1aXRlL2dkYi5weXRob24v cHktc3ltdGFiLmV4cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxl OiAvY3ZzL3NyYy9zcmMvZ2RiL3Rlc3RzdWl0ZS9nZGIucHl0aG9uL3B5LXN5 bXRhYi5leHAsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuOApkaWZmIC1jIC1w IC1yMS44IHB5LXN5bXRhYi5leHAKKioqIHRlc3RzdWl0ZS9nZGIucHl0aG9u L3B5LXN5bXRhYi5leHAJNyBGZWIgMjAxMiAxOTo0MjoyNyAtMDAwMAkxLjgK LS0tIHRlc3RzdWl0ZS9nZGIucHl0aG9uL3B5LXN5bXRhYi5leHAJMTAgQXBy IDIwMTIgMDc6MzU6MjEgLTAwMDAKKioqKioqKioqKioqKioqIGxvYWRfbGli IGdkYi1weXRob24uZXhwCioqKiAyMCwzNyAqKioqCiAgCiAgc2V0IHRlc3Rm aWxlICJweS1zeW1ib2wiCiAgc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYwoh IHNldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0K ISBpZiB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3Ny Y2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWd9XSAhPSAi IiB9IHsKISAgICAgdW50ZXN0ZWQgIkNvdWxkbid0IGNvbXBpbGUgJHtzcmNm aWxlfSIKICAgICAgcmV0dXJuIC0xCiAgfQogIAotICMgU3RhcnQgd2l0aCBh IGZyZXNoIGdkYi4KLSBnZGJfZXhpdAotIGdkYl9zdGFydAotIGdkYl9yZWlu aXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgotIGdkYl9sb2FkICR7Ymlu ZmlsZX0KLSAKICAjIFNraXAgYWxsIHRlc3RzIGlmIFB5dGhvbiBzY3JpcHRp bmcgaXMgbm90IGVuYWJsZWQuCiAgaWYgeyBbc2tpcF9weXRob25fdGVzdHNd IH0geyBjb250aW51ZSB9CiAgCi0tLSAyMCwzMCAtLS0tCiAgCiAgc2V0IHRl c3RmaWxlICJweS1zeW1ib2wiCiAgc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0u YwohIAohIGlmIHsgW3ByZXBhcmVfZm9yX3Rlc3RpbmcgJHt0ZXN0ZmlsZX0u ZXhwICR7dGVzdGZpbGV9LXN5bXRhYiAke3NyY2ZpbGV9XSB9IHsKICAgICAg cmV0dXJuIC0xCiAgfQogIAogICMgU2tpcCBhbGwgdGVzdHMgaWYgUHl0aG9u IHNjcmlwdGluZyBpcyBub3QgZW5hYmxlZC4KICBpZiB7IFtza2lwX3B5dGhv bl90ZXN0c10gfSB7IGNvbnRpbnVlIH0KICAKKioqKioqKioqKioqKioqIGlm ICFbcnVudG9fbWFpbl0gdGhlbiB7CioqKiA0MSw2OSAqKioqCiAgfQogIAog IGdsb2JhbCBoZXggZGVjaW1hbAotIAotICMgU2V0dXAgYW5kIGdldCB0aGUg c3ltYm9sIHRhYmxlLgogIHNldCBsaW5lX25vIFtnZGJfZ2V0X2xpbmVfbnVt YmVyICJCbG9jayBicmVhayBoZXJlLiJdCiEgZ2RiX2JyZWFrcG9pbnQgJGxp bmVfbm8KISBnZGJfY29udGludWVfdG9fYnJlYWtwb2ludCAiQmxvY2sgYnJl YWsgaGVyZS4iCiEgZ2RiX3B5X3Rlc3Rfc2lsZW50X2NtZCAicHl0aG9uIGZy YW1lID0gZ2RiLnNlbGVjdGVkX2ZyYW1lKCkiICJHZXQgRnJhbWUiIDAKISBn ZGJfcHlfdGVzdF9zaWxlbnRfY21kICJweXRob24gc2FsID0gZnJhbWUuZmlu ZF9zYWwoKSIgIkdldCBibG9jayIgMAohIGdkYl9weV90ZXN0X3NpbGVudF9j bWQgInB5dGhvbiBzeW10YWIgPSBzYWwuc3ltdGFiIiAiR2V0IGJsb2NrIiAw CiEgCiEgIyBUZXN0IHNhbC4KISBnZGJfdGVzdCAicHl0aG9uIHByaW50IHNh bC5zeW10YWIiICIuKmdkYi5weXRob24vcHktc3ltYm9sLmMuKiIgIlRlc3Qg c3ltdGFiIgohIGdkYl90ZXN0ICJweXRob24gcHJpbnQgc2FsLnBjIiAiJHtk ZWNpbWFsfSIgIlRlc3Qgc2FsLnBjIgohIGdkYl90ZXN0ICJweXRob24gcHJp bnQgc2FsLmxpbmUiICIkbGluZV9ubyIgIlRlc3Qgc2FsLmxpbmUiCiEgZ2Ri X3Rlc3QgInB5dGhvbiBwcmludCBzYWwuaXNfdmFsaWQoKSIgIlRydWUiICJU ZXN0IHNhbC5pc192YWxpZCIKISAKISAjIFRlc3Qgc3ltYm9sIHRhYmxlLgoh IGdkYl90ZXN0ICJweXRob24gcHJpbnQgc3ltdGFiLmZpbGVuYW1lIiAiLipn ZGIucHl0aG9uL3B5LXN5bWJvbC5jLioiICJUZXN0IHN5bXRhYi5maWxlbmFt ZSIKISBnZGJfdGVzdCAicHl0aG9uIHByaW50IHN5bXRhYi5vYmpmaWxlIiAi PGdkYi5PYmpmaWxlIG9iamVjdCBhdCAke2hleH0+IiAiVGVzdCBzeW10YWIu b2JqZmlsZSIKISBnZGJfdGVzdCAicHl0aG9uIHByaW50IHN5bXRhYi5mdWxs bmFtZSgpIiAidGVzdHN1aXRlL2dkYi5weXRob24vcHktc3ltYm9sLmMuKiIg IlRlc3Qgc3ltdGFiLmZ1bGxuYW1lIgohIGdkYl90ZXN0ICJweXRob24gcHJp bnQgc3ltdGFiLmlzX3ZhbGlkKCkiICJUcnVlIiAiVGVzdCBzeW10YWIuaXNf dmFsaWQoKSIKISAKISAjIFRlc3QgaXNfdmFsaWQgd2hlbiB0aGUgb2JqZmls ZSBpcyB1bmxvYWRlZC4gIFRoaXMgbXVzdCBiZSB0aGUgbGFzdAohICMgdGVz dCBhcyBpdCB1bmxvYWRzIHRoZSBvYmplY3QgZmlsZSBpbiBHREIuCiEgZ2Ri X3VubG9hZAohIGdkYl90ZXN0ICJweXRob24gcHJpbnQgc2FsLmlzX3ZhbGlk KCkiICJGYWxzZSIgIlRlc3Qgc2FsLmlzX3ZhbGlkIgohIGdkYl90ZXN0ICJw eXRob24gcHJpbnQgc3ltdGFiLmlzX3ZhbGlkKCkiICJGYWxzZSIgIlRlc3Qg c3ltdGFiLmlzX3ZhbGlkKCkiCi0tLSAzNCw5MyAtLS0tCiAgfQogIAogIGds b2JhbCBoZXggZGVjaW1hbAogIHNldCBsaW5lX25vIFtnZGJfZ2V0X2xpbmVf bnVtYmVyICJCbG9jayBicmVhayBoZXJlLiJdCiEgCiEgIyBQcm9jIHRvIHNl dHVwIGFuZCBnZXQgdGhlIHN5bWJvbCB0YWJsZSBpbiB0aGUgUHl0aG9uIGVu dmlyb25tZW50LgohIHByb2Mgc2V0dXBfcHl0aG9uX2VudiB7IGxpbmVfbm8g fSB7CiEgICAgIGdkYl9icmVha3BvaW50ICRsaW5lX25vCiEgICAgIGdkYl9j b250aW51ZV90b19icmVha3BvaW50ICJCbG9jayBicmVhayBoZXJlLiIKISAg ICAgZ2RiX3B5X3Rlc3Rfc2lsZW50X2NtZCAicHl0aG9uIGRlZiBmdW5jX3N5 bWJvbChibG9jayk6IHJldHVybiBibG9jay5mdW5jdGlvbiIgIkRlZmluZSBh IGZ1bmMgdG8gZ2V0IHRoZSBmdW5jdGlvbiBzeW1ib2xzIiAiMCIKISAgICAg Z2RiX3B5X3Rlc3Rfc2lsZW50X2NtZCAicHl0aG9uIGZyYW1lID0gZ2RiLnNl bGVjdGVkX2ZyYW1lKCkiICJHZXQgRnJhbWUiIDAKISAgICAgZ2RiX3B5X3Rl c3Rfc2lsZW50X2NtZCAicHl0aG9uIHNhbCA9IGZyYW1lLmZpbmRfc2FsKCki ICJHZXQgYmxvY2siIDAKISAgICAgZ2RiX3B5X3Rlc3Rfc2lsZW50X2NtZCAi cHl0aG9uIHN5bXRhYiA9IHNhbC5zeW10YWIiICJHZXQgYmxvY2siIDAKISAg ICAgZ2RiX3B5X3Rlc3Rfc2lsZW50X2NtZCAicHl0aG9uIGJsb2NrX2xpc3Qg PSBsaXN0KHN5bXRhYi5ibG9ja3MoKSkiICJDcmVhdGUgYSBsaXN0IG9mIGJs b2NrcyIgMAohICAgICBnZGJfcHlfdGVzdF9zaWxlbnRfY21kICJweXRob24g ZnVuY19zeW1ib2xzID0gbWFwKGZ1bmNfc3ltYm9sLCBibG9ja19saXN0KSIg IkNyZWF0ZSBhIGxpc3Qgb2YgZnVuY3Rpb24gc3ltYm9scyIgMAohICAgICBn ZGJfcHlfdGVzdF9zaWxlbnRfY21kICJweXRob24gZnVuY19uYW1lcyA9IG1h cChzdHIsIGZ1bmNfc3ltYm9scykiICJDcmVhdGUgYSBsaXN0IG9mIGZ1bmN0 aW9uIG5hbWVzIiAwCiEgfQohIAohIHNldHVwX3B5dGhvbl9lbnYgJGxpbmVf bm8KISAKISB3aXRoX3Rlc3RfcHJlZml4ICJDIFRlc3QiIHsKISAgICAgIyBU ZXN0IHNhbC4KISAgICAgZ2RiX3Rlc3QgInB5dGhvbiBwcmludCBzYWwuc3lt dGFiIiAiLipnZGIucHl0aG9uL3B5LXN5bWJvbC5jLioiICJUZXN0IHN5bXRh YiIKISAgICAgZ2RiX3Rlc3QgInB5dGhvbiBwcmludCBzYWwucGMiICIke2Rl Y2ltYWx9IiAiVGVzdCBzYWwucGMiCiEgICAgIGdkYl90ZXN0ICJweXRob24g cHJpbnQgc2FsLmxpbmUiICIkbGluZV9ubyIgIlRlc3Qgc2FsLmxpbmUiCiEg ICAgIGdkYl90ZXN0ICJweXRob24gcHJpbnQgc2FsLmlzX3ZhbGlkKCkiICJU cnVlIiAiVGVzdCBzYWwuaXNfdmFsaWQiCiEgICAgIAohICAgICAjIFRlc3Qg c3ltYm9sIHRhYmxlLgohICAgICBnZGJfdGVzdCAicHl0aG9uIHByaW50IHN5 bXRhYi5maWxlbmFtZSIgIi4qZ2RiLnB5dGhvbi9weS1zeW1ib2wuYy4qIiAi VGVzdCBzeW10YWIuZmlsZW5hbWUiCiEgICAgIGdkYl90ZXN0ICJweXRob24g cHJpbnQgc3ltdGFiLm9iamZpbGUiICI8Z2RiLk9iamZpbGUgb2JqZWN0IGF0 ICR7aGV4fT4iICJUZXN0IHN5bXRhYi5vYmpmaWxlIgohICAgICBnZGJfdGVz dCAicHl0aG9uIHByaW50IHN5bXRhYi5mdWxsbmFtZSgpIiAidGVzdHN1aXRl L2dkYi5weXRob24vcHktc3ltYm9sLmMuKiIgIlRlc3Qgc3ltdGFiLmZ1bGxu YW1lIgohICAgICBnZGJfdGVzdCAicHl0aG9uIHByaW50IHN5bXRhYi5pc192 YWxpZCgpIiAiVHJ1ZSIgIlRlc3Qgc3ltdGFiLmlzX3ZhbGlkKCkiCiEgICAg IGdkYl90ZXN0ICJweXRob24gcHJpbnQgJ2Z1bmMnIGluIGZ1bmNfbmFtZXMi ICJUcnVlIiAiVGVzdCB0aGF0IHRoZXJlIGlzIGEgc3ltYm9sIGZvciB0aGUg ZnVuY3Rpb24gZnVuYyIKISAgICAgZ2RiX3Rlc3QgInB5dGhvbiBwcmludCAn bWFpbicgaW4gZnVuY19uYW1lcyIgIlRydWUiICJUZXN0IHRoYXQgdGhlcmUg aXMgYSBzeW1ib2wgZm9yIHRoZSBmdW5jdGlvbiBtYWluIgohICAgICAgIAoh ICAgICAKISAgICAgIyBUZXN0IGlzX3ZhbGlkIHdoZW4gdGhlIG9iamZpbGUg aXMgdW5sb2FkZWQuICBUaGlzIG11c3QgYmUgdGhlIGxhc3QKISAgICAgIyB0 ZXN0IGFzIGl0IHVubG9hZHMgdGhlIG9iamVjdCBmaWxlIGluIEdEQi4KISAg ICAgZ2RiX3VubG9hZAohICAgICBnZGJfdGVzdCAicHl0aG9uIHByaW50IHNh bC5pc192YWxpZCgpIiAiRmFsc2UiICJUZXN0IHNhbC5pc192YWxpZCIKISAg ICAgZ2RiX3Rlc3QgInB5dGhvbiBwcmludCBzeW10YWIuaXNfdmFsaWQoKSIg IkZhbHNlIiAiVGVzdCBzeW10YWIuaXNfdmFsaWQoKSIKISB9CiEgCiEgIyBD b21waWxlIHRoZSBzb3VyY2UgZmlsZSBhcyBhIEMrKyBmaWxlIGFuZCB0ZXN0 IGFnYWluLgohIGlmIHsgW3ByZXBhcmVfZm9yX3Rlc3RpbmcgJHRlc3RmaWxl LmV4cCAke3Rlc3RmaWxlfS1zeW10YWItY2MgJHNyY2ZpbGUge2RlYnVnIGMr K31dIH0gewohICAgICByZXR1cm4gLTEKISB9CiEgCiEgaWYgIVtydW50b19t YWluXSB7CiEgICAgcmV0dXJuIC0xCiEgfQohIAohIHNldHVwX3B5dGhvbl9l bnYgJGxpbmVfbm8KISAKISB3aXRoX3Rlc3RfcHJlZml4ICJDKysgVGVzdCIg ewohICAgICBnZGJfdGVzdCAicHl0aG9uIHByaW50ICdmdW5jKGludCknIGlu IGZ1bmNfbmFtZXMiICJUcnVlIiAiVGVzdCB0aGF0IHRoZXJlIGlzIGEgc3lt Ym9sIGZvciB0aGUgZnVuY3Rpb24gZnVuYyIKISAgICAgZ2RiX3Rlc3QgInB5 dGhvbiBwcmludCAnbWFpbihpbnQsIGNoYXIqKiknIGluIGZ1bmNfbmFtZXMi ICJUcnVlIiAiVGVzdCB0aGF0IHRoZXJlIGlzIGEgc3ltYm9sIGZvciB0aGUg ZnVuY3Rpb24gbWFpbiIKISAgICAgZ2RiX3Rlc3QgInB5dGhvbiBwcmludCAn U2ltcGxlQ2xhc3M6OnNldGkoaW50KScgaW4gZnVuY19uYW1lcyIgIlRydWUi ICJUZXN0IHRoYXQgdGhlIGZ1bmN0aW9uIFNpbXBsZUNsYXNzOjpzZXRpKGlu dCkgaXMgcHJlc2VudCIKISAgICAgZ2RiX3Rlc3QgInB5dGhvbiBwcmludCAn U2ltcGxlQ2xhc3M6OnZhbHVlb2ZpKCknIGluIGZ1bmNfbmFtZXMiICJUcnVl IiAiVGVzdCB0aGF0IHRoZSBmdW5jdGlvbiBTaW1wbGVDbGFzczo6dmFsdWVv ZmkoKSBpcyBwcmVzZW50IgohIH0K --20cf3074d9a8e2b6f704bd4e4a40--