# Maven dependency Problem ?



## Hein_nieH (12. Jul 2021)

Hallo Fans der Bits und Bytes,

ich stehe vor einem Problem, das ich nicht lösen kann,
Ich habe ine Programm geschrieben was PDF Dateien erzeugen soll.
Hierzu nutze ich die Apache-Bibliothek fop.2.6 (zip) heruntergeladen.

Erzeuge ich die Application in Eclipse als Run As Java Application funktioniert alles wie es soll.
Baue ich das Projekt über Maven, so wird die Applikation erstellt (Gui funktioniert) , jedoch wird keine PDF erstellt.

Ursache sind dieser Code

        // create an instance of fop factory
        FopFactory fopFactory = FopFactory.newInstance(    new File(".").toURI());

Hier noch die eingebundenen Klassen
        import org.apache.fop.apps.FOPException;
        import org.apache.fop.apps.FOUserAgent;
        import org.apache.fop.apps.Fop;
        import org.apache.fop.apps.FopFactory;
        import org.apache.fop.apps.MimeConstants;

Meine Vermutung ist, dass über in Maven Dependency andere Versionen (hier wohl org.apache.fop) in das Repository eingebunden werden als in  fop 2.6. vorhanden sind.
Meine Frage: Wie kann ich die Versionen der in fop 2.6. enthaltenen jar-Dateien feststellen insbesondere fuer fop?
Hier die in meinem Programm genutzen Bibliotheken aus fop2.6
batik-all-1.14.jar
commons-io-1.3.1.jar
commons-logging-1.0.4.jar
fop.jar (im Unterverzeichnis build enthalten)
xmlgraphics-commons-2.6.jar

Die fop-Bibliothek habe ich in Maven wie folgt eingebunden:

        <dependency>
            <groupId>org.apache.xmlgraphics</groupId>
            <artifactId>fop</artifactId>
            <version>2.6</version>
        </dependency>

Kenn mir jemand weiterhelfen?

Gruss Hein_nieH


----------



## mihe7 (12. Jul 2021)

Mit dem Maven dependency-Plugin kannst Du Dir die notwendigen Abhängigkeiten in ein Verzeichnis (Standard: target/dependencies) kopieren lassen.

```
mvn dependency:copy-dependencies -DincludeScope=runtime
```


----------



## Hein_nieH (13. Jul 2021)

Hallo,

@mihe7 danke für das feedback

Nachstehende Funktion (habe ich aus dem Netz) funktioniert in einer Java-Application tadellos.
Versuche ich das ganze mit Maven zu bauen (fop 2.6) gibt es in der Zeile
    FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
Probleme.
Im Maven-Bild wird dieser Befehl einfach verschluckt.
Ich habe auch schon einen try-catch-block herumgebaut aber es wird keine Exceptio geworfen.
Ich vermute, dass ich in der dependency definition etwas falsch gemacht habe (oder auch nicht???)

batik-all-1.14.jar
commons-io-1.3.1.jar
commons-logging-1.0.4.jar
fop.jar (im Unterverzeichnis build enthalten)
xmlgraphics-commons-2.6.jar

Sofern jemand das generieren einer pdf mit einem MavenBuild hinbekommen hat wäre ich über einen Hinweis sehr dankbar.
Es muss auch nicht zwingend fop 2.6 sein.
Im Anhang ein Auszug aus der pom.xml und der Java Funktionscode bei dem es Probleme gibt.

Gruss Hein_nieH

[CODE lang="xml" title="Auszug aus pom"]        <!--  dependency für fop -->

        <dependency>
            <groupId>org.apache.xmlgraphics</groupId>
            <artifactId>fop</artifactId>
            <version>2.6</version>
        </dependency>

        <!-- XML Graphics -->
        <dependency>
              <groupId>org.apache.xmlgraphics</groupId>
              <artifactId>xmlgraphics-commons</artifactId>
              <version>1.4</version>
        </dependency>

        <dependency>
            <groupId>org.apache.xmlgraphics</groupId>
            <artifactId>batik-all</artifactId>
             <version>1.14</version>
        </dependency>


        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.0.4</version>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.3.1</version>
        </dependency>

        <!-- -->
        <dependency>
              <groupId>org.apache.avalon.framework</groupId>
              <artifactId>avalon-framework-api</artifactId>
              <version>4.3.1</version>
        </dependency>

          <dependency>
            <groupId>org.apache.avalon.framework</groupId>
            <artifactId>avalon-framework-impl</artifactId>
            <version>4.3.1</version>
        </dependency>[/CODE]



