From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============1904239062322963448==" MIME-Version: 1.0 From: Walker, Benjamin Subject: Re: [SPDK] Netlist storage card Date: Mon, 30 Jan 2017 19:55:46 +0000 Message-ID: <1485806145.25496.2.camel@intel.com> In-Reply-To: CAGcKcXQndT_OvAPobwRcUmab+=4P8W6MPQ05MBJ54zdsHpXPNA@mail.gmail.com List-ID: To: spdk@lists.01.org --===============1904239062322963448== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable On Mon, 2017-01-30 at 10:20 +1300, Dale Corlett wrote: > Hi, > = > I have managed to get the Netlist card initialised with SPDK and map > the registers, I now need to read and write to it. > The Netlist card uses DMA to read/write so I think I will need to > allocate DMA memory. Is there a way to do this through SPDK? Are > there SPDK functions equivalent to the DMA API functions > like=C2=A0dma_alloc_coherent()? See spdk_malloc, spdk_zmalloc, spdk_realloc, and spdk_free. > = > Thanks, > Dale > = > = > On Wed, Jan 11, 2017 at 1:38 PM, Dale Corlett m> wrote: > > Hi, > > = > > For the Netlist SPDK PCI driver that I am making, does it need to > > use VFIO, or UIO? If so, how are these configured in a userspace > > driver? > > = > > I also have not got the DPDK debug messages to show yet. > > = > > Thanks, > > Dale > > = > > On Tue, Jan 10, 2017 at 8:37 AM, Dale Corlett > com> wrote: > > > Hi Daniel, > > > = > > > Thanks for your reply. > > > = > > > I have set the log level using rte_set_log_level(RTE_LOG_DEBUG) > > > but the debug messages still do not display. I > > > used=C2=A0rte_get_log_level() to check that the log level was set to > > > DEBUG, it returned 8 which corresponds to the RTE_LOG_DEBUG > > > macro. So it seems like the log level is set to debug, but the > > > debug messages do not show in the terminal. > > > = > > > Do the EAL messages get written anywhere else? Could I have > > > broken something when I set the=C2=A0EXTRA_CFLAGS environment > > > variable? > > > = > > > = > > > Thanks, > > > Dale > > > = > > > On Tue, Jan 10, 2017 at 7:38 AM, Verkamp, Daniel > > intel.com> wrote: > > > > Hi Dale, > > > > =C2=A0 > > > > This is controlled by the log level; the SPDK example programs > > > > don=E2=80=99t currently expose this as a command-line parameter, but > > > > you can add a call to rte_set_log_level() early in the program > > > > to change it from the default: http://dpdk.org/doc/api/rte__log > > > > _8h.html > > > > =C2=A0 > > > > -- Daniel > > > > =C2=A0 > > > > From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of Dale > > > > Corlett > > > > Sent: Saturday, January 7, 2017 3:49 PM > > > > = > > > > To: Storage Performance Development Kit > > > > Subject: Re: [SPDK] Netlist storage card > > > > = > > > > = > > > > =C2=A0 > > > > Hi, > > > > =C2=A0 > > > > For an SPDK application I am trying to enable the EAL debug > > > > message such as: "RTE_LOG(DEBUG, EAL, " =C2=A0Not managed by a > > > > supported kernel driver, skipped\n");". > > > > I have tried compiling DPDK for debug by setting the > > > > environment variable "EXTRA_CFLAGS" to "-O0 -g" as described > > > > here: http://dpdk.readthedocs.io/en/v16.07/prog_guide/dev_kit_r > > > > oot_make_help.html#compiling-for-debug, but this does not work. > > > > =C2=A0 > > > > Is there any other way to enable these EAL debug messages? > > > > =C2=A0 > > > > Thanks, > > > > Dale > > > > =C2=A0 > > > > On Mon, Dec 19, 2016 at 5:59 PM, Dileep Sharma > > > mple.com> wrote: > > > > Hi Dale, > > > > =C2=A0 > > > > SPDK uses the DPDK's PCI generic to get the information about > > > > the PCI devices. And DPDK in turn uses the uio driver to get > > > > the information about the underlying PCI devices. I'll suggest > > > > you to follow the code flow of rte_eal_pci_probe() routine in > > > > DPDK to get the feel how DPDK works for PCI devices. During > > > > code path flow, you'll came to know about various data > > > > structures that are similar to kernel code and then you can use > > > > them effectively in your code. > > > > =C2=A0 > > > > Thanks, > > > > Dileep > > > > =C2=A0 > > > > On Sun, Dec 18, 2016 at 9:27 AM, Dale Corlett > > > iad.com> wrote: > > > > Hi, > > > > =C2=A0 > > > > I have now moved on to creating a user space driver for the > > > > netlist storage card. I have written a simple kernel driver > > > > that uses the PCI driver that just gets the pcie register > > > > information from the netlist card. I want to port this kernel > > > > driver to user space to work with SPDK, but I am finding it > > > > difficult to workout the steps required to do this. I have > > > > noticed that some structures like=C2=A0spdk_pci_id, > > > > and=C2=A0spdk_pci_device which are defined in SPDK are similar to > > > > structures that I have used in my kernel driver: pci_device_id, > > > > and=C2=A0pci_dev. However, SPDK does not seem to have structures > > > > equivalent to=C2=A0pci_driver which I have used in my kernel > > > > driver.=C2=A0 > > > > How does SPDK link the PCI driver to the user space driver? > > > > Any assistance would be greatly appreciated. > > > > =C2=A0 > > > > My simple kernel driver for the Netlist card: > > > > #include > > > > #include > > > > #include > > > > =C2=A0 > > > > =C2=A0 > > > > #define EV_VENDOR_ID 0x1C1B =C2=A0 =C2=A0// Netlist > > > > #define EV_DEVICE_ID_BAR32_WINDOW_32M_16GB 0x0006 // > > > > EXPRESSvault NVDIMM/DDR3 PCIe GEN3 x8 lane - =C2=A0 =C2=A0 =C2=A0 = =C2=A0For debug > > > > use only > > > > =C2=A0 > > > > #define PCI_DRIVER_NAME "Netlistev3" > > > > =C2=A0 > > > > // Function prototypes: > > > > static int netlist_pci_probe(struct pci_dev *dev, const struct > > > > pci_device_id *id); > > > > =C2=A0 > > > > //PCI_DEVICE(EV_VENDOR_ID, EV_DEVICE_ID_BAR32_WINDOW_32M_16GB); > > > > static const struct pci_device_id netlist_pci_ids [] =3D=C2=A0 > > > > { > > > > { > > > > .vendor =3D EV_VENDOR_ID, > > > > .device =3D EV_DEVICE_ID_BAR32_WINDOW_32M_16GB, > > > > .subvendor =3D PCI_ANY_ID, > > > > .subdevice =3D PCI_ANY_ID, > > > > }, > > > > {=C2=A0 > > > > // end: all zeroes > > > > .vendor =3D 0, > > > > .device =3D 0, > > > > .subvendor =3D 0, > > > > .subdevice =3D 0, > > > > } > > > > }; > > > > =C2=A0 > > > > static struct pci_driver netlist_pci_driver =3D=C2=A0 > > > > { > > > > .name =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =3D PCI_DRIVER_NAME, > > > > .id_table =C2=A0 =C2=A0 =C2=A0 =3D netlist_pci_ids, > > > > .probe =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D netlist_pci_probe, > > > > // .remove =C2=A0 =C2=A0 =C2=A0 =C2=A0 =3D netlist_pci_remove, > > > > // .err_handler =C2=A0 =C2=A0=3D &pci_err_handler, // This is a str= ucture > > > > }; > > > > =C2=A0 > > > > static int netlist_pci_probe(struct pci_dev *dev, const struct > > > > pci_device_id *id) > > > > { > > > > printk("pci_enable_device\n"); > > > > if (pci_enable_device(dev) < 0) > > > > { > > > > printk("pci_enable_device FAILED\n"); > > > > return -ENODEV; > > > > } > > > > unsigned int venid; > > > > int offset; > > > > for(offset =3D 0x00; offset <=3D 0x03C; offset +=3D 4) > > > > { > > > > int retVal =3D pci_read_config_dword(dev, offset, &venid); > > > > printk ("byte offset 0x%X =3D 0x%X\n", offset, venid); > > > > } > > > > return 0; > > > > } > > > > =C2=A0 > > > > =C2=A0 > > > > static int netlist_init(void) > > > > { > > > > int err =3D pci_register_driver(&netlist_pci_driver); > > > > =C2=A0 =C2=A0=C2=A0 > > > > =C2=A0 =C2=A0 if(err < 0) > > > > =C2=A0 =C2=A0 { > > > > =C2=A0 =C2=A0 printk("error registering netlist_pci_driver\n"); > > > > =C2=A0 =C2=A0 } > > > > =C2=A0 =C2=A0 else if(err =3D=3D 0) > > > > =C2=A0 =C2=A0 { > > > > =C2=A0 =C2=A0 printk("netlist_pci_driver registered successfully\n"= ); > > > > =C2=A0 =C2=A0 } > > > > =C2=A0 =C2=A0 return err; > > > > } > > > > =C2=A0 > > > > static void netlist_cleanup(void) > > > > { > > > > pci_unregister_driver(&netlist_pci_driver); > > > > printk("netlist_pci_driver unregistered\n"); > > > > } > > > > =C2=A0 > > > > module_init(netlist_init); > > > > module_exit(netlist_cleanup); > > > > =C2=A0 > > > > Thanks, > > > > Dale > > > > =C2=A0 > > > > On Fri, Dec 2, 2016 at 10:55 AM, Dale Corlett > > > iad.com> wrote: > > > > Hi, > > > > =C2=A0 > > > > I have the iscsi_tgt program compiled but I do not know how to > > > > setup the iscsi.conf file. I have removed all of what I think > > > > is unnecessary for my application from the iscsi.conf.in > > > > example so I have the following: > > > > =C2=A0 > > > > [iSCSI] > > > > =C2=A0 # node name (not include optional part) > > > > =C2=A0 # Users can optionally change this to fit their environment. > > > > =C2=A0 NodeBase "iqn.2016-06.io.spdk" > > > > =C2=A0 > > > > =C2=A0 AuthFile /usr/local/etc/spdk/auth.conf > > > > =C2=A0 > > > > =C2=A0 MinConnectionsPerCore 4 > > > > =C2=A0 # Power saving related variable, this parameter defines how > > > > long an iSCSI > > > > =C2=A0 # connection must be idle before moving it to a state where > > > > it will consume > > > > =C2=A0 # less power. This variable is defined in terms of > > > > microseconds. We set default > > > > =C2=A0 # value as 5ms. > > > > =C2=A0 MinConnectionIdleInterval 5000 > > > > =C2=A0 > > > > =C2=A0 # Socket I/O timeout sec. (0 is infinite) > > > > =C2=A0 Timeout 30 > > > > =C2=A0 > > > > =C2=A0 # authentication information for discovery session > > > > =C2=A0 DiscoveryAuthMethod Auto > > > > =C2=A0 > > > > =C2=A0 #MaxSessions 128 > > > > =C2=A0 #MaxConnectionsPerSession 2 > > > > =C2=A0 > > > > =C2=A0 # iSCSI initial parameters negotiate with initiators > > > > =C2=A0 # NOTE: incorrect values might crash > > > > =C2=A0 DefaultTime2Wait 2 > > > > =C2=A0 DefaultTime2Retain 60 > > > > =C2=A0 > > > > =C2=A0 ImmediateData Yes > > > > =C2=A0 ErrorRecoveryLevel 0 > > > > =C2=A0 > > > > [AIO] > > > > AIO /dev/ev3mema > > > > =C2=A0 > > > > [TargetNode1] > > > > =C2=A0TargetName disk1 > > > > =C2=A0 TargetAlias "Data Disk1" > > > > =C2=A0 Mapping PortalGroup1 InitiatorGroup1 > > > > =C2=A0 AuthMethod Auto > > > > =C2=A0 AuthGroup AuthGroup1 > > > > =C2=A0 # Enable header and data digest > > > > =C2=A0 # UseDigest Header Data > > > > =C2=A0 UseDigest Auto > > > > # Using the first AIO target > > > > =C2=A0 LUN0 AIO0 > > > > =C2=A0 > > > > But when I run the iscsi_tgt program like this:=C2=A0sudo > > > > ./iscsi_tgt -c ../../etc/spdk/iscsi.conf I get the following > > > > output: > > > > =C2=A0 > > > > Starting Intel(R) DPDK initialization ...=C2=A0 > > > > [ DPDK EAL parameters: iscsi -c 1 -n 4 -m 2048 --master-lcore=3D0 = > > > > --file-prefix=3Drte0 --proc-type=3Dauto ] > > > > EAL: Detected 4 lcore(s) > > > > EAL: Auto-detected process type: PRIMARY > > > > EAL: No free hugepages reported in hugepages-1048576kB > > > > EAL: Probing VFIO support... > > > > done. > > > > Occupied cpu core mask is 0x1 > > > > Occupied cpu socket mask is 0x1 > > > > Ioat Copy Engine Offload Enabled > > > > tgt_node.c: 590:spdk_iscsi_tgt_node_add_map: ***ERROR*** > > > > iqn.2016-06.io.spdk:disk1: PortalGroup1 not found > > > > tgt_node.c: 727:spdk_iscsi_tgt_node_construct: ***ERROR*** > > > > could not add map to target > > > > tgt_node.c: 982:spdk_cf_add_iscsi_tgt_node: ***ERROR*** > > > > tgt_node1: add_iscsi_target_node error > > > > tgt_node.c:1006:spdk_iscsi_init_tgt_nodes: ***ERROR*** > > > > spdk_cf_add_iscsi_tgt_node() failed > > > > iscsi_subsystem.c: 964:spdk_iscsi_subsystem_init: ***ERROR*** > > > > spdk_iscsi_init_tgt_nodes() failed > > > > app.c: 404:spdk_app_init: ***ERROR*** spdk_subsystem_init() > > > > failed > > > > =C2=A0 > > > > I just want the most basic configuration so that I can just see > > > > if the Netlist card works with SPDK. > > > > =C2=A0 > > > > Thanks, > > > > Dale > > > > =C2=A0 > > > > On Thu, Dec 1, 2016 at 5:39 PM, Dale Corlett > > > ad.com> wrote: > > > > Hi Param, > > > > =C2=A0 > > > > Awesome it worked! > > > > =C2=A0 > > > > Thanks, > > > > Dale > > > > =C2=A0 > > > > On Thu, Dec 1, 2016 at 5:06 PM, Kumaraparameshwaran Rathnavel < > > > > krath(a)cloudsimple.com> wrote: > > > > Hi Dale, > > > > =C2=A0 > > > > When you compile your SPDK application try giving > > > > DPDK_DIR=3D/path/to/dpdk/x86_build folder. This should solve your > > > > problem. From SPDK directory give make and the DPDK_DIR. > > > > =C2=A0 > > > > Regards, > > > > Param. > > > > =C2=A0 > > > > On 01-Dec-2016, at 9:23 AM, Dale Corlett > > > om> wrote: > > > > =C2=A0 > > > > Hello again, > > > > =C2=A0 > > > > When I was trying to run iscsi_tgt (as instructed in=C2=A0http://www > > > > .spdk.io/spdk/doc/iscsi_getting_started.html)=C2=A0I found that the > > > > app/iscsi_tgt.c was not compiled, and when I tried to compile > > > > it I got the following error: > > > > iscsi_tgt.c:38:24: fatal error: rte_config.h: No such file or > > > > directory > > > > From an online search I have seen that many other people get a > > > > similar error to do with missing the rte_config.h file, but > > > > there do not seem to be any resolutions. > > > > I have found a rte_config.h file in one of the dpdk > > > > directories. I tried putting this in the /usr/include > > > > directory, but this did not fix it. > > > > =C2=A0 > > > > Does anyone have any ideas of how to fix this? Has anyone > > > > encountered this problem before? > > > > =C2=A0 > > > > Thanks, > > > > Dale > > > > =C2=A0 > > > > =C2=A0 > > > > =C2=A0 > > > > On Thu, Dec 1, 2016 at 5:46 AM, Walker, Benjamin > > > er(a)intel.com> wrote: > > > > Note also that running the iSCSI target will not create a block > > > > device on your local system by itself. It=E2=80=99s just a C execut= able > > > > that=E2=80=99s opening up some listening sockets. To see a block de= vice > > > > on a system, you have to connect to the target using an iSCSI > > > > initiator. The one we use is iscsiadm, which is not part of > > > > SPDK but is in wide use and is packaged on all mainstream Linux > > > > distributions. This is the same iSCSI initiator people use with > > > > the Linux kernel iSCSI target. > > > > =C2=A0 > > > > All of the above is covered in that guide you linked. > > > > =C2=A0 > > > > From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of > > > > Harris, James R > > > > Sent: Tuesday, November 29, 2016 6:07 PM > > > > = > > > > To: Storage Performance Development Kit > > > > Subject: Re: [SPDK] Netlist storage card > > > > =C2=A0 > > > > =C2=A0 > > > > Hi Dale, > > > > =C2=A0 > > > > You can pass the name of your config file to the iscsi_tgt app > > > > using the =E2=80=93c option. > > > > =C2=A0 > > > > -Jim > > > > =C2=A0 > > > > =C2=A0 > > > > From: SPDK on behalf of Dale > > > > Corlett > > > > Reply-To: Storage Performance Development Kit > > > g> > > > > Date: Tuesday, November 29, 2016 at 3:38 PM > > > > To: Storage Performance Development Kit > > > > Subject: Re: [SPDK] Netlist storage card > > > > =C2=A0 > > > > Hi, > > > > =C2=A0 > > > > I have added the [AIO] section to the config > > > > file:=C2=A0/home/dale/spdk/etc/spdk/iscsi.conf.in but I cannot > > > > figure out how to "run" SPDK to create the SPDK block device > > > > called AIO0.=C2=A0 > > > > =C2=A0 > > > > I have tried following the guid for the iscsi block device: htt > > > > p://www.spdk.io/spdk/doc/iscsi_getting_started.html but I am > > > > not sure if I have used the correct config file. > > > > =C2=A0 > > > > Thanks, > > > > Dale > > > > =C2=A0 > > > > On Wed, Nov 30, 2016 at 10:41 AM, Daniel Verkamp > > > p(a)intel.com> wrote: > > > > On 11/29/2016 02:15 PM, Dale Corlett wrote: > > > > > Hi, > > > > > > > > > > Thank you all for your replies. > > > > > > > > > > Jim, I think that I will first try the AIO first, and then > > > > try > > > > > writing the userspace driver and bdev module. I am not sure > > > > of what I > > > > > should do with the config files, or how to get the .ko file > > > > for the > > > > > AIO module. Is there a makefile that gets the .ko module file > > > > or do I > > > > > have to create one? > > > > > > > > > > Also, when trying to use ./scripts/setup.sh I found that it > > > > did not > > > > > work because I got then message: "logname: no login name". I > > > > think > > > > > that this is a problem with the 16.04 version of Ubuntu: > > > > > https://bugs.launchpad.net/ubuntu/+source/gnome-terminal/+bug > > > > /1537645 > > > > > so I changed line 177 to: username=3D `echo whoami` and this > > > > seems to > > > > > work. > > > > > > > > > > Thanks, Dale > > > > = > > > > Hi Dale, > > > > = > > > > You do not need any special kernel modules to use the SPDK AIO > > > > bdev - > > > > it uses the libaio userspace library provided by glibc and the > > > > block > > > > devices that are exposed by the usual kernel drivers for any > > > > block > > > > device that is supported by Linux. > > > > = > > > > Thanks for the report about logname - I'll prepare a patch to > > > > work > > > > around that issue. The only time the username provided by > > > > logname is > > > > used is to provide access to an unprivileged user to the VFIO > > > > device, > > > > so if you are running the programs using SPDK as root, there > > > > should have > > > > no negative effect. > > > > = > > > > Thanks, > > > > -- Daniel > > > > _______________________________________________ > > > > SPDK mailing list > > > > SPDK(a)lists.01.org > > > > https://lists.01.org/mailman/listinfo/spdk > > > > =C2=A0 > > > > = > > > > _______________________________________________ > > > > SPDK mailing list > > > > SPDK(a)lists.01.org > > > > https://lists.01.org/mailman/listinfo/spdk > > > > = > > > > =C2=A0 > > > > _______________________________________________ > > > > SPDK mailing list > > > > SPDK(a)lists.01.org > > > > https://lists.01.org/mailman/listinfo/spdk > > > > =C2=A0 > > > > = > > > > _______________________________________________ > > > > SPDK mailing list > > > > SPDK(a)lists.01.org > > > > https://lists.01.org/mailman/listinfo/spdk > > > > = > > > > =C2=A0 > > > > =C2=A0 > > > > =C2=A0 > > > > = > > > > _______________________________________________ > > > > SPDK mailing list > > > > SPDK(a)lists.01.org > > > > https://lists.01.org/mailman/listinfo/spdk > > > > = > > > > = > > > > = > > > > =C2=A0 > > > > -- > > > > Thanks, > > > > Dileep Sharma > > > > = > > > > _______________________________________________ > > > > SPDK mailing list > > > > SPDK(a)lists.01.org > > > > https://lists.01.org/mailman/listinfo/spdk > > > > = > > > > =C2=A0 > > > > = > > > > _______________________________________________ > > > > SPDK mailing list > > > > SPDK(a)lists.01.org > > > > https://lists.01.org/mailman/listinfo/spdk > > > > = > > > = > > > = > > = > > = > = > _______________________________________________ > SPDK mailing list > SPDK(a)lists.01.org > https://lists.01.org/mailman/listinfo/spdk >=20 --===============1904239062322963448== Content-Type: application/x-pkcs7-signature MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" 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 npsySQSf0cxLmvA6/a4qPOUSitHit+cJQ58/EOt6PLrPGAbdu5sz9O+Iv+FUJakwUtg0sAY4RQID AQABo4ICNTCCAjEwHQYDVR0OBBYEFAU2hsr+3sx/M5e5WafmYD18VvX1MB8GA1UdIwQYMBaAFB5p KrTcKP5HGE4hCz+8rBEv8Jj1MGUGA1UdHwReMFwwWqBYoFaGVGh0dHA6Ly93d3cuaW50ZWwuY29t L3JlcG9zaXRvcnkvQ1JML0ludGVsJTIwRXh0ZXJuYWwlMjBCYXNpYyUyMElzc3VpbmclMjBDQSUy MDRBLmNybDCBnwYIKwYBBQUHAQEEgZIwgY8waQYIKwYBBQUHMAKGXWh0dHA6Ly93d3cuaW50ZWwu Y29tL3JlcG9zaXRvcnkvY2VydGlmaWNhdGVzL0ludGVsJTIwRXh0ZXJuYWwlMjBCYXNpYyUyMElz c3VpbmclMjBDQSUyMDRBLmNydDAiBggrBgEFBQcwAYYWaHR0cDovL29jc3AuaW50ZWwuY29tLzAL BgNVHQ8EBAMCB4AwPAYJKwYBBAGCNxUHBC8wLQYlKwYBBAGCNxUIhsOMdYSZ5VGD/YEohY6fU4KR wAlngd69OZXwQwIBZAIBCTAfBgNVHSUEGDAWBggrBgEFBQcDBAYKKwYBBAGCNwoDDDApBgkrBgEE AYI3FQoEHDAaMAoGCCsGAQUFBwMEMAwGCisGAQQBgjcKAwwwTwYDVR0RBEgwRqApBgorBgEEAYI3 FAIDoBsMGWJlbmphbWluLndhbGtlckBpbnRlbC5jb22BGWJlbmphbWluLndhbGtlckBpbnRlbC5j b20wDQYJKoZIhvcNAQEFBQADggEBAMQUzXgrfwDLl92M7wNqp24Xe1poeurJ8YVAy5a2UukwC/uX uXE8Duoz2jMJL90QETn17H7EQQu1J7kc059H6GyDU42MkzPA3mqZQimrTgOaalPXxWXoVl/UUoLB PJZXGF3Ef1p8b1UVdSnZZ8wTD/QTUw7UhgljKZ1td/raLV1h96x6lKCVkZ0UKU8be5M3FHQ/GZJ9 CgUjvN0m2mYOUHDkNzsUTJb4bsV7vZDa3zixm4Gxu2F/uq328AEJ6JJmXA+jjFOzQ0FI8sa7XOSR 1UPvZSrwyA00M/zFZaDTln+sFPFNseYYGYFU7P711D8Wj1Hv1V/C2G4rSRBJG5f1WF8xggIXMIIC EwIBATCBkDB5MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFDASBgNVBAcTC1NhbnRhIENsYXJh MRowGAYDVQQKExFJbnRlbCBDb3Jwb3JhdGlvbjErMCkGA1UEAxMiSW50ZWwgRXh0ZXJuYWwgQmFz aWMgSXNzdWluZyBDQSA0QQITMwAAi7krPkV7x3So3QAAAACLuTAJBgUrDgMCGgUAoF0wGAYJKoZI hvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTcwMTMwMTk1NTQ1WjAjBgkqhkiG 9w0BCQQxFgQUn2naJ8YXu5zuqT8odVm8Z2bO8VIwDQYJKoZIhvcNAQEBBQAEggEASOk0BndfTyBV /1Z/WzVFt11J+F5u32HUAoP4FVR7pb/EFI5JC4U/0pdXMfSSMBc4q0BnkBjzuaKT07fn7QgYghZb aGSml+4sC/wTsq3jvuoa20oq0ZImuL1kK0rClaDNG7V7nE4it3FvxLlVo9ZVCKJPsgFAXpvFUYMW npf1MyNRMVzCgJvMwLU3D0CuZ87taRnqjRwQjohgc83+ipCsTtm3cWv9TuVKwmzoeNEfSPn7a2GG a5qfddMIfmD6yfpTlFBelX8o9VBj9+ylzSvi4peQvNTmkcjtsYMdEAOBOif3sLV30awkzgKFBwd4 AUYBviPyuYns/7/+Wh+QDu7wegAAAAAAAA== --===============1904239062322963448==--