From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp11.migadu.com ([2001:41d0:403:4789::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms8.migadu.com with LMTPS id YBoiDn2HKWWwZAEA9RJhRA:P1 (envelope-from ) for ; Fri, 13 Oct 2023 20:07:57 +0200 Received: from aspmx1.migadu.com ([2001:41d0:403:4789::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp11.migadu.com with LMTPS id YBoiDn2HKWWwZAEA9RJhRA (envelope-from ) for ; Fri, 13 Oct 2023 20:07:57 +0200 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id C05C1653BF for ; Fri, 13 Oct 2023 20:07:56 +0200 (CEST) Authentication-Results: aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=Runbox.com header.s=rbselector1 header.b=WS54eQfj; dmarc=pass (policy=none) header.from=gnu.org; spf=pass (aspmx1.migadu.com: domain of "help-guix-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="help-guix-bounces+larch=yhetil.org@gnu.org" ARC-Seal: i=1; s=key1; d=yhetil.org; t=1697220477; a=rsa-sha256; cv=none; b=O1nbX9WxBVdX34lMjc+iq3BTDAORD+bztnIDs6Nc2d7D954JZwgQ4XwcMCT1J3SE2iQvlB mfZVdYA+gOjxQex0ut5DypmYq4tu+ae5zgesRk9jw/2LjY8Z0ayZj2CneQNh1vK8txU2kJ p7baouu3ptY4QqTCdt3MWlin4PBE9kxF8KAvw5/aefKxA+W3jVhM4O5GbQQ0zfXZJRH9yD a4mKd6NgMNkEDnFR8OuOBiVP0cKtNABu37U3WfAqv55BA+0t7lST7J09nMFT/G7vtmPDHg btw4fpQycnAIkz9r0l3wxY/a+oFE6onWne/iyvR2a7ljvlO5I0IcPEZ7i7yZeQ== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=Runbox.com header.s=rbselector1 header.b=WS54eQfj; dmarc=pass (policy=none) header.from=gnu.org; spf=pass (aspmx1.migadu.com: domain of "help-guix-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="help-guix-bounces+larch=yhetil.org@gnu.org" ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1697220477; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:in-reply-to:in-reply-to: references:references:list-id:list-help:list-unsubscribe: list-subscribe:list-post:dkim-signature; bh=7bRqRk+OKMtiXn0DD/K4AGSLkkZzHAbX1SWD+G6bQ+I=; b=GA+K34vLsMXLYoEZ49IJ65F6HNYBgqS1DBOeZW0l7efToA0p00LpzcfPHdC8RT65RUgSVs yhXt6BmHtYXu0nD+ZCmmHGQHHx1169bz/QFjStyLUgkhuOGBCygpUJIv7Rrn7ektf0FOU/ Vh+sfRXwpGKT8eCAgpFMA5vf78EDQYXglu/0MPFQcjeU8jd2fTIftQDITxbhq0VlG6axWE oThMPyf/RXWSIdXSXVZK/E9Di0gb9xYujbGSB0vVsiRk+4TeI2kf+5TRFIgvxFFqpk+c8G +y2EN4HDsOxJsRmugLy38tO0ro1kw4IDlM3UZylYbKnEa14zqeo0V3O9aRW+bg== Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qrMYt-0007X4-TW; Fri, 13 Oct 2023 14:06:59 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qrMYr-0007Wn-6l for help-guix@gnu.org; Fri, 13 Oct 2023 14:06:57 -0400 Received: from mailtransmit05.runbox.com ([2a0c:5a00:149::26]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qrMYb-0007NY-Ja for help-guix@gnu.org; Fri, 13 Oct 2023 14:06:56 -0400 Received: from mailtransmit03.runbox ([10.9.9.163] helo=aibo.runbox.com) by mailtransmit05.runbox.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.93) (envelope-from ) id 1qrMYQ-004vKb-T1 for help-guix@gnu.org; Fri, 13 Oct 2023 20:06:30 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=Runbox.com; s=rbselector1; h=Content-Type:MIME-Version:References:In-Reply-To:Message-ID :Subject:Cc:To:From:Date; bh=7bRqRk+OKMtiXn0DD/K4AGSLkkZzHAbX1SWD+G6bQ+I=; b= WS54eQfjEcTZjz4uHg23JkjfadkTpguSrYQK6ifBhjgW4hbV6cluMyPri+CQ84BmY1c0kBgSICSBo fvwUljnv0ZiksdaK6EA8BssH8wcxfTwsc4gLS7oQLNSacCuPebJL8BO2+c3ESkkpXvddabQzG/w+B pCNRMCQNhhsUyxAuuwyULBrabA/SC4wQfeuKmvuuYrtBEpUIVfCCQ9p7FAIuEidfk4pLqBo1/nngA cpWXCZZ9AX5Vg1kueBvokBkbjztx5PDY6hZG62288/nfuPGyb43v6PytABVkKMfzDgzsfsFesBCCd tz+GsQtyYQATmMdpFKCeNDvmqybi6ElASA==; Received: from [10.9.9.72] (helo=submission01.runbox) by mailtransmit03.runbox with esmtp (Exim 4.86_2) (envelope-from ) id 1qrMYQ-000882-D1; Fri, 13 Oct 2023 20:06:30 +0200 Received: by submission01.runbox with esmtpsa [Authenticated ID (782598)] (TLS1.2:ECDHE_SECP256R1__RSA_SHA256__AES_256_GCM:256) (Exim 4.93) id 1qrMY8-009SER-EM; Fri, 13 Oct 2023 20:06:12 +0200 Date: Fri, 13 Oct 2023 19:05:52 +0100 To: Josh Marshall Cc: help-guix@gnu.org Subject: Re: Architecture to reduce download time when pulling multiple packages =?UTF-8?B?4oCT?= historic success with magnet URLs, BTIHs, & Aria2c! Message-ID: <20231013190552.65c8ddb4@jrhaighs-debian-x200> In-Reply-To: References: <87jzrse047.fsf@cbaines.net> <8734ye965y.fsf@cbaines.net> X-Mailer: Claws Mail 3.14.1 (GTK+ 2.24.31; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/McFFFqceJxGix85d6=.xO_r"; protocol="application/pgp-signature" Received-SPF: pass client-ip=2a0c:5a00:149::26; envelope-from=JRHaigh+ML.GNU.Guix@Runbox.com; helo=mailtransmit05.runbox.com X-Spam_score_int: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, T_SPF_TEMPERROR=0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: help-guix@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: "James R. Haigh (+ML.GNU.Guix subaddress)" From: JRHaigh+ML.GNU.Guix--- via Errors-To: help-guix-bounces+larch=yhetil.org@gnu.org Sender: help-guix-bounces+larch=yhetil.org@gnu.org X-Migadu-Country: US X-Migadu-Flow: FLOW_IN X-Migadu-Scanner: mx1.migadu.com X-Migadu-Spam-Score: 0.60 X-Spam-Score: 0.60 X-Migadu-Queue-Id: C05C1653BF X-TUID: mQfIfOXvZ8XN --Sig_/McFFFqceJxGix85d6=.xO_r Content-Type: multipart/mixed; boundary="MP_/U6_UI6axfGxxhgAeAchrCvI" --MP_/U6_UI6axfGxxhgAeAchrCvI Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Hi Josh, At Z-0400=3D2023-10-13Fri12:36:01, Josh Marshall sent: > This is to parallelize connections which should never hurt downloading bu= t can help. Mirroring would be parallelizing for providing packages, what = I want to implement is to parallelize obtaining packages. Server side vs c= lient side. Please, if you are going to do something like this, please use a torrent a= rchitecture like BitTorrent or GNUnet =E2=80=93 I suggest Aria2c as a very = good CLI download backend that can be daemonised and sent instructions over= a socket to add, pause, remove downloads, etc., and it supports magnet URL= s including the existing nontorrent servers (via =E2=80=98as=E2=80=99 param= eters, iirc.). I actually implemented this in a local copy of APT Daemon many years ago (= circa 2011), but the change was not accepted upstream to Launchpad (because= I was not on bleeding-edge; I was too slow to keep-up with the upstream de= velopment). My fork got forgotten about, because to get the full benefit t= he server would have had to have added a BitTorrent Info Hash (BTIH) to the= metadata of each package, along with the MD5, SHA-256, etc. that it alread= y did (not a big ask, really). That said, without the full benefit of havi= ng the metadata, it did provide immediate benefit and I used it for many ye= ars, not upgrading my Ubuntu 11.04 Natty Narwhal that I was using back then= until I really had to. The immediate benefit that it provided was exactly as you described: It al= lowed parallelisation of nontorrent downloads, be it from the same server o= r from multiple mirrors. Iirc., I achieved this by simply passing the down= load list to Aria2c in daemon mode, I think I also converted all the HTTP U= RLs to =E2=80=98as=E2=80=99 parameters in magnet links, so that multiple mi= rrors could be passed using multiple =E2=80=98as=E2=80=99 parameters in eac= h magnet link. Then I simply relied on Aria2c being amazing at parallelisi= ng everything that I had given it! I then also implemented progress update= s such that APT Daemon could reflect where Aria2c was up to. The way I implemented this using Aria2c and magnet URLs meant that if addi= tional hashes were known, they could be used as well, and so if the server = metadata made the simple addition of adding BTIHs, it allows swarming to oc= cur, which in-turn would massively reduce load on the central servers, and = allow anyone who want to be a mirror to be a mirror simply by seeding indef= initely. A default share ratio of 1.0 means that no user is a burden on th= e network, unless they deliberately change that. Users can donate to the r= unning costs of the project simply by increasing their share ratio, which a= dds another means of contribution that they may find easier than the others. Anyone keen to keep old packages online can simply seed them indefinitely,= so this is also really great for archival purposes. Even if the central p= roject loses interest in the old packages and deletes them, anyone else can= keep them up. The hashes ensure that they have not been tampered with. There is also a really cool benefit that occurs, or can occur, on a LAN. = An entire network of computers can all swarm locally with each other, thus = needing each package to only need downloading through the metered last mile= bottleneck from the WAN precisely once =E2=80=93 providing that local broa= dcasting is supported. I think this requires Avahi, and I seem to remember= that Aria2c supports this but I can't remember. I don't ever remember get= ting this bit working but also I did not try hard because it would have req= uired the metadata that I didn't have until after download, so even if I go= t it working it would not have been directly useful unless the APT reposito= ries that I was using would include the BTIHs. So yeah, loads of great benefits to this architecture, and I highly-recomm= end it: convert all existing URLs to magnet links (can be done client-side = as I did; or server-side); optionally add any additional mirrors as additio= nal =E2=80=98as=E2=80=99 parameters (again client-side or server-side); add= =E2=80=98btih=E2=80=99 parameters to the magnet links (the BTIH must be in= cluded in the server metadata to get the full benefit of the swarming, but = conversion to magnet link format can be done client-side or server-side); t= hen simply pass all this to a really good parallelising backend such as Ari= a2c; then update any progress data and relay pause, resume, cancel, etc. to= the backend. One final note, as I am sure that there are a lot of GNUnet fans on this l= ist, is that I would try Aria2c first to see how well it can work, and then= try GNUnet or whatever else once you have a standard to benchmark against.= Both are Free Software, so no concern there. Aria2c is an all-round down= load manager CLI that works with or without swarming, i.e. it is just as go= od at HTTPS as it is BitTorrent, and can do both at the same time. GNUnet = has the advantage of working from SHA-256 iirc., which is generally already= included in the metadata of the repositories of various distributions, but= I think it lacks a lot of other features and stability and ecosystem of al= ternative backends, compared to the BitTorrent network. Of course, there is no harm in including other hashes along with BTIH, to = allow people to experiment with alternative backends, while always ensuring= that what works works well. Another hash that may be useful to include is= the Tiger Tree Hash, which is structurally very similar to BTIH, but stron= ger, iirc.. The first thing that the Guix project can do to signal interest in this ar= chitecture is to simply include the BTIH of each package in the repository = metadata. Be it in magnet URL form or not does not matter because the clie= nt can later convert that as needed. The important thing is an authoritati= ve statement in metadata that this version of this package has this BTIH. = Once that metadata is available, the game is on to implement swarming suppo= rt, be it with Aria2c as a backend (as I recommend at least starting with) = or otherwise. I know that this architecture works well out of first-hand experience with= APT Daemon written in Python. The only failure I had with it was lack of = upstream support. So I consider it important to first attain the upstream = approval before really investing more time into this. I seem to remember s= uggesting this to the Nix project many years ago and didn't get anywhere, a= nd now I don't have the energy to try to improve upstream projects if they = reject my ideas, so I'll be interested to see whether you have any success = with your attempt to do the same. Good luck! ;-) Kind regards, James. --=20 Wealth doesn't bring happiness, but poverty brings sadness. Sent from Debian with Claws Mail, using email subaddressing as an alternati= ve to error-prone heuristical spam filtering. Postal: James R. Haigh, Middle Farm, Vennington, nr. Westbury, nr. Shrewsbu= ry, Salop, SY5 9RG, Britain --MP_/U6_UI6axfGxxhgAeAchrCvI Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="JRHaigh+plz-sign4GPG@Runbox.com.asc" -----BEGIN PGP PUBLIC KEY BLOCK----- mQINBGTp6SMBEADPQq1qjx0IpKf6nDxGeF9wRitXtkAxyDQ2y7DvJDfZ2L+vOjFR InjGeD7FLK+AF5mTlsoRIg+kmE2j/1lIGj9sIybxQbcK0lxnQWMF7SXMu7e2BqPz d/cTW8M0hdvni9FaNERL0LZkxClfHGSaQF8YKqGLuWD6q8s8YXyOK+mk+bKBjLMj lRJGiYvSS/qCeyIRvYYPwLuSVhUybtvN/bvXyGP1Vaf39ssOyJYxSEzebsc70Doq sS0g+47Rdl4ni24RDq/MNn5fNOy3/inP5OXxv+RgFMUwfzpx49znETMYnCGs8sbb s7U/tTch5LTcZooBvo5HIwumnwg1RB6PjC0s59FUahoudJSDLYhZQjjZMDIjeiIT CXjQLz2QXOdv5412c0jfWq8lLMos8tj6ACu4cTuCshljTZ+d1wG5l4H17YelgAHt PCL6vaP4MdIpdHfeU2K0hM4EI8D+ucHpC/Hz3YGOC/vEqnX/G+NFzKK6aS469Ex/ YSbt84akd+LSW78ql7Tmw7NveWYU7wJalcMEPX0YMTRGTOsPA76KS956YCXabB6o 7xuWK9uSQzOEG8OVV9DTf8HPxc2C0dcqSDqKNyW9rOeh6nhqyHXw96W50fMx4qmp dl1eg2Zd22Sea/uv/xyxhfI3Bq3WamaWztPMzn983qgDc50E0RDDOBe4SQARAQAB tKtKYW1lcyBSLiBIYWlnaCAoUGxlYXNlIHNpZ24geW91ciBlbWFpbCB0byB0aGlz IGFkZHJlc3Mgd2l0aCBHTlUgUHJpdmFjeSBHdWFyZCBvciBjb21wYXRpYmxlOyBl bHNlIG1heSBiZSBhdXRvbWF0aWNhbGx5IHJlZ2FyZGVkIGFzIHNwYW0uKSA8SlJI YWlnaCtwbHotc2lnbjRHUEdAUnVuYm94LmNvbT6JAlQEEwEIAD4WIQSW9hOM3nLo AXpJ6nMHFMjblIE24wUCZOnpIwIbAwUJE0/ZAAULCQgHAgYVCAkKCwIEFgIDAQIe AQIXgAAKCRAHFMjblIE24xwDD/4gREdchv8MpVz4DSpDkvrXJfZJknmL5IJS2DLh mVFQ/NYgFQZa2IdcMEdE7BkwTmL0czxgjHOo9hjHP70kkSGfwsuChaNoAXMj89R4 p1Sv61FC24cbrdaT4bS2CYQqhhzbOcTozAyGlP7AaijDPc4RkrjLqepjdlEvp1tk dFwdusDpQZ/YE8Sri4GFVPh56ZvbJW1cfoAyVaOPvnE1z5XsW6fFnRfZ1/Ll3XIL 5nNCbXrXvTJ79bNvETmznvH7Cn+4c19YicrNFjlhrf2Sv+8/q/ljts2nny3TPX1/ nh8NlgHFRYcYza7YeBK6P3twmf2tNLXIDdKZoD49rsPBVTRGkV2u5pIBpEcgKZBr cvnT07sOEnQrdz23gEfnwzNFHpW3XOp03bF8by99p9sfdFywundb3I3d/8Xs4/DD RZl39Xh+HSMH/Vv6jDsrH+AKp3ItO0cg44Rt8I7l/FlIfekeZ5m6QMNiCtWE4Jk5 +bQVY4j3mRFxW1vNNxv4GRpyrAHBvjqc4CFZTiFvNil/iAKnCOfy9VNv39yq2ZUB lDFoehrf2aHifp6KsR32tw91zjIoneY1Kl8b81IKYsf2w8GlkEks1hzpSNbQqLJt e9fCDef10NuZJv0bYjUPVjwHHLwy3R8GER3BcJkytNg/MgtlQ/xFkfC6n9qDUf4G QLLNPbkCDQRk6ekjARAAn6+xhvuz3uxTLsF3KX9f7ADl7ekwQRKNiZsn4H7nBQ2F Rw5ByjxTNTWbmKkKNDVBtcgkdQAs1X+9rNaG2xrFqqjhQ3ND8Q9H8jw4m2S2zX7X T+CbZJJxQ46yuyw1m/+P9PQu4I6dkzqEcld4F1OWhJFljLpIzrOJnhQI+d8DR0ky 3tLN88/MT1ps9/gHrHj54uNO+IkGQiebBxYP2jpq+h2K1DZHLIiNSe3YUjTkRFjs oORnBinw0KVSnltkXn4CQ1iVSCDJWgAdiI7yLmoWP2nFDuRnFLhLwymjahpr6nGO gJLBag6JmGDM2+AxKBaBpwShsNjfygwv1joAM5YIct9iK/CTbEgzvY5Q//t9mMV9 iz2tOmOOkEfRs8h7BSzvjVD6/VAYstIPg0EXnXk9DABPy7OeLcGPyOPULvCvbF41 gu+pv3TkJ9jsfLZdaZwxVAvcxkOJ0ZkeM/Nm/c3za/rpvK7H8j8GZkXyDjST2t7/ byn3Jf9yBtr1lg4O/6nm7TU09/W48Wg7LRPxp7hK4B87eBcIAO1WHOwNb5Hcrfc4 ggW8UfLmeFVEiT1kWFW77yuw/cgz7T2TMe4wRjVDHq9pvyqvWiRzq29wtbozDWVc VAND4+oh3OX35pUrJLIwF27NfSWCiwYu+m4Vpd+ARpv7gFBg/XUujcriYDCwLiEA EQEAAYkCPAQYAQgAJhYhBJb2E4zecugBeknqcwcUyNuUgTbjBQJk6ekjAhsMBQkT T9kAAAoJEAcUyNuUgTbjkwkQAKUNSgHJLpaQA5rOV5fw8ddU1VeHVeBojVCWab9L 6AopnQ98tHaO1EQlsoMJ4R3n3iZG7r0Ek1Tb2o3QmAuQg9RgiHi2+ccXCs9VTy99 pQhguCZrTj3xrNCr5D4SvicAzSuwd5ALPZq4sdEpRA0ZIaUU3FBH2W4NZ5qex3G5 VvM1hVfXnBNTPeN/rT6KwF8BpKrrVjuiB4/2NY61i7WX6/Hb9gIwZqeHMGwI/wUp n1hiIv0xrIcfu6/7zda3yAwmHTBO3foaETZHEj7eyK7a/qH5yPEN6f5srb9TNWds cx/yCscTZdGtBJKoYYA/dQtwal2GuOrbq8jVTdtWk/VINn+XV0Twkoer3HD7IH+/ XbPReGS1X6+Q1XmGcc0CWQ+yvsUipowtj2Z8EGefscEHLcDOdcStW9HV8pOewGlQ PbBz9QPQTnrqhDp6ia3oKEBuxuVCOMX7meNVzBycHvqbNGV1oGJbPkTJeRcEFwO/ NSBFTlXc+euH37ZFobTnDHj7wKsbKZ+GWI7QQmcbBCeuDaFjujhQ8AgUcp4nPUYI Op+nhMZW6LHpE0JSFtMpSYAw3Lf+6dP4hVFOXLrqs1zTaM69g0tvQJOXbF1I9hJ7 0GPnLtYhj5xx+FJBcchp3ipY0dwEVW6jqRRPJWS6xfm42JggKmpRPG+1IW4wWmEK Q9XT =3DjwvA -----END PGP PUBLIC KEY BLOCK----- --MP_/U6_UI6axfGxxhgAeAchrCvI-- --Sig_/McFFFqceJxGix85d6=.xO_r Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQIzBAEBCAAdFiEElvYTjN5y6AF6SepzBxTI25SBNuMFAmUphwAACgkQBxTI25SB NuN/OhAAjLpW8Q2Ba3YdKcdfrYLYOzXd6/vFWAj9+4LqZ9OCELoZAlB4Ibe+kQ+s 9R3XxDxpsB0a9cJP8vk4NuJc7K1H4p5NnxVTP+cTDHARCd5Jwf56nt0eRrK7ocRe auB4nb2CO5tYut60P3t2EXVDf8E1Z6dG9b2BI0XPIUbkq9sMp6OKLizoW3cT4xqI 55/75e09K+UzybQ+bqaNXes1f1teWu9x+3rgwSH5zcdEv+kPt6wp1Hzkhx86I8LA mUAV0sQuBs63v323+iv0K/ajbp6JVKDsDJppa1Uu7Fk0iBqZr/l5/Bvx9yv3NauX KsK+Q/1oeKvfwGd36kvRSVHEf/jHwnQevAV0ThQI1M3tOzg1FK3oZkJ0EzvZHSa6 VjwlcTGXd3P0Kgg4BKOulOt1MSRCJPPX7Ca1hrRP6dMCQNDvCoZdnd/H2IfZ1obI WjLsVdJWnW8Io6gc8/hjE7t4PsfpzmAF/2HaEhiTnm7hsPviRbKiTdtkKhYKimwh hA/Uw0yLgdwy+70Zz0LPv7+kxOWrZhdBZ8Ls9q9r3zDTlWu+eUjz9ZQlAcoJv5RB dWgwwFHP+7a6qoz/ZndlqH64u56NJ1aXgG1PDVhjZ19Fkqqr5P06nc17vO+wiW2M /oquw9To4fNCtwajC/mgbEhwYycmRC8iCjd0UH7nGI/Ozl/vuSc= =3E7L -----END PGP SIGNATURE----- --Sig_/McFFFqceJxGix85d6=.xO_r--