[CODE lang="java" title="ConvertToPDF"]/**
* Method that will convert the given XML to PDF
* @throws IOException
* @throws FOPException
* @throws TransformerException
*/
public void convertToPDF() throws IOException, FOPException, TransformerException
{
    // the XSL FO file
    File xsltFile = new File("F:\\Temp\\template.xsl");
    // the XML file which provides the input
    StreamSource xmlSource = new StreamSource(new File("F:\\Temp\\Employees.xml"));

    // create an instance of fop factory
    // ----> bei einem build in Maven wird dieser Befehl nicht ausgeführt !!!
    // es wird auch keine Exception geworfen!!!
    FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());


    // a user agent is needed for transformation
    FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
    // Setup output
    OutputStream out;
    out = new java.io.FileOutputStream("F:\\Temp\\employee.pdf");
    try
    {
        // Construct fop with desired output format
        Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
        // Setup XSLT
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer(new
        StreamSource(xsltFile));
        // Resulting SAX events (the generated FO) must be piped through
        // to FOP
        Result res = new SAXResult(fop.getDefaultHandler());
        // Start XSLT transformation and FOP processing
        // That's where the XML is first transformed to XSL-FO and then
        // PDF is created
        transformer.transform(xmlSource, res);
    }
    finally
    {
        out.close();
    }
}//convertToPDF[/CODE]


----------



## LimDul (13. Jul 2021)

In einem Maven Build wird sowieso kein Code ausgeführt, ich hoffe du meinst wenn du die Jar danach startest. 

File(".") wird sich auf das Verzeichnis beziehen, in das Jar File liegt. Liegt in dem Verzeichnis auch eine Konfiguration für Fop? Odre liegt die im Jar drin - dann musst du mit getResourceAsStream arbeiten.

Bzgl. Exceptions - wo ist der catch Block? Damit man sehen kann, ob die Exceptions wirklich korrekt behandelt werden.


----------



## Hein_nieH (13. Jul 2021)

Hallo LimDul,

danke für die Antwort.
Ja ich meine natürlich die jar.Datei, welche via Maven gebaut wurde.

Den try-catch Block habe ich wieder herausgenommen und die Funktion so dargestellt wie ich sie im Netz gefunden habe.

Der Ansatz mit getstream klingt logisch.
Wie müsste die Codezeile aussehen, wenn ich mit getResourceAsStream  arbeite?

Gruss Hein_nieH


----------



## kneitzel (13. Jul 2021)

Da eine URI erwartet wird bei dem aktuellen Aufruf und ich nicht weiss, ob die Methode überladen wurde, würde ich mit der URI weiter arbeiten:
`FopFactory.newInstance(new File(".").toURI());`
könnte dann z.B. so aussehen:
`FopFactory.newInstance(getClass().getResource(".").toURI());`

Das wäre so ein erster Ansatz, wobei ich mir diese FOP API (wie bereits erwähnt) noch nicht angesehen habe.


----------



## LimDul (13. Jul 2021)

Die bietet auch eine Methode


Hein_nieH hat gesagt.:


> Hallo LimDul,
> 
> danke für die Antwort.
> Ja ich meine natürlich die jar.Datei, welche via Maven gebaut wurde.
> ...


Wie @kneitzel gerade schon geantwortet hat, kann man es so machen. Ansonsten bietet die API noch eine Methode mit URI + Stream (keine Ahnung wie die genau funktioniert)

Ich glaube übrigens nicht, das keine Exception geworfen wird, ich rechne schon damit das eine - vermutlich FOPException kommt. Man sieht im deinem Code nicht, wo die gefangen wird. Daher wäre es interessant wo der Catch-Block dazu ist und wie der aussieht.


----------



## Hein_nieH (13. Jul 2021)

Hallo

danke für die Antworten

