From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by dpdk.org (Postfix) with ESMTP id C40B76CB8 for ; Mon, 30 May 2016 17:51:01 +0200 (CEST) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga104.fm.intel.com with ESMTP; 30 May 2016 08:51:01 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.26,390,1459839600"; d="txt'?scan'208";a="987522355" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by orsmga002.jf.intel.com with ESMTP; 30 May 2016 08:51:00 -0700 Received: from fmsmsx118.amr.corp.intel.com (10.18.116.18) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.248.2; Mon, 30 May 2016 08:51:00 -0700 Received: from shsmsx101.ccr.corp.intel.com (10.239.4.153) by fmsmsx118.amr.corp.intel.com (10.18.116.18) with Microsoft SMTP Server (TLS) id 14.3.248.2; Mon, 30 May 2016 08:50:58 -0700 Received: from shsmsx102.ccr.corp.intel.com ([169.254.2.220]) by SHSMSX101.ccr.corp.intel.com ([169.254.1.150]) with mapi id 14.03.0248.002; Mon, 30 May 2016 23:49:16 +0800 From: "Peng, Yuan" To: "Tao, Zhe" , "dev@dpdk.org" CC: "Tao, Zhe" , "Wu, Jingjing" Thread-Topic: [dpdk-dev] [PATCH v8 3/3] i40e: add floating VEB extension support Thread-Index: AQHRteHm9sCIa1sO6UK4/l1DJWE0MJ/Ro3Kg Date: Mon, 30 May 2016 15:49:15 +0000 Message-ID: <67D543A150B29E4CAAE53918F64EDAEAA9C4C5@shsmsx102.ccr.corp.intel.com> References: <1458895321-21896-1-git-send-email-zhe.tao@intel.com> <1464110886-9504-1-git-send-email-zhe.tao@intel.com> <1464110886-9504-4-git-send-email-zhe.tao@intel.com> In-Reply-To: <1464110886-9504-4-git-send-email-zhe.tao@intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiYWQ3ZWY4ZWItNDI4NS00MjYxLWI2MWMtNWVjMGZjNGY0NTk4IiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX0lDIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE1LjkuNi42IiwiVHJ1c3RlZExhYmVsSGFzaCI6IlVxZEI4bXJKa25yODdHOVNJQW5ZZVJ6bTJ3UFIzUXNrU21VU21STmx4VU09In0= x-ctpclassification: CTP_IC x-originating-ip: [10.239.127.40] Content-Type: multipart/mixed; boundary="_002_67D543A150B29E4CAAE53918F64EDAEAA9C4C5shsmsx102ccrcorpi_" MIME-Version: 1.0 Subject: Re: [dpdk-dev] [PATCH v8 3/3] i40e: add floating VEB extension support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 30 May 2016 15:51:02 -0000 --_002_67D543A150B29E4CAAE53918F64EDAEAA9C4C5shsmsx102ccrcorpi_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Tested-by: Peng Yuan - Test Commit: f3625976474a595bfbdb44ad1c881b07d722a226 15ef663c2acb7ed576083f97cd2555fc9900c724 d0e57ebaf63fe240391dfafebd28f8e6559da899 - OS/Kernel: Fedora 23/4.2.3 - GCC: gcc version 5.3.1 20151207 (Red Hat 5.3.1-2) (GCC) - CPU: Intel(R) Xeon(R) CPU E5-2699 v3 @ 2.30GHz - NIC: Fortville 2*40G - Total 6 cases,6 passed, 0 failed. There are three patch about the floating VEB feature, I put all of them, an= d just send one test-by. Here I listed the test case summary, you can get the detail steps from att= achment. I run test cases according to my test plan, all the test cases passed. Test Case1: Floating VEB Inter-VM VF-VF =20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D Summary: DPDK PF, then create 2VFs and 2VMs, assign one VF to one VM, say V= F1 in VM1, VF2 in VM2, and make PF link down(the cable can be pluged out). = VFs in VMs are running dpdk testpmd, VF1 send traffic, and set the packet's= DEST MAC to VF2, check VF2 can receive the packets. Check Inter-VM VF-VF M= AC switch when PF is link down as well as up. Test Case2: Floating VEB PF can't get traffic from VF =20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D DPDK PF, then create 1VF, assign VF1 to VM1, send traffic from VF1 to PF, t= hen check PF will not see any traffic. Test Case3: Floating VEB VF can't receive traffic from outside world =20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D DPDK PF, then create 1VF, assign VF1 to VM1, send traffic from tester to VF= 1, in floating mode, check VF1 can't receive traffic from tester. Test Case4: Floating VEB VF can not communicate with legacy VEB VF inter-VM =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D Summary: DPDK PF, then create 3VFs and 3VMs, assign one VF to one VM, say V= F1 in VM1, VF3 in VM3, floating VEB; VF2 in VM2, lagecy VEB. Make PF link d= own(port stop all), VFs in VMs are running dpdk testpmd. 1. VF1 send traffic, and set the packet's DEST MAC to VF2, check VF2 can no= t receive the packets.=20 2. VF1 send traffic, and set the packet's DEST MAC to VF3, check VF3 can re= ceive the packets.=20 3. VF2 send traffic, and set the packet's DEST MAC to VF1, check VF1 can no= t receive the packets.=20 Check Inter-VM VF-VF MAC switch when PF is link down as well as up. Test Case5: PF can't get traffic from Floating VEB VF, but PF can get traff= ic from legacy VEB VF. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D DPDK PF, then create 2VF, assign VF1 to VM1, VF2 to VM2, set VF1 in floatin= g VEB, VF2 in legacy VEB. 1. Send traffic from VF1 to PF, then check PF will not see any traffic;=20 2. Send traffic from VF2 to PF, then check PF will receive all the packets. Test Case6: Floating VEB VF can't receive traffic from outside world, while= legacy VEB VF can receive traffic from outside world. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D DPDK PF, then create 2VF, assign VF1 to VM1, assign VF2 to VM2, set VF1 in = floating VEB, set VF2 in legacy VEB 1. send traffic from tester to VF1, check VF1 can't receive traffic from te= ster. 2. send traffic from tester to VF2, check VF2 can receive all the traffic f= rom tester. Thanks! Yuan. -----Original Message----- From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Zhe Tao Sent: Wednesday, May 25, 2016 1:28 AM To: dev@dpdk.org Cc: Tao, Zhe ; Wu, Jingjing Subject: [dpdk-dev] [PATCH v8 3/3] i40e: add floating VEB extension support To enable this feature, the user should pass a devargs parameter to the EAL= like "-w 84:00.0,enable_floating=3D1", and the application will make sure = the PMD will use the floating VEB feature for all the VFs created by this P= F device. Also you can specifiy which VF need to connect to this floating veb using "= floating_bitmap", every bit corresponding to one VF (e.g. bitn for VFn). Like "-w 84:00.0,enable_floating=3D1,floating_bitmap=3D1", means only the V= F0 connect to the floating VEB, VF1 connect to the legacy VEB. Signed-off-by: Zhe Tao --- doc/guides/nics/i40e.rst | 5 +++- drivers/net/i40e/i40e_ethdev.c | 56 ++++++++++++++++++++++++++++++++++++++= ++-- drivers/net/i40e/i40e_ethdev.h | 1 + drivers/net/i40e/i40e_pf.c | 3 ++- 4 files changed, 61 insertions(+), 4 deletions(-) diff --git a/doc/guides/nics/i40e.rst b/doc/guides/nics/i40e.rst index 49a0= 598..0919a96 100644 --- a/doc/guides/nics/i40e.rst +++ b/doc/guides/nics/i40e.rst @@ -372,4 +372,7 @@ FVL can support floating VEB feature. To enable this feature, the user should pass a devargs parameter to the EA= L like "-w 84:00.0,enable_floating=3D1", and the application will make sur= e the PMD will use the floating VEB feature for all the VFs created by thi= s PF device. - +Also you can specify which VF need to connect to this floating veb=20 +using "floating_bitmap", every bit corresponding to one VF (e.g. bitn for = VFn). +Like "-w 84:00.0,enable_floating=3D1,floating_bitmap=3D1", means only the= =20 +VF0 connect to the floating VEB, VF1 connect to the legacy VEB. diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.= c index 8859936..39da1e0 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -750,6 +750,52 @@ i40e_add_tx_flow_control_drop_filter(struct i40e_pf *p= f) " frames from VSIs."); } =20 +static int i40e_check_fbitmap_handler(__rte_unused const char *key, + const char *value, + void *opaque) +{ + errno =3D 0; + *(uint16_t *)opaque =3D strtoul(value, NULL, 0); + if (errno) + return -1; + return 0; +} + +static uint16_t i40e_check_fbitmap(struct rte_devargs *devargs, + uint16_t floating) +{ + struct rte_kvargs *kvlist; + const char *floating_bitmap =3D "floating_bitmap"; + /* default value for vf floating bitmap is -1 */ + uint16_t vf_fbitmap =3D (uint16_t)-1; + uint16_t new_vf_fbitmap; + + if (floating =3D=3D false) + return 0; + + if (devargs =3D=3D NULL) + return vf_fbitmap; + + kvlist =3D rte_kvargs_parse(devargs->args, NULL); + if (kvlist =3D=3D NULL) + return vf_fbitmap; + + if (!rte_kvargs_count(kvlist, floating_bitmap)) { + rte_kvargs_free(kvlist); + return vf_fbitmap; + } + /* Floating is enabled when there's key-value pair: enable_floating=3D1 *= / + if (rte_kvargs_process(kvlist, floating_bitmap, + i40e_check_fbitmap_handler, + &new_vf_fbitmap) < 0) { + rte_kvargs_free(kvlist); + return vf_fbitmap; + } + rte_kvargs_free(kvlist); + + return new_vf_fbitmap; +} + static int i40e_check_floating_handler(__rte_unused const char *key, const char *value, __rte_unused void *opaque) @@ -884,8 +930,11 @@ eth_i40e_dev_init(struct rte_eth_dev *dev) /* Need the special FW version support floating VEB */ if (hw->aq.fw_maj_ver >=3D FLOATING_FW_MAJ) { pf->floating =3D i40e_check_floating(pci_dev->devargs); + pf->vf_fbitmap =3D i40e_check_fbitmap(pci_dev->devargs, + pf->floating); } else { pf->floating =3D false; + pf->vf_fbitmap =3D 0; } /* Clear PXE mode */ i40e_clear_pxe_mode(hw); @@ -3855,6 +3904,7 @@ i40e_vsi_release(struct i40e_vsi *vsi) struct i40e_vsi_list *vsi_list; int ret; struct i40e_mac_filter *f; + uint16_t user_param =3D vsi->user_param; =20 if (!vsi) return I40E_SUCCESS; @@ -3886,7 +3936,8 @@ i40e_vsi_release(struct i40e_vsi *vsi) rte_free(f); =20 if (vsi->type !=3D I40E_VSI_MAIN && - ((vsi->type !=3D I40E_VSI_SRIOV) || !pf->floating)) { + ((vsi->type !=3D I40E_VSI_SRIOV) || + !(pf->vf_fbitmap && 1 << user_param))) { /* Remove vsi from parent's sibling list */ if (vsi->parent_vsi =3D=3D NULL || vsi->parent_vsi->veb =3D=3D NULL) { PMD_DRV_LOG(ERR, "VSI's parent VSI is NULL"); @@ -3901,7 +3952,8 @@ i40= e_vsi_release(struct i40e_vsi *vsi) PMD_DRV_LOG(ERR, "Failed to delete element"); } =20 - if ((vsi->type =3D=3D I40E_VSI_SRIOV) && pf->floating) { + if ((vsi->type =3D=3D I40E_VSI_SRIOV) && + (pf->vf_fbitmap && 1 << user_param)) { /* Remove vsi from parent's sibling list */ if (vsi->parent_vsi =3D=3D NULL || vsi->parent_vsi->floating_veb =3D=3D NULL) { diff --git a/drivers/ne= t/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h index deef0ce..39c366= 4 100644 --- a/drivers/net/i40e/i40e_ethdev.h +++ b/drivers/net/i40e/i40e_ethdev.h @@ -458,6 +458,7 @@ struct i40e_pf { struct i40e_mirror_rule_list mirror_list; uint16_t nb_mirror_rule; /* The number of mirror rules */ uint16_t floating; /* The flag to use the floating VEB */ + uint16_t vf_fbitmap; /* The floating enable flag for the specific VF=20 +*/ }; =20 enum pending_msg { diff --git a/drivers/net/i40e/i40e_pf.c b/drivers/net/i40e/i40e_pf.c index = 9adfad2..312e1f8 100644 --- a/drivers/net/i40e/i40e_pf.c +++ b/drivers/net/i40e/i40e_pf.c @@ -224,7 +224,8 @@ i40e_pf_host_vf_reset(struct i40e_pf_vf *vf, bool do_hw= _reset) vf->reset_cnt++; I40E_WRITE_FLUSH(hw); =20 - if (pf->floating =3D=3D true) { + if (pf->floating =3D=3D true && + (pf->vf_fbitmap & 1 << vf_id)) { vf->vsi =3D i40e_vsi_setup(vf->pf, I40E_VSI_SRIOV, NULL, vf->vf_idx); } else { -- 2.1.4 --_002_67D543A150B29E4CAAE53918F64EDAEAA9C4C5shsmsx102ccrcorpi_ Content-Type: text/plain; name="floating-VEB-testplan - attach.txt" Content-Description: floating-VEB-testplan - attach.txt Content-Disposition: attachment; filename="floating-VEB-testplan - attach.txt"; size=12119; creation-date="Mon, 30 May 2016 15:45:23 GMT"; modification-date="Mon, 30 May 2016 15:45:23 GMT" Content-Transfer-Encoding: base64 UHJlcmVxdWlzaXRlcyBmb3IgZmxvYXRpbmcgVkVCIHRlc3RpbmcNCiA9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQ0KDQoxLiBHZXQgdGhlIHBjaSBkZXZpY2UgaWQgb2YgRFVULCBmb3IgZXhh bXBsZTo6DQoNCi4vZHBka19uaWNfYmluZC5weSAtLXN0DQoNCjAwMDA6ODI6MDAuMCAnRXRoZXJu ZXQgQ29udHJvbGxlciBYNzEwIGZvciAxMEdiRSBTRlArJyBpZj1lbnAxMzBzMGYwIGRydj1pNDBl IHVudXNlZD0NCg0KMi4gSG9zdCBQRiBpbiBEUERLIGRyaXZlci4gQ3JlYXRlIDJWRnMgZnJvbSAx IFBGIHdpdGggZHBkayBkcml2ZXIuIA0KDQouL2RwZGtfbmljX2JpbmQucHkgLWIgaWdiX3VpbyA4 MjowMC4wIA0KIGVjaG8gMiA+L3N5cy9idXMvcGNpL2RldmljZXMvMDAwMFw6ODJcOjAwLjAvbWF4 X3Zmcw0KIC4vZHBka19uaWNfYmluZC5weSAtLXN0DQogMDAwMDo4MjowMi4wICdYTDcxMC9YNzEw IFZpcnR1YWwgRnVuY3Rpb24nIHVudXNlZD1pNDBldmYsaWdiX3Vpbw0KIDAwMDA6ODI6MDIuMSAn WEw3MTAvWDcxMCBWaXJ0dWFsIEZ1bmN0aW9uJyB1bnVzZWQ9aTQwZXZmLGlnYl91aW8NCg0KMy4g RGV0YWNoIFZGcyBmcm9tIHRoZSBob3N0LCBiaW5kIHRoZW0gdG8gcGNpLXN0dWIgZHJpdmVyOjoN Cg0KbW9kcHJvYmUgcGNpLXN0dWINCg0KdXNpbmcgYGxzcGNpIC1ubnxncmVwIC1pIGV0aGVybmV0 YCBnb3QgVkYgZGV2aWNlIGlkLCBmb3IgZXhhbXBsZSAiODA4NiAxNTRjIiwNCg0KZWNobyAiODA4 NiAxNTRjIiA+IC9zeXMvYnVzL3BjaS9kcml2ZXJzL3BjaS1zdHViL25ld19pZA0KIGVjaG8gIjAw MDA6ODI6MDIuMCIgPiAvc3lzL2J1cy9wY2kvZHJpdmVycy9pNDBldmYvdW5iaW5kDQogZWNobyAi MDAwMDo4MjowMi4wIiA+IC9zeXMvYnVzL3BjaS9kcml2ZXJzL3BjaS1zdHViL2JpbmQNCg0KZWNo byAiODA4NiAxNTRjIiA+IC9zeXMvYnVzL3BjaS9kcml2ZXJzL3BjaS1zdHViL25ld19pZA0KIGVj aG8gIjAwMDA6ODI6MDIuMSIgPiAvc3lzL2J1cy9wY2kvZHJpdmVycy9pNDBldmYvdW5iaW5kDQog ZWNobyAiMDAwMDo4MjowMi4xIiA+IC9zeXMvYnVzL3BjaS9kcml2ZXJzL3BjaS1zdHViL2JpbmQN Cg0KNC4gTGF1Y2ggdGhlIFZNIHdpdGggdGhlIFZGIFBDSSBwYXNzdGhyb3VnaC4gDQoNCnRhc2tz ZXQgLWMgMTgtMTkgcWVtdS1zeXN0ZW0teDg2XzY0IFwNCiAtZW5hYmxlLWt2bSAtbSAyMDQ4IC1z bXAgY29yZXM9Mixzb2NrZXRzPTEgLWNwdSBob3N0IC1uYW1lIGRwZGsxLXZtMCBcDQogLWRldmlj ZSBwY2ktYXNzaWduLGhvc3Q9MDAwMDo4MjowMi4wIFwNCiAtZHJpdmUgZmlsZT0vaG9tZS9pbWFn ZS92bTAuaW1nIFwNCiAtbmV0ZGV2IHRhcCxpZD1pcHZtMCxpZm5hbWU9dGFwMSxzY3JpcHQ9L2V0 Yy9xZW11LWlmdXAgLWRldmljZSBydGw4MTM5LG5ldGRldj1pcHZtMCxpZD1uZXQxLG1hYz0wMDow MDowMDowMDowMDowMSBcDQogLWxvY2FsdGltZSAtdm5jIDoxIC1kYWVtb25pemUNCg0KdGFza3Nl dCAtYyAxOC0xOSBxZW11LXN5c3RlbS14ODZfNjQgXA0KIC1lbmFibGUta3ZtIC1tIDIwNDggLXNt cCBjb3Jlcz0yLHNvY2tldHM9MSAtY3B1IGhvc3QgLW5hbWUgZHBkazEtdm0xIFwNCiAtZGV2aWNl IHBjaS1hc3NpZ24saG9zdD0wMDAwOjgyOjAyLjEgXA0KIC1kcml2ZSBmaWxlPS9ob21lL2ltYWdl L3ZtMS5pbWcgXA0KIC1uZXRkZXYgdGFwLGlkPWlwdm0xLGlmbmFtZT10YXAyLHNjcmlwdD0vZXRj L3FlbXUtaWZ1cCAtZGV2aWNlIHJ0bDgxMzksbmV0ZGV2PWlwdm0xLGlkPW5ldDIsbWFjPTAwOjAw OjAwOjAwOjAwOjAyIFwNCiAtbG9jYWx0aW1lIC12bmMgOjIgLWRhZW1vbml6ZQ0KDQoNClRlc3Qg Q2FzZTE6IEZsb2F0aW5nIFZFQiBJbnRlci1WTSBWRi1WRiAgDQo9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNClN1bW1hcnk6IERQREsgUEYs IHRoZW4gY3JlYXRlIDJWRnMgYW5kIDJWTXMsIGFzc2lnbiBvbmUgVkYgdG8gb25lIFZNLCBzYXkg VkYxIGluIFZNMSwgVkYyIGluIFZNMiwgYW5kIG1ha2UgUEYgbGluayBkb3duKHRoZSBjYWJsZSBj YW4gYmUgcGx1Z2VkIG91dCkuIFZGcyBpbiBWTXMgYXJlIHJ1bm5pbmcgZHBkayB0ZXN0cG1kLCBW RjEgc2VuZCB0cmFmZmljLCBhbmQgc2V0IHRoZSBwYWNrZXQncyBERVNUIE1BQyB0byBWRjIsIGNo ZWNrIGlmIFZGMiBjYW4gcmVjZWl2ZSB0aGUgcGFja2V0cy4gQ2hlY2sgSW50ZXItVk0gVkYtVkYg TUFDIHN3aXRjaCB3aGVuIFBGIGlzIGxpbmsgZG93biBhcyB3ZWxsIGFzIHVwLg0KDQpMYXVuY2gg UEYgdGVzdHBtZDogLi90ZXN0cG1kIC1jIDB4MyAtbiA0IC13IDgyOjAwLjAsZW5hYmxlX2Zsb2F0 aW5nPTEgLS0gLWkNCg0KMS4gU3RhcnQgVk0xIHdpdGggVkYxLCBWTTIgd2l0aCBWRjIsIHNlZSB0 aGUgcHJlcmVxdWlzaXRlIHBhcnQuIHB1dCB0aGUgcGF0Y2ggaW4gdGhlIFZNJ3MgZHBkaw0KDQox LjEgIFJlc2VydmUgaHVnZSBwYWdlcyBtZW1vcnkgb24gaG9zdCBhbmQgVk0oYmVmb3JlIHVzaW5n IERQREspOg0KDQogICAgIGVjaG8gNDA5NiA+IC9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9ub2Rl MC9odWdlcGFnZXMvaHVnZXBhZ2VzLTIwNDhrQi9ucl9odWdlcGFnZXMgDQogICAgIG1rZGlyIC9t bnQvaHVnZSAgIA0KICAgICBtb3VudCAtdCBodWdldGxiZnMgbm9kZXYgL21udC9odWdlICANCg0K MS4yICBWRiBiaW5kIHRvIGRwZGsgZHJpdmVyDQoNCiAgICAgY2QgL3Jvb3QvZHBkay90b29scw0K ICAgICAuL2RwZGtfbmljX2JpbmQgLS1zdA0KICAgICAuL2RwZGtfbmljX2JpbmQgLWIgaWdiX3Vp byBldGhlcm5ldCAgIA0KICAgDQoyLiBJbiB0aGUgaG9zdCwgcnVuIHRlc3RwbWQgd2l0aCBmbG9h dGluZyBwYXJhbWV0ZXJzIGFuZCBtYWtlIHRoZSBsaW5rIGRvd246Og0KDQogICAgIC4vdGVzdHBt ZCAtYyAweDMgLW4gNCAtdyA4MjowMC4wLGVuYWJsZV9mbG9hdGluZz0xIC0tIC1pDQogICAgdGVz dHBtZD4gcG9ydCBzdG9wIGFsbA0KICAgIHRlc3RwbWQ+IHNob3cgcG9ydCBpbmZvIGFsbA0KDQoz LiBJbiBWTTEsIHJ1biB0ZXN0cG1kOjoNCg0KICAgIC4vdGVzdHBtZCAtYyAweDMgLW4gNCAtLSAt aSANCiAgICB0ZXN0cG1kPnNldCBmd2Qgcnhvbmx5DQogICAgdGVzdHBtZD5zaG93IHBvcnQgaW5m byBhbGwgICAgIC8vZ2V0IHRoZSB2ZjFfbWFjX2FkZHJlc3MNCiAgICB0ZXN0cG1kPnN0YXJ0DQog ICAgdGVzdHBtZD5zaG93IHBvcnQgc3RhdHMgYWxsDQogICANCiAgIEluIFZNMiwgcnVuIHRlc3Rw bWQ6Og0KDQogICAgLi90ZXN0cG1kIC1jIDB4MyAtbiA0IC0tIC1pIC0tZXRoLXBlZXI9MCx2ZjFf bWFjX2FkZHJlc3MNCiAgICB0ZXN0cG1kPnNldCBmd2QgdHhvbmx5DQogICAgdGVzdHBtZD5zdGFy dA0KICAgIHRlc3RwbWQ+c2hvdyBwb3J0IHN0YXRzIGFsbA0KDQo0LiBjaGVjayBpZiBWRjEgY2Fu IGdldCBhbGwgdGhlIHBhY2tldHMuIENoZWNrIHRoZSBwYWNrZXQgY29udGVudCBpcyBubyBjb3Jy dXB0ZWQuIA0KDQo1LiBTZXQgInRlc3RwbWQ+IHBvcnQgc3RhcnQgYWxsIiBhbmQgInRlc3RwbWQ+ IHN0YXJ0IiBpbiBzdGVwMiwgdGhlbiBydW4gdGhlIHN0ZXAzLTQgYWdhaW4uIHNhbWUgcmVzdWx0 Lg0KDQoNClRlc3QgQ2FzZTI6IEZsb2F0aW5nIFZFQiBQRiBjYW4ndCBnZXQgdHJhZmZpYyBmcm9t IFZGICAgIA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQ0KDQpEUERLIFBGLCB0aGVuIGNyZWF0ZSAxVkYsIGFzc2lnbiBWRjEg dG8gVk0xLCBzZW5kIHRyYWZmaWMgZnJvbSBWRjEgdG8gUEYsIHRoZW4gY2hlY2sgUEYgd2lsbCBu b3Qgc2VlIGFueSB0cmFmZmljLiANCg0KMS4gU3RhcnQgVk0xIHdpdGggVkYxLCBzZWUgdGhlIHBy ZXJlcXVpc2l0ZSBwYXJ0Lg0KDQoyLiBJbiBob3N0LCBsYXVuY2ggdGVzdHBtZDo6DQoNCiAgIC4v dGVzdHBtZCAtYyAweDMgLW4gNCAtdyA4MjowMC4wLGVuYWJsZV9mbG9hdGluZz0xIC0tIC1pDQog ICB0ZXN0cG1kPiBzZXQgZndkIHJ4b25seQ0KICAgdGVzdHBtZD4gcG9ydCBzdGFydCBhbGwNCiAg IHRlc3RwbWQ+IHN0YXJ0DQogICB0ZXN0cG1kPiBzaG93IHBvcnQgc3RhdHMgYWxsDQoNCjMuIElu IFZNMSwgcnVuIHRlc3RwbWQ6Og0KDQogICAuL3Rlc3RwbWQgLWMgMHgzIC1uIDQgLS0gLWkgLS1l dGgtcGVlcj0wLHBmX21hY19hZGRyDQogICB0ZXN0cG1kPnNldCBmd2QgdHhvbmx5DQogICB0ZXN0 cG1kPnN0YXJ0DQogICB0ZXN0cG1kPnNob3cgcG9ydCBzdGF0cyBhbGwNCg0KNC4gQ2hlY2sgaWYg UEYgY2FuIG5vdCBnZXQgYW55IHBhY2tldHMsIHNvIFZGMS0+UEYgaXMgbm90IHdvcmtpbmcuIA0K DQo1LiBTZXQgInRlc3RwbWQ+IHBvcnQgc3RvcCBhbGwiIGluIHN0ZXAyLCB0aGVuIHJ1biB0aGUg dGVzdCBjYXNlIGFnYWluLiBTYW1lIHJlc3VsdC4NCg0KDQoNClRlc3QgQ2FzZTM6IEZsb2F0aW5n IFZFQiBWRiBjYW4ndCByZWNlaXZlIHRyYWZmaWMgZnJvbSBvdXRzaWRlIHdvcmxkICAgDQo9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KRFBE SyBQRiwgdGhlbiBjcmVhdGUgMVZGLCBhc3NpZ24gVkYxIHRvIFZNMSwgc2VuZCB0cmFmZmljIGZy b20gdGVzdGVyIHRvIFZGMSwgaW4gZmxvYXRpbmcgbW9kZSwgY2hlY2sgVkYxIGNhbid0IHJlY2Vp dmUgdHJhZmZpYyBmcm9tIHRlc3Rlci4NCg0KMS4gU3RhcnQgVk0xIHdpdGggVkYxLCBzZWUgdGhl IHByZXJlcXVpc2l0ZSBwYXJ0Lg0KDQoyLiBJbiBob3N0LCBsYXVuY2ggdGVzdHBtZDo6DQoNCiAg IC4vdGVzdHBtZCAtYyAweDMgLW4gNCAtdyA4MjowMC4wLGVuYWJsZV9mbG9hdGluZz0xIC0tIC1p IA0KICAgdGVzdHBtZD4gc2V0IGZ3ZCBtYWMNCiAgIHRlc3RwbWQ+IHBvcnQgc3RhcnQgYWxsDQog ICB0ZXN0cG1kPiBzdGFydA0KICAgdGVzdHBtZD4gc2hvdyBwb3J0IHN0YXRzIGFsbA0KICAgDQoN CiAgIEluIFZNMSwgcnVuIHRlc3RwbWQ6DQoNCiAgIC4vdGVzdHBtZCAtYyAweDMgLW4gNCAtLSAt aSANCiAgICB0ZXN0cG1kPnNob3cgcG9ydCBpbmZvIGFsbCAgICAvL2dldCBWRl9tYWNfYWRkcmVz cw0KICAgIHRlc3RwbWQ+c2V0IGZ3ZCByeG9ubHkNCiAgICB0ZXN0cG1kPnN0YXJ0DQogICAgdGVz dHBtZD5zaG93IHBvcnQgc3RhdHMgYWxsDQoNCiAgIEluIHRlc3RlciwgcnVuIHNjYXB5DQoNCiAg IHBhY2tldD1FdGhlcihkc3Q9IlZGX21hY19hZGRyZXNzIikvSVAoKS9VRFAoKS9SYXcoJ3gnKjIw KQ0KICAgc2VuZHAocGFja2V0LGlmYWNlPSJlbnAxMzJzMGYwIikNCiAgIA0KDQozLiBDaGVjayBp ZiBWRjEgY2FuIG5vdCBnZXQgYW55IHBhY2tldHMsIHNvIHRlc3Rlci0+VkYxIGlzIG5vdCB3b3Jr aW5nLiANCjQuIFNldCAidGVzdHBtZD4gcG9ydCBzdG9wIGFsbCIgaW4gc3RlcDIgaW4gSG9zdCwg dGhlbiBydW4gdGhlIHRlc3QgY2FzZSBhZ2Fpbi4gc2FtZSByZXN1bHQuDQoNCg0KVGVzdCBDYXNl NDogRmxvYXRpbmcgVkVCIFZGIGNhbiBub3QgY29tbXVuaWNhdGUgd2l0aCBsZWdhY3kgVkVCIFZG IGludGVyLVZNDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0NCg0KU3VtbWFyeTogRFBESyBQRiwgdGhlbiBjcmVhdGUgM1ZGcyBhbmQgM1ZNcywg YXNzaWduIG9uZSBWRiB0byBvbmUgVk0sIHNheSBWRjEgaW4gVk0xLCBWRjMgaW4gVk0zLCBmbG9h dGluZyBWRUI7IFZGMiBpbiBWTTIsIGxhZ2VjeSBWRUIuIE1ha2UgUEYgbGluayBkb3duKHBvcnQg c3RvcCBhbGwpLCBWRnMgaW4gVk1zIGFyZSBydW5uaW5nIGRwZGsgdGVzdHBtZC4NCjEuIFZGMSBz ZW5kIHRyYWZmaWMsIGFuZCBzZXQgdGhlIHBhY2tldCdzIERFU1QgTUFDIHRvIFZGMiwgY2hlY2sg VkYyIGNhbiBub3QgcmVjZWl2ZSB0aGUgcGFja2V0cy4gDQoyLiBWRjEgc2VuZCB0cmFmZmljLCBh bmQgc2V0IHRoZSBwYWNrZXQncyBERVNUIE1BQyB0byBWRjMsIGNoZWNrIFZGMyBjYW4gcmVjZWl2 ZSB0aGUgcGFja2V0cy4gDQozLiBWRjIgc2VuZCB0cmFmZmljLCBhbmQgc2V0IHRoZSBwYWNrZXQn cyBERVNUIE1BQyB0byBWRjEsIGNoZWNrIFZGMSBjYW4gbm90IHJlY2VpdmUgdGhlIHBhY2tldHMu IA0KQ2hlY2sgSW50ZXItVk0gVkYtVkYgTUFDIHN3aXRjaCB3aGVuIFBGIGlzIGxpbmsgZG93biBh cyB3ZWxsIGFzIHVwLg0KDQpMYXVuY2ggUEYgdGVzdHBtZDogLi90ZXN0cG1kIC1jIDB4MyAtbiA0 IC13IDgyOjAwLjAsZW5hYmxlX2Zsb2F0aW5nPTEsZmxvYXRpbmdfYml0bWFwPTB4NSAtLSAtaQ0K DQoxLiBTdGFydCBWTTEgd2l0aCBWRjEsIFZNMiB3aXRoIFZGMiwgVk0zIHdpdGggVkYzLCBzZWUg dGhlIHByZXJlcXVpc2l0ZSBwYXJ0Lg0KDQoyLiBJbiB0aGUgaG9zdCwgcnVuIHRlc3RwbWQgd2l0 aCBmbG9hdGluZyBwYXJhbWV0ZXJzIGFuZCBtYWtlIHRoZSBsaW5rIGRvd246Og0KDQogICAgLi90 ZXN0cG1kIC1jIDB4MyAtbiA0IC13IDgyOjAwLjAsZW5hYmxlX2Zsb2F0aW5nPTEsZmxvYXRpbmdf Yml0bWFwPTB4NSAtLSAtaSAgICAgLy9WRjEgYW5kIFZGMyBpbiBmbG9hdGluZyBWRUIsIFZGMiBp biBsZWdhY3kgVkVCDQogICAgdGVzdHBtZD4gcG9ydCBzdG9wIGFsbA0KICAgIHRlc3RwbWQ+IHNo b3cgcG9ydCBpbmZvIGFsbA0KDQozLiBWRjEgc2VuZCB0cmFmZmljLCBhbmQgc2V0IHRoZSBwYWNr ZXQncyBERVNUIE1BQyB0byBWRjIsIGNoZWNrIFZGMiBjYW4gbm90IHJlY2VpdmUgdGhlIHBhY2tl dHMuDQoNCiAgICBJbiBWTTIsIHJ1biB0ZXN0cG1kOjoNCg0KICAgIC4vdGVzdHBtZCAtYyAweDMg LW4gNCAtLSAtaSANCiAgICB0ZXN0cG1kPnNldCBmd2Qgcnhvbmx5DQogICAgdGVzdHBtZD5zaG93 IHBvcnQgaW5mbyBhbGwgICAgIC8vZ2V0IHRoZSB2ZjJfbWFjX2FkZHJlc3MNCiAgICB0ZXN0cG1k PnN0YXJ0DQogICAgdGVzdHBtZD5zaG93IHBvcnQgc3RhdHMgYWxsDQogICANCiAgICBJbiBWTTEs IHJ1biB0ZXN0cG1kOjoNCg0KICAgIC4vdGVzdHBtZCAtYyAweDMgLW4gNCAtLSAtaSAtLWV0aC1w ZWVyPTAsdmYyX21hY19hZGRyZXNzDQogICAgdGVzdHBtZD5zZXQgZndkIHR4b25seQ0KICAgIHRl c3RwbWQ+c3RhcnQNCiAgICB0ZXN0cG1kPnNob3cgcG9ydCBzdGF0cyBhbGwNCg0KICAgIENoZWNr IFZGMiBjYW4gbm90IGdldCBhbnkgcGFja2V0cywgc28gVkYxLT5WRjIgaXMgbm90IHdvcmtpbmcu DQoNCjQuIFZGMSBzZW5kIHRyYWZmaWMsIGFuZCBzZXQgdGhlIHBhY2tldCdzIERFU1QgTUFDIHRv IFZGMywgY2hlY2sgVkYzIGNhbiByZWNlaXZlIHRoZSBwYWNrZXRzLg0KDQogICAgSW4gVk0zLCBy dW4gdGVzdHBtZDo6DQoNCiAgICAuL3Rlc3RwbWQgLWMgMHgzIC1uIDQgLS0gLWkgDQogICAgdGVz dHBtZD5zZXQgZndkIHJ4b25seQ0KICAgIHRlc3RwbWQ+c2hvdyBwb3J0IGluZm8gYWxsICAgICAv L2dldCB0aGUgdmYzX21hY19hZGRyZXNzDQogICAgdGVzdHBtZD5zdGFydA0KICAgIHRlc3RwbWQ+ c2hvdyBwb3J0IHN0YXRzIGFsbA0KDQogICAgSW4gVk0xLCBydW4gdGVzdHBtZDo6DQoNCiAgICAu L3Rlc3RwbWQgLWMgMHgzIC1uIDQgLS0gLWkgLS1ldGgtcGVlcj0wLHZmM19tYWNfYWRkcmVzcw0K ICAgIHRlc3RwbWQ+c2V0IGZ3ZCB0eG9ubHkNCiAgICB0ZXN0cG1kPnN0YXJ0DQogICAgdGVzdHBt ZD5zaG93IHBvcnQgc3RhdHMgYWxsDQoNCiAgICBDaGVjayBWRjMgY2FuIGdldCBhbGwgdGhlIHBh Y2tldHMuIENoZWNrIHRoZSBwYWNrZXQgY29udGVudCBpcyBubyBjb3JydXB0ZWQuLCBzbyBWRjEt PlZGMiBpcyB3b3JraW5nLg0KDQo1LiBWRjIgc2VuZCB0cmFmZmljLCBhbmQgc2V0IHRoZSBwYWNr ZXQncyBERVNUIE1BQyB0byBWRjEsIGNoZWNrIFZGMSBjYW4gbm90IHJlY2VpdmUgdGhlIHBhY2tl dHMuIA0KDQogICAgSW4gVk0xLCBydW4gdGVzdHBtZDo6DQoNCiAgICAuL3Rlc3RwbWQgLWMgMHgz IC1uIDQgLS0gLWkgDQogICAgdGVzdHBtZD5zZXQgZndkIHJ4b25seQ0KICAgIHRlc3RwbWQ+c2hv dyBwb3J0IGluZm8gYWxsICAgICAvL2dldCB0aGUgdmYxX21hY19hZGRyZXNzDQogICAgdGVzdHBt ZD5zdGFydA0KICAgIHRlc3RwbWQ+c2hvdyBwb3J0IHN0YXRzIGFsbA0KDQogICAgSW4gVk0yLCBy dW4gdGVzdHBtZDo6DQoNCiAgICAuL3Rlc3RwbWQgLWMgMHgzIC1uIDQgLS0gLWkgLS1ldGgtcGVl cj0wLHZmMV9tYWNfYWRkcmVzcw0KICAgIHRlc3RwbWQ+c2V0IGZ3ZCB0eG9ubHkNCiAgICB0ZXN0 cG1kPnN0YXJ0DQogICAgdGVzdHBtZD5zaG93IHBvcnQgc3RhdHMgYWxsDQoNCiAgICBDaGVjayBW RjEgY2FuIG5vdCBnZXQgYW55IHBhY2tldHMsIHNvIFZGMi0+VkYxIGlzIG5vdCB3b3JraW5nLg0K DQo2LiBTZXQgInRlc3RwbWQ+IHBvcnQgc3RhcnQgYWxsIiBhbmQgInRlc3RwbWQ+IHN0YXJ0IiBp biBzdGVwMiwgdGhlbiBydW4gdGhlIHN0ZXAzLTUgYWdhaW4uIHNhbWUgcmVzdWx0Lg0KDQoNClRl c3QgQ2FzZTU6IFBGIGNhbid0IGdldCB0cmFmZmljIGZyb20gRmxvYXRpbmcgVkVCIFZGLCBidXQg UEYgY2FuIGdldCB0cmFmZmljIGZyb20gbGVnYWN5IFZFQiBWRi4NCj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KRFBESyBQ RiwgdGhlbiBjcmVhdGUgMlZGLCBhc3NpZ24gVkYxIHRvIFZNMSwgVkYyIHRvIFZNMiwgc2V0IFZG MSBpbiBmbG9hdGluZyBWRUIsIFZGMiBpbiBsZWdhY3kgVkVCLiANCjEuIFNlbmQgdHJhZmZpYyBm cm9tIFZGMSB0byBQRiwgdGhlbiBjaGVjayBQRiB3aWxsIG5vdCBzZWUgYW55IHRyYWZmaWM7IA0K Mi4gU2VuZCB0cmFmZmljIGZyb20gVkYyIHRvIFBGLCB0aGVuIGNoZWNrIFBGIHdpbGwgcmVjZWl2 ZSBhbGwgdGhlIHBhY2tldHMuDQoNCk5vdGU6VGhlIGRpcmVjdGlvbiBjYW4ndCBiZSByZXZlcnNl ZC4gYmVjYXVzZSB5b3UgbXVzdCBydW4gdGVzdHBtZCBpbiBQRiBmaXJzdCwgdGhlbiB5b3UgY2Fu IHJ1biB0ZXN0cG1kIGluIHZmLiBzbyB3aGVuIHlvdSBydW4gdGVzdHBtZCBpbiBwZiwgeW91IGRv bid0IGtub3cgdGhlIHZmJ3MgbWFjX2FkZHJlc3MsIHlvdSBjYW4ndCBzZXQgdGhlIC0tZXRoLXBl ZXIuIGlmIHRoZXJlIGlzIG5vdCAiLWV0aC1wZWVyIiwgdmYgY2FuJ3QgcmVjZWl2ZSB0aGUgdGhl IHBhY2tldCBzZW50IGJ5ICJ0eG9ubHkiLiBldmVuIGlmIHRoZXJlIGlzIG5vdCBmbG9hdGluZ1ZF QiwgdmYgc3RpbGwgY2FuJ3QgcmVjZWl2ZSB0aGUgcGFja2V0IHNlbnQgYnkgInR4b25seSIgd2l0 aG91dCB0aGUgIi1ldGgtcGVlciIuDQoNCjEuIFN0YXJ0IFZNMSB3aXRoIFZGMSwgVk0yIHdpdGgg VkYyLCBzZWUgdGhlIHByZXJlcXVpc2l0ZSBwYXJ0Lg0KDQoyLiBJbiBob3N0LCBsYXVuY2ggdGVz dHBtZDo6DQoNCiAgIC4vdGVzdHBtZCAtYyAweDMgLW4gNCAtdyA4MjowMC4wLGVuYWJsZV9mbG9h dGluZz0xLGZsb2F0aW5nX2JpdG1hcD0weDEgLS0gLWkgICAvL1ZGMSBpbiBmbG9hdGluZyBWRUIs IFZGMiBpbiBsZWdhY3kgVkVCDQogICB0ZXN0cG1kPiBzZXQgZndkIHJ4b25seQ0KICAgdGVzdHBt ZD4gcG9ydCBzdGFydCBhbGwNCiAgIHRlc3RwbWQ+IHN0YXJ0DQogICB0ZXN0cG1kPiBzaG93IHBv cnQgc3RhdHMgYWxsDQoNCjMuIEluIFZNMSwgcnVuIHRlc3RwbWQ6DQoNCiAgIC4vdGVzdHBtZCAt YyAweDMgLW4gNCAtLSAtaSAtLWV0aC1wZWVyPTAscGZfbWFjX2FkZHINCiAgIHRlc3RwbWQ+c2V0 IGZ3ZCB0eG9ubHkNCiAgIHRlc3RwbWQ+c3RhcnQNCiAgIHRlc3RwbWQ+c2hvdyBwb3J0IHN0YXRz IGFsbA0KDQogICBDaGVjayBQRiBjYW4gbm90IGdldCBhbnkgcGFja2V0cywgc28gVkYxLT5QRiBp cyBub3Qgd29ya2luZy4gKEkgaGF2ZSB2ZXJpZmllZCB0aGF0IGlmIGl0J3Mgbm90IGZsb2F0aW5n IFZFQiwgUEYgY2FuIGdldCBwYWNrZXRzLCB0aGVyZSBpcyBzb21lIFJYLW1pc3NlZCkNCg0KNC4g SW4gVk0yLCBydW4gdGVzdHBtZDoNCg0KICAgLi90ZXN0cG1kIC1jIDB4MyAtbiA0IC0tIC1pIC0t ZXRoLXBlZXI9MCxwZl9tYWNfYWRkcg0KICAgdGVzdHBtZD5zZXQgZndkIHR4b25seQ0KICAgdGVz dHBtZD5zdGFydA0KICAgdGVzdHBtZD5zaG93IHBvcnQgc3RhdHMgYWxsDQoNCiAgIENoZWNrIFBG IGNhbiBnZXQgYWxsIHRoZSBwYWNrZXRzLCBzbyBWRjItPlBGIGlzIHdvcmtpbmcuDQoNCjUuIFNl dCAidGVzdHBtZD4gcG9ydCBzdG9wIGFsbCIgaW4gc3RlcDIgaW4gSG9zdCwgdGhlbiBydW4gdGhl IHRlc3QgY2FzZSBhZ2Fpbi4gc2FtZSByZXN1bHQuDQoNCg0KVGVzdCBDYXNlNjogRmxvYXRpbmcg VkVCIFZGIGNhbid0IHJlY2VpdmUgdHJhZmZpYyBmcm9tIG91dHNpZGUgd29ybGQsIHdoaWxlIGxl Z2FjeSBWRUIgVkYgY2FuIHJlY2VpdmUgdHJhZmZpYyBmcm9tIG91dHNpZGUgd29ybGQuDQo9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KRFBE SyBQRiwgdGhlbiBjcmVhdGUgMlZGLCBhc3NpZ24gVkYxIHRvIFZNMSwgYXNzaWduIFZGMiB0byBW TTIsIHNldCBWRjEgaW4gZmxvYXRpbmcgVkVCLCBzZXQgVkYyIGluIGxlZ2FjeSBWRUINCjEuIHNl bmQgdHJhZmZpYyBmcm9tIHRlc3RlciB0byBWRjEsIGNoZWNrIFZGMSBjYW4ndCByZWNlaXZlIHRy YWZmaWMgZnJvbSB0ZXN0ZXIuDQoyLiBzZW5kIHRyYWZmaWMgZnJvbSB0ZXN0ZXIgdG8gVkYyLCBj aGVjayBWRjIgY2FuIHJlY2VpdmUgYWxsIHRoZSB0cmFmZmljIGZyb20gdGVzdGVyLg0KDQoxLiBT dGFydCBWTTEgd2l0aCBWRjEsIFZNMiB3aXRoIFZGMiwgc2VlIHRoZSBwcmVyZXF1aXNpdGUgcGFy dC4NCg0KMi4gSW4gaG9zdCwgbGF1bmNoIHRlc3RwbWQ6Og0KDQogICAuL3Rlc3RwbWQgLWMgMHgz IC1uIDQgLXcgODI6MDAuMCxlbmFibGVfZmxvYXRpbmc9MSxmbG9hdGluZ19iaXRtYXA9MHgxIC0t IC1pICAgLy9WRjEgaW4gZmxvYXRpbmcgVkVCLCBWRjIgaW4gbGVnYWN5IFZFQiANCiAgIHRlc3Rw bWQ+IHNldCBmd2QgbWFjDQogICB0ZXN0cG1kPiBwb3J0IHN0YXJ0IGFsbA0KICAgdGVzdHBtZD4g c3RhcnQNCiAgIHRlc3RwbWQ+IHNob3cgcG9ydCBzdGF0cyBhbGwNCiAgIA0KDQozLiBJbiBWTTEs IHJ1biB0ZXN0cG1kOg0KDQogICAuL3Rlc3RwbWQgLWMgMHgzIC1uIDQgLS0gLWkgDQogICAgdGVz dHBtZD5zaG93IHBvcnQgaW5mbyBhbGwgICAgLy9nZXQgVkYxX21hY19hZGRyZXNzDQogICAgdGVz dHBtZD5zZXQgZndkIHJ4b25seQ0KICAgIHRlc3RwbWQ+c3RhcnQNCiAgICB0ZXN0cG1kPnNob3cg cG9ydCBzdGF0cyBhbGwNCg0KICAgSW4gdGVzdGVyLCBydW4gc2NhcHkNCg0KICAgcGFja2V0PUV0 aGVyKGRzdD0iVkYxX21hY19hZGRyZXNzIikvSVAoKS9VRFAoKS9SYXcoJ3gnKjIwKQ0KICAgc2Vu ZHAocGFja2V0LGlmYWNlPSJlbnAxMzJzMGYwIikNCiAgIA0KICAgQ2hlY2sgVkYxIGNhbiBub3Qg Z2V0IGFueSBwYWNrZXRzLCBzbyB0ZXN0ZXItPlZGMSBpcyBub3Qgd29ya2luZy4gUEYgY2FuIHJl Y2VpdmUgcGFja2V0cyBhbmQgZm9yd29yZGluZyBpdC4NCg0KNC4gSW4gVk0yLCBydW4gdGVzdHBt ZDoNCg0KICAgLi90ZXN0cG1kIC1jIDB4MyAtbiA0IC0tIC1pIA0KICAgIHRlc3RwbWQ+c2hvdyBw b3J0IGluZm8gYWxsICAgIC8vZ2V0IFZGMl9tYWNfYWRkcmVzcw0KICAgIHRlc3RwbWQ+c2V0IGZ3 ZCByeG9ubHkNCiAgICB0ZXN0cG1kPnN0YXJ0DQogICAgdGVzdHBtZD5zaG93IHBvcnQgc3RhdHMg YWxsDQoNCiAgIEluIHRlc3RlciwgcnVuIHNjYXB5DQoNCiAgIHBhY2tldD1FdGhlcihkc3Q9IlZG Ml9tYWNfYWRkcmVzcyIpL0lQKCkvVURQKCkvUmF3KCd4JyoyMCkNCiAgIHNlbmRwKHBhY2tldCxp ZmFjZT0iZW5wMTMyczBmMCIpDQogICANCiAgIENoZWNrIFZGMSBjYW4gZ2V0IGFsbCB0aGUgcGFj a2V0cywgc28gdGVzdGVyLT5WRjIgaXMgd29ya2luZy4NCg0KNS4gU2V0ICJ0ZXN0cG1kPiBwb3J0 IHN0b3AgYWxsIiBpbiBzdGVwMiBpbiBIb3N0LCB0aGVuIHJ1biB0aGUgdGVzdCBjYXNlIGFnYWlu LiBWRjEgYW5kIFZGMiBjYW5ub3QgcmVjZWl2ZSBhbnkgcGFja2V0cy4gKGJlY2F1c2UgUEYgbGlu ayBkb3duLCBhbmQgUEYgY2FuJ3QgcmVjZWl2ZSBhbnkgcGFja2V0cy4gc28gZXZlbiBpZiBWRjIg Y2FuJ3QgcmVjZWl2ZSBhbnkgcGFja2V0cy4pDQoNCg0KDQo= --_002_67D543A150B29E4CAAE53918F64EDAEAA9C4C5shsmsx102ccrcorpi_--