From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from relay8-d.mail.gandi.net (relay8-d.mail.gandi.net [217.70.183.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E12F3196C7C; Thu, 6 Jun 2024 15:53:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717689187; cv=none; b=FsQwW8NTo8JBhQTRROPh1s/GS1HES5b9Lx/bfnjZ/bZS789ruVTnW+VwCNJ/urOJ9Vkr8PybW+4Qmu3b4x9p++RgSBUr537nTrMOs8qYTwfQcIKMGKLA4Dwi9Yv9mpvy0bAUEkFQ9HzvK15fkeDkiBrx5+1hJBiBzn0LTbSiS1Q= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717689187; c=relaxed/simple; bh=tTjASRihTSAqBdBo4miDRMTZLE7izCWc3a5OMOafW7I=; h=Date:From:To:Cc:Subject:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=XUKdSVsartIT9vnrRmndwDNWL7uuC110CBNJzsiuNIFSQM71xJ2WFr13zTnyCL1n4Jb3IomENf0TZoYw2pHVhZGx/nGr7rXuThEGLlfJbTcCQb0mqFzijJudLExupe0z6AN4LCuiVYomzI2sxFmmWqkR/U/XILFnlKwsTanoY1w= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=CHGEsgFQ; arc=none smtp.client-ip=217.70.183.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="CHGEsgFQ" Received: by mail.gandi.net (Postfix) with ESMTPSA id 1B8271BF20C; Thu, 6 Jun 2024 15:52:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1717689183; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=P1gsWIzttywwUfj8wVOsf1uZZgWknP5y8TDFvRDuZYk=; b=CHGEsgFQhxmgI9kit9UsDWhmeYkm1SMTfF4HSpSA7M8iIVcSVCK/UyOZq6Gy2jZ2rR87iy i4WYz6XtCmH99jmROTw+zPCWzvlakd/VZY3uWUitL6Mt0gOFiK65awIY1gDXmquhgHUcQW iO3ZNIG1VIWM/NyCMHeGs3p2//LfaVeliifa5/9HOfF7+fgLu+v0nRcnXDd+yJKrmUL19n dUhzhZNUZaWDNr8ORmOT+uj1yZFosizfn1V2Xh+hoHzgxLCwWnG0QGXkUct43JfJJ+rGu4 nU6OLVOZCMEDcgiCpaXDkS6Zkx6JvL154FuLaogp03TvT6quaxAiSbmgDQqBMQ== Date: Thu, 6 Jun 2024 17:52:58 +0200 From: Herve Codina To: Thomas Gleixner Cc: Simon Horman , Sai Krishna Gajula , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Lee Jones , Arnd Bergmann , Horatiu Vultur , UNGLinuxDriver@microchip.com, Andrew Lunn , Heiner Kallweit , Russell King , Saravana Kannan , Bjorn Helgaas , Philipp Zabel , Lars Povlsen , Steen Hegelund , Daniel Machon , Alexandre Belloni , linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, netdev@vger.kernel.org, linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Allan Nielsen , Luca Ceresoli , Thomas Petazzoni Subject: Re: [PATCH v2 10/19] irqdomain: Introduce irq_domain_alloc() and irq_domain_publish() Message-ID: <20240606175258.0e36ea98@bootlin.com> In-Reply-To: <8734pr5yq1.ffs@tglx> References: <20240527161450.326615-1-herve.codina@bootlin.com> <20240527161450.326615-11-herve.codina@bootlin.com> <8734pr5yq1.ffs@tglx> Organization: Bootlin X-Mailer: Claws Mail 4.2.0 (GTK 3.24.41; x86_64-redhat-linux-gnu) Precedence: bulk X-Mailing-List: linux-pci@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-GND-Sasl: herve.codina@bootlin.com Hi Thomas, On Wed, 05 Jun 2024 15:02:46 +0200 Thomas Gleixner wrote: > On Mon, May 27 2024 at 18:14, Herve Codina wrote: > > The irq_domain_add_*() family functions create an irq_domain and also > > publish this newly created to domain. Once an irq_domain is published, > > consumers can request IRQ in order to use them. > > > > Some interrupt controller drivers have to perform some more operations > > with the created irq_domain in order to have it ready to be used. > > For instance: > > - Allocate generic irq chips with irq_alloc_domain_generic_chips() > > - Retrieve the generic irq chips with irq_get_domain_generic_chip() > > - Initialize retrieved chips: set register base address and offsets, > > set several hooks such as irq_mask, irq_unmask, ... > > > > To avoid a window where the domain is published but not yet ready to be > > I can see the point, but why is this suddenly a problem? There are tons > of interrupt chip drivers which have exactly that pattern. > I thing the issue was not triggered because these interrupt chip driver are usually builtin compiled and the probe sequence is the linear one done at boot time. Consumers/supplier are probe sequentially without any parallel execution issues. In the LAN966x PCI device driver use case, the drivers were built as modules. Modules loading and drivers .probe() calls for the irqs supplier and irqs consumers are done in parallel. This reveals the race condition. > Also why is all of this burried in a series which aims to add a network > driver and touches the world and some more. If you had sent the two irq > domain patches seperately w/o spamming 100 people on CC then this would > have been solved long ago. That's documented clearly, no? Yes, the main idea of the series, as mentioned in the cover letter, is to give the big picture of the LAN966x PCI device use case in order to have all the impacted subsystems and drivers maintainers be aware of the global use case: DT overlay on top of PCI device. Of course, the plan is to split this series into smaller ones once parts get discussed in the DT overlay on top of PCI use case and reach some kind of maturity at least on the way to implement a solution. Thomas, do you prefer to have all the IRQ related patches extracted right now from this big picture series ? > > > void irq_domain_free_fwnode(struct fwnode_handle *fwnode); > > +struct irq_domain *irq_domain_alloc(struct fwnode_handle *fwnode, unsigned int size, > > + irq_hw_number_t hwirq_max, int direct_max, > > + const struct irq_domain_ops *ops, > > + void *host_data); > > + > > +static inline struct irq_domain *irq_domain_alloc_linear(struct fwnode_handle *fwnode, > > + unsigned int size, > > + const struct irq_domain_ops *ops, > > + void *host_data) > > +{ > > + return irq_domain_alloc(fwnode, size, size, 0, ops, host_data); > > +} > > So this creates exactly one wrapper, which means we'll grow another ton > of wrappers if that becomes popular for whatever reason. We have already > too many of variants for creating domains. > > But what's worse is that this does not work for hierarchical domains and > is just an ad hoc scratch my itch solution. > > Also looking at the irq chip drivers which use generic interrupt > chips. There are 24 instances of irq_alloc_domain_generic_chips() and > most of this code is just boilerplate. > > So what we really want is a proper solution to get rid of this mess > instead of creating interfaces which just proliferate and extend it. > > Something like the uncompiled below allows to convert all the > boilerplate into a template based setup/remove. > > I just converted a random driver over to it and the result is pretty > neutral in terms of lines, but the amount of code to get wrong is > significantly smaller. I'm sure that more complex drivers will benefit > even more and your problem should be completely solved by that. > > The below is just an initial sketch which allows further consolidation > in the irqdomain space. You get the idea. Got it, thanks a lot for the idea, the sketch and the way to use it in drivers. I will rework my patches in that way. Thanks, Hervé From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 43575C25B75 for ; Thu, 6 Jun 2024 15:53:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=VU6ou2Cbdce9m1tTudw8RfxEZLjio3gVe/dIgQ6a3iU=; b=f5oqfVs9e9iAU7 eP5wja+OMTbQrCFJGu8MSTrS528RrPcs4HggZlVkZgq5dwofWWIQcAT0CRCya4E7Vnm5FUx5amJ9r GqMn5y9qcdZtTiNtujuwR8SkMn6gIVwT8znOD7yVNvsC+soCGCkLVsVf2nFm3XWaRnjIiyl8WL8gp n/2BroULhbiyEww/2H8oHc7XiyS2x6g2J9aRCKknefB0MPxfXvEpU7OgFDsznsGYSM/MgmYhY23Wl TsQu+3n9ZRCQegKknxvuJUAWhdH+sHifx1du7EZk9S7wkRkEVPahI8LY1HmE1mA1CpQoRiW4/iGyD qDFO20gBfrnB36rosvGQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sFFQM-0000000ANdC-33Wo; Thu, 06 Jun 2024 15:53:10 +0000 Received: from relay8-d.mail.gandi.net ([2001:4b98:dc4:8::228]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sFFQI-0000000ANbt-3WsU for linux-arm-kernel@lists.infradead.org; Thu, 06 Jun 2024 15:53:09 +0000 Received: by mail.gandi.net (Postfix) with ESMTPSA id 1B8271BF20C; Thu, 6 Jun 2024 15:52:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1717689183; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=P1gsWIzttywwUfj8wVOsf1uZZgWknP5y8TDFvRDuZYk=; b=CHGEsgFQhxmgI9kit9UsDWhmeYkm1SMTfF4HSpSA7M8iIVcSVCK/UyOZq6Gy2jZ2rR87iy i4WYz6XtCmH99jmROTw+zPCWzvlakd/VZY3uWUitL6Mt0gOFiK65awIY1gDXmquhgHUcQW iO3ZNIG1VIWM/NyCMHeGs3p2//LfaVeliifa5/9HOfF7+fgLu+v0nRcnXDd+yJKrmUL19n dUhzhZNUZaWDNr8ORmOT+uj1yZFosizfn1V2Xh+hoHzgxLCwWnG0QGXkUct43JfJJ+rGu4 nU6OLVOZCMEDcgiCpaXDkS6Zkx6JvL154FuLaogp03TvT6quaxAiSbmgDQqBMQ== Date: Thu, 6 Jun 2024 17:52:58 +0200 From: Herve Codina To: Thomas Gleixner Cc: Simon Horman , Sai Krishna Gajula , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Lee Jones , Arnd Bergmann , Horatiu Vultur , UNGLinuxDriver@microchip.com, Andrew Lunn , Heiner Kallweit , Russell King , Saravana Kannan , Bjorn Helgaas , Philipp Zabel , Lars Povlsen , Steen Hegelund , Daniel Machon , Alexandre Belloni , linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, netdev@vger.kernel.org, linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Allan Nielsen , Luca Ceresoli , Thomas Petazzoni Subject: Re: [PATCH v2 10/19] irqdomain: Introduce irq_domain_alloc() and irq_domain_publish() Message-ID: <20240606175258.0e36ea98@bootlin.com> In-Reply-To: <8734pr5yq1.ffs@tglx> References: <20240527161450.326615-1-herve.codina@bootlin.com> <20240527161450.326615-11-herve.codina@bootlin.com> <8734pr5yq1.ffs@tglx> Organization: Bootlin X-Mailer: Claws Mail 4.2.0 (GTK 3.24.41; x86_64-redhat-linux-gnu) MIME-Version: 1.0 X-GND-Sasl: herve.codina@bootlin.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240606_085308_231216_E8B1791B X-CRM114-Status: GOOD ( 34.64 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgVGhvbWFzLAoKT24gV2VkLCAwNSBKdW4gMjAyNCAxNTowMjo0NiArMDIwMApUaG9tYXMgR2xl aXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4gd3JvdGU6Cgo+IE9uIE1vbiwgTWF5IDI3IDIwMjQg YXQgMTg6MTQsIEhlcnZlIENvZGluYSB3cm90ZToKPiA+IFRoZSBpcnFfZG9tYWluX2FkZF8qKCkg ZmFtaWx5IGZ1bmN0aW9ucyBjcmVhdGUgYW4gaXJxX2RvbWFpbiBhbmQgYWxzbwo+ID4gcHVibGlz aCB0aGlzIG5ld2x5IGNyZWF0ZWQgdG8gZG9tYWluLiBPbmNlIGFuIGlycV9kb21haW4gaXMgcHVi bGlzaGVkLAo+ID4gY29uc3VtZXJzIGNhbiByZXF1ZXN0IElSUSBpbiBvcmRlciB0byB1c2UgdGhl bS4KPiA+Cj4gPiBTb21lIGludGVycnVwdCBjb250cm9sbGVyIGRyaXZlcnMgaGF2ZSB0byBwZXJm b3JtIHNvbWUgbW9yZSBvcGVyYXRpb25zCj4gPiB3aXRoIHRoZSBjcmVhdGVkIGlycV9kb21haW4g aW4gb3JkZXIgdG8gaGF2ZSBpdCByZWFkeSB0byBiZSB1c2VkLgo+ID4gRm9yIGluc3RhbmNlOgo+ ID4gICAtIEFsbG9jYXRlIGdlbmVyaWMgaXJxIGNoaXBzIHdpdGggaXJxX2FsbG9jX2RvbWFpbl9n ZW5lcmljX2NoaXBzKCkKPiA+ICAgLSBSZXRyaWV2ZSB0aGUgZ2VuZXJpYyBpcnEgY2hpcHMgd2l0 aCBpcnFfZ2V0X2RvbWFpbl9nZW5lcmljX2NoaXAoKQo+ID4gICAtIEluaXRpYWxpemUgcmV0cmll dmVkIGNoaXBzOiBzZXQgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIGFuZCBvZmZzZXRzLAo+ID4gICAg IHNldCBzZXZlcmFsIGhvb2tzIHN1Y2ggYXMgaXJxX21hc2ssIGlycV91bm1hc2ssIC4uLgo+ID4K PiA+IFRvIGF2b2lkIGEgd2luZG93IHdoZXJlIHRoZSBkb21haW4gaXMgcHVibGlzaGVkIGJ1dCBu b3QgeWV0IHJlYWR5IHRvIGJlICAKPiAKPiBJIGNhbiBzZWUgdGhlIHBvaW50LCBidXQgd2h5IGlz IHRoaXMgc3VkZGVubHkgYSBwcm9ibGVtPyBUaGVyZSBhcmUgdG9ucwo+IG9mIGludGVycnVwdCBj aGlwIGRyaXZlcnMgd2hpY2ggaGF2ZSBleGFjdGx5IHRoYXQgcGF0dGVybi4KPiAKCkkgdGhpbmcg dGhlIGlzc3VlIHdhcyBub3QgdHJpZ2dlcmVkIGJlY2F1c2UgdGhlc2UgaW50ZXJydXB0IGNoaXAg ZHJpdmVyCmFyZSB1c3VhbGx5IGJ1aWx0aW4gY29tcGlsZWQgYW5kIHRoZSBwcm9iZSBzZXF1ZW5j ZSBpcyB0aGUgbGluZWFyIG9uZQpkb25lIGF0IGJvb3QgdGltZS4gQ29uc3VtZXJzL3N1cHBsaWVy IGFyZSBwcm9iZSBzZXF1ZW50aWFsbHkgd2l0aG91dCBhbnkKcGFyYWxsZWwgZXhlY3V0aW9uIGlz c3Vlcy4KCkluIHRoZSBMQU45NjZ4IFBDSSBkZXZpY2UgZHJpdmVyIHVzZSBjYXNlLCB0aGUgZHJp dmVycyB3ZXJlIGJ1aWx0IGFzCm1vZHVsZXMuIE1vZHVsZXMgbG9hZGluZyBhbmQgZHJpdmVycyAu cHJvYmUoKSBjYWxscyBmb3IgdGhlIGlycXMgc3VwcGxpZXIKYW5kIGlycXMgY29uc3VtZXJzIGFy ZSBkb25lIGluIHBhcmFsbGVsLiBUaGlzIHJldmVhbHMgdGhlIHJhY2UgY29uZGl0aW9uLgoKPiBB bHNvIHdoeSBpcyBhbGwgb2YgdGhpcyBidXJyaWVkIGluIGEgc2VyaWVzIHdoaWNoIGFpbXMgdG8g YWRkIGEgbmV0d29yawo+IGRyaXZlciBhbmQgdG91Y2hlcyB0aGUgd29ybGQgYW5kIHNvbWUgbW9y ZS4gSWYgeW91IGhhZCBzZW50IHRoZSB0d28gaXJxCj4gZG9tYWluIHBhdGNoZXMgc2VwZXJhdGVs eSB3L28gc3BhbW1pbmcgMTAwIHBlb3BsZSBvbiBDQyB0aGVuIHRoaXMgd291bGQKPiBoYXZlIGJl ZW4gc29sdmVkIGxvbmcgYWdvLiBUaGF0J3MgZG9jdW1lbnRlZCBjbGVhcmx5LCBubz8KClllcywg dGhlIG1haW4gaWRlYSBvZiB0aGUgc2VyaWVzLCBhcyBtZW50aW9uZWQgaW4gdGhlIGNvdmVyIGxl dHRlciwgaXMgdG8KZ2l2ZSB0aGUgYmlnIHBpY3R1cmUgb2YgdGhlIExBTjk2NnggUENJIGRldmlj ZSB1c2UgY2FzZSBpbiBvcmRlciB0byBoYXZlCmFsbCB0aGUgaW1wYWN0ZWQgc3Vic3lzdGVtcyBh bmQgZHJpdmVycyBtYWludGFpbmVycyBiZSBhd2FyZSBvZiB0aGUgZ2xvYmFsCnVzZSBjYXNlOiBE VCBvdmVybGF5IG9uIHRvcCBvZiBQQ0kgZGV2aWNlLgpPZiBjb3Vyc2UsIHRoZSBwbGFuIGlzIHRv IHNwbGl0IHRoaXMgc2VyaWVzIGludG8gc21hbGxlciBvbmVzIG9uY2UgcGFydHMKZ2V0IGRpc2N1 c3NlZCBpbiB0aGUgRFQgb3ZlcmxheSBvbiB0b3Agb2YgUENJIHVzZSBjYXNlIGFuZCByZWFjaCBz b21lIGtpbmQKb2YgbWF0dXJpdHkgYXQgbGVhc3Qgb24gdGhlIHdheSB0byBpbXBsZW1lbnQgYSBz b2x1dGlvbi4KClRob21hcywgZG8geW91IHByZWZlciB0byBoYXZlIGFsbCB0aGUgSVJRIHJlbGF0 ZWQgcGF0Y2hlcyBleHRyYWN0ZWQgcmlnaHQKbm93IGZyb20gdGhpcyBiaWcgcGljdHVyZSBzZXJp ZXMgPwoKPiAKPiA+ICB2b2lkIGlycV9kb21haW5fZnJlZV9md25vZGUoc3RydWN0IGZ3bm9kZV9o YW5kbGUgKmZ3bm9kZSk7Cj4gPiArc3RydWN0IGlycV9kb21haW4gKmlycV9kb21haW5fYWxsb2Mo c3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSwgdW5zaWduZWQgaW50IHNpemUsCj4gPiArCQkJ CSAgICBpcnFfaHdfbnVtYmVyX3QgaHdpcnFfbWF4LCBpbnQgZGlyZWN0X21heCwKPiA+ICsJCQkJ ICAgIGNvbnN0IHN0cnVjdCBpcnFfZG9tYWluX29wcyAqb3BzLAo+ID4gKwkJCQkgICAgdm9pZCAq aG9zdF9kYXRhKTsKPiA+ICsKPiA+ICtzdGF0aWMgaW5saW5lIHN0cnVjdCBpcnFfZG9tYWluICpp cnFfZG9tYWluX2FsbG9jX2xpbmVhcihzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlLAo+ID4g KwkJCQkJCQkgdW5zaWduZWQgaW50IHNpemUsCj4gPiArCQkJCQkJCSBjb25zdCBzdHJ1Y3QgaXJx X2RvbWFpbl9vcHMgKm9wcywKPiA+ICsJCQkJCQkJIHZvaWQgKmhvc3RfZGF0YSkKPiA+ICt7Cj4g PiArCXJldHVybiBpcnFfZG9tYWluX2FsbG9jKGZ3bm9kZSwgc2l6ZSwgc2l6ZSwgMCwgb3BzLCBo b3N0X2RhdGEpOwo+ID4gK30gIAo+IAo+IFNvIHRoaXMgY3JlYXRlcyBleGFjdGx5IG9uZSB3cmFw cGVyLCB3aGljaCBtZWFucyB3ZSdsbCBncm93IGFub3RoZXIgdG9uCj4gb2Ygd3JhcHBlcnMgaWYg dGhhdCBiZWNvbWVzIHBvcHVsYXIgZm9yIHdoYXRldmVyIHJlYXNvbi4gV2UgaGF2ZSBhbHJlYWR5 Cj4gdG9vIG1hbnkgb2YgdmFyaWFudHMgZm9yIGNyZWF0aW5nIGRvbWFpbnMuCj4gCj4gQnV0IHdo YXQncyB3b3JzZSBpcyB0aGF0IHRoaXMgZG9lcyBub3Qgd29yayBmb3IgaGllcmFyY2hpY2FsIGRv bWFpbnMgYW5kCj4gaXMganVzdCBhbiBhZCBob2Mgc2NyYXRjaCBteSBpdGNoIHNvbHV0aW9uLgo+ IAo+IEFsc28gbG9va2luZyBhdCB0aGUgaXJxIGNoaXAgZHJpdmVycyB3aGljaCB1c2UgZ2VuZXJp YyBpbnRlcnJ1cHQKPiBjaGlwcy4gVGhlcmUgYXJlIDI0IGluc3RhbmNlcyBvZiBpcnFfYWxsb2Nf ZG9tYWluX2dlbmVyaWNfY2hpcHMoKSBhbmQKPiBtb3N0IG9mIHRoaXMgY29kZSBpcyBqdXN0IGJv aWxlcnBsYXRlLgo+IAo+IFNvIHdoYXQgd2UgcmVhbGx5IHdhbnQgaXMgYSBwcm9wZXIgc29sdXRp b24gdG8gZ2V0IHJpZCBvZiB0aGlzIG1lc3MKPiBpbnN0ZWFkIG9mIGNyZWF0aW5nIGludGVyZmFj ZXMgd2hpY2gganVzdCBwcm9saWZlcmF0ZSBhbmQgZXh0ZW5kIGl0Lgo+IAo+IFNvbWV0aGluZyBs aWtlIHRoZSB1bmNvbXBpbGVkIGJlbG93IGFsbG93cyB0byBjb252ZXJ0IGFsbCB0aGUKPiBib2ls ZXJwbGF0ZSBpbnRvIGEgdGVtcGxhdGUgYmFzZWQgc2V0dXAvcmVtb3ZlLgo+IAo+IEkganVzdCBj b252ZXJ0ZWQgYSByYW5kb20gZHJpdmVyIG92ZXIgdG8gaXQgYW5kIHRoZSByZXN1bHQgaXMgcHJl dHR5Cj4gbmV1dHJhbCBpbiB0ZXJtcyBvZiBsaW5lcywgYnV0IHRoZSBhbW91bnQgb2YgY29kZSB0 byBnZXQgd3JvbmcgaXMKPiBzaWduaWZpY2FudGx5IHNtYWxsZXIuIEknbSBzdXJlIHRoYXQgbW9y ZSBjb21wbGV4IGRyaXZlcnMgd2lsbCBiZW5lZml0Cj4gZXZlbiBtb3JlIGFuZCB5b3VyIHByb2Js ZW0gc2hvdWxkIGJlIGNvbXBsZXRlbHkgc29sdmVkIGJ5IHRoYXQuCj4gCj4gVGhlIGJlbG93IGlz IGp1c3QgYW4gaW5pdGlhbCBza2V0Y2ggd2hpY2ggYWxsb3dzIGZ1cnRoZXIgY29uc29saWRhdGlv bgo+IGluIHRoZSBpcnFkb21haW4gc3BhY2UuIFlvdSBnZXQgdGhlIGlkZWEuCgpHb3QgaXQsIHRo YW5rcyBhIGxvdCBmb3IgdGhlIGlkZWEsIHRoZSBza2V0Y2ggYW5kIHRoZSB3YXkgdG8gdXNlIGl0 IGluCmRyaXZlcnMuIEkgd2lsbCByZXdvcmsgbXkgcGF0Y2hlcyBpbiB0aGF0IHdheS4KClRoYW5r cywKSGVydsOpCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f XwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmlu ZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9s aW51eC1hcm0ta2VybmVsCg==