@kneitzel: ich habe folgendes versucht
FopFactory.newInstance(getClass().getResource(".").toURI());
Das verträgt sich nicht mit der Zeile: FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
FOUserAgent schein nur bei FopFactory.newInstance(new File(".").toURI()); zu funktionieren.

Ich habe mal so etwas versucht:
FopFactory fopFactory = FopFactory.newInstance(    new File( String.class.getResourceAsStream(".").toString() ).toURI());  
das funktioniert auch nicht, da dann eine NullPointerException geworfen wird.

Was wäre noch möglich  
Ich denke mal, dass ich nicht der Erste bin, der mit einer unter Maven erstellten jar Pdf-Dateien erzeugen will.

Gruss Hein_nieH


----------



## kneitzel (13. Jul 2021)

Mir fehlt da der Überblick, was du genau gemacht wird. Da wird ja jetzt noch keine Datei geöffnet. "." ist ja ein Verzeichnis. Ohne Zusammenhänge, was FOP wie machen will / Versucht, ist es schwer, da irgendwas zu sagen. Wo wird denn dann auf eine Ressource zugegriffen?

Dein Versuch mit dem Stream ist natürlich quatsch. Du bekommst einen Stream und mit toString() bekommst Du dann ein String mit Klassenname@hashcode - und das gibst Du dann dem File Konstruktor als Dateiname? Also nicht wirklich durchdacht.


----------



## LimDul (13. Jul 2021)

Set FopFactoryBuilder baseURI to jar classpath
					

I'm upgrading an Apache FOP 1.0 project to Apache FOP 2.1. In this project, all necessary files are packaged within the jar file.  I've added the new FopFactoryBuilder to generate a FopFactory




					stackoverflow.com


----------



## Hein_nieH (13. Jul 2021)

Hallo



> Mir fehlt da der Überblick, was du genau gemacht wird.



Ich zeige mal das Tutorial welches ich als Vorlage genommen habe (habe ich in Word etwas aufgearbeitet).
Den Code zur PDF Erzeugung aus dem Tutorial habe in mein Programm eingebaut. Ich habe mein Programm (mit eigebautem pdf-Converter) als jar via Maven erstellt.

Ich habe die Codezeile
FopFactory.newInstance(new File(".").toURI())
in einen try/catch Block eingebaut.
Da kam wirklich keine Fehlermeldung worüber ich mich sehr gewundert habe, sonst hätte ich einen ersten Ansatz die Ursache zu erkennen.

Gruss Hein_nieH


----------



## LimDul (13. Jul 2021)

Hein_nieH hat gesagt.:


> Hallo
> 
> 
> 
> ...


Wie sieht den der try/catch block aus?


----------



## kneitzel (13. Jul 2021)

Jetzt hat sich das überschnitten mit dem, was @LimDul gefunden und gepostet hat.

Aber ich verzichte jetzt einmal darauf, alles zu löschen und gebe mal einfach weiter, was ich so gefunden habe:


Auf








						Apache(tm) FOP: Embedding
					





					xmlgraphics.apache.org
				



wird die Factory mit einem Config-File erstellt. 
`FopFactory fopFactory = FopFactory.newInstance(new File("C:/Temp/fop.xconf"));`

Hast Du denn so ein Config File? Wenn das als Ressource mitgegeben wurde, dann wäre die Frage, wo das genau liegt. Und dann kann man das mit Pfad genau angeben. Die URI ist ja nur ein Base Path. Wo soll der genau liegen? Wo liegen Deine Ressourcen bezüglich genau?

`getClass().getRessource(".")` ist halt relativ innerhalb des jar Files im Namespace der Klasse.
Das ist also ggf. noch anzupassen, also z.B. in
`getClass().getRessource("/")`
um ins root zu wechseln. 
==> Mit der Info von @LimDul wird dies aber vermutlich nicht reichen, um Ressourcen zu finden. Diese sollten dann als classpath im Config-File angegeben werden. Dann sollte es aber mit der Änderung des Config-Files passen, wenn man dann das Config-File als Stream mitgibt:

