Apache Weex
Copyright 2018 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

This product contains software semver(http://semver.org/) developed
by Tom Preston-Werner , licensed under the Creative Commons - CC BY 3.0 License.

This product contains software core-js(https://github.com/zloirock/core-js) developed
by Denis Pushkarev , licensed under the MIT License.

This product contains software autoprefixer(https://github.com/postcss/autoprefixer) developed
by postcss , licensed under the MIT License.

This product contains software query-string(https://github.com/sindresorhus/query-string) developed
by sindresorhus  , licensed under the MIT License.

This product contains software weex-picker(https://github.com/weexteam/weex-picker) developed
by abigtree  , licensed under the Apache 2.0 License.

This product contains software weex-rax-framework(https://github.com/alibaba/rax) developed
by yuanyan  , licensed under the BSD-3-Clause License.

This product contains software weex-vue-framework(https://github.com/vuejs/vue) developed
by fkysly  , licensed under the MIT License.

This product contains software weex-vue-render(https://github.com/vuejs/vue) developed
by MrRaindrop  , licensed under the Apache 2.0 License.

This product contains software weex-styler(https://github.com/weexteam/weex-styler) developed
by songsiqi  , licensed under the MIT License.

This product contains software vuejs(https://github.com/vuejs/vue) developed
by Yuxi Evan You , licensed under the MIT License.

This product contains software fastjson(https://github.com/alibaba/fastjson) developed
by alibaba inc.  , licensed under the Apache 2.0 License.

This product contains software dexposed(https://github.com/alibaba/dexposed) developed
by alibaba inc.  , licensed under the Apache 2.0 License.

This product contains software loopj(https://github.com/loopj/android-async-http) developed
by loopj , licensed under the Apache 2.0 License.

This product contains software fresco(https://github.com/facebook/fresco) developed
by facebook , licensed under the BSD-3-Clause License.

This product contains software animated-gif(https://github.com/facebook/fresco) developed
by facebook , licensed under the BSD-3-Clause License.

This product contains software SocketRocket(https://github.com/facebook/SocketRocket) developed
by facebook , licensed under the BSD-3-Clause License.

This product contains software zxing(https://github.com/zxing/zxing) developed
by zxing , licensed under the Apache 2.0 License.

This product contains software okhttp(https://github.com/square/okhttp) developed
by square , licensed under the Apache 2.0 License.

This product contains software okio(https://github.com/square/okio) developed
by square , licensed under the Apache 2.0 License.

This product contains software scalpel(https://github.com/JakeWharton/scalpel) developed
by Jake Wharton , licensed under the Apache 2.0 License.

This product contains software espresso-idling-resource(https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/) developed
by google , licensed under the Apache 2.0 License.

This product contains software AOSP(https://source.android.com/) developed
by The Android Open Source Project , licensed under the Apache 2.0 License.

This product contains software SDWebImage(https://github.com/rs/SDWebImage) developed
by Olivier Poitrey  , licensed under the MIT License.

This product contains software Guava(https://github.com/google/guava) developed
by google  , licensed under the Apache License.

This product contains shelljs Guava(https://github.com/shelljs/shelljs) developed
by shelljs  , licensed under BSD 3-clause "New" or "Revised" License.

This product contains software fpconv(https://github.com/night-shift/fpconv) developed
by night-shift  , licensed under the MIT License.

This product contains software rapidjson(https://github.com/Tencent/rapidjson) developed
by tencent  , licensed under the MIT License.

This product contains software flexbox-layout(https://github.com/google/flexbox-layout) developed
by google  , licensed under the Apache License.

This product contains software IPC(https://source.android.com/) developed
by google  , licensed under the Apache License.

This product contains software JNI(https://chromium.googlesource.com/) developed
by google, licensed under the BSD-style License.

This product contains software modp(http://modp.com/release/base64) developed
by modp, licensed under the BSD-style License.

This product contains software jni_generator(https://chromium.googlesource.com/) developed
by google, licensed under the BSD-style License.
