Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp3113347rwd; Sat, 10 Jun 2023 01:32:19 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6GOzZqf8QZvXWY7IuPmPmBY0fClYm7sfzHyDhbS8wgOXsbOdKHFXw42D4XZtcFEQI7XsvK X-Received: by 2002:a05:6a20:7f8d:b0:10c:67c9:2fda with SMTP id d13-20020a056a207f8d00b0010c67c92fdamr3716676pzj.40.1686385938704; Sat, 10 Jun 2023 01:32:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686385938; cv=none; d=google.com; s=arc-20160816; b=fpeQDa9snra0srQmkb5afyG4lzHz5y+uq/20d8FORZ8DIx705g++D2tmPBHzc6C3Zf JHoGTkD2a/Qw176QQVSLnKkji1+2Ul+WO3dv0i5hS4fdYtwAViKJubGuB4quPki2xVQS PbCoKWvvOvYJVLFM0gFS61Tz83kkDr3rzvnJHlrlFB0+5VyJWvhEXB9eFVJclCjROMzs ZGAnTR6nnTwWqzKICAFvQsgvKxtYjqVbANi8t66dTaULS07sQmszmac9i6lEVQkzybSd +l3j+n1DNy9vrx6EgJprTNInDr4p4ACN3ijFxJa83lKnSI7N+TDDHMaaJbMTiBm6XLTi AdWw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=tWAN9VDwY+JMcj2dGq4u9NjJBGPDPucOkoVNgOVCDs0=; b=EuNSY0XGV5o+ufhy6ZwL7n6VApOBfPuXf4ZTt8+bLCpJ2DBgsMfImZousEo/AhTw5Z pdd1IEZlg7I0GzhJZrCKDgyJ8+jAY8AQ1x/SVd0UNOSREc+s/LVKBT5g9M+VSzHUjyam tZhwuy+89cojoeQD4Nj4ts7qeCsRDS62Px69A4iB143WFnsAuEmLFWL0/aU4U0R46plS DxbNOP2hHcNxkBAYczMAYE0F+zInMZZshXtXAwcD3v+dwMaSBgZoDpmswdEmOVfDNyhR 7lswap3qsd88vHQ42j+jaXGGyUgO5/p0pVpXSXYtAw2AO6nNAEPaOYAXsgodwge7qP8V Pgmw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20221208 header.b=pZPfGASw; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id e128-20020a636986000000b00543d2b889e0si3937838pgc.469.2023.06.10.01.32.06; Sat, 10 Jun 2023 01:32:18 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20221208 header.b=pZPfGASw; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232846AbjFJI3U (ORCPT + 99 others); Sat, 10 Jun 2023 04:29:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50172 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230137AbjFJI3T (ORCPT ); Sat, 10 Jun 2023 04:29:19 -0400 Received: from mail-wm1-x32f.google.com (mail-wm1-x32f.google.com [IPv6:2a00:1450:4864:20::32f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E9D8A2718 for ; Sat, 10 Jun 2023 01:29:17 -0700 (PDT) Received: by mail-wm1-x32f.google.com with SMTP id 5b1f17b1804b1-3f7f7dfc037so33215e9.0 for ; Sat, 10 Jun 2023 01:29:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1686385756; x=1688977756; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=tWAN9VDwY+JMcj2dGq4u9NjJBGPDPucOkoVNgOVCDs0=; b=pZPfGASw5mrx9iR957Dm4VVbB3nBgXvL0eHQ9advEL1n9wTFL9OANuigkmQTvtwiMT c97DRfR0/6pef7Ag/NTpDbAfZsQ4JwHK8hPeir7cFun4K1z/8ehRyrINDfEktQycfAaJ 34tC+UfVvX/wMpNNWb4iBfnD3RnLzc9orBN/TKF1vm2KeAIZp0YdfLxA/8kBKyVRN18E lhhxCzWv+Q14S5KdBpzz3bDoCCWSMXghQzMHhtovXqMTz3/jq/PDq3hzi8yKSwDeQ6F8 q2QNgBSzzMVE9+s5oWQ36U0DpkTwSLs0uCXFsawYbJzjqoaoQSeXJ8lJ1UxPIG4nJk+9 uZlg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1686385756; x=1688977756; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=tWAN9VDwY+JMcj2dGq4u9NjJBGPDPucOkoVNgOVCDs0=; b=N7BP9sXZlkOZpksnz2O4Ia3m6JxK+LqTdDEg7MKeovCMbCQwWR1a10t+psVyet5dhI jJ8q7dkbpmjI0IHN3C6zup/fubONehNPC3snr9mb0G6pWtynI2sNreLY41HceP4DQnqp TRMwBnt758TwKaind1Pj7/MnNYc5E2706spXsaBxac2neMqCbReErfDc+BJ7BblqjQek YmcPvlJbIxThlRDGkdULnEW/Mony0z+GxD2LyRdbGAlB+YCcuYI75y3J3sA96vrQTpDw kla0P4fAAtdTDn//VtyCKa+QJiDYamrOy2DcnVgI5iHh9HAqCWN7i7gD4jFlmPe3IPTR w3UQ== X-Gm-Message-State: AC+VfDxFhAxyXesmnMboE/0OznmXknRPnmo/3lsckcaqWVbHJZkKtRUf spcx8wsakB+BJUP2hBAqRMB+OaLIol5byo3fNGDUjg== X-Received: by 2002:a05:600c:45c8:b0:3f7:3654:8d3 with SMTP id s8-20020a05600c45c800b003f7365408d3mr77190wmo.2.1686385756267; Sat, 10 Jun 2023 01:29:16 -0700 (PDT) MIME-Version: 1.0 References: <20230610005149.1145665-1-rmoar@google.com> In-Reply-To: <20230610005149.1145665-1-rmoar@google.com> From: David Gow Date: Sat, 10 Jun 2023 16:29:03 +0800 Message-ID: Subject: Re: [RFC v1 0/6] kunit: Add test attributes API To: Rae Moar Cc: shuah@kernel.org, dlatypov@google.com, brendan.higgins@linux.dev, linux-kselftest@vger.kernel.org, kunit-dev@googlegroups.com, linux-kernel@vger.kernel.org, keescook@chromium.org, linux-hardening@vger.kernel.org, jstultz@google.com, tglx@linutronix.de, sboyd@kernel.org Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="000000000000fb882105fdc247d2" X-Spam-Status: No, score=-17.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, ENV_AND_HDR_SPF_MATCH,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED,USER_IN_DEF_DKIM_WL, USER_IN_DEF_SPF_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org --000000000000fb882105fdc247d2 Content-Type: text/plain; charset="UTF-8" On Sat, 10 Jun 2023 at 08:52, Rae Moar wrote: > > Hello everyone, > > This is an RFC patch series to propose the addition of a test attributes > framework to KUnit. > > There has been interest in filtering out "slow" KUnit tests. Most notably, > a new config, CONFIG_MEMCPY_SLOW_KUNIT_TEST, has been added to exclude > particularly slow memcpy tests > (https://lore.kernel.org/all/20230118200653.give.574-kees@kernel.org/). Awesome: this is a long overdue feature. > This proposed attributes framework would be used to save and access test > associated data, including whether a test is slow. These attributes would > be reportable (via KTAP and command line output) and some will be > filterable. Why wouldn't they all be filterable? I guess I can imagine some where filtering wouldn't be useful, but I can't think of a technical reason why the filter shouldn't work. Also, as I understand it, I think this could also work with data which is not "saved" in this kunit_attributes struct you define. So we could have attributes which are generated automatically from other information about the test. I could definitely see value in being able to filter on things like "is_parameterised" or "runs_at_init" or similar. Finally, it'd be really great if these attributes could apply to individual parameters in parameterised tests, in which case we could have and filter on the parameter value. That seems like it could be incredibly useful. > > This framework is designed to allow for the addition of other attributes in > the future. These attributes could include whether the test is flaky, > associated test files, etc. A small part of me is hesitant to add this much framework code for only one attribute, so it'd be nice to look into at least having an RFC for some of these. Hopefully we don't actually have flaky tests, but "is_deterministic" would be nice (alongside a future ability to inject a random seed, or similar). Other properties like "is_threadsafe", "is_reentrant", etc could be useful for future features. And I'm sure there could be some more subsystem-specific things which would be useful to filter on, too. Some of these could probably replace the need for custom code to make the test skip itself if dependencies aren't met, too, which would be fun. I'm not sure "associated test files" quite gels perfectly with this system as-is (assuming I understand what that refers to). If it's the ability to "attach" extra data (logs, etc) to the KTAP output, that's possibly best injected at runtime, or added by the separate parser, rather than hardcoded in the kernel. > > Note that this could intersect with the discussions on how to format > test-associated data in KTAP v2 that I am also involved in > (https://lore.kernel.org/all/20230420205734.1288498-1-rmoar@google.com/). > I definitely need to re-read and respond to that. I'm not 100% thrilled with the output format here, and I think the goal with KTAP "test associated data" is, as you say, related, but not identical to this. There'd definitely be data which doesn't make sense as a KUnit attribute which we might want to add to the output (e.g., data only calcuated while the test runs), and attributes which we might not want to always print out with the results. > If the overall idea seems good, I'll make sure to add tests/documentation, > and more patches marking existing tests as slow to the patch series. > I think the series is good overall. If no-one else objects, let's move forward with it. I'd definitely prefer to see a few more tests and some documentation. Having another attribute would be great, too, though I can certainly live with that being a separate series. > Thanks! > Rae > > Rae Moar (6): > kunit: Add test attributes API structure > kunit: Add speed attribute > kunit: Add ability to filter attributes > kunit: tool: Add command line interface to filter and report > attributes > kunit: memcpy: Mark tests as slow using test attributes > kunit: time: Mark test as slow using test attributes > > include/kunit/attributes.h | 41 ++++ > include/kunit/test.h | 62 ++++++ > kernel/time/time_test.c | 2 +- > lib/kunit/Makefile | 3 +- > lib/kunit/attributes.c | 280 +++++++++++++++++++++++++ > lib/kunit/executor.c | 89 ++++++-- > lib/kunit/executor_test.c | 8 +- > lib/kunit/kunit-example-test.c | 9 + > lib/kunit/test.c | 17 +- > lib/memcpy_kunit.c | 8 +- > tools/testing/kunit/kunit.py | 34 ++- > tools/testing/kunit/kunit_kernel.py | 6 +- > tools/testing/kunit/kunit_tool_test.py | 41 ++-- > 13 files changed, 536 insertions(+), 64 deletions(-) > create mode 100644 include/kunit/attributes.h > create mode 100644 lib/kunit/attributes.c > > > base-commit: fefdb43943c1a0d87e1b43ae4d03e5f9a1d058f4 > -- > 2.41.0.162.gfafddb0af9-goog > --000000000000fb882105fdc247d2 Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-Description: S/MIME Cryptographic Signature MIIPnwYJKoZIhvcNAQcCoIIPkDCCD4wCAQExDzANBglghkgBZQMEAgEFADALBgkqhkiG9w0BBwGg ggz5MIIEtjCCA56gAwIBAgIQeAMYYHb81ngUVR0WyMTzqzANBgkqhkiG9w0BAQsFADBMMSAwHgYD VQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UE AxMKR2xvYmFsU2lnbjAeFw0yMDA3MjgwMDAwMDBaFw0yOTAzMTgwMDAwMDBaMFQxCzAJBgNVBAYT AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMSowKAYDVQQDEyFHbG9iYWxTaWduIEF0bGFz IFIzIFNNSU1FIENBIDIwMjAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvLe9xPU9W dpiHLAvX7kFnaFZPuJLey7LYaMO8P/xSngB9IN73mVc7YiLov12Fekdtn5kL8PjmDBEvTYmWsuQS 6VBo3vdlqqXZ0M9eMkjcKqijrmDRleudEoPDzTumwQ18VB/3I+vbN039HIaRQ5x+NHGiPHVfk6Rx c6KAbYceyeqqfuJEcq23vhTdium/Bf5hHqYUhuJwnBQ+dAUcFndUKMJrth6lHeoifkbw2bv81zxJ I9cvIy516+oUekqiSFGfzAqByv41OrgLV4fLGCDH3yRh1tj7EtV3l2TngqtrDLUs5R+sWIItPa/4 AJXB1Q3nGNl2tNjVpcSn0uJ7aFPbAgMBAAGjggGKMIIBhjAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0l BBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFHzM CmjXouseLHIb0c1dlW+N+/JjMB8GA1UdIwQYMBaAFI/wS3+oLkUkrk1Q+mOai97i3Ru8MHsGCCsG AQUFBwEBBG8wbTAuBggrBgEFBQcwAYYiaHR0cDovL29jc3AyLmdsb2JhbHNpZ24uY29tL3Jvb3Ry MzA7BggrBgEFBQcwAoYvaHR0cDovL3NlY3VyZS5nbG9iYWxzaWduLmNvbS9jYWNlcnQvcm9vdC1y My5jcnQwNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9iYWxzaWduLmNvbS9yb290LXIz LmNybDBMBgNVHSAERTBDMEEGCSsGAQQBoDIBKDA0MDIGCCsGAQUFBwIBFiZodHRwczovL3d3dy5n bG9iYWxzaWduLmNvbS9yZXBvc2l0b3J5LzANBgkqhkiG9w0BAQsFAAOCAQEANyYcO+9JZYyqQt41 TMwvFWAw3vLoLOQIfIn48/yea/ekOcParTb0mbhsvVSZ6sGn+txYAZb33wIb1f4wK4xQ7+RUYBfI TuTPL7olF9hDpojC2F6Eu8nuEf1XD9qNI8zFd4kfjg4rb+AME0L81WaCL/WhP2kDCnRU4jm6TryB CHhZqtxkIvXGPGHjwJJazJBnX5NayIce4fGuUEJ7HkuCthVZ3Rws0UyHSAXesT/0tXATND4mNr1X El6adiSQy619ybVERnRi5aDe1PTwE+qNiotEEaeujz1a/+yYaaTY+k+qJcVxi7tbyQ0hi0UB3myM A/z2HmGEwO8hx7hDjKmKbDCCA18wggJHoAMCAQICCwQAAAAAASFYUwiiMA0GCSqGSIb3DQEBCwUA MEwxIDAeBgNVBAsTF0dsb2JhbFNpZ24gUm9vdCBDQSAtIFIzMRMwEQYDVQQKEwpHbG9iYWxTaWdu MRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTA5MDMxODEwMDAwMFoXDTI5MDMxODEwMDAwMFowTDEg MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzAR BgNVBAMTCkdsb2JhbFNpZ24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMJXaQeQZ4 Ihb1wIO2hMoonv0FdhHFrYhy/EYCQ8eyip0EXyTLLkvhYIJG4VKrDIFHcGzdZNHr9SyjD4I9DCuu l9e2FIYQebs7E4B3jAjhSdJqYi8fXvqWaN+JJ5U4nwbXPsnLJlkNc96wyOkmDoMVxu9bi9IEYMpJ pij2aTv2y8gokeWdimFXN6x0FNx04Druci8unPvQu7/1PQDhBjPogiuuU6Y6FnOM3UEOIDrAtKeh 6bJPkC4yYOlXy7kEkmho5TgmYHWyn3f/kRTvriBJ/K1AFUjRAjFhGV64l++td7dkmnq/X8ET75ti +w1s4FRpFqkD2m7pg5NxdsZphYIXAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E BTADAQH/MB0GA1UdDgQWBBSP8Et/qC5FJK5NUPpjmove4t0bvDANBgkqhkiG9w0BAQsFAAOCAQEA S0DbwFCq/sgM7/eWVEVJu5YACUGssxOGhigHM8pr5nS5ugAtrqQK0/Xx8Q+Kv3NnSoPHRHt44K9u bG8DKY4zOUXDjuS5V2yq/BKW7FPGLeQkbLmUY/vcU2hnVj6DuM81IcPJaP7O2sJTqsyQiunwXUaM ld16WCgaLx3ezQA3QY/tRG3XUyiXfvNnBB4V14qWtNPeTCekTBtzc3b0F5nCH3oO4y0IrQocLP88 q1UOD5F+NuvDV0m+4S4tfGCLw0FREyOdzvcya5QBqJnnLDMfOjsl0oZAzjsshnjJYS8Uuu7bVW/f hO4FCU29KNhyztNiUGUe65KXgzHZs7XKR1g/XzCCBNgwggPAoAMCAQICEAEDPnEOWzT2vYIrJhGq c1swDQYJKoZIhvcNAQELBQAwVDELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt c2ExKjAoBgNVBAMTIUdsb2JhbFNpZ24gQXRsYXMgUjMgU01JTUUgQ0EgMjAyMDAeFw0yMzA1MTIx NjMzMjlaFw0yMzExMDgxNjMzMjlaMCQxIjAgBgkqhkiG9w0BCQEWE2RhdmlkZ293QGdvb2dsZS5j b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCfIQuFV9ECjSKrnHc+/gEoEHeMu29G hkC9x5KA7Tgm7ZISSdxxP+b9Q23vqKKYcaXlXzxDUweAEa7KrhRdZMpcF1p14/qI6AG7rBn8otbO t6QSE9nwXQRL5ITEHtPRcQzLU5H9Yyq4b9MmEZAq+ByKX1t6FrXw461kqV8I/oCueKmD0p6mU/4k xzQWik4ZqST0MXkJiZenSKDDN+U1qGgHKC3HAzsIlWpNh/WsWcD4RRcEtwfW1h9DwRfGFp78OFQg 65qXbeub4G7ELSIdjGygCzVG+g1jo6we5uqPep3iRCzn92KROEVxP5lG9FlwQ2YWMt+dNiGrJdKy Kw4TK7CrAgMBAAGjggHUMIIB0DAeBgNVHREEFzAVgRNkYXZpZGdvd0Bnb29nbGUuY29tMA4GA1Ud DwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDBAYIKwYBBQUHAwIwHQYDVR0OBBYEFG/UTu3x 9IGQSBx2i4m+hGXJpET+MEwGA1UdIARFMEMwQQYJKwYBBAGgMgEoMDQwMgYIKwYBBQUHAgEWJmh0 dHBzOi8vd3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMAwGA1UdEwEB/wQCMAAwgZoGCCsG AQUFBwEBBIGNMIGKMD4GCCsGAQUFBzABhjJodHRwOi8vb2NzcC5nbG9iYWxzaWduLmNvbS9jYS9n c2F0bGFzcjNzbWltZWNhMjAyMDBIBggrBgEFBQcwAoY8aHR0cDovL3NlY3VyZS5nbG9iYWxzaWdu LmNvbS9jYWNlcnQvZ3NhdGxhc3Izc21pbWVjYTIwMjAuY3J0MB8GA1UdIwQYMBaAFHzMCmjXouse LHIb0c1dlW+N+/JjMEYGA1UdHwQ/MD0wO6A5oDeGNWh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5jb20v Y2EvZ3NhdGxhc3Izc21pbWVjYTIwMjAuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQCRI3Z4cAidgFcv Usqdz765x6KMZSfg/WtFrYg8ewsP2NpCxVM2+EhPyyEQ0k0DhtzdtGoI/Ug+jdFDyCKB9P2+EPLh iMjMnFILp7Zs4r18ECHlvZuDZfH9m0BchXIxu5jLIuQyKUWrCRDZZEDNr510ZhhVfYSFPA8ms1nk jyzYFOHYQyv5IfML/3IBFKlON5OZa+V8EZYULYcNkp03DdWglafj7SXZ1/XgAbVYrC381UvrsYN8 jndVvoa1GWwe+NVlIIK7Q3uAjV3qLEDQpaNPg1rr0oAn6YmvTccjVMqj2YNwN+RHhKNzgRGxY5ct FaN+8fXZhRhpv3bVbAWuPZXoMYICajCCAmYCAQEwaDBUMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQ R2xvYmFsU2lnbiBudi1zYTEqMCgGA1UEAxMhR2xvYmFsU2lnbiBBdGxhcyBSMyBTTUlNRSBDQSAy MDIwAhABAz5xDls09r2CKyYRqnNbMA0GCWCGSAFlAwQCAQUAoIHUMC8GCSqGSIb3DQEJBDEiBCD/ 5V7mOVQBtw2t91HW33C3dkHqAdMg5JI3guMDq4iGXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcB MBwGCSqGSIb3DQEJBTEPFw0yMzA2MTAwODI5MTZaMGkGCSqGSIb3DQEJDzFcMFowCwYJYIZIAWUD BAEqMAsGCWCGSAFlAwQBFjALBglghkgBZQMEAQIwCgYIKoZIhvcNAwcwCwYJKoZIhvcNAQEKMAsG CSqGSIb3DQEBBzALBglghkgBZQMEAgEwDQYJKoZIhvcNAQEBBQAEggEAlRTL1Ytl9KzrIqKSQpiQ 34iMq4NHPDuo/OygRdRayFRFoQ1Q+b4gEFGw/SDSm719j3SE4qTBn7ZU/2mNedXet5aAso0Z7S7E k2VDopBtWj1RjqoCQFIorXUrblkMccLVRAOAXVQY2Utepaa2xSAmwvjG5Nec3nrAVfGHcDI4yuam 9sFYU0TggJNJ0W/lEGsiz4Ili8xMnKUwiSpN5l7YzstOlW/uXqKag3Z6YQYJF7YAtgjLrpg8FG7+ 5j87MdLrxj1mWM1BdWZvTVi59aChy2wxjDDzWYYekIXYQZtqE3IRxWrHsi6hK/9XQsvKahBeJKV2 Ii+Hel8vTLY4acm9JQ== --000000000000fb882105fdc247d2--