Dann gibt es noch eine Überladung von newInstance, die noch zusätzlich einen Stream nimmt (Hatte die API von 2.6 jetzt nicht im Netz gefunden - nur die von der 2.3 ... evtl. hat es sich also geändert ...) 

Das wäre dann etwas wie:
`FopFactory fopFactory = FopFactory.newInstance(getClass().getRessource("/").toURI(), getClass().getRessourceAsStream("/fop.xconf"));`


----------



## Hein_nieH (13. Jul 2021)

Hallo

@LimDul: Das probiere ich mal aus und gebe dann Rauchzeichen  

Es scheint dann wohl doch nicht an der Dependency- Definiton zu liegen, was ich ursprünglich dachte.

Gruss Hein_neiH


----------



## Hein_nieH (13. Jul 2021)

Hallo 

ich habe den Hinweis von LimDul ausprobiert aber irgend etwas mache ich falsch oder habe es nicht richtig verstanden.

ich habe wie im Beispiel beschrieben die classe ClasspathResolverURIAdapter erstellt.

Wenn ich das richtig verstehe nutze ich jetzt
FopFactoryBuilder fopBuilder = new FopFactoryBuilder(new File(".").toURI(), new ClasspathResolverURIAdapter());
statt 
FopFactory fopFactory = FopFactory.newInstance(    new File(".").toURI() );

wenn ich FopFactoryBuilder nutze dann gibt es Probleme bei folgenden Zeilen
FOUserAgent fopBuilder = fopFactory.newFOUserAgent();
Fop fop = fopBuilder .newFop(MimeConstants.MIME_PDF, foUserAgent, out);

Wie muesste die Lösung aussehen, wenn ich FopFactoryBuilder nutze?

Gruss Hein_nieH


----------



## LimDul (13. Jul 2021)

ich kenne die Bibliothek nicht - das heißt ich gebe nur Tipps, den Rest muss man - ggf. mit Selber debuggen - rausfinden. Frage wäre immer noch nach dem try/catch Block, wie der ausgesehen hat. Weil ich glaube immer noch nicht, das keine Exception kommt.

*Erste Regel beim analysieren von Problemen anderer Leuter*: Vertraue Ihnen niemals. Wenn sie sagen ich habe "x" gemacht aber es hat nicht geholfen. Lass dir "x" zeigen. Dementsprechend - solange ich deinen Code mit Exception Handling nicht sehe, glaube ich dir nicht, dass da keine Exception gekommen ist.
Das hat nix mit Misstrauen gegen über dir speziell zu tun - das würde ich @kneitzel oder meinen Kollegen nicht glauben - und ich würde auch erwarten das man mir das nicht glaubt wenn ich das behaupte. Man ist selber sehr oft betriebsblind und sieht einfachste Dinge nicht, die ein Dritter der draufguckt, dann sieht.


----------



## Hein_nieH (13. Jul 2021)

Hallo

@LimDul ich mache dann noch mal das Beispiel mit dem try/catch Block fertig

@kneitzel:  ich habe die Zeile
FopFactory fopFactory = FopFactory.newInstance(getClass().getRessource("/").toURI(), getClass().getRessourceAsStream("/fop.xconf"));
ausprobiert. Die Methode newInstance zeigt dann bei mir einen fehler.

Für heute muss ich erst einmal Schluss machen.
Danke für die Hilfe. Wäre schön wenn sich zu dem Problem eine Lösung finden lässt  

Gruss Hein_nieH


----------



## Hein_nieH (15. Jul 2021)

Problem geloest  

Hallo,

Das Problem konnte ich selbst lösen.

Wenn die jar in Maven erzeugt wird muss die FopFactory wie folgt instanziert werden:

statt:
FopFactory fopFactory = FopFactory.newInstance( new File(".").toURI() );

ist zu benutzen:
FopFactoryBuilder builder = new FopFactoryBuilder(new File(".").toURI(), new ClasspathResolverURIAdapter());
FopFactory fopFactory = builder.build();

Die Klasse ClasspathResolverURIAdapter hat folgenden Code
@LimDul: der Tipp war richtig

[CODE lang="java" title="ClasspathResolverURIAdapter"]package action;

import java.io.IOException;
import java.iutputStream;
import java.net.URI;
import java.net.URL;

