<?xml version="1.0"?>
<!--
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to you under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
-->
<assembler>
    <scripts>
        <!--
            Minimal assembly with all experimental features
            and all extra i18n languages stripped out

            Support for legacy browsers stripped out.
            Minimal baseline all current browsers in
            their latest version (including ie9)
            The baseline will be increased whenever
            the browsers update.
        -->


        <script>
            <fileName>jsf-minimal-modern.js</fileName>
            <includes>
                <include>**/_impl/core/_EvalHandlers.js</include>
                <include>**/_impl/core/_Runtime.js</include>
                <include>**/_impl/core/_StartImpl.js</include>
                <include>**/_impl/i18n/Messages.js</include>


                <include>**/_impl/_util/_Lang.js</include>
                <include>**/_impl/core/Object.js</include>

                <include>**/_impl/_util/_Queue.js</include>
                <include>**/_impl/_util/_ListenerQueue.js</include>
                <include>**/_impl/_util/_Dom.js</include>
                <include>**/_impl/_util/_HtmlStripper.js</include>
                <include>**/_impl/_util/_OamSubmit.js</include>

                <include>**/_impl/xhrCore/_AjaxUtils.js</include>
                <include>**/_impl/xhrCore/_AjaxRequestQueue.js</include>

                <!-- the jsf.js independend xhr core engine -->
                <include>**/_impl/xhrCore/engine/XhrConst.js</include>
                <include>**/_impl/xhrCore/engine/FormData.js</include>
                <include>**/_impl/xhrCore/engine/BaseRequest.js</include>

                <include>**/_impl/xhrCore/_AjaxRequest.js</include>
                <include>**/_impl/xhrCore/_AjaxRequestLevel2.js</include>
                <!-- not yet used in 2.0 but for development purposes it makes sense to include it here -->
                <include>**/_impl/xhrCore/_AjaxResponse.js</include>
                <include>**/_impl/xhrCore/_Transports.js</include>
                <include>**/_impl/core/Impl.js</include>
                <!-- optimization helper -->
                <include>**/_impl/core/_EndImpl.js</include>
                <!-- api -->
                <include>**/api/jsf.js</include>
            </includes>
        </script>
    </scripts>
</assembler>
