extend _components/base.pug
block pagetitle
    title Download - Apache Ignite
    meta(name="description", content="Download Apache Ignite here and install in your environment. It’s for free – just select from one of the available options and download.")
    link(rel="canonical", href="https://ignite.apache.org/download.html")
    meta(property="og:title", content="Download - Apache Ignite")
    meta(property="og:type", content="article")
    meta(property="og:url", content="https://ignite.apache.org/download.html")
    meta(property="og:image", content="/img/og-pic.png")
    meta(property="og:description", content="Download Apache Ignite here and install in your environment. It’s for free – just select from one of the available options and download.")

block css 
    link(rel="stylesheet", href="../css/native-persistence.css?ver=" + config.version)
    link(rel="stylesheet", href="../css/download.css?ver=" + config.version)
    link(rel="stylesheet", href="../js/vendor/highlight/default.min.css?ver=" + config.version)
    link(rel="stylesheet", href="../js/vendor/highlight/night-owl.css?ver=" + config.version)
    script(src="../js/vendor/highlight/highlight.min.js")
    script(src="../js/vendor/highlight/xml.min.js")
    //- script(src="../js/vendor/highlight/bash.min.js")

block main
    - global.pageHref = "download"
    - config.hdrClassName = "hdr__blue"
    include ./_components/header.pug

    mixin downloadRow(params)
        tr 
            td !{params.ver}
            td
                if(params.guide)
                    a(href=params.guide, target="_blank") guide
                if(params.javadoc)
                    a(href=params.javadoc, target="_blank") javadoc
                if(params.scaladoc)
                    a(href=params.scaladoc, target="_blank") scaladoc
            td
                if(params.notes)
                    a(href=params.notes, target="_blank") release notes
            td !{params.date}
            td.jsLinksInside
                
                if(params.sourcelink)
                    - let fileNameArr = params.sourcelink.split("/");
                    - let fileName = fileNameArr[fileNameArr.length - 1];
                    a.sourcelink(href=params.sourcelink, target="_blank", onclick=params.onclick) !{fileName}
                    |  (
                    a(href=params.sourcelink + ".asc", target="_blank") pgp
                    a(href=params.sourcelink + ".sha512", target="_blank") sha512
                    | )

    mixin downloadExtensionRow(params)
        tr 
            td !{params.name}
            td !{params.ver}
            td
                if(params.guide)
                    a(href=params.guide, target="_blank") guide
            td
                if(params.notes)
                    a(href=params.notes, target="_blank") release notes
            td !{params.date}
            td.jsLinksInside
                
                if(params.sourcelink)
                    - let fileNameArr = params.sourcelink.split("/");
                    - let fileName = fileNameArr[fileNameArr.length - 1];
                    a.sourcelink(href=params.sourcelink, target="_blank", onclick=params.onclick) !{fileName}
                    |  (
                    a(href=params.sourcelink + ".asc", target="_blank") pgp
                    a(href=params.sourcelink + ".sha512", target="_blank") sha512
                    | )

    mixin downloadDockerRow(params)
        tr 
            td !{params.name}
            td
                if(params.guide)
                    a(href=params.guide, target="_blank", onclick=params.onclick) guide
            td !{params.date}
            td
                if(params.links)
                    each link in params.links
                        a.sourcelink(href=link.url, target="_blank", onclick=link.onclick) !{link.url}<br>

    
    .cgi(hidden).
        <!-- Update the following template variables for every release -->
        [define distdir]ignite[end]
        [define disturl]https://www.apache.org/dist[end]



    section.innerhero.innerhero--download
        .container.innerhero__cont
            .innerhero__main
                .innerhero__pre.pb-3 Apache Ignite
                h1.h1.innerhero__h1.innerhero__mega Downloads
            img.innerhero__pic.innerhero__pic--download(src="/img/downloads/hero.svg", alt="Downloads")
    // /.innerhero



    section.downloadtitle.container.pb-5
        p Download Apache Ignite® and install in your environment. <br>Select from one of the available options.

    section.cmtynavblock.jsNavBlock.cmtynavblock--downwrap
        .container
            ul.cmtynavblock__list.flexi.cmtynavblock--down
                li
                    a.cmtynavblock__active(href="#source") Source Releases
                li
                    a(href="#binary") Binary Releases
                li
                    a(href="#docker") Docker and <br>Cloud Images
                li
                    a(href="#git") Git Repository
                li
                    a(href="#extensions") Extensions
                li
                    a(href="#party3rd") 3rd Party Binaries 
    // /.cmtynavblock

    section.download-src#source.container
        h2.capstext.pb-5 SOURCE RELEASES

        include ./_components/download-source.pug
        .download-src__bottom.flexi.pt-5
            .download-src__left
                p.
                    If you are looking for an earlier version of Apache Ignite, please find it in the archive. If you encounter a problem with the selected mirror, please choose another one. If primary mirrors are not reachable, switch to backup servers added to the end of the list.
            .download-src__right
                include _components/download-select.html
    // /.download-src





    section.download-bin.container#binary
        h2.capstext BINARY RELEASES

        .download-bin__header.pt-4.pb-5
            p.
                Binary release packages are provided for your convenience and not considered as primary release artifacts of the ASF. It's recommended to verify a release downloadable, following <a href="#verification">this guidelines.</a> For more information about Apache release policy see <a href="http://www.apache.org/dev/release.html#what" target="_blank">What is a Release?</a>

        include ./_components/download-binary.pug
        // /.downtable__wrap
        p.pt-5 f you are looking for previous release versions of Apache Ignite, please have a look in the <a href="https://archive.apache.org/dist/ignite" target="_blank">archive</a>.
    // /.download-bin





    


    section.downloadslim.container 
        h3.h5.pb-2 Slim binary releases
        include ./_components/download-slim.pug
    // /.downloadslim



    section.download-docker.container#docker
        h2.capstext.pb-5 DOCKER AND CLOUD IMAGES
        include ./_components/download-docker.pug
    // /.download-docker




    section.downverify.container#verify.pt-5
        h3.h5 How to verify
        .downverify__wrap.flexi.pt-4
            .downverify__left
                p The PGP signatures can be verified using PGP or GPG. First download the <a href="https://downloads.apache.org/ignite/KEYS" target="_blank">Apache Ignite KEYS</a> file as well as the .asc signature files for the desired release version. Make sure you get these files from the main distribution directory, rather than from a mirror. Then verify the signatures.
            aside.downverify__right 
                p Please check <a href="https://www.apache.org/info/verification.html" target="_blank">How to Verify Downloaded Files</a> for more information on how and why you should verify Apache Ignite releases.
                downverify.downverify__code
                    p.pb-1 % gpg --import KEYS
                    p % gpg --verify apache-ignite-2.9.1-src.zip.asc apache-ignite-2.9.1-src.zip
    // /.downverify



    section.downfooter.container#git
        h2.capstext.pb-3 GIT REPOSITORY
        pre.nativecode__codebox.nomargin
            code.bash.
                $ git clone https://gitbox.apache.org/repos/asf/ignite
        
        .downfooter__spacer.pt-5.pb-5

    section.download-extenstions.container#extensions
        h2.capstext.pb-3 EXTENSIONS

        h3.h5.pb-2 Source Releases
        include ./_components/download-extension-source.pug

        h3.h5.pt-5.pb-2 Binary Releases
        p.pb-2 Binary release packages are provided for your convenience and not considered as primary release artifacts of the ASF. It's recommended to verify a release downloadable, following <a href="#verify">this guidelines</a>. For more information about Apache release policy see <a href="https://www.apache.org/legal/release-policy.html#what" target="_blank">What is a Release?</a>
        include ./_components/download-extension-binary.pug
        p.pt-2.pb-2 Spring Boot extensions:
        -
            var xmlCode = `<dependency>
                <groupId>org.apache.ignite</groupId>
                <artifactId>ignite-spring-boot-autoconfigure-ext</artifactId>
                <version>1.0.0</version>
            </dependency>
            <dependency>
                <groupId>org.apache.ignite</groupId>
                <artifactId>ignite-spring-boot-thin-client-autoconfigure-ext</artifactId>
                <version>1.0.0</version>
            </dependency>`;

        pre.nativecode__codebox.nomargin
            code.xml #{xmlCode}



    section.party3rd#party3rd.container
        h2.capstext 3RD PARTY BINARIES
        .party3rd__wrap.pt-5.flexi
            .party3rd__left
                p.pb-2 This is a list of 3rd party binary packages based on Apache Ignite. The Apache Ignite project does not endorse or maintain any 3rd party binary packages.
                p <a href="https://www.gridgain.com/resources/download#communityEdition" target="_blank">GridGain Community Edition</a> is a binary build of Apache Ignite created by GridGain, which includes optional LGPL dependencies, such as Hibernate L2 cache integration and Geospatial Indexing, as well as bug fixes and features which may be included into the future official Apache Ignite releases.
            .party3rd__right
                p GridGain also provides his own <a href="http://www.gridgainsystems.com/nexus/content/repositories/external" target="_blank">GridGain Maven Repository</a> containing Apache Ignite LGPL artifacts such as ignite-hibernate.
                p Please note that artifacts located at GridGain Maven Repository provided for convenience and are NOT official Apache Ignite artifacts.
                p If you would like to provide your own edition of Apache Ignite here, please send email to <a href="mailto:dev@ignite.apache.org">Ignite dev list.</a>