import org.apache.fop.apps.io.ResourceResolverFactory;
import org.apache.xmlgraphics.io.Resource;
import org.apache.xmlgraphics.io.ResourceResolver;

public class ClasspathResolverURIAdapter implements ResourceResolver
{
    private final ResourceResolver wrapped;

    public ClasspathResolverURIAdapter()
    {
        this.wrapped = ResourceResolverFactory.createDefaultResourceResolver();
    }//Konstruktor

    //@Override
    public Resource getResource(URI uri) throws IOException
    {
        if (uri.getScheme().equals("classpath"))
        {
            URL url = getClass().getClassLoader().getResource(uri.getSchemeSpecificPart());

            return new Resource(url.openStream());
        }
        else
        {
            return wrapped.getResource(uri);
        }
    }//getResource

    //@Override
    public OutputStream getOutputStream(URI uri) throws IOException
    {
        return wrapped.getOutputStream(uri);
    }

}//class
[/CODE]

Und für alle die es nicht glauben möchten in einer via Maven erzeugten jar
wirft die in einem try/catch block enthaltene Zeile

FopFactory fopFactory = FopFactory.newInstance( new File(".").toURI() );

wirklich keine Exception, sondern verschluckt den Befehl einfach.

Gruss Hein_nieH


----------



## mrBrown (15. Jul 2021)

Hein_nieH hat gesagt.:


> Und für alle die es nicht glauben möchten in einer via Maven erzeugten jar
> wirft die in einem try/catch block enthaltene Zeile
> 
> FopFactory fopFactory = FopFactory.newInstance( new File(".").toURI() );
> ...


Du hast den try-catch-Block allerdings bisher auch noch nicht gezeigt 

Das Code einfach "verschluckt" wird, gibt es in Java halt nicht. Entweder er wird ausgeführt, oder es gibt eine Exception.


----------



## Hein_nieH (31. Jul 2021)

Hallo,

um keinen neuen Thread zu öffnen möchte ich hier eine artverwandte Frage stellen.
Für mein o.g. Programm nutze ich die Apache-Bibliothek fop.2.6 (zip) .


Mein Problem: 
Ich erzeuge mit meinem Programm pdf-Dateien, welche auch Grafiken erhalten.
Starte ich die Application in Eclipse als Run As Java Application funktioniert alles wie es soll.
Das heisst in der erzeugten pdf.-Datei werden die Grafiken (welche in der xsl-Datei definiert sind) auch richtig dargestellt.
Für Testzwecke habe ich in der xsl-Datei absolute Pfade zu den Grafiken angegeben.

Baue ich das Projekt über Maven, so erzeugt die Applikation auch pdf-Dateien, jedoch ohne Grafiken.

Als externe Bibliothek habe ich in den Java Build Path fop.jar eingebunden.

In der Maven Pom habe ich folgenders Codesegment als dependency

[CODE lang="xml" title="pom - Schnipsel"]        <dependency>
            <groupId>org.apache.xmlgraphics</groupId>
            <artifactId>fop</artifactId>
            <version>2.6</version>
        </dependency>[/CODE]

Nach meinem Verständnis  müssen für fop keine weitern Bibliotheken verwendet werden, da fop.jar alle notwendigen integriert hat.
Meine Frage:
Wo müsste/könnte ich noch etwas ändern, damit eine via Maven erstellte Application in der zu erzeugenden pdf-auch die Grafiken richtig darstellt.
Mir sind die Ideen ausgegangen.

Über einen konstruktiven Hinweis würde ich mich sehr freuen.

Gruss Hein_nieH


----------



## kneitzel (31. Jul 2021)

Wo liegen denn die Grafiken? Wie referenzierst Du diese?

Wenn die mit im jar File sind, dann hilft evtl. der folgende Thread, den ich auf die Schnelle für Dich finden konnte.





						FOP - Users - Referring to a image file in a JAR file
					

Referring to a image file in a JAR file.  Hi, I am trying to refer to a graphic file within a JAR file. The JAR file contains the application which is being executed along with the aforementioned...



					apache-fop.1065347.n5.nabble.com


----------



## Hein_nieH (31. Jul 2021)

Hallo kneitzel,

Die darzustellenden Grafiken befinden sich nicht in der jar-Datei, sondern nativ an einem anderen Ort, siehe Ausschnitt aus der Szylesheet-Datei.
Wie oben geschrieben habe ich nur fop.jar (aus fop 2.6) in den Build-Path eingebunden.
Wenn ich aus Eclipse (run as application) die Application starte, dann wird in der Application auch das pdf mit Grafik ordnungsgemäß erstellt.

Nun möchte ich die Anwendung via Maven erstellen.
Die Application läuft auch und erstellt eine pdf-Datei, jedoch ohne die Grafiken zu berücksichtigen.
Bei beiden Varianten wird die selbe xml-Quelle und die selbe Stylesheet-Datei verwendet.

In der pom.xml (Maven) habe ich bezüglich fop nur das einzige (auf fop 2.6 verweisende) Dependency eingefügt.

Ich vermute, dass es irgendwie mit dem dependency zusammenhängen muss.
Alle Versuche blieben erfolglos.



[CODE lang="xml" title="Ausschnitt aus der Stylesheet-Datei"]     <xsaram name="PicPath_Logo_Dechblatt">url(file:C:/Users/hallo/Documents/DVD_Archiv/Logos_DVD/DVD_Logo_hellgrau.png)</xsaram>


<foage-sequence master-reference="Deckblatt">

        <fo:flow flow-name="xsl-region-Deckblatt">
          <fo:block     font-size="18pt" text-align="center">
            <xs:copy-of select="$Anwendung"/>
          </fo:block>


          <fo:block space-before="50mm" text-align="center">
                        <fo:external-graphic src="{$PicPath_Logo_Dechblatt}" border="2pt dotted blue">
                            <!-- Grafik Groesse festlegen (Standard B=65 mm H=30mm) -->
                            <xs:choose>
                                <xs:when test="@content-width">
                                    <xs:value-of select="@content-width"/>
                                </xs:when>
                                <xstherwise>
                                    <xs:attribute name="content-width">65mm</xs:attribute>
                                </xstherwise>
                            </xs:choose>
                        </fo:external-graphic>
          </fo:block>
        </fo:flow>
      </foage-sequence>[/CODE]

Gruss Hein_nieH


----------



## LimDul (31. Jul 2021)

Ausgabe? Irgendwas sollte schon protokolliert werden. Ansonsten Logging Level Hochdrehen: https://cwiki.apache.org/confluence/display/XMLGRAPHICSFOP

Edit: http://apache-fop.1065347.n5.nabble.com/Changing-the-log-level-td40754.html


----------



## Hein_nieH (4. Aug 2021)

Problem gelöst   

Moinsen,

ich habe jetzt eine Lösung mit der das Darstellen von Grafiken in pdf mit fop via Maven funktioniert.
Es lag nicht am Java-Code sondern an der pom.xml.
Es genügt nicht einfach die fop-Bibliothek in den dependencies zu integrieren, wie es oft dargestellt wird.

Nach reichlich suchen in Google habe ich folgendes gefunden:

[CODE lang="java" title="Auszug aus pom"]        <!--  dependencies für fop -->
        <dependency>
              <groupId>org.apache.xmlgraphics</groupId>
              <artifactId>xmlgraphics-commons</artifactId>
              <version>2.6</version>
        </dependency>       

        <dependency>
            <groupId>org.apache.xmlgraphics</groupId>
            <artifactId>fop</artifactId>
            <version>2.6</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.xmlgraphics</groupId>
                    <artifactId>xmlgraphics-commons</artifactId>
                </exclusion>
            </exclusions>
        </dependency>[/CODE]

Es soll wohl daran liegen, dass es mit den Konfigurationsdateien in META-INF/services Konflikte gibt, die sowohl in 
fop.jar als auch in xmlgraphics-commons.jar vorhanden sind.
Was mich persönlich stört ist die Tatsache, dass es scheinbar keinen offiziellen Verweis auf der Seite von org apache hierzu gibt.
Das Problem mit fehlenden Grafiken in via fop erzeugten pdf (in mit Maven erstellten jar) scheinen mehrere Programmierer zu haben.

Gruss Hein_nieH


